From 4ea115ea0d3b57b5052d8f92e8494a7409d5ea50 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 16 Mar 2021 06:59:48 -0400 Subject: [PATCH] fix for seedrandom --- CHANGELOG.md | 5 +- dist/face-api.esm-nobundle.js | 2 +- dist/face-api.esm.js | 2 +- dist/face-api.js | 2 +- dist/face-api.node-cpu.js | 2 +- dist/face-api.node-gpu.js | 2 +- dist/face-api.node.js | 2 +- package-lock.json | 251 ++++++++++++++++++---------------- package.json | 9 +- 9 files changed, 148 insertions(+), 129 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b26f27..dd18b32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # @vladmandic/face-api -Version: **1.1.1** +Version: **1.1.2** Description: **FaceAPI: AI-powered Face Detection, Face Embedding & Recognition Using Tensorflow/JS** Author: **Vladimir Mandic ** @@ -11,6 +11,9 @@ Repository: **** ### **HEAD -> master** 2021/03/15 mandic00@live.com + +### **1.1.2** 2021/03/15 mandic00@live.com + - create templates - create codeql-analysis.yml diff --git a/dist/face-api.esm-nobundle.js b/dist/face-api.esm-nobundle.js index 3f33a02..ea3b217 100644 --- a/dist/face-api.esm-nobundle.js +++ b/dist/face-api.esm-nobundle.js @@ -5,5 +5,5 @@ author: ' */ -var pn=Object.create,Ye=Object.defineProperty,dn=Object.getPrototypeOf,un=Object.prototype.hasOwnProperty,ln=Object.getOwnPropertyNames,fn=Object.getOwnPropertyDescriptor;var Dr=o=>Ye(o,"__esModule",{value:!0});var uo=(o,t)=>()=>(t||(t={exports:{}},o(t.exports,t)),t.exports),Er=(o,t)=>{for(var e in t)Ye(o,e,{get:t[e],enumerable:!0})},lt=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ln(t))!un.call(o,r)&&r!=="default"&&Ye(o,r,{get:()=>t[r],enumerable:!(e=fn(t,r))||e.enumerable});return o},hn=o=>lt(Dr(Ye(o!=null?pn(dn(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);import*as Ca from"@tensorflow/tfjs/dist/index.js";import*as Na from"@tensorflow/tfjs-backend-wasm";var b=uo(xn=>{Dr(xn);lt(xn,Ca);lt(xn,Na)});var go=uo((_n,bo)=>{Dr(_n);Er(_n,{isNodejs:()=>wn});function wn(){return typeof global=="object"&&!0&&typeof bo!="undefined"&&typeof process!="undefined"&&!!process.version}});var ya=b();var Po={};Er(Po,{AnchorPosition:()=>pt,DrawBox:()=>Ue,DrawBoxOptions:()=>jr,DrawFaceLandmarks:()=>Zr,DrawFaceLandmarksOptions:()=>qr,DrawTextField:()=>Mt,DrawTextFieldOptions:()=>Ce,drawContour:()=>ft,drawDetections:()=>En,drawFaceExpressions:()=>kn,drawFaceLandmarks:()=>Ln});function ft(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var lo={};Er(lo,{computeReshapedDimensions:()=>Nr,getCenterPoint:()=>$t,isDimensions:()=>ze,isEven:()=>Ge,isFloat:()=>Cr,isTensor:()=>Bt,isTensor1D:()=>bn,isTensor2D:()=>Mr,isTensor3D:()=>ht,isTensor4D:()=>G,isValidNumber:()=>et,isValidProbablitiy:()=>ee,range:()=>it,round:()=>Rt});var fo=b();var S=class{constructor(t,e){if(!et(t)||!et(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new S(1/this.width,1/this.height)}};function Bt(o,t){return o instanceof fo.Tensor&&o.shape.length===t}function bn(o){return Bt(o,1)}function Mr(o){return Bt(o,2)}function ht(o){return Bt(o,3)}function G(o){return Bt(o,4)}function Cr(o){return o%1!=0}function Ge(o){return o%2==0}function Rt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function ze(o){return o&&o.width&&o.height}function Nr({width:o,height:t},e){let r=e/Math.max(t,o);return new S(Math.round(o*r),Math.round(t*r))}function $t(o){return o.reduce((t,e)=>t.add(e),new x(0,0)).div(new x(o.length,o.length))}function it(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function ee(o){return et(o)&&o>=0&&o<=1}var x=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new x(this.x+t.x,this.y+t.y)}sub(t){return new x(this.x-t.x,this.y-t.y)}mul(t){return new x(this.x*t.x,this.y*t.y)}div(t){return new x(this.x/t.x,this.y/t.y)}abs(){return new x(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new x(Math.floor(this.x),Math.floor(this.y))}};var P=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!P.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(et),a=[r.x,r.y,r.width,r.height].every(et);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];P.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new x(this.left,this.top)}get topRight(){return new x(this.right,this.top)}get bottomLeft(){return new x(this.left,this.bottom)}get bottomRight(){return new x(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new P({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new P({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-d+e+r,d=e),u>t&&(c=-u+t+n,u=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:u,x:m,ex:d,w:r,h:n}}calibrate(t){return new P({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var re=class extends P{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var Dt=class{constructor(t,e,r,n,a){this._imageDims=new S(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new P(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new P(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new Dt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var E=class extends Dt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new E(r,n,a)}};function kr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function Ir(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var ct=b();function rt(o,t){return ct.tidy(()=>{let[e,r,n]=t,a=ct.fill([...o.shape.slice(0,3),1],e,"float32"),s=ct.fill([...o.shape.slice(0,3),1],r,"float32"),i=ct.fill([...o.shape.slice(0,3),1],n,"float32"),c=ct.concat([a,s,i],3);return ct.sub(o,c)})}var Et=b();function Sr(o,t=!1){return Et.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=u=>{let l=o.shape.slice();return l[s]=u,Et.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],d=[t&&m?i(m):null,o,c].filter(u=>!!u).map(u=>Et.cast(u,"float32"));return Et.concat(d,s)})}function gn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function De(o){return 1/(1+Math.exp(-o))}function vn(o){return Math.log(o/(1-o))}var oe=class extends P{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var yn=.5,Fn=.43,Tn=.45,z=class{constructor(t,e,r=new x(0,0)){let{width:n,height:a}=e;this._imgDims=new S(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new x(n,a)).add(r))}get shift(){return new x(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new x(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new x(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof E?t.box.floor():new P(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=d=>n.sub(d).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/Tn),c=$t(t),m=Math.floor(Math.max(0,c.x-yn*i)),p=Math.floor(Math.max(0,c.y-Fn*i));return new oe(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=Ir(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var ho=class extends z{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],$t([t[3],t[4]])]}};var ne=class extends z{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map($t)}};var Ee=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Rt(this.distance)})`:""}`}};var Me=class extends P{static assertIsValidLabeledBox(t,e){if(P.assertIsValidBox(t,e),!et(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t);this._label=e}get label(){return this._label}};var xt=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new xt(t.label,e)}};var xo=class extends Me{static assertIsValidPredictedBox(t,e){if(Me.assertIsValidLabeledBox(t,e),!ee(t.score)||!ee(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,n){super(t,e);this._score=r,this._classScore=n}get score(){return this._score}get classScore(){return this._classScore}};function mt(o){return o.detection instanceof E}function Ot(o,t){return{...o,...{detection:t}}}function Ar(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Ve(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Wr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch,a=Ve();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:n,...a}}function Br(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var Rr=hn(go()),I;function Pn(){if(!I)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return I}function $r(o){I=o}function Or(){return Br()?$r(Ar()):(0,Rr.isNodejs)()?$r(Wr()):null}function Dn(o){if(I||Or(),!I)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=I.Canvas,Image:e=I.Image}=o;I.Canvas=t,I.Image=e,I.createCanvasElement=o.createCanvasElement||(()=>new t),I.createImageElement=o.createImageElement||(()=>new e),I.ImageData=o.ImageData||I.ImageData,I.Video=o.Video||I.Video,I.fetch=o.fetch||I.fetch,I.readFile=o.readFile||I.readFile}var w={getEnv:Pn,setEnv:$r,initialize:Or,createBrowserEnv:Ar,createFileSystem:Ve,createNodejsEnv:Wr,monkeyPatch:Dn,isBrowser:Br,isNodejs:Rr.isNodejs};Or();function jt(o){return!w.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function R(o){let{Canvas:t,CanvasRenderingContext2D:e}=w.getEnv();if(o instanceof e)return o;let r=jt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var pt;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(pt||(pt={}));var Ce=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||pt.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},Mt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof Mt?t.text:t,this.anchor=e,this.options=new Ce(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let g=c+d.x,_=c+d.y+(l+1)*s;r.fillText(u,g,_)})}};var jr=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:pt.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Ce({...s,...a})}},Ue=class{constructor(t,e={}){this.box=new P(t),this.options=new jr(e)}draw(t){let e=R(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new Mt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function En(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof E?r.score:mt(r)?r.detection.score:void 0,a=r instanceof E?r.box:mt(r)?r.detection.box:new P(r),s=n?`${Rt(n)}`:void 0;new Ue(a,{label:s}).draw(o)})}var ue=b();function Ne(o){let{Image:t,Video:e}=w.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function Hr(o){return new Promise((t,e)=>{if(o instanceof w.getEnv().Canvas||Ne(o))return t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function Yr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=w.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Ht(o){let{Image:t,Video:e}=w.getEnv();return o instanceof t?new S(o.naturalWidth,o.naturalHeight):o instanceof e?new S(o.videoWidth,o.videoHeight):new S(o.width,o.height)}function Yt({width:o,height:t}){let{createCanvasElement:e}=w.getEnv(),r=e();return r.width=o,r.height=t,r}function ke(o,t){let{ImageData:e}=w.getEnv();if(!(o instanceof e)&&!Ne(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Ht(o),a=Yt({width:r,height:n});return o instanceof e?R(a).putImageData(o,0,0):R(a).drawImage(o,0,0,r,n),a}var Xe=b();async function Gr(o,t){let e=t||w.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(G(o)?1:0),s=Xe.tidy(()=>o.as3D(r,n,a).toInt());return await Xe.browser.toPixels(s,e),s.dispose(),e}function Je(o){let{Image:t,Canvas:e,Video:r}=w.getEnv();return o instanceof t||o instanceof e||o instanceof r}var X=b();function zr(o,t,e=!1){let{Image:r,Canvas:n}=w.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Yt({width:1,height:1});let a=Ht(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=Yt({width:t,height:t}),p=o instanceof n?o:ke(o),d=Math.abs(i-c)/2,u=e&&i0&&p.height>0&&R(m).drawImage(p,u,l,i,c),m}var bt=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(ht(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(G(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof w.getEnv().Canvas?r:ke(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return it(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Nr({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,X.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof X.Tensor){let i=G(s)?s:s.expandDims();return i=Sr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=X.image.resizeBilinear(i,[t,t])),i.as3D(t,t,3)}if(s instanceof w.getEnv().Canvas)return X.browser.fromPixels(zr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return X.stack(r.map(a=>X.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function D(o){if(o instanceof bt)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(jt);return r.forEach((n,a)=>{if(!Je(n)&&!ht(n)&&!G(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(G(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>Je(n)&&Hr(n))),new bt(r,Array.isArray(o))}async function ae(o,t){let{Canvas:e}=w.getEnv(),r=o;if(!(o instanceof e)){let s=await D(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await Gr(i)}let n=R(r);return t.map(s=>s instanceof E?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=Yt({width:c,height:m});return c>0&&m>0&&R(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var qe=b();async function se(o,t){if(!ht(o)&&!G(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(G(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return qe.tidy(()=>{let[e,r,n]=o.shape.slice(G(o)?1:0);return t.map(i=>i instanceof E?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).map(({x:i,y:c,width:m,height:p})=>qe.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function Gt(o,t){let{fetch:e}=w.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function Mn(o){let t=await Gt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return Yr(e)}async function Vr(o){return(await Gt(o)).json()}async function Cn(o){return new Float32Array(await(await Gt(o)).arrayBuffer())}var vo=b();function Ze(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function Ur(o,t){let{manifestUri:e,modelBaseUri:r}=Ze(o,t),n=await Vr(e);return vo.io.loadWeights(n,r)}function Nn(o,t,e=!1){let{width:r,height:n}=e?Ht(t):t;return o.width=r,o.height=n,{width:r,height:n}}var Nt=b();var gt=b();var L=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof gt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof gt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=gt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await Ur(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=w.getEnv(),{manifestUri:r,modelBaseUri:n}=Ze(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(d=>d.buffer))),s=gt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof gt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var M=b();var ie=b();function $(o,t,e){return ie.tidy(()=>{let r=ie.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=ie.add(r,t.bias),r})}function Ke(o,t,e=!1){return M.tidy(()=>{let r=M.relu(e?M.add(M.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):$(o,t.conv0,[2,2])),n=$(r,t.conv1,[1,1]),a=M.relu(M.add(r,n)),s=$(a,t.conv2,[1,1]);return M.relu(M.add(r,M.add(n,s)))})}function Ie(o,t,e=!1,r=!0){return M.tidy(()=>{let n=M.relu(e?M.add(M.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):$(o,t.conv0,r?[2,2]:[1,1])),a=$(n,t.conv1,[1,1]),s=M.relu(M.add(n,a)),i=$(s,t.conv2,[1,1]),c=M.relu(M.add(n,M.add(a,i))),m=$(c,t.conv3,[1,1]);return M.relu(M.add(n,M.add(a,M.add(i,m))))})}var Ct=b();function zt(o,t,e="same",r=!1){return Ct.tidy(()=>{let n=Ct.add(Ct.conv2d(o,t.filters,[1,1],e),t.bias);return r?Ct.relu(n):n})}function A(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var Qe=b();function ce(o,t){return(e,r,n,a)=>{let s=Qe.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Qe.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var tr=b();function er(o,t){return(e,r,n)=>{let a=tr.tensor2d(o(e*r),[e,r]),s=tr.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Le=b();var rr=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function me(o,t){return(e,r,n)=>{let a=Le.tensor4d(o(3*3*e),[3,3,e,1]),s=Le.tensor4d(o(e*r),[1,1,e,r]),i=Le.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new rr(a,s,i)}}function pe(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new rr(e,r,n)}}function O(o,t){return(e,r,n)=>{let a=o[e];if(!Bt(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function W(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function or(o,t){let e=ce(o,t),r=me(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),d=r(i,i,`${c}/conv1`),u=r(i,i,`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function a(s,i,c,m=!1){let{conv0:p,conv1:d,conv2:u}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function yo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=W(o),{extractDenseBlock4Params:n}=or(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function nr(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function ar(o,t){let e=O(o,t),r=nr(e),n=pe(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:d}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`),u=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:d,conv3:u}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Fo(o){let t=[],{extractDenseBlock4Params:e}=ar(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return A(o,t),{params:r,paramMappings:t}}var Se=class extends L{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return Nt.tidy(()=>{let r=Nt.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(Nt.scalar(255)),s=Ie(a,e.dense0,!0);return s=Ie(s,e.dense1),s=Ie(s,e.dense2),s=Ie(s,e.dense3),s=Nt.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await D(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Fo(t)}extractParams(t){return yo(t)}};var wo=b();var de=b();function Ae(o,t){return de.tidy(()=>de.add(de.matMul(o,t.weights),t.bias))}function To(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=W(o),i=er(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function _o(o){let t=[],e=O(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return A(o,t),{params:n,paramMappings:t}}function sr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var We=class extends L{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return wo.tidy(()=>{let r=t instanceof bt?this.faceFeatureExtractor.forwardInput(t):t;return Ae(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return To(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=sr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),_o(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,a=t.slice(0,t.length-n),s=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Xr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],kt=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Xr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Xr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var ir=class extends We{constructor(t=new Se){super("FaceExpressionNet",t)}forwardInput(t){return ue.tidy(()=>ue.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await D(t))}async predictExpressions(t){let e=await D(t),r=await this.forwardInput(e),n=await Promise.all(ue.unstack(r).map(async s=>{let i=await s.data();return s.dispose(),i}));r.dispose();let a=n.map(s=>new kt(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Jr(o){return o.expressions instanceof kt}function cr(o,t){return{...o,...{expressions:t}}}function kn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof kt?a:Jr(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(d=>d.probability>e),m=mt(a)?a.detection.box.bottomLeft:r||new x(0,0);new Mt(c.map(d=>`${d.expression} (${Rt(d.probability)})`),m).draw(o)})}function Vt(o){return mt(o)&&o.landmarks instanceof z&&o.unshiftedLandmarks instanceof z&&o.alignedRect instanceof E}function In(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function le(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new E(o.detection.score,n.rescale(a.reverse()),a),i=In(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var qr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},Zr=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new qr(e)}draw(t){let e=R(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof ne&&(e.strokeStyle=s,e.lineWidth=a,ft(e,this.faceLandmarks.getJawOutline()),ft(e,this.faceLandmarks.getLeftEyeBrow()),ft(e,this.faceLandmarks.getRightEyeBrow()),ft(e,this.faceLandmarks.getNose()),ft(e,this.faceLandmarks.getLeftEye(),!0),ft(e,this.faceLandmarks.getRightEye(),!0),ft(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function Ln(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof z?r:Vt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new Zr(n).draw(o)})}var Do="1.1.1";var dt=b();var N=b();function Sn(o,t){let e=ce(o,t),r=me(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Eo(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=W(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=Sn(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),d=i(64,128,"entry_flow/reduction_block_1"),u={conv_in:m,reduction_block_0:p,reduction_block_1:d},l={};it(t,0,1).forEach(v=>{l[`main_block_${v}`]=c(128,`middle_flow/main_block_${v}`)});let g=i(128,256,"exit_flow/reduction_block"),_=s(256,512,"exit_flow/separable_conv"),h={reduction_block:g,separable_conv:_};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:u,middle_flow:l,exit_flow:h}}}function An(o,t){let e=O(o,t),r=nr(e),n=pe(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function Mo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=An(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},d={};it(t,0,1).forEach(_=>{d[`main_block_${_}`]=s(`middle_flow/main_block_${_}`)});let u=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),g={reduction_block:u,separable_conv:l};return A(o,e),{params:{entry_flow:p,middle_flow:d,exit_flow:g},paramMappings:e}}function Co(o,t,e){return N.add(N.conv2d(o,t.filters,e,"same"),t.bias)}function Kr(o,t,e=!0){let r=e?N.relu(o):o;return r=$(r,t.separable_conv0,[1,1]),r=$(N.relu(r),t.separable_conv1,[1,1]),r=N.maxPool(r,[3,3],[2,2],"same"),r=N.add(r,Co(o,t.expansion_conv,[2,2])),r}function Wn(o,t){let e=$(N.relu(o),t.separable_conv0,[1,1]);return e=$(N.relu(e),t.separable_conv1,[1,1]),e=$(N.relu(e),t.separable_conv2,[1,1]),e=N.add(e,o),e}var Qr=class extends L{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return N.tidy(()=>{let r=N.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(N.scalar(256)),s=N.relu(Co(a,e.entry_flow.conv_in,[2,2]));return s=Kr(s,e.entry_flow.reduction_block_0,!1),s=Kr(s,e.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(i=>{s=Wn(s,e.middle_flow[`main_block_${i}`])}),s=Kr(s,e.exit_flow.reduction_block),s=N.relu($(s,e.exit_flow.separable_conv,[1,1])),s})}async forward(t){return this.forwardInput(await D(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return Mo(t,this._numMainBlocks)}extractParams(t){return Eo(t,this._numMainBlocks)}};function No(o){let t=[],{extractWeights:e,getRemainingWeights:r}=W(o),n=er(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function ko(o){let t=[],e=O(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return A(o,t),{params:n,paramMappings:t}}var vt;(function(o){o.FEMALE="female",o.MALE="male"})(vt||(vt={}));var mr=class extends L{constructor(t=new Qr(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return dt.tidy(()=>{let r=t instanceof bt?this.faceFeatureExtractor.forwardInput(t):t,n=dt.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),a=Ae(n,e.fc.age).as1D(),s=Ae(n,e.fc.gender);return{age:a,gender:s}})}forwardInput(t){return dt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:dt.softmax(r)}})}async forward(t){return this.forwardInput(await D(t))}async predictAgeAndGender(t){let e=await D(t),r=await this.forwardInput(e),n=dt.unstack(r.age),a=dt.unstack(r.gender),s=n.map((c,m)=>({ageTensor:c,genderTensor:a[m]})),i=await Promise.all(s.map(async({ageTensor:c,genderTensor:m})=>{let p=(await c.data())[0],d=(await m.data())[0],u=d>.5,l=u?vt.MALE:vt.FEMALE,g=u?d:1-d;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:g}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?i:i[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return No(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=sr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),ko(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),n=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var j=b();var Be=class extends We{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return j.tidy(()=>{let s=(d,u)=>j.stack([j.fill([68],d,"float32"),j.fill([68],u,"float32")],1).as2D(1,136).as1D(),i=(d,u)=>{let{width:l,height:g}=n[d];return u(l,g)?Math.abs(l-g)/2:0},c=d=>i(d,(u,l)=>ui(d,(u,l)=>ls(c(u),m(u))))).div(j.stack(Array.from(Array(a),(d,u)=>s(n[u].width,n[u].height))))})}forwardInput(t){return j.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await D(t))}async detectLandmarks(t){let e=await D(t),r=j.tidy(()=>j.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(await a.data()),c=i.filter((p,d)=>Ge(d)),m=i.filter((p,d)=>!Ge(d));return new ne(Array(68).fill(0).map((p,d)=>new x(c[d],m[d])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var fe=class extends Be{constructor(t=new Se){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var It=b();function Io(o){let t=[],{extractDenseBlock3Params:e}=ar(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return A(o,t),{params:r,paramMappings:t}}function Lo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=W(o),{extractDenseBlock3Params:n}=or(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var to=class extends L{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return It.tidy(()=>{let r=It.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(It.scalar(255)),s=Ke(a,e.dense0,!0);return s=Ke(s,e.dense1),s=Ke(s,e.dense2),s=It.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await D(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Io(t)}extractParams(t){return Lo(t)}};var pr=class extends Be{constructor(t=new to){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var So=class extends fe{};var V=b();var he=b();var dr=b();function Ao(o,t){return dr.add(dr.mul(o,t.weights),t.biases)}function eo(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=he.conv2d(o,a,e,n);return i=he.add(i,s),i=Ao(i,t.scale),r?he.relu(i):i}function Wo(o,t){return eo(o,t,[1,1],!0)}function ro(o,t){return eo(o,t,[1,1],!1)}function ur(o,t){return eo(o,t,[2,2],!0,"valid")}var H=b();function Bn(o,t){function e(i,c,m){let p=o(i),d=p.length/(c*m*m);if(Cr(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return H.tidy(()=>H.transpose(H.tensor4d(p,[c,d,m,m]),[2,3,1,0]))}function r(i,c,m,p){let d=e(i,c,m),u=H.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:u}}function n(i,c){let m=H.tensor1d(o(i)),p=H.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let d=r(i,c,m,`${p}/conv`),u=n(c,`${p}/scale`);return{conv:d,scale:u}}function s(i,c,m,p,d=!1){let u=a((d?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:u,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Bo(o){let{extractWeights:t,getRemainingWeights:e}=W(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=Bn(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),d=a(36864,64,3,"conv64_1"),u=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),g=a(147456,128,3,"conv128_down",!0),_=a(147456,128,3,"conv128_1"),h=a(147456,128,3,"conv128_2"),v=a(589824,256,3,"conv256_down",!0),F=a(589824,256,3,"conv256_1"),y=a(589824,256,3,"conv256_2"),k=a(589824,256,3,"conv256_down_out"),Y=H.tidy(()=>H.transpose(H.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:d,conv64_2:u,conv64_3:l,conv128_down:g,conv128_1:_,conv128_2:h,conv256_down:v,conv256_1:F,conv256_2:y,conv256_down_out:k,fc:Y},paramMappings:r}}function Rn(o,t){let e=O(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function Ro(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Rn(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),d=r("conv64_3"),u=r("conv128_down"),l=r("conv128_1"),g=r("conv128_2"),_=r("conv256_down"),h=r("conv256_1"),v=r("conv256_2"),F=r("conv256_down_out"),{fc:y}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!Mr(y))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${y}`);let k={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:d,conv128_down:u,conv128_1:l,conv128_2:g,conv256_down:_,conv256_1:h,conv256_2:v,conv256_down_out:F,fc:y};return A(o,t),{params:k,paramMappings:t}}var B=b();function ot(o,t){let e=Wo(o,t.conv1);return e=ro(e,t.conv2),e=B.add(e,o),e=B.relu(e),e}function Re(o,t){let e=ur(o,t.conv1);e=ro(e,t.conv2);let r=B.avgPool(o,2,2,"valid"),n=B.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=B.zeros(i);e=B.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=B.zeros(m);e=B.concat([e,p],2)}return r=a?B.concat([r,n],3):r,e=B.add(r,e),e=B.relu(e),e}var xe=class extends L{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return V.tidy(()=>{let r=V.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(V.scalar(256)),s=ur(a,e.conv32_down);s=V.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Re(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Re(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Re(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Re(s,e.conv256_down_out);let i=s.mean([1,2]);return V.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await D(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)==null?void 0:a.some(s=>s<=0))return new Float32Array(128);let e=await D(t),r=V.tidy(()=>V.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return Ro(t)}extractParams(t){return Bo(t)}};function $n(o){let t=new xe;return t.extractWeights(o),t}function lr(o,t){return{...o,...{descriptor:t}}}function On(o){return typeof o.age=="number"}function fr(o,t){return{...o,...{age:t}}}function jn(o){return(o.gender===vt.MALE||o.gender===vt.FEMALE)&&ee(o.genderProbability)}function hr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var at=b();var nt=b();function Hn(o,t){function e(c,m){let p=nt.tensor4d(o(3*3*c),[3,3,c,1]),d=nt.tensor1d(o(c)),u=nt.tensor1d(o(c)),l=nt.tensor1d(o(c)),g=nt.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:u,batch_norm_mean:l,batch_norm_variance:g}}function r(c,m,p,d,u){let l=nt.tensor4d(o(c*m*p*p),[p,p,c,m]),g=nt.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${u?"batch_norm_offset":"bias"}`}),{filters:l,bias:g}}function n(c,m,p,d){let{filters:u,bias:l}=r(c,m,p,d,!0);return{filters:u,batch_norm_offset:l}}function a(c,m,p){let d=e(c,`${p}/depthwise_conv`),u=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:u}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),d=a(128,128,"mobilenetv1/conv_3"),u=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),g=a(256,512,"mobilenetv1/conv_6"),_=a(512,512,"mobilenetv1/conv_7"),h=a(512,512,"mobilenetv1/conv_8"),v=a(512,512,"mobilenetv1/conv_9"),F=a(512,512,"mobilenetv1/conv_10"),y=a(512,512,"mobilenetv1/conv_11"),k=a(512,1024,"mobilenetv1/conv_12"),Y=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:g,conv_7:_,conv_8:h,conv_9:v,conv_10:F,conv_11:y,conv_12:k,conv_13:Y}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),d=n(128,256,3,"prediction_layer/conv_3"),u=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),g=n(256,64,1,"prediction_layer/conv_6"),_=n(64,128,3,"prediction_layer/conv_7"),h=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),v=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),F=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),y=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),k=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),Y=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),tt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),st=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),U=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),_t=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),wt=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Pt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:g,conv_7:_,box_predictor_0:{box_encoding_predictor:h,class_predictor:v},box_predictor_1:{box_encoding_predictor:F,class_predictor:y},box_predictor_2:{box_encoding_predictor:k,class_predictor:Y},box_predictor_3:{box_encoding_predictor:tt,class_predictor:st},box_predictor_4:{box_encoding_predictor:U,class_predictor:_t},box_predictor_5:{box_encoding_predictor:wt,class_predictor:Pt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function $o(o){let t=[],{extractWeights:e,getRemainingWeights:r}=W(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Hn(e,t),s=n(),i=a(),m={extra_dim:nt.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Yn(o,t){let e=O(o,t);function r(m,p,d){let u=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:u,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,d=`MobilenetV1/Conv2d_${m}_depthwise`,u=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,g=e(`${d}/depthwise_weights`,4,`${u}/filters`),_=e(`${d}/BatchNorm/gamma`,1,`${u}/batch_norm_scale`),h=e(`${d}/BatchNorm/beta`,1,`${u}/batch_norm_offset`),v=e(`${d}/BatchNorm/moving_mean`,1,`${u}/batch_norm_mean`),F=e(`${d}/BatchNorm/moving_variance`,1,`${u}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:_,batch_norm_offset:h,batch_norm_mean:v,batch_norm_variance:F},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let d=e(`${m}/weights`,4,`${p}/filters`),u=e(`${m}/biases`,1,`${p}/bias`);return{filters:d,bias:u}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),d=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function Oo(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Yn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!ht(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return A(o,t),{params:a,paramMappings:t}}var yt=b();var Lt=b();function J(o,t,e){return Lt.tidy(()=>{let r=Lt.conv2d(o,t.filters,e,"same");return r=Lt.add(r,t.batch_norm_offset),Lt.clipByValue(r,0,6)})}var Gn=.0010000000474974513;function zn(o,t,e){return yt.tidy(()=>{let r=yt.depthwiseConv2d(o,t.filters,e,"same");return r=yt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Gn),yt.clipByValue(r,0,6)})}function Vn(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function jo(o,t){return yt.tidy(()=>{let e,r=J(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=Vn(i);r=zn(r,a.depthwise_conv,c),r=J(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function Un(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),d=Math.max(r[e][1],r[e][3]),u=(s-n)*(i-a),l=(p-c)*(d-m);if(u<=0||l<=0)return 0;let g=Math.max(n,c),_=Math.max(a,m),h=Math.min(s,p),v=Math.min(i,d),F=Math.max(h-g,0)*Math.max(v-_,0);return F/(u+l-F)}function Ho(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>n).sort((p,d)=>d.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let d=p.score;for(let u=m.length-1;u>=0;--u){let l=Un(o,p.boxIndex,m[u]);if(l!==0&&(p.score*=c(l),p.score<=n))break}d===p.score&&m.push(p.boxIndex)}),m}var f=b();function Xn(o){let t=f.unstack(f.transpose(o,[1,0])),e=[f.sub(t[2],t[0]),f.sub(t[3],t[1])],r=[f.add(t[0],f.div(e[0],f.scalar(2))),f.add(t[1],f.div(e[1],f.scalar(2)))];return{sizes:e,centers:r}}function Jn(o,t){let{sizes:e,centers:r}=Xn(o),n=f.unstack(f.transpose(t,[1,0])),a=f.div(f.mul(f.exp(f.div(n[2],f.scalar(5))),e[0]),f.scalar(2)),s=f.add(f.mul(f.div(n[0],f.scalar(10)),e[0]),r[0]),i=f.div(f.mul(f.exp(f.div(n[3],f.scalar(5))),e[1]),f.scalar(2)),c=f.add(f.mul(f.div(n[1],f.scalar(10)),e[1]),r[1]);return f.transpose(f.stack([f.sub(s,a),f.sub(c,i),f.add(s,a),f.add(c,i)]),[1,0])}function Yo(o,t,e){return f.tidy(()=>{let r=o.shape[0],n=Jn(f.reshape(f.tile(e.extra_dim,[r,1,1]),[-1,4]),f.reshape(o,[-1,4]));n=f.reshape(n,[r,n.shape[0]/r,4]);let a=f.sigmoid(f.slice(t,[0,0,1],[-1,-1,-1])),s=f.slice(a,[0,0,0],[-1,-1,1]);s=f.reshape(s,[r,s.shape[1]]);let i=f.unstack(n),c=f.unstack(s);return{boxes:i,scores:c}})}var Oe=b();var $e=b();function Ut(o,t){return $e.tidy(()=>{let e=o.shape[0],r=$e.reshape(zt(o,t.box_encoding_predictor),[e,-1,1,4]),n=$e.reshape(zt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function Go(o,t,e){return Oe.tidy(()=>{let r=J(o,e.conv_0,[1,1]),n=J(r,e.conv_1,[2,2]),a=J(n,e.conv_2,[1,1]),s=J(a,e.conv_3,[2,2]),i=J(s,e.conv_4,[1,1]),c=J(i,e.conv_5,[2,2]),m=J(c,e.conv_6,[1,1]),p=J(m,e.conv_7,[2,2]),d=Ut(t,e.box_predictor_0),u=Ut(o,e.box_predictor_1),l=Ut(n,e.box_predictor_2),g=Ut(s,e.box_predictor_3),_=Ut(c,e.box_predictor_4),h=Ut(p,e.box_predictor_5),v=Oe.concat([d.boxPredictionEncoding,u.boxPredictionEncoding,l.boxPredictionEncoding,g.boxPredictionEncoding,_.boxPredictionEncoding,h.boxPredictionEncoding],1),F=Oe.concat([d.classPrediction,u.classPrediction,l.classPrediction,g.classPrediction,_.classPrediction,h.classPrediction],1);return{boxPredictions:v,classPredictions:F}})}var q=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Xt=class extends L{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return at.tidy(()=>{let r=at.cast(t.toBatchTensor(512,!1),"float32"),n=at.sub(at.mul(r,at.scalar(.007843137718737125)),at.scalar(1)),a=jo(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=Go(a.out,a.conv11,e.prediction_layer);return Yo(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await D(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new q(e),a=await D(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let y=1;y{let[k,Y]=[Math.max(0,v[y][0]),Math.min(1,v[y][2])].map(U=>U*h),[tt,st]=[Math.max(0,v[y][1]),Math.min(1,v[y][3])].map(U=>U*_);return new E(p[y],new oe(tt,k,st-tt,Y-k),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),F}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Oo(t)}extractParams(t){return $o(t)}};function zo(o){let t=new Xt;return t.extractWeights(o),t}function qn(o){return zo(o)}var Vo=class extends Xt{};var Uo=.4,Xo=[new x(.738768,.874946),new x(2.42204,2.65704),new x(4.30971,7.04493),new x(10.246,4.59428),new x(12.6868,11.8741)],Jo=[new x(1.603231,2.094468),new x(6.041143,7.080126),new x(2.882459,3.518061),new x(4.266906,5.178857),new x(9.041765,10.66308)],qo=[117.001,114.697,97.404],Zo="tiny_yolov2_model",Ko="tiny_yolov2_separable_conv_model";var C=b();var xr=o=>typeof o=="number";function oo(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!xr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>xr(t.x)&&xr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(xr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var K=b();var Z=b();function be(o){return Z.tidy(()=>{let t=Z.mul(o,Z.scalar(.10000000149011612));return Z.add(Z.relu(Z.sub(o,t)),t)})}function Ft(o,t){return K.tidy(()=>{let e=K.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=K.conv2d(e,t.conv.filters,[1,1],"valid"),e=K.sub(e,t.bn.sub),e=K.mul(e,t.bn.truediv),e=K.add(e,t.conv.bias),be(e)})}var St=b();function Tt(o,t){return St.tidy(()=>{let e=St.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=St.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=St.add(e,t.bias),be(e)})}var no=b();function Zn(o,t){let e=ce(o,t);function r(s,i){let c=no.tensor1d(o(s)),m=no.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=me(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function Qo(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=W(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=Zn(n,s),p;if(t.withSeparableConvs){let[d,u,l,g,_,h,v,F,y]=r,k=t.isFirstLayerConv2d?i(d,u,3,"conv0"):m(d,u,"conv0"),Y=m(u,l,"conv1"),tt=m(l,g,"conv2"),st=m(g,_,"conv3"),U=m(_,h,"conv4"),_t=m(h,v,"conv5"),wt=F?m(v,F,"conv6"):void 0,Pt=y?m(F,y,"conv7"):void 0,te=i(y||F||v,5*e,1,"conv8");p={conv0:k,conv1:Y,conv2:tt,conv3:st,conv4:U,conv5:_t,conv6:wt,conv7:Pt,conv8:te}}else{let[d,u,l,g,_,h,v,F,y]=r,k=c(d,u,"conv0"),Y=c(u,l,"conv1"),tt=c(l,g,"conv2"),st=c(g,_,"conv3"),U=c(_,h,"conv4"),_t=c(h,v,"conv5"),wt=c(v,F,"conv6"),Pt=c(F,y,"conv7"),te=i(y,5*e,1,"conv8");p={conv0:k,conv1:Y,conv2:tt,conv3:st,conv4:U,conv5:_t,conv6:wt,conv7:Pt,conv8:te}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function Kn(o,t){let e=O(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=pe(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function tn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=Kn(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return A(o,e),{params:s,paramMappings:e}}var ut=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var ao=class extends L{constructor(t){super("TinyYolov2");oo(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=Ft(t,e.conv0);return r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv1),r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv2),r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv3),r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv4),r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv5),r=C.maxPool(r,[2,2],[1,1],"same"),r=Ft(r,e.conv6),r=Ft(r,e.conv7),zt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?be(zt(t,e.conv0,"valid",!1)):Tt(t,e.conv0);return r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv1),r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv2),r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv3),r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv4),r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv5),r=C.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?Tt(r,e.conv6):r,r=e.conv7?Tt(r,e.conv7):r,zt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return C.tidy(()=>{let n=C.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?rt(n,this.config.meanRgb):n,n=n.div(C.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(n,r):this.runTinyYolov2(n,r)})}async forward(t,e){return this.forwardInput(await D(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:n}=new ut(e),a=await D(t),s=await this.forwardInput(a,r),i=C.tidy(()=>C.unstack(s)[0].expandDims()),c={width:a.getInputWidth(0),height:a.getInputHeight(0)},m=await this.extractBoxes(i,a.getReshapedInputDimensions(0),n);s.dispose(),i.dispose();let p=m.map(h=>h.box),d=m.map(h=>h.score),u=m.map(h=>h.classScore),l=m.map(h=>this.config.classes[h.label]);return Lr(p.map(h=>h.rescale(r)),d,this.config.iouThreshold,!0).map(h=>new Dt(d[h],u[h],l[h],p[h],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return tn(t,this.config)}extractParams(t){let e=this.config.filterSizes||ao.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return Qo(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:n,height:a}=e,s=Math.max(n,a),i=s/n,c=s/a,m=t.shape[1],p=this.config.anchors.length,[d,u,l]=C.tidy(()=>{let v=t.reshape([m,m,p,this.boxEncodingSize]),F=v.slice([0,0,0,0],[m,m,p,4]),y=v.slice([0,0,0,4],[m,m,p,1]),k=this.withClassScores?C.softmax(v.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):C.scalar(0);return[F,y,k]}),g=[],_=await u.array(),h=await d.array();for(let v=0;vr){let Y=(F+De(h[v][F][y][0]))/m*i,tt=(v+De(h[v][F][y][1]))/m*c,st=Math.exp(h[v][F][y][2])*this.config.anchors[y].x/m*i,U=Math.exp(h[v][F][y][3])*this.config.anchors[y].y/m*c,_t=Y-st/2,wt=tt-U/2,Pt={row:v,col:F,anchor:y},{classScore:te,label:po}=this.withClassScores?await this.extractPredictedClass(l,Pt):{classScore:1,label:0};g.push({box:new re(_t,wt,_t+st,wt+U),score:k,classScore:k*te,label:po,...Pt})}}return d.dispose(),u.dispose(),l.dispose(),g}async extractPredictedClass(t,e){let{row:r,col:n,anchor:a}=e,s=await t.array();return Array(this.config.classes.length).fill(0).map((i,c)=>s[r][n][a][c]).map((i,c)=>({classScore:i,label:c})).reduce((i,c)=>i.classScore>c.classScore?i:c)}},ge=ao;ge.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var ve=class extends ge{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:Uo,classes:["face"],...t?{anchors:Jo,meanRgb:qo}:{anchors:Xo,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new E(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?Ko:Zo}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function Qn(o,t=!0){let e=new ve(t);return e.extractWeights(o),e}var br=class extends ut{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var Q=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var je=b();var so=b();async function Jt(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>Vt(c)?n(c):c.detection),s=r||(t instanceof so.Tensor?await se(t,a):await ae(t,a)),i=await e(s);return s.forEach(c=>c instanceof so.Tensor&&c.dispose()),i}async function ye(o,t,e,r,n){return Jt([o],t,async a=>e(a[0]),r,n)}var en=.4,rn=[new x(1.603231,2.094468),new x(6.041143,7.080126),new x(2.882459,3.518061),new x(4.266906,5.178857),new x(9.041765,10.66308)],on=[117.001,114.697,97.404];var Fe=class extends ge{constructor(){let t={withSeparableConvs:!0,iouThreshold:en,classes:["face"],anchors:rn,meanRgb:on,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new E(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var T={ssdMobilenetv1:new Xt,tinyFaceDetector:new Fe,tinyYolov2:new ve,faceLandmark68Net:new fe,faceLandmark68TinyNet:new pr,faceRecognitionNet:new xe,faceExpressionNet:new ir,ageGenderNet:new mr},nn=(o,t)=>T.ssdMobilenetv1.locateFaces(o,t),ta=(o,t)=>T.tinyFaceDetector.locateFaces(o,t),ea=(o,t)=>T.tinyYolov2.locateFaces(o,t),an=o=>T.faceLandmark68Net.detectLandmarks(o),ra=o=>T.faceLandmark68TinyNet.detectLandmarks(o),oa=o=>T.faceRecognitionNet.computeFaceDescriptor(o),na=o=>T.faceExpressionNet.predictExpressions(o),aa=o=>T.ageGenderNet.predictAgeAndGender(o),sn=o=>T.ssdMobilenetv1.load(o),sa=o=>T.tinyFaceDetector.load(o),ia=o=>T.tinyYolov2.load(o),ca=o=>T.faceLandmark68Net.load(o),ma=o=>T.faceLandmark68TinyNet.load(o),pa=o=>T.faceRecognitionNet.load(o),da=o=>T.faceExpressionNet.load(o),ua=o=>T.ageGenderNet.load(o),la=sn,fa=nn,ha=an;var io=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},we=class extends io{async run(){let t=await this.parentTask,e=await Jt(t,this.input,async r=>Promise.all(r.map(n=>T.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>cr(r,e[n]))}withAgeAndGender(){return new Te(this,this.input)}},Pe=class extends io{async run(){let t=await this.parentTask;if(!t)return;let e=await ye(t,this.input,r=>T.faceExpressionNet.predictExpressions(r),this.extractedFaces);return cr(t,e)}withAgeAndGender(){return new _e(this,this.input)}},Kt=class extends we{withAgeAndGender(){return new qt(this,this.input)}withFaceDescriptors(){return new At(this,this.input)}},Qt=class extends Pe{withAgeAndGender(){return new Zt(this,this.input)}withFaceDescriptor(){return new Wt(this,this.input)}};var co=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Te=class extends co{async run(){let t=await this.parentTask,e=await Jt(t,this.input,async r=>Promise.all(r.map(n=>T.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return fr(hr(r,s,i),a)})}withFaceExpressions(){return new we(this,this.input)}},_e=class extends co{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await ye(t,this.input,a=>T.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return fr(hr(t,r,n),e)}withFaceExpressions(){return new Pe(this,this.input)}},qt=class extends Te{withFaceExpressions(){return new Kt(this,this.input)}withFaceDescriptors(){return new At(this,this.input)}},Zt=class extends _e{withFaceExpressions(){return new Qt(this,this.input)}withFaceDescriptor(){return new Wt(this,this.input)}};var gr=class extends Q{constructor(t,e){super();this.parentTask=t;this.input=e}},At=class extends gr{async run(){let t=await this.parentTask;return(await Jt(t,this.input,r=>Promise.all(r.map(n=>T.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>lr(t[n],r))}withFaceExpressions(){return new Kt(this,this.input)}withAgeAndGender(){return new qt(this,this.input)}},Wt=class extends gr{async run(){let t=await this.parentTask;if(!t)return;let e=await ye(t,this.input,r=>T.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return lr(t,e)}withFaceExpressions(){return new Qt(this,this.input)}withAgeAndGender(){return new Zt(this,this.input)}};var vr=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?T.faceLandmark68TinyNet:T.faceLandmark68Net}},yr=class extends vr{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof je.Tensor?await se(this.input,e):await ae(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof je.Tensor&&a.dispose()),t.map((a,s)=>le(a,n[s]))}withFaceExpressions(){return new Kt(this,this.input)}withAgeAndGender(){return new qt(this,this.input)}withFaceDescriptors(){return new At(this,this.input)}},Fr=class extends vr{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof je.Tensor?await se(this.input,[e]):await ae(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof je.Tensor&&a.dispose()),le(t,n)}withFaceExpressions(){return new Qt(this,this.input)}withAgeAndGender(){return new Zt(this,this.input)}withFaceDescriptor(){return new Wt(this,this.input)}};var Tr=class extends Q{constructor(t,e=new q){super();this.input=t;this.options=e}},He=class extends Tr{async run(){let{input:t,options:e}=this,r;if(e instanceof br)r=T.tinyFaceDetector.locateFaces(t,e);else if(e instanceof q)r=T.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ut)r=T.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>Ot({},r)))})}withFaceLandmarks(t=!1){return new yr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new we(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Te(this.runAndExtendWithFaceDetections(),this.input)}},_r=class extends Tr{async run(){let t=await new He(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?Ot({},e):void 0)})}withFaceLandmarks(t=!1){return new Fr(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Pe(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new _e(this.runAndExtendWithFaceDetection(),this.input)}};function xa(o,t=new q){return new _r(o,t)}function wr(o,t=new q){return new He(o,t)}async function cn(o,t){return wr(o,new q(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function ba(o,t={}){return wr(o,new ut(t)).withFaceLandmarks().withFaceDescriptors()}var ga=cn;function mo(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var Pr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof xt)return s;if(s instanceof Float32Array)return new xt(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new xt(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>mo(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new Ee(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>xt.fromJSON(r));return new Pr(e,t.distanceThreshold)}};function va(o){let t=new Fe;return t.extractWeights(o),t}function mn(o,t){let{width:e,height:r}=new S(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>mn(n,{width:e,height:r}));if(Vt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return le(Ot(o,n),a)}return mt(o)?Ot(o,o.detection.forSize(e,r)):o instanceof z||o instanceof E?o.forSize(e,r):o}var Fa=typeof process!="undefined",Ta=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",_a={faceapi:Do,node:Fa,browser:Ta};export{mr as AgeGenderNet,re as BoundingBox,P as Box,Q as ComposableTask,At as ComputeAllFaceDescriptorsTask,gr as ComputeFaceDescriptorsTaskBase,Wt as ComputeSingleFaceDescriptorTask,yr as DetectAllFaceLandmarksTask,He as DetectAllFacesTask,vr as DetectFaceLandmarksTaskBase,Tr as DetectFacesTaskBase,Fr as DetectSingleFaceLandmarksTask,_r as DetectSingleFaceTask,S as Dimensions,Xr as FACE_EXPRESSION_LABELS,E as FaceDetection,Vo as FaceDetectionNet,ir as FaceExpressionNet,kt as FaceExpressions,fe as FaceLandmark68Net,pr as FaceLandmark68TinyNet,So as FaceLandmarkNet,z as FaceLandmarks,ho as FaceLandmarks5,ne as FaceLandmarks68,Ee as FaceMatch,Pr as FaceMatcher,xe as FaceRecognitionNet,vt as Gender,Me as LabeledBox,xt as LabeledFaceDescriptors,bt as NetInput,L as NeuralNetwork,Dt as ObjectDetection,x as Point,xo as PredictedBox,oe as Rect,Xt as SsdMobilenetv1,q as SsdMobilenetv1Options,Fe as TinyFaceDetector,br as TinyFaceDetectorOptions,ve as TinyYolov2,ut as TinyYolov2Options,ga as allFaces,cn as allFacesSsdMobilenetv1,ba as allFacesTinyYolov2,Hr as awaitMediaLoaded,Yr as bufferToImage,oa as computeFaceDescriptor,Yt as createCanvas,ke as createCanvasFromMedia,qn as createFaceDetectionNet,$n as createFaceRecognitionNet,zo as createSsdMobilenetv1,va as createTinyFaceDetector,Qn as createTinyYolov2,wr as detectAllFaces,an as detectFaceLandmarks,ra as detectFaceLandmarksTiny,ha as detectLandmarks,xa as detectSingleFace,Po as draw,w as env,mo as euclideanDistance,fr as extendWithAge,lr as extendWithFaceDescriptor,Ot as extendWithFaceDetection,cr as extendWithFaceExpressions,le as extendWithFaceLandmarks,hr as extendWithGender,se as extractFaceTensors,ae as extractFaces,Mn as fetchImage,Vr as fetchJson,Cn as fetchNetWeights,Gt as fetchOrThrow,R as getContext2dOrThrow,Ht as getMediaDimensions,Gr as imageTensorToCanvas,zr as imageToSquare,vn as inverseSigmoid,kr as iou,Je as isMediaElement,Ne as isMediaLoaded,On as isWithAge,mt as isWithFaceDetection,Jr as isWithFaceExpressions,Vt as isWithFaceLandmarks,jn as isWithGender,ua as loadAgeGenderModel,la as loadFaceDetectionModel,da as loadFaceExpressionModel,ca as loadFaceLandmarkModel,ma as loadFaceLandmarkTinyModel,pa as loadFaceRecognitionModel,sn as loadSsdMobilenetv1Model,sa as loadTinyFaceDetectorModel,ia as loadTinyYolov2Model,Ur as loadWeightMap,fa as locateFaces,Nn as matchDimensions,Ir as minBbox,T as nets,Lr as nonMaxSuppression,rt as normalize,Sr as padToSquare,aa as predictAgeAndGender,na as recognizeFaceExpressions,mn as resizeResults,jt as resolveInput,gn as shuffleArray,De as sigmoid,nn as ssdMobilenetv1,ya as tf,ta as tinyFaceDetector,ea as tinyYolov2,D as toNetInput,lo as utils,oo as validateConfig,_a as version}; +var pn=Object.create,Ye=Object.defineProperty,dn=Object.getPrototypeOf,un=Object.prototype.hasOwnProperty,ln=Object.getOwnPropertyNames,fn=Object.getOwnPropertyDescriptor;var Dr=o=>Ye(o,"__esModule",{value:!0});var uo=(o,t)=>()=>(t||(t={exports:{}},o(t.exports,t)),t.exports),Er=(o,t)=>{for(var e in t)Ye(o,e,{get:t[e],enumerable:!0})},lt=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ln(t))!un.call(o,r)&&r!=="default"&&Ye(o,r,{get:()=>t[r],enumerable:!(e=fn(t,r))||e.enumerable});return o},hn=o=>lt(Dr(Ye(o!=null?pn(dn(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);import*as Ca from"@tensorflow/tfjs/dist/index.js";import*as Na from"@tensorflow/tfjs-backend-wasm";var b=uo(xn=>{Dr(xn);lt(xn,Ca);lt(xn,Na)});var go=uo((_n,bo)=>{Dr(_n);Er(_n,{isNodejs:()=>wn});function wn(){return typeof global=="object"&&!0&&typeof bo!="undefined"&&typeof process!="undefined"&&!!process.version}});var ya=b();var Po={};Er(Po,{AnchorPosition:()=>pt,DrawBox:()=>Ue,DrawBoxOptions:()=>jr,DrawFaceLandmarks:()=>Zr,DrawFaceLandmarksOptions:()=>qr,DrawTextField:()=>Mt,DrawTextFieldOptions:()=>Ce,drawContour:()=>ft,drawDetections:()=>En,drawFaceExpressions:()=>kn,drawFaceLandmarks:()=>Ln});function ft(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var lo={};Er(lo,{computeReshapedDimensions:()=>Nr,getCenterPoint:()=>$t,isDimensions:()=>ze,isEven:()=>Ge,isFloat:()=>Cr,isTensor:()=>Bt,isTensor1D:()=>bn,isTensor2D:()=>Mr,isTensor3D:()=>ht,isTensor4D:()=>G,isValidNumber:()=>et,isValidProbablitiy:()=>ee,range:()=>it,round:()=>Rt});var fo=b();var S=class{constructor(t,e){if(!et(t)||!et(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new S(1/this.width,1/this.height)}};function Bt(o,t){return o instanceof fo.Tensor&&o.shape.length===t}function bn(o){return Bt(o,1)}function Mr(o){return Bt(o,2)}function ht(o){return Bt(o,3)}function G(o){return Bt(o,4)}function Cr(o){return o%1!=0}function Ge(o){return o%2==0}function Rt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function ze(o){return o&&o.width&&o.height}function Nr({width:o,height:t},e){let r=e/Math.max(t,o);return new S(Math.round(o*r),Math.round(t*r))}function $t(o){return o.reduce((t,e)=>t.add(e),new x(0,0)).div(new x(o.length,o.length))}function it(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function ee(o){return et(o)&&o>=0&&o<=1}var x=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new x(this.x+t.x,this.y+t.y)}sub(t){return new x(this.x-t.x,this.y-t.y)}mul(t){return new x(this.x*t.x,this.y*t.y)}div(t){return new x(this.x/t.x,this.y/t.y)}abs(){return new x(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new x(Math.floor(this.x),Math.floor(this.y))}};var P=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!P.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(et),a=[r.x,r.y,r.width,r.height].every(et);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];P.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new x(this.left,this.top)}get topRight(){return new x(this.right,this.top)}get bottomLeft(){return new x(this.left,this.bottom)}get bottomRight(){return new x(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new P({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new P({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-d+e+r,d=e),u>t&&(c=-u+t+n,u=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:u,x:m,ex:d,w:r,h:n}}calibrate(t){return new P({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var re=class extends P{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var Dt=class{constructor(t,e,r,n,a){this._imageDims=new S(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new P(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new P(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new Dt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var E=class extends Dt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new E(r,n,a)}};function kr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function Ir(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var ct=b();function rt(o,t){return ct.tidy(()=>{let[e,r,n]=t,a=ct.fill([...o.shape.slice(0,3),1],e,"float32"),s=ct.fill([...o.shape.slice(0,3),1],r,"float32"),i=ct.fill([...o.shape.slice(0,3),1],n,"float32"),c=ct.concat([a,s,i],3);return ct.sub(o,c)})}var Et=b();function Sr(o,t=!1){return Et.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=u=>{let l=o.shape.slice();return l[s]=u,Et.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],d=[t&&m?i(m):null,o,c].filter(u=>!!u).map(u=>Et.cast(u,"float32"));return Et.concat(d,s)})}function gn(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function De(o){return 1/(1+Math.exp(-o))}function vn(o){return Math.log(o/(1-o))}var oe=class extends P{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var yn=.5,Fn=.43,Tn=.45,z=class{constructor(t,e,r=new x(0,0)){let{width:n,height:a}=e;this._imgDims=new S(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new x(n,a)).add(r))}get shift(){return new x(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new x(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new x(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof E?t.box.floor():new P(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=d=>n.sub(d).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/Tn),c=$t(t),m=Math.floor(Math.max(0,c.x-yn*i)),p=Math.floor(Math.max(0,c.y-Fn*i));return new oe(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=Ir(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var ho=class extends z{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],$t([t[3],t[4]])]}};var ne=class extends z{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map($t)}};var Ee=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Rt(this.distance)})`:""}`}};var Me=class extends P{static assertIsValidLabeledBox(t,e){if(P.assertIsValidBox(t,e),!et(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t);this._label=e}get label(){return this._label}};var xt=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new xt(t.label,e)}};var xo=class extends Me{static assertIsValidPredictedBox(t,e){if(Me.assertIsValidLabeledBox(t,e),!ee(t.score)||!ee(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,n){super(t,e);this._score=r,this._classScore=n}get score(){return this._score}get classScore(){return this._classScore}};function mt(o){return o.detection instanceof E}function Ot(o,t){return{...o,...{detection:t}}}function Ar(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Ve(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Wr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch,a=Ve();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:n,...a}}function Br(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var Rr=hn(go()),I;function Pn(){if(!I)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return I}function $r(o){I=o}function Or(){return Br()?$r(Ar()):(0,Rr.isNodejs)()?$r(Wr()):null}function Dn(o){if(I||Or(),!I)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=I.Canvas,Image:e=I.Image}=o;I.Canvas=t,I.Image=e,I.createCanvasElement=o.createCanvasElement||(()=>new t),I.createImageElement=o.createImageElement||(()=>new e),I.ImageData=o.ImageData||I.ImageData,I.Video=o.Video||I.Video,I.fetch=o.fetch||I.fetch,I.readFile=o.readFile||I.readFile}var w={getEnv:Pn,setEnv:$r,initialize:Or,createBrowserEnv:Ar,createFileSystem:Ve,createNodejsEnv:Wr,monkeyPatch:Dn,isBrowser:Br,isNodejs:Rr.isNodejs};Or();function jt(o){return!w.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function R(o){let{Canvas:t,CanvasRenderingContext2D:e}=w.getEnv();if(o instanceof e)return o;let r=jt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var pt;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(pt||(pt={}));var Ce=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||pt.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},Mt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof Mt?t.text:t,this.anchor=e,this.options=new Ce(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let g=c+d.x,_=c+d.y+(l+1)*s;r.fillText(u,g,_)})}};var jr=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:pt.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Ce({...s,...a})}},Ue=class{constructor(t,e={}){this.box=new P(t),this.options=new jr(e)}draw(t){let e=R(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new Mt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function En(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof E?r.score:mt(r)?r.detection.score:void 0,a=r instanceof E?r.box:mt(r)?r.detection.box:new P(r),s=n?`${Rt(n)}`:void 0;new Ue(a,{label:s}).draw(o)})}var ue=b();function Ne(o){let{Image:t,Video:e}=w.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function Hr(o){return new Promise((t,e)=>{if(o instanceof w.getEnv().Canvas||Ne(o))return t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function Yr(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=w.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Ht(o){let{Image:t,Video:e}=w.getEnv();return o instanceof t?new S(o.naturalWidth,o.naturalHeight):o instanceof e?new S(o.videoWidth,o.videoHeight):new S(o.width,o.height)}function Yt({width:o,height:t}){let{createCanvasElement:e}=w.getEnv(),r=e();return r.width=o,r.height=t,r}function ke(o,t){let{ImageData:e}=w.getEnv();if(!(o instanceof e)&&!Ne(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Ht(o),a=Yt({width:r,height:n});return o instanceof e?R(a).putImageData(o,0,0):R(a).drawImage(o,0,0,r,n),a}var Xe=b();async function Gr(o,t){let e=t||w.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(G(o)?1:0),s=Xe.tidy(()=>o.as3D(r,n,a).toInt());return await Xe.browser.toPixels(s,e),s.dispose(),e}function Je(o){let{Image:t,Canvas:e,Video:r}=w.getEnv();return o instanceof t||o instanceof e||o instanceof r}var X=b();function zr(o,t,e=!1){let{Image:r,Canvas:n}=w.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Yt({width:1,height:1});let a=Ht(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=Yt({width:t,height:t}),p=o instanceof n?o:ke(o),d=Math.abs(i-c)/2,u=e&&i0&&p.height>0&&R(m).drawImage(p,u,l,i,c),m}var bt=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(ht(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(G(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof w.getEnv().Canvas?r:ke(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return it(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Nr({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,X.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof X.Tensor){let i=G(s)?s:s.expandDims();return i=Sr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=X.image.resizeBilinear(i,[t,t])),i.as3D(t,t,3)}if(s instanceof w.getEnv().Canvas)return X.browser.fromPixels(zr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return X.stack(r.map(a=>X.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function D(o){if(o instanceof bt)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(jt);return r.forEach((n,a)=>{if(!Je(n)&&!ht(n)&&!G(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(G(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>Je(n)&&Hr(n))),new bt(r,Array.isArray(o))}async function ae(o,t){let{Canvas:e}=w.getEnv(),r=o;if(!(o instanceof e)){let s=await D(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await Gr(i)}let n=R(r);return t.map(s=>s instanceof E?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=Yt({width:c,height:m});return c>0&&m>0&&R(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var qe=b();async function se(o,t){if(!ht(o)&&!G(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(G(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return qe.tidy(()=>{let[e,r,n]=o.shape.slice(G(o)?1:0);return t.map(i=>i instanceof E?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).map(({x:i,y:c,width:m,height:p})=>qe.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function Gt(o,t){let{fetch:e}=w.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function Mn(o){let t=await Gt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return Yr(e)}async function Vr(o){return(await Gt(o)).json()}async function Cn(o){return new Float32Array(await(await Gt(o)).arrayBuffer())}var vo=b();function Ze(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function Ur(o,t){let{manifestUri:e,modelBaseUri:r}=Ze(o,t),n=await Vr(e);return vo.io.loadWeights(n,r)}function Nn(o,t,e=!1){let{width:r,height:n}=e?Ht(t):t;return o.width=r,o.height=n,{width:r,height:n}}var Nt=b();var gt=b();var L=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof gt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof gt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=gt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await Ur(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=w.getEnv(),{manifestUri:r,modelBaseUri:n}=Ze(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(d=>d.buffer))),s=gt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof gt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var M=b();var ie=b();function $(o,t,e){return ie.tidy(()=>{let r=ie.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=ie.add(r,t.bias),r})}function Ke(o,t,e=!1){return M.tidy(()=>{let r=M.relu(e?M.add(M.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):$(o,t.conv0,[2,2])),n=$(r,t.conv1,[1,1]),a=M.relu(M.add(r,n)),s=$(a,t.conv2,[1,1]);return M.relu(M.add(r,M.add(n,s)))})}function Ie(o,t,e=!1,r=!0){return M.tidy(()=>{let n=M.relu(e?M.add(M.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):$(o,t.conv0,r?[2,2]:[1,1])),a=$(n,t.conv1,[1,1]),s=M.relu(M.add(n,a)),i=$(s,t.conv2,[1,1]),c=M.relu(M.add(n,M.add(a,i))),m=$(c,t.conv3,[1,1]);return M.relu(M.add(n,M.add(a,M.add(i,m))))})}var Ct=b();function zt(o,t,e="same",r=!1){return Ct.tidy(()=>{let n=Ct.add(Ct.conv2d(o,t.filters,[1,1],e),t.bias);return r?Ct.relu(n):n})}function A(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var Qe=b();function ce(o,t){return(e,r,n,a)=>{let s=Qe.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Qe.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var tr=b();function er(o,t){return(e,r,n)=>{let a=tr.tensor2d(o(e*r),[e,r]),s=tr.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Le=b();var rr=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function me(o,t){return(e,r,n)=>{let a=Le.tensor4d(o(3*3*e),[3,3,e,1]),s=Le.tensor4d(o(e*r),[1,1,e,r]),i=Le.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new rr(a,s,i)}}function pe(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new rr(e,r,n)}}function O(o,t){return(e,r,n)=>{let a=o[e];if(!Bt(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function W(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function or(o,t){let e=ce(o,t),r=me(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),d=r(i,i,`${c}/conv1`),u=r(i,i,`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function a(s,i,c,m=!1){let{conv0:p,conv1:d,conv2:u}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function yo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=W(o),{extractDenseBlock4Params:n}=or(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function nr(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function ar(o,t){let e=O(o,t),r=nr(e),n=pe(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:d}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`),u=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:d,conv3:u}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Fo(o){let t=[],{extractDenseBlock4Params:e}=ar(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return A(o,t),{params:r,paramMappings:t}}var Se=class extends L{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return Nt.tidy(()=>{let r=Nt.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(Nt.scalar(255)),s=Ie(a,e.dense0,!0);return s=Ie(s,e.dense1),s=Ie(s,e.dense2),s=Ie(s,e.dense3),s=Nt.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await D(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Fo(t)}extractParams(t){return yo(t)}};var wo=b();var de=b();function Ae(o,t){return de.tidy(()=>de.add(de.matMul(o,t.weights),t.bias))}function To(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=W(o),i=er(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function _o(o){let t=[],e=O(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return A(o,t),{params:n,paramMappings:t}}function sr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var We=class extends L{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return wo.tidy(()=>{let r=t instanceof bt?this.faceFeatureExtractor.forwardInput(t):t;return Ae(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return To(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=sr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),_o(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,a=t.slice(0,t.length-n),s=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Xr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],kt=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Xr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Xr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var ir=class extends We{constructor(t=new Se){super("FaceExpressionNet",t)}forwardInput(t){return ue.tidy(()=>ue.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await D(t))}async predictExpressions(t){let e=await D(t),r=await this.forwardInput(e),n=await Promise.all(ue.unstack(r).map(async s=>{let i=await s.data();return s.dispose(),i}));r.dispose();let a=n.map(s=>new kt(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Jr(o){return o.expressions instanceof kt}function cr(o,t){return{...o,...{expressions:t}}}function kn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof kt?a:Jr(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(d=>d.probability>e),m=mt(a)?a.detection.box.bottomLeft:r||new x(0,0);new Mt(c.map(d=>`${d.expression} (${Rt(d.probability)})`),m).draw(o)})}function Vt(o){return mt(o)&&o.landmarks instanceof z&&o.unshiftedLandmarks instanceof z&&o.alignedRect instanceof E}function In(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function le(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new E(o.detection.score,n.rescale(a.reverse()),a),i=In(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var qr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},Zr=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new qr(e)}draw(t){let e=R(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof ne&&(e.strokeStyle=s,e.lineWidth=a,ft(e,this.faceLandmarks.getJawOutline()),ft(e,this.faceLandmarks.getLeftEyeBrow()),ft(e,this.faceLandmarks.getRightEyeBrow()),ft(e,this.faceLandmarks.getNose()),ft(e,this.faceLandmarks.getLeftEye(),!0),ft(e,this.faceLandmarks.getRightEye(),!0),ft(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function Ln(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof z?r:Vt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new Zr(n).draw(o)})}var Do="1.1.2";var dt=b();var N=b();function Sn(o,t){let e=ce(o,t),r=me(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Eo(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=W(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=Sn(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),d=i(64,128,"entry_flow/reduction_block_1"),u={conv_in:m,reduction_block_0:p,reduction_block_1:d},l={};it(t,0,1).forEach(v=>{l[`main_block_${v}`]=c(128,`middle_flow/main_block_${v}`)});let g=i(128,256,"exit_flow/reduction_block"),_=s(256,512,"exit_flow/separable_conv"),h={reduction_block:g,separable_conv:_};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:u,middle_flow:l,exit_flow:h}}}function An(o,t){let e=O(o,t),r=nr(e),n=pe(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function Mo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=An(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},d={};it(t,0,1).forEach(_=>{d[`main_block_${_}`]=s(`middle_flow/main_block_${_}`)});let u=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),g={reduction_block:u,separable_conv:l};return A(o,e),{params:{entry_flow:p,middle_flow:d,exit_flow:g},paramMappings:e}}function Co(o,t,e){return N.add(N.conv2d(o,t.filters,e,"same"),t.bias)}function Kr(o,t,e=!0){let r=e?N.relu(o):o;return r=$(r,t.separable_conv0,[1,1]),r=$(N.relu(r),t.separable_conv1,[1,1]),r=N.maxPool(r,[3,3],[2,2],"same"),r=N.add(r,Co(o,t.expansion_conv,[2,2])),r}function Wn(o,t){let e=$(N.relu(o),t.separable_conv0,[1,1]);return e=$(N.relu(e),t.separable_conv1,[1,1]),e=$(N.relu(e),t.separable_conv2,[1,1]),e=N.add(e,o),e}var Qr=class extends L{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return N.tidy(()=>{let r=N.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(N.scalar(256)),s=N.relu(Co(a,e.entry_flow.conv_in,[2,2]));return s=Kr(s,e.entry_flow.reduction_block_0,!1),s=Kr(s,e.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(i=>{s=Wn(s,e.middle_flow[`main_block_${i}`])}),s=Kr(s,e.exit_flow.reduction_block),s=N.relu($(s,e.exit_flow.separable_conv,[1,1])),s})}async forward(t){return this.forwardInput(await D(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return Mo(t,this._numMainBlocks)}extractParams(t){return Eo(t,this._numMainBlocks)}};function No(o){let t=[],{extractWeights:e,getRemainingWeights:r}=W(o),n=er(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function ko(o){let t=[],e=O(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return A(o,t),{params:n,paramMappings:t}}var vt;(function(o){o.FEMALE="female",o.MALE="male"})(vt||(vt={}));var mr=class extends L{constructor(t=new Qr(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return dt.tidy(()=>{let r=t instanceof bt?this.faceFeatureExtractor.forwardInput(t):t,n=dt.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),a=Ae(n,e.fc.age).as1D(),s=Ae(n,e.fc.gender);return{age:a,gender:s}})}forwardInput(t){return dt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:dt.softmax(r)}})}async forward(t){return this.forwardInput(await D(t))}async predictAgeAndGender(t){let e=await D(t),r=await this.forwardInput(e),n=dt.unstack(r.age),a=dt.unstack(r.gender),s=n.map((c,m)=>({ageTensor:c,genderTensor:a[m]})),i=await Promise.all(s.map(async({ageTensor:c,genderTensor:m})=>{let p=(await c.data())[0],d=(await m.data())[0],u=d>.5,l=u?vt.MALE:vt.FEMALE,g=u?d:1-d;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:g}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?i:i[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return No(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=sr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),ko(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),n=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var j=b();var Be=class extends We{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return j.tidy(()=>{let s=(d,u)=>j.stack([j.fill([68],d,"float32"),j.fill([68],u,"float32")],1).as2D(1,136).as1D(),i=(d,u)=>{let{width:l,height:g}=n[d];return u(l,g)?Math.abs(l-g)/2:0},c=d=>i(d,(u,l)=>ui(d,(u,l)=>ls(c(u),m(u))))).div(j.stack(Array.from(Array(a),(d,u)=>s(n[u].width,n[u].height))))})}forwardInput(t){return j.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await D(t))}async detectLandmarks(t){let e=await D(t),r=j.tidy(()=>j.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(await a.data()),c=i.filter((p,d)=>Ge(d)),m=i.filter((p,d)=>!Ge(d));return new ne(Array(68).fill(0).map((p,d)=>new x(c[d],m[d])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var fe=class extends Be{constructor(t=new Se){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var It=b();function Io(o){let t=[],{extractDenseBlock3Params:e}=ar(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return A(o,t),{params:r,paramMappings:t}}function Lo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=W(o),{extractDenseBlock3Params:n}=or(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var to=class extends L{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return It.tidy(()=>{let r=It.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(It.scalar(255)),s=Ke(a,e.dense0,!0);return s=Ke(s,e.dense1),s=Ke(s,e.dense2),s=It.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await D(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Io(t)}extractParams(t){return Lo(t)}};var pr=class extends Be{constructor(t=new to){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var So=class extends fe{};var V=b();var he=b();var dr=b();function Ao(o,t){return dr.add(dr.mul(o,t.weights),t.biases)}function eo(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=he.conv2d(o,a,e,n);return i=he.add(i,s),i=Ao(i,t.scale),r?he.relu(i):i}function Wo(o,t){return eo(o,t,[1,1],!0)}function ro(o,t){return eo(o,t,[1,1],!1)}function ur(o,t){return eo(o,t,[2,2],!0,"valid")}var H=b();function Bn(o,t){function e(i,c,m){let p=o(i),d=p.length/(c*m*m);if(Cr(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return H.tidy(()=>H.transpose(H.tensor4d(p,[c,d,m,m]),[2,3,1,0]))}function r(i,c,m,p){let d=e(i,c,m),u=H.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:u}}function n(i,c){let m=H.tensor1d(o(i)),p=H.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let d=r(i,c,m,`${p}/conv`),u=n(c,`${p}/scale`);return{conv:d,scale:u}}function s(i,c,m,p,d=!1){let u=a((d?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:u,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Bo(o){let{extractWeights:t,getRemainingWeights:e}=W(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=Bn(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),d=a(36864,64,3,"conv64_1"),u=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),g=a(147456,128,3,"conv128_down",!0),_=a(147456,128,3,"conv128_1"),h=a(147456,128,3,"conv128_2"),v=a(589824,256,3,"conv256_down",!0),F=a(589824,256,3,"conv256_1"),y=a(589824,256,3,"conv256_2"),k=a(589824,256,3,"conv256_down_out"),Y=H.tidy(()=>H.transpose(H.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:d,conv64_2:u,conv64_3:l,conv128_down:g,conv128_1:_,conv128_2:h,conv256_down:v,conv256_1:F,conv256_2:y,conv256_down_out:k,fc:Y},paramMappings:r}}function Rn(o,t){let e=O(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function Ro(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Rn(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),d=r("conv64_3"),u=r("conv128_down"),l=r("conv128_1"),g=r("conv128_2"),_=r("conv256_down"),h=r("conv256_1"),v=r("conv256_2"),F=r("conv256_down_out"),{fc:y}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!Mr(y))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${y}`);let k={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:d,conv128_down:u,conv128_1:l,conv128_2:g,conv256_down:_,conv256_1:h,conv256_2:v,conv256_down_out:F,fc:y};return A(o,t),{params:k,paramMappings:t}}var B=b();function ot(o,t){let e=Wo(o,t.conv1);return e=ro(e,t.conv2),e=B.add(e,o),e=B.relu(e),e}function Re(o,t){let e=ur(o,t.conv1);e=ro(e,t.conv2);let r=B.avgPool(o,2,2,"valid"),n=B.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=B.zeros(i);e=B.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=B.zeros(m);e=B.concat([e,p],2)}return r=a?B.concat([r,n],3):r,e=B.add(r,e),e=B.relu(e),e}var xe=class extends L{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return V.tidy(()=>{let r=V.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(V.scalar(256)),s=ur(a,e.conv32_down);s=V.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Re(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Re(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Re(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Re(s,e.conv256_down_out);let i=s.mean([1,2]);return V.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await D(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)==null?void 0:a.some(s=>s<=0))return new Float32Array(128);let e=await D(t),r=V.tidy(()=>V.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return Ro(t)}extractParams(t){return Bo(t)}};function $n(o){let t=new xe;return t.extractWeights(o),t}function lr(o,t){return{...o,...{descriptor:t}}}function On(o){return typeof o.age=="number"}function fr(o,t){return{...o,...{age:t}}}function jn(o){return(o.gender===vt.MALE||o.gender===vt.FEMALE)&&ee(o.genderProbability)}function hr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var at=b();var nt=b();function Hn(o,t){function e(c,m){let p=nt.tensor4d(o(3*3*c),[3,3,c,1]),d=nt.tensor1d(o(c)),u=nt.tensor1d(o(c)),l=nt.tensor1d(o(c)),g=nt.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:u,batch_norm_mean:l,batch_norm_variance:g}}function r(c,m,p,d,u){let l=nt.tensor4d(o(c*m*p*p),[p,p,c,m]),g=nt.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${u?"batch_norm_offset":"bias"}`}),{filters:l,bias:g}}function n(c,m,p,d){let{filters:u,bias:l}=r(c,m,p,d,!0);return{filters:u,batch_norm_offset:l}}function a(c,m,p){let d=e(c,`${p}/depthwise_conv`),u=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:u}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),d=a(128,128,"mobilenetv1/conv_3"),u=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),g=a(256,512,"mobilenetv1/conv_6"),_=a(512,512,"mobilenetv1/conv_7"),h=a(512,512,"mobilenetv1/conv_8"),v=a(512,512,"mobilenetv1/conv_9"),F=a(512,512,"mobilenetv1/conv_10"),y=a(512,512,"mobilenetv1/conv_11"),k=a(512,1024,"mobilenetv1/conv_12"),Y=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:g,conv_7:_,conv_8:h,conv_9:v,conv_10:F,conv_11:y,conv_12:k,conv_13:Y}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),d=n(128,256,3,"prediction_layer/conv_3"),u=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),g=n(256,64,1,"prediction_layer/conv_6"),_=n(64,128,3,"prediction_layer/conv_7"),h=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),v=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),F=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),y=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),k=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),Y=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),tt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),st=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),U=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),_t=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),wt=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Pt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:g,conv_7:_,box_predictor_0:{box_encoding_predictor:h,class_predictor:v},box_predictor_1:{box_encoding_predictor:F,class_predictor:y},box_predictor_2:{box_encoding_predictor:k,class_predictor:Y},box_predictor_3:{box_encoding_predictor:tt,class_predictor:st},box_predictor_4:{box_encoding_predictor:U,class_predictor:_t},box_predictor_5:{box_encoding_predictor:wt,class_predictor:Pt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function $o(o){let t=[],{extractWeights:e,getRemainingWeights:r}=W(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Hn(e,t),s=n(),i=a(),m={extra_dim:nt.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Yn(o,t){let e=O(o,t);function r(m,p,d){let u=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:u,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,d=`MobilenetV1/Conv2d_${m}_depthwise`,u=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,g=e(`${d}/depthwise_weights`,4,`${u}/filters`),_=e(`${d}/BatchNorm/gamma`,1,`${u}/batch_norm_scale`),h=e(`${d}/BatchNorm/beta`,1,`${u}/batch_norm_offset`),v=e(`${d}/BatchNorm/moving_mean`,1,`${u}/batch_norm_mean`),F=e(`${d}/BatchNorm/moving_variance`,1,`${u}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:_,batch_norm_offset:h,batch_norm_mean:v,batch_norm_variance:F},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let d=e(`${m}/weights`,4,`${p}/filters`),u=e(`${m}/biases`,1,`${p}/bias`);return{filters:d,bias:u}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),d=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function Oo(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Yn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!ht(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return A(o,t),{params:a,paramMappings:t}}var yt=b();var Lt=b();function J(o,t,e){return Lt.tidy(()=>{let r=Lt.conv2d(o,t.filters,e,"same");return r=Lt.add(r,t.batch_norm_offset),Lt.clipByValue(r,0,6)})}var Gn=.0010000000474974513;function zn(o,t,e){return yt.tidy(()=>{let r=yt.depthwiseConv2d(o,t.filters,e,"same");return r=yt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Gn),yt.clipByValue(r,0,6)})}function Vn(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function jo(o,t){return yt.tidy(()=>{let e,r=J(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=Vn(i);r=zn(r,a.depthwise_conv,c),r=J(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function Un(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),d=Math.max(r[e][1],r[e][3]),u=(s-n)*(i-a),l=(p-c)*(d-m);if(u<=0||l<=0)return 0;let g=Math.max(n,c),_=Math.max(a,m),h=Math.min(s,p),v=Math.min(i,d),F=Math.max(h-g,0)*Math.max(v-_,0);return F/(u+l-F)}function Ho(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>n).sort((p,d)=>d.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let d=p.score;for(let u=m.length-1;u>=0;--u){let l=Un(o,p.boxIndex,m[u]);if(l!==0&&(p.score*=c(l),p.score<=n))break}d===p.score&&m.push(p.boxIndex)}),m}var f=b();function Xn(o){let t=f.unstack(f.transpose(o,[1,0])),e=[f.sub(t[2],t[0]),f.sub(t[3],t[1])],r=[f.add(t[0],f.div(e[0],f.scalar(2))),f.add(t[1],f.div(e[1],f.scalar(2)))];return{sizes:e,centers:r}}function Jn(o,t){let{sizes:e,centers:r}=Xn(o),n=f.unstack(f.transpose(t,[1,0])),a=f.div(f.mul(f.exp(f.div(n[2],f.scalar(5))),e[0]),f.scalar(2)),s=f.add(f.mul(f.div(n[0],f.scalar(10)),e[0]),r[0]),i=f.div(f.mul(f.exp(f.div(n[3],f.scalar(5))),e[1]),f.scalar(2)),c=f.add(f.mul(f.div(n[1],f.scalar(10)),e[1]),r[1]);return f.transpose(f.stack([f.sub(s,a),f.sub(c,i),f.add(s,a),f.add(c,i)]),[1,0])}function Yo(o,t,e){return f.tidy(()=>{let r=o.shape[0],n=Jn(f.reshape(f.tile(e.extra_dim,[r,1,1]),[-1,4]),f.reshape(o,[-1,4]));n=f.reshape(n,[r,n.shape[0]/r,4]);let a=f.sigmoid(f.slice(t,[0,0,1],[-1,-1,-1])),s=f.slice(a,[0,0,0],[-1,-1,1]);s=f.reshape(s,[r,s.shape[1]]);let i=f.unstack(n),c=f.unstack(s);return{boxes:i,scores:c}})}var Oe=b();var $e=b();function Ut(o,t){return $e.tidy(()=>{let e=o.shape[0],r=$e.reshape(zt(o,t.box_encoding_predictor),[e,-1,1,4]),n=$e.reshape(zt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function Go(o,t,e){return Oe.tidy(()=>{let r=J(o,e.conv_0,[1,1]),n=J(r,e.conv_1,[2,2]),a=J(n,e.conv_2,[1,1]),s=J(a,e.conv_3,[2,2]),i=J(s,e.conv_4,[1,1]),c=J(i,e.conv_5,[2,2]),m=J(c,e.conv_6,[1,1]),p=J(m,e.conv_7,[2,2]),d=Ut(t,e.box_predictor_0),u=Ut(o,e.box_predictor_1),l=Ut(n,e.box_predictor_2),g=Ut(s,e.box_predictor_3),_=Ut(c,e.box_predictor_4),h=Ut(p,e.box_predictor_5),v=Oe.concat([d.boxPredictionEncoding,u.boxPredictionEncoding,l.boxPredictionEncoding,g.boxPredictionEncoding,_.boxPredictionEncoding,h.boxPredictionEncoding],1),F=Oe.concat([d.classPrediction,u.classPrediction,l.classPrediction,g.classPrediction,_.classPrediction,h.classPrediction],1);return{boxPredictions:v,classPredictions:F}})}var q=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Xt=class extends L{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return at.tidy(()=>{let r=at.cast(t.toBatchTensor(512,!1),"float32"),n=at.sub(at.mul(r,at.scalar(.007843137718737125)),at.scalar(1)),a=jo(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=Go(a.out,a.conv11,e.prediction_layer);return Yo(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await D(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new q(e),a=await D(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let y=1;y{let[k,Y]=[Math.max(0,v[y][0]),Math.min(1,v[y][2])].map(U=>U*h),[tt,st]=[Math.max(0,v[y][1]),Math.min(1,v[y][3])].map(U=>U*_);return new E(p[y],new oe(tt,k,st-tt,Y-k),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),F}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Oo(t)}extractParams(t){return $o(t)}};function zo(o){let t=new Xt;return t.extractWeights(o),t}function qn(o){return zo(o)}var Vo=class extends Xt{};var Uo=.4,Xo=[new x(.738768,.874946),new x(2.42204,2.65704),new x(4.30971,7.04493),new x(10.246,4.59428),new x(12.6868,11.8741)],Jo=[new x(1.603231,2.094468),new x(6.041143,7.080126),new x(2.882459,3.518061),new x(4.266906,5.178857),new x(9.041765,10.66308)],qo=[117.001,114.697,97.404],Zo="tiny_yolov2_model",Ko="tiny_yolov2_separable_conv_model";var C=b();var xr=o=>typeof o=="number";function oo(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!xr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>xr(t.x)&&xr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(xr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var K=b();var Z=b();function be(o){return Z.tidy(()=>{let t=Z.mul(o,Z.scalar(.10000000149011612));return Z.add(Z.relu(Z.sub(o,t)),t)})}function Ft(o,t){return K.tidy(()=>{let e=K.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=K.conv2d(e,t.conv.filters,[1,1],"valid"),e=K.sub(e,t.bn.sub),e=K.mul(e,t.bn.truediv),e=K.add(e,t.conv.bias),be(e)})}var St=b();function Tt(o,t){return St.tidy(()=>{let e=St.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=St.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=St.add(e,t.bias),be(e)})}var no=b();function Zn(o,t){let e=ce(o,t);function r(s,i){let c=no.tensor1d(o(s)),m=no.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=me(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function Qo(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=W(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=Zn(n,s),p;if(t.withSeparableConvs){let[d,u,l,g,_,h,v,F,y]=r,k=t.isFirstLayerConv2d?i(d,u,3,"conv0"):m(d,u,"conv0"),Y=m(u,l,"conv1"),tt=m(l,g,"conv2"),st=m(g,_,"conv3"),U=m(_,h,"conv4"),_t=m(h,v,"conv5"),wt=F?m(v,F,"conv6"):void 0,Pt=y?m(F,y,"conv7"):void 0,te=i(y||F||v,5*e,1,"conv8");p={conv0:k,conv1:Y,conv2:tt,conv3:st,conv4:U,conv5:_t,conv6:wt,conv7:Pt,conv8:te}}else{let[d,u,l,g,_,h,v,F,y]=r,k=c(d,u,"conv0"),Y=c(u,l,"conv1"),tt=c(l,g,"conv2"),st=c(g,_,"conv3"),U=c(_,h,"conv4"),_t=c(h,v,"conv5"),wt=c(v,F,"conv6"),Pt=c(F,y,"conv7"),te=i(y,5*e,1,"conv8");p={conv0:k,conv1:Y,conv2:tt,conv3:st,conv4:U,conv5:_t,conv6:wt,conv7:Pt,conv8:te}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function Kn(o,t){let e=O(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=pe(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function tn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=Kn(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return A(o,e),{params:s,paramMappings:e}}var ut=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var ao=class extends L{constructor(t){super("TinyYolov2");oo(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=Ft(t,e.conv0);return r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv1),r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv2),r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv3),r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv4),r=C.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv5),r=C.maxPool(r,[2,2],[1,1],"same"),r=Ft(r,e.conv6),r=Ft(r,e.conv7),zt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?be(zt(t,e.conv0,"valid",!1)):Tt(t,e.conv0);return r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv1),r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv2),r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv3),r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv4),r=C.maxPool(r,[2,2],[2,2],"same"),r=Tt(r,e.conv5),r=C.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?Tt(r,e.conv6):r,r=e.conv7?Tt(r,e.conv7):r,zt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return C.tidy(()=>{let n=C.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?rt(n,this.config.meanRgb):n,n=n.div(C.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(n,r):this.runTinyYolov2(n,r)})}async forward(t,e){return this.forwardInput(await D(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:n}=new ut(e),a=await D(t),s=await this.forwardInput(a,r),i=C.tidy(()=>C.unstack(s)[0].expandDims()),c={width:a.getInputWidth(0),height:a.getInputHeight(0)},m=await this.extractBoxes(i,a.getReshapedInputDimensions(0),n);s.dispose(),i.dispose();let p=m.map(h=>h.box),d=m.map(h=>h.score),u=m.map(h=>h.classScore),l=m.map(h=>this.config.classes[h.label]);return Lr(p.map(h=>h.rescale(r)),d,this.config.iouThreshold,!0).map(h=>new Dt(d[h],u[h],l[h],p[h],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return tn(t,this.config)}extractParams(t){let e=this.config.filterSizes||ao.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return Qo(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:n,height:a}=e,s=Math.max(n,a),i=s/n,c=s/a,m=t.shape[1],p=this.config.anchors.length,[d,u,l]=C.tidy(()=>{let v=t.reshape([m,m,p,this.boxEncodingSize]),F=v.slice([0,0,0,0],[m,m,p,4]),y=v.slice([0,0,0,4],[m,m,p,1]),k=this.withClassScores?C.softmax(v.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):C.scalar(0);return[F,y,k]}),g=[],_=await u.array(),h=await d.array();for(let v=0;vr){let Y=(F+De(h[v][F][y][0]))/m*i,tt=(v+De(h[v][F][y][1]))/m*c,st=Math.exp(h[v][F][y][2])*this.config.anchors[y].x/m*i,U=Math.exp(h[v][F][y][3])*this.config.anchors[y].y/m*c,_t=Y-st/2,wt=tt-U/2,Pt={row:v,col:F,anchor:y},{classScore:te,label:po}=this.withClassScores?await this.extractPredictedClass(l,Pt):{classScore:1,label:0};g.push({box:new re(_t,wt,_t+st,wt+U),score:k,classScore:k*te,label:po,...Pt})}}return d.dispose(),u.dispose(),l.dispose(),g}async extractPredictedClass(t,e){let{row:r,col:n,anchor:a}=e,s=await t.array();return Array(this.config.classes.length).fill(0).map((i,c)=>s[r][n][a][c]).map((i,c)=>({classScore:i,label:c})).reduce((i,c)=>i.classScore>c.classScore?i:c)}},ge=ao;ge.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var ve=class extends ge{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:Uo,classes:["face"],...t?{anchors:Jo,meanRgb:qo}:{anchors:Xo,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new E(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?Ko:Zo}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function Qn(o,t=!0){let e=new ve(t);return e.extractWeights(o),e}var br=class extends ut{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var Q=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var je=b();var so=b();async function Jt(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>Vt(c)?n(c):c.detection),s=r||(t instanceof so.Tensor?await se(t,a):await ae(t,a)),i=await e(s);return s.forEach(c=>c instanceof so.Tensor&&c.dispose()),i}async function ye(o,t,e,r,n){return Jt([o],t,async a=>e(a[0]),r,n)}var en=.4,rn=[new x(1.603231,2.094468),new x(6.041143,7.080126),new x(2.882459,3.518061),new x(4.266906,5.178857),new x(9.041765,10.66308)],on=[117.001,114.697,97.404];var Fe=class extends ge{constructor(){let t={withSeparableConvs:!0,iouThreshold:en,classes:["face"],anchors:rn,meanRgb:on,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new E(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var T={ssdMobilenetv1:new Xt,tinyFaceDetector:new Fe,tinyYolov2:new ve,faceLandmark68Net:new fe,faceLandmark68TinyNet:new pr,faceRecognitionNet:new xe,faceExpressionNet:new ir,ageGenderNet:new mr},nn=(o,t)=>T.ssdMobilenetv1.locateFaces(o,t),ta=(o,t)=>T.tinyFaceDetector.locateFaces(o,t),ea=(o,t)=>T.tinyYolov2.locateFaces(o,t),an=o=>T.faceLandmark68Net.detectLandmarks(o),ra=o=>T.faceLandmark68TinyNet.detectLandmarks(o),oa=o=>T.faceRecognitionNet.computeFaceDescriptor(o),na=o=>T.faceExpressionNet.predictExpressions(o),aa=o=>T.ageGenderNet.predictAgeAndGender(o),sn=o=>T.ssdMobilenetv1.load(o),sa=o=>T.tinyFaceDetector.load(o),ia=o=>T.tinyYolov2.load(o),ca=o=>T.faceLandmark68Net.load(o),ma=o=>T.faceLandmark68TinyNet.load(o),pa=o=>T.faceRecognitionNet.load(o),da=o=>T.faceExpressionNet.load(o),ua=o=>T.ageGenderNet.load(o),la=sn,fa=nn,ha=an;var io=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},we=class extends io{async run(){let t=await this.parentTask,e=await Jt(t,this.input,async r=>Promise.all(r.map(n=>T.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>cr(r,e[n]))}withAgeAndGender(){return new Te(this,this.input)}},Pe=class extends io{async run(){let t=await this.parentTask;if(!t)return;let e=await ye(t,this.input,r=>T.faceExpressionNet.predictExpressions(r),this.extractedFaces);return cr(t,e)}withAgeAndGender(){return new _e(this,this.input)}},Kt=class extends we{withAgeAndGender(){return new qt(this,this.input)}withFaceDescriptors(){return new At(this,this.input)}},Qt=class extends Pe{withAgeAndGender(){return new Zt(this,this.input)}withFaceDescriptor(){return new Wt(this,this.input)}};var co=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Te=class extends co{async run(){let t=await this.parentTask,e=await Jt(t,this.input,async r=>Promise.all(r.map(n=>T.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return fr(hr(r,s,i),a)})}withFaceExpressions(){return new we(this,this.input)}},_e=class extends co{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await ye(t,this.input,a=>T.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return fr(hr(t,r,n),e)}withFaceExpressions(){return new Pe(this,this.input)}},qt=class extends Te{withFaceExpressions(){return new Kt(this,this.input)}withFaceDescriptors(){return new At(this,this.input)}},Zt=class extends _e{withFaceExpressions(){return new Qt(this,this.input)}withFaceDescriptor(){return new Wt(this,this.input)}};var gr=class extends Q{constructor(t,e){super();this.parentTask=t;this.input=e}},At=class extends gr{async run(){let t=await this.parentTask;return(await Jt(t,this.input,r=>Promise.all(r.map(n=>T.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>lr(t[n],r))}withFaceExpressions(){return new Kt(this,this.input)}withAgeAndGender(){return new qt(this,this.input)}},Wt=class extends gr{async run(){let t=await this.parentTask;if(!t)return;let e=await ye(t,this.input,r=>T.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return lr(t,e)}withFaceExpressions(){return new Qt(this,this.input)}withAgeAndGender(){return new Zt(this,this.input)}};var vr=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?T.faceLandmark68TinyNet:T.faceLandmark68Net}},yr=class extends vr{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof je.Tensor?await se(this.input,e):await ae(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof je.Tensor&&a.dispose()),t.map((a,s)=>le(a,n[s]))}withFaceExpressions(){return new Kt(this,this.input)}withAgeAndGender(){return new qt(this,this.input)}withFaceDescriptors(){return new At(this,this.input)}},Fr=class extends vr{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof je.Tensor?await se(this.input,[e]):await ae(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof je.Tensor&&a.dispose()),le(t,n)}withFaceExpressions(){return new Qt(this,this.input)}withAgeAndGender(){return new Zt(this,this.input)}withFaceDescriptor(){return new Wt(this,this.input)}};var Tr=class extends Q{constructor(t,e=new q){super();this.input=t;this.options=e}},He=class extends Tr{async run(){let{input:t,options:e}=this,r;if(e instanceof br)r=T.tinyFaceDetector.locateFaces(t,e);else if(e instanceof q)r=T.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ut)r=T.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>Ot({},r)))})}withFaceLandmarks(t=!1){return new yr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new we(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Te(this.runAndExtendWithFaceDetections(),this.input)}},_r=class extends Tr{async run(){let t=await new He(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?Ot({},e):void 0)})}withFaceLandmarks(t=!1){return new Fr(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Pe(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new _e(this.runAndExtendWithFaceDetection(),this.input)}};function xa(o,t=new q){return new _r(o,t)}function wr(o,t=new q){return new He(o,t)}async function cn(o,t){return wr(o,new q(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function ba(o,t={}){return wr(o,new ut(t)).withFaceLandmarks().withFaceDescriptors()}var ga=cn;function mo(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var Pr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof xt)return s;if(s instanceof Float32Array)return new xt(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new xt(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>mo(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new Ee(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>xt.fromJSON(r));return new Pr(e,t.distanceThreshold)}};function va(o){let t=new Fe;return t.extractWeights(o),t}function mn(o,t){let{width:e,height:r}=new S(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>mn(n,{width:e,height:r}));if(Vt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return le(Ot(o,n),a)}return mt(o)?Ot(o,o.detection.forSize(e,r)):o instanceof z||o instanceof E?o.forSize(e,r):o}var Fa=typeof process!="undefined",Ta=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",_a={faceapi:Do,node:Fa,browser:Ta};export{mr as AgeGenderNet,re as BoundingBox,P as Box,Q as ComposableTask,At as ComputeAllFaceDescriptorsTask,gr as ComputeFaceDescriptorsTaskBase,Wt as ComputeSingleFaceDescriptorTask,yr as DetectAllFaceLandmarksTask,He as DetectAllFacesTask,vr as DetectFaceLandmarksTaskBase,Tr as DetectFacesTaskBase,Fr as DetectSingleFaceLandmarksTask,_r as DetectSingleFaceTask,S as Dimensions,Xr as FACE_EXPRESSION_LABELS,E as FaceDetection,Vo as FaceDetectionNet,ir as FaceExpressionNet,kt as FaceExpressions,fe as FaceLandmark68Net,pr as FaceLandmark68TinyNet,So as FaceLandmarkNet,z as FaceLandmarks,ho as FaceLandmarks5,ne as FaceLandmarks68,Ee as FaceMatch,Pr as FaceMatcher,xe as FaceRecognitionNet,vt as Gender,Me as LabeledBox,xt as LabeledFaceDescriptors,bt as NetInput,L as NeuralNetwork,Dt as ObjectDetection,x as Point,xo as PredictedBox,oe as Rect,Xt as SsdMobilenetv1,q as SsdMobilenetv1Options,Fe as TinyFaceDetector,br as TinyFaceDetectorOptions,ve as TinyYolov2,ut as TinyYolov2Options,ga as allFaces,cn as allFacesSsdMobilenetv1,ba as allFacesTinyYolov2,Hr as awaitMediaLoaded,Yr as bufferToImage,oa as computeFaceDescriptor,Yt as createCanvas,ke as createCanvasFromMedia,qn as createFaceDetectionNet,$n as createFaceRecognitionNet,zo as createSsdMobilenetv1,va as createTinyFaceDetector,Qn as createTinyYolov2,wr as detectAllFaces,an as detectFaceLandmarks,ra as detectFaceLandmarksTiny,ha as detectLandmarks,xa as detectSingleFace,Po as draw,w as env,mo as euclideanDistance,fr as extendWithAge,lr as extendWithFaceDescriptor,Ot as extendWithFaceDetection,cr as extendWithFaceExpressions,le as extendWithFaceLandmarks,hr as extendWithGender,se as extractFaceTensors,ae as extractFaces,Mn as fetchImage,Vr as fetchJson,Cn as fetchNetWeights,Gt as fetchOrThrow,R as getContext2dOrThrow,Ht as getMediaDimensions,Gr as imageTensorToCanvas,zr as imageToSquare,vn as inverseSigmoid,kr as iou,Je as isMediaElement,Ne as isMediaLoaded,On as isWithAge,mt as isWithFaceDetection,Jr as isWithFaceExpressions,Vt as isWithFaceLandmarks,jn as isWithGender,ua as loadAgeGenderModel,la as loadFaceDetectionModel,da as loadFaceExpressionModel,ca as loadFaceLandmarkModel,ma as loadFaceLandmarkTinyModel,pa as loadFaceRecognitionModel,sn as loadSsdMobilenetv1Model,sa as loadTinyFaceDetectorModel,ia as loadTinyYolov2Model,Ur as loadWeightMap,fa as locateFaces,Nn as matchDimensions,Ir as minBbox,T as nets,Lr as nonMaxSuppression,rt as normalize,Sr as padToSquare,aa as predictAgeAndGender,na as recognizeFaceExpressions,mn as resizeResults,jt as resolveInput,gn as shuffleArray,De as sigmoid,nn as ssdMobilenetv1,ya as tf,ta as tinyFaceDetector,ea as tinyYolov2,D as toNetInput,lo as utils,oo as validateConfig,_a as version}; //# sourceMappingURL=face-api.esm-nobundle.js.map diff --git a/dist/face-api.esm.js b/dist/face-api.esm.js index 355d92e..1b0cc8f 100644 --- a/dist/face-api.esm.js +++ b/dist/face-api.esm.js @@ -4163,7 +4163,7 @@ return a / b;`,XJ=` } setOutput(${l}); } - `}};function yee(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,segmentIds:s}=t,{numSegments:i}=a,o=r.shape.length,l=[],u=0,c=E.getAxesPermutation([u],o),p=r;c!=null&&(p=_n({inputs:{x:r},backend:n,attrs:{perm:c}}),l.push(p),u=E.getInnerMostAxes(1,o)[0]);let d=E.segment_util.computeOutShape(p.shape,u,i),h=I.sizeFromShape([p.shape[u]]),m=ye({inputs:{x:p},backend:n,attrs:{shape:[-1,h]}});l.push(m);let f=jd(r.dtype),g=(v,k,w,S,A)=>{let F=v.shape[0],D=v.shape[1],R=E.segment_util.segOpComputeOptimalWindowSize(D,A),L={windowSize:R,inSize:D,batchSize:F,numSegments:A},W=new gee(L,k),U=n.compileAndRun(W,[v,w],S);if(l.push(U),U.shape[1]===A)return U;let G=qT({backend:n,attrs:{start:0,stop:A,step:1,dtype:"float32"}}),X=YT({inputs:{x:G},backend:n,attrs:{reps:[D/R]}});return l.push(G),l.push(X),g(U,k,X,S,A)},y=g(m,"unsortedSegmentSum",s,f,i),b=ye({inputs:{x:y},backend:n,attrs:{shape:d}}),x=b;if(c!=null){l.push(b);let v=E.getUndoAxesPermutation(c);x=_n({inputs:{x},backend:n,attrs:{perm:v}})}return l.forEach(v=>n.disposeIntermediateTensorInfo(v)),x}var bee={kernelName:pc,backendName:"webgl",kernelFunc:yee},xee=[lJ,pJ,YX,QX,tK,rK,iK,uK,pK,hK,yK,xK,kK,TK,$K,AK,RK,zK,OK,UK,HK,qK,JK,r7,i7,d7,m7,b7,w7,EX,T7,R7,O7,F7,B7,U7,z7,j7,K7,Q7,eY,nY,sY,pY,hY,oY,gY,xY,IY,CY,EY,MY,RY,PY,LY,WY,VY,GY,jY,YY,e9,n9,r9,o9,p9,f9,x9,_X,w9,N7,N9,C9,_9,DX,M9,L9,W9,q9,G9,J9,eJ,rJ,hJ,wJ,xJ,TJ,CJ,FJ,yJ,EJ,DJ,OJ,BJ,HJ,ZJ,LX,tQ,rQ,oQ,cQ,l7,hQ,fQ,yQ,vQ,NQ,RX,SQ,CQ,u7,KJ,_Q,LQ,MQ,WX,VQ,HQ,XQ,JQ,tZ,aZ,iZ,uZ,pZ,mZ,yZ,vZ,IZ,SZ,FZ,n7,JJ,$Z,MZ,PZ,LZ,BZ,GZ,jZ,XZ,JZ,YJ,qX,eee,aee,iee,lee,pee,XX,hee,fee,bee,mQ];for(let e of xee)hc(e);var vee="3.3.0",wee={"tfjs-core":Q0,"tfjs-backend-cpu":BU,"tfjs-backend-webgl":FX,"tfjs-data":TN,"tfjs-layers":im,"tfjs-converter":xN,tfjs:vee},Hn;(function(e){e[e.float32=0]="float32",e[e.int32=1]="int32",e[e.bool=2]="bool",e[e.string=3]="string",e[e.complex64=4]="complex64"})(Hn||(Hn={}));var gp;(function(e){e[e.linear=0]="linear",e[e.relu=1]="relu",e[e.relu6=2]="relu6",e[e.prelu=3]="prelu",e[e.leakyrelu=4]="leakyrelu"})(gp||(gp={}));var JT;function kee(e){JT=e.wasm.cwrap(gi,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])}function Iee(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s,bias:i,preluActivationWeights:o}=t;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");let{transposeA:l,transposeB:u,activation:c,leakyreluAlpha:p}=a,d=n.dataIdMap.get(r.dataId).id,h=n.dataIdMap.get(s.dataId).id,m=0;if(i!=null){let A=n.dataIdMap.get(i.dataId);if(A.shape.length!==1)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${A.shape.length}.`);m=A.id}let f=o==null?0:n.dataIdMap.get(o.dataId).id,g=gp[c];if(g==null)throw new Error(`${c} activation not yet supported for FusedConv2D in the wasm backend.`);let y=l?r.shape[2]:r.shape[1],b=u?s.shape[1]:s.shape[2],x=r.shape[0],v=n.makeOutput([x,y,b],r.dtype),k=n.dataIdMap.get(v.dataId).id,w=new Uint8Array(new Int32Array(r.shape).buffer),S=new Uint8Array(new Int32Array(s.shape).buffer);return JT(d,w,r.shape.length,h,S,s.shape.length,l,u,g,m,f,p||0,k),v}var Nee={kernelName:gi,backendName:"wasm",setupFunc:kee,kernelFunc:Iee};function En(e){let t;function n(r){t=r.wasm.cwrap(e,null,["number","number"])}function a(r){let{backend:s,inputs:{x:i}}=r,o=s.dataIdMap.get(i.dataId).id,l=s.makeOutput(i.shape,i.dtype),u=s.dataIdMap.get(l.dataId).id;return I.sizeFromShape(l.shape)===0||t(o,u),l}return{kernelName:e,backendName:"wasm",setupFunc:n,kernelFunc:a}}var Tee=En(So);function gn(e,t,n){let a;function r(i){a=i.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])}function s(i){let{backend:o,inputs:l}=i,{a:u,b:c}=l,p=o.dataIdMap.get(u.dataId).id,d=o.dataIdMap.get(c.dataId).id,h=n!=null?n:u.dtype,m=E.assertAndGetBroadcastShape(u.shape,c.shape),f=o.makeOutput(m,h);if(I.sizeFromShape(m)===0)return f;let g=new Uint8Array(new Int32Array(u.shape).buffer),y=new Uint8Array(new Int32Array(c.shape).buffer),b=o.dataIdMap.get(f.dataId).id,x=()=>a(p,g,u.shape.length,d,y,c.shape.length,Hn[u.dtype],b);if(t&&u.dtype==="float32")return x(),f;let v=E.getBroadcastDims(u.shape,m),k=E.getBroadcastDims(c.shape,m),w=v.every((A,F)=>A===F),S=k.every((A,F)=>A===F);if(w&&S)return x(),f;throw new Error(`Broadcasting along outer dims is not yet supported for ${u.dtype} ${e}.`)}return{kernelName:e,backendName:"wasm",setupFunc:r,kernelFunc:s}}var See=!0,Cee=gn(Br,See),QT;function Aee(e){QT=e.wasm.cwrap(Ns,null,["array","number","number","number"])}function Fee(e){let{inputs:t,backend:n}=e,a=n.makeOutput(t[0].shape,t[0].dtype);if(I.sizeFromShape(a.shape)===0)return a;let r=t.map(o=>n.dataIdMap.get(o.dataId).id),s=new Uint8Array(new Int32Array(r).buffer),i=n.dataIdMap.get(a.dataId).id;return QT(s,r.length,Hn[a.dtype],i),a}var _ee={kernelName:Ns,backendName:"wasm",setupFunc:Aee,kernelFunc:Fee};function Wm(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype),r=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(a).set(r),a}var Eee={kernelName:Bs,backendName:"wasm",kernelFunc:Wm},ZT;function $ee(e){ZT=e.wasm.cwrap(fi,null,["number","array","number","number","number","array","number"])}function Bm(e){let{inputs:t,backend:n,attrs:a}=e,[r,s]=Mee(t.x.shape,a.perm),i=!0;for(let m=0;m=r&&(s===-1||a[s]>a[i])&&(s=i);a[s]=r}return[n,a]}var Ree={kernelName:fi,backendName:"wasm",kernelFunc:Bm,setupFunc:$ee};function mu(e,t,n){let a=e.shape,r=e.shape.length,s=I.parseAxisParam(t,a),i=s,o=E.getAxesPermutation(i,r),l=null,u=!1;if(o!=null){let c=new Array(r);for(let d=0;d`new shape: ${i}, old shape: ${a.shape}. New shape and old shape must have the same number of elements.`),e.backend.incRef(a.dataId),{dataId:a.dataId,shape:i,dtype:a.dtype}}var Vee={kernelName:cl,backendName:"wasm",kernelFunc:Pa},nS;function Uee(e){nS=e.wasm.cwrap(Cs,null,["number","array","number","number","array","number","number","number","number"])}function Gee(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=a;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");let l=r.shape.length,u=s.shape.length,c=i?r.shape[l-2]:r.shape[l-1],p=o?s.shape[u-1]:s.shape[u-2],d=i?r.shape[l-1]:r.shape[l-2],h=o?s.shape[u-2]:s.shape[u-1],m=r.shape.slice(0,-2),f=s.shape.slice(0,-2),g=I.sizeFromShape(m),y=I.sizeFromShape(f),b=g===y||g===1||y===1;I.assert(l>=2&&u>=2&&b,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${m}) and (${f}).`);let x=(g>y?r.shape.slice(0,-2):s.shape.slice(0,-2)).concat([d,h]);I.assert(c===p,()=>`Error in matMul: inner shapes (${c}) and (${p}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let v=i?[g,c,d]:[g,d,c],k=o?[y,h,p]:[y,p,h],w=Pa({inputs:{x:r},backend:n,attrs:{shape:v}}),S=Pa({inputs:{x:s},backend:n,attrs:{shape:k}}),A=n.dataIdMap.get(w.dataId).id,F=n.dataIdMap.get(S.dataId).id,D=i?w.shape[2]:w.shape[1],R=o?S.shape[1]:S.shape[2],L=Math.max(g,y),W=n.makeOutput([L,D,R],w.dtype),U=n.dataIdMap.get(W.dataId).id,G=new Uint8Array(new Int32Array(w.shape).buffer),X=new Uint8Array(new Int32Array(S.shape).buffer);return nS(A,G,w.shape.length,F,X,S.shape.length,i,o,U),n.disposeData(w.dataId),n.disposeData(S.dataId),W.shape=x,W}var Hee={kernelName:Cs,backendName:"wasm",setupFunc:Uee,kernelFunc:Gee};function Vm(e){let{inputs:{x:t},attrs:{dtype:n},backend:a}=e,r=a.makeOutput(t.shape,n),s=a.typedArrayFromHeap(t);return a.typedArrayFromHeap(r).set(s),r}var jee={kernelName:As,backendName:"wasm",kernelFunc:Vm},qee=En(Fs),aS;function Xee(e){aS=e.wasm.cwrap(Vr,null,["number","number","number","number"])}function Kee(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{clipValueMin:s,clipValueMax:i}=a,o=n.dataIdMap.get(r.dataId).id,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(l.dataId).id;return aS(o,s,i,u),l}var Yee={kernelName:Vr,backendName:"wasm",setupFunc:Xee,kernelFunc:Kee};function rS(e){let{inputs:t,backend:n}=e,a=I.parseAxisParam(e.attrs.axis,t[0].shape)[0],r=E.computeOutShape(t.map(h=>h.shape),a),s=t.filter(h=>I.sizeFromShape(h.shape)>0);if(s.length===1)return Wm({inputs:{x:s[0]},backend:n});let i=n.makeOutput(r,t[0].dtype);if(I.sizeFromShape(r)===0)return i;let o=s.map(h=>h.shape);if(E.assertParamsConsistent(o,a),s[0].dtype==="string"){let h=s.map(x=>{let v=I.sizeFromShape(x.shape.slice(a));return Pa({inputs:{x},backend:n,attrs:{shape:[-1,v]}})}),m=h.map(x=>({vals:n.readSync(x.dataId),shape:x.shape}));r=E.computeOutShape(h.map(x=>x.shape),1);let f=h[0].shape[0]===1,g=fv(m,r,t[0].dtype,f),y=E.computeOutShape(s.map(x=>x.shape),a);i.shape=y;let b=n.dataIdMap.get(i.dataId);return b.stringBytes=E.fromStringArrayToUint8(g),h.forEach(x=>n.disposeData(x.dataId)),i}let l=I.sizeFromShape(s[0].shape.slice(0,a)),u=0,c=s.map(h=>{let m=I.sizeFromShape(h.shape.slice(a));return u+=m,m}),p=s.map(h=>n.typedArrayFromHeap(h)),d=n.typedArrayFromHeap(i);for(let h=0;h`cumsum does not support ${r.dtype} tensors in the WASM backend`);let u=E.getAxesPermutation([s],l),c=r;u!==null&&(c=Bm({inputs:{x:r},attrs:{perm:u},backend:n}));let p=E.getInnerMostAxes(1,l)[0];E.assertAxesAreInnerMostDims("cumsum",[p],l);let d=n.makeOutput(c.shape,c.dtype),h=c.shape[p],m=n.dataIdMap.get(c.dataId).id,f=n.dataIdMap.get(d.dataId).id;lS(m,i?1:0,o?1:0,h,f,Hn[r.dtype]);let g=d;if(u!==null){let y=E.getUndoAxesPermutation(u);g=Bm({inputs:{x:d},attrs:{perm:y},backend:n}),n.disposeData(c.dataId),n.disposeData(d.dataId)}return g}var cte={kernelName:Ds,backendName:"wasm",setupFunc:lte,kernelFunc:ute},uS;function pte(e){uS=e.wasm.cwrap(Oo,null,["number","number","number","array","number","array","array","number","number"])}function dte(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{blockSize:s,dataFormat:i}=a;I.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=r.shape[0],l=i==="NHWC"?r.shape[1]:r.shape[2],u=i==="NHWC"?r.shape[2]:r.shape[3],c=i==="NHWC"?r.shape[3]:r.shape[1],p=l*s,d=u*s,h=c/(s*s),m=i==="NHWC"?[o,p,d,h]:[o,h,p,d],f=t.makeOutput(m,"float32"),g=t.dataIdMap.get(r.dataId).id,y=new Uint8Array(new Int32Array(I.computeStrides(r.shape)).buffer),b=new Uint8Array(new Int32Array(m).buffer),x=new Uint8Array(new Int32Array(I.computeStrides(m)).buffer),v=t.dataIdMap.get(f.dataId).id;return uS(g,s,i==="NHWC"?1:0,y,r.shape.length-1,b,x,m.length,v),f}var hte={kernelName:Oo,backendName:"wasm",setupFunc:pte,kernelFunc:dte},cS;function mte(e){cS=e.wasm.cwrap(Ms,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function fte(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s}=t,i=a.dataIdMap.get(r.dataId).id,o=a.dataIdMap.get(s.dataId).id,{strides:l,dilations:u,pad:c,dimRoundingMode:p}=n,d=u==null?[1,1]:u,h=E.computeConv2DInfo(r.shape,s.shape,l,d,c,p,!0),m=h.filterHeight,f=h.filterWidth,g=h.padInfo.top,y=h.padInfo.right,b=h.padInfo.bottom,x=h.padInfo.left,v=h.dilationHeight,k=h.dilationWidth,w=h.strideHeight,S=h.strideWidth,A=h.inChannels,F=h.outChannels,D=h.padInfo.type==="SAME"?1:0;if(h.dataFormat!=="channelsLast")throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);let R=a.makeOutput(h.outShape,"float32"),L=a.dataIdMap.get(R.dataId).id;return cS(i,r.shape[0],r.shape[1],r.shape[2],o,m,f,g,y,b,x,D,v,k,w,S,A,F,L),R}var gte={kernelName:Ms,backendName:"wasm",setupFunc:mte,kernelFunc:fte},yte=!1,bte=gn(Wo,yte,"bool"),xte=En(Ps);function qv(e){let{inputs:t,attrs:n,backend:a}=e,{input:r}=t,{dim:s}=n,i=r.shape.length,o=r.shape.slice(),l=s;return s<0&&(I.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),Pa({inputs:{x:r},backend:a,attrs:{shape:o}})}var vte={kernelName:Bo,backendName:"wasm",kernelFunc:qv};function wte(e){let{attrs:{shape:t,value:n,dtype:a},backend:r}=e,s=r.makeOutput(t,a);return r.typedArrayFromHeap(s).fill(n),s}var kte={kernelName:tc,backendName:"wasm",kernelFunc:wte},pS;function Ite(e){pS=e.wasm.cwrap(Uo,null,["number","number","number","number","number","number"])}function Nte(e){let{inputs:t,backend:n}=e,{image:a}=t,r=n.makeOutput(a.shape,a.dtype),s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,[o,l,u,c]=a.shape;return pS(s,o,l,u,c,i),r}var Tte={kernelName:Uo,backendName:"wasm",kernelFunc:Nte,setupFunc:Ite},Ste=En(Os),Cte=!1,Ate=gn(Ls,Cte),dS;function Fte(e){dS=e.wasm.cwrap(zs,null,["number","number","number","number","number","number","number"])}function _te(e){let{backend:t,inputs:n,attrs:a}=e,{varianceEpsilon:r}=a,{x:s,mean:i,variance:o,offset:l,scale:u}=n,c=t.dataIdMap.get(s.dataId).id,p=t.dataIdMap.get(i.dataId).id,d=t.dataIdMap.get(o.dataId).id,h=l!=null?t.dataIdMap.get(l.dataId).id:0,m=u!=null?t.dataIdMap.get(u.dataId).id:0,f=t.makeOutput(s.shape,s.dtype);if(I.sizeFromShape(s.shape)===0)return f;let g=t.dataIdMap.get(f.dataId).id;return dS(c,p,d,h,m,r,g),f}var Ete={kernelName:zs,backendName:"wasm",setupFunc:Fte,kernelFunc:_te},hS;function $te(e){hS=e.wasm.cwrap(yi,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Dte(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dataFormat:p,dimRoundingMode:d,activation:h,leakyreluAlpha:m}=n,f=E.computeConv2DInfo(r.shape,s.shape,l,c,u,d),g=gp[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ee=a.dataIdMap.get(i.dataId);if(ee.shape.length!==1)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${ee.shape.length}.`);if(ee.shape[0]!==x)throw new Error(`FusedConv2D bias shape (${ee.shape}) does not match the number of output channels (${x})`);v=ee.id}let k=f.filterHeight,w=f.filterWidth,S=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,D=f.padInfo.left,R=f.dilationHeight,L=f.dilationWidth,W=f.strideHeight,U=f.strideWidth,G=f.inChannels,X=f.padInfo.type==="SAME"?1:0,j=f.batchSize,te=f.inHeight,Q=f.inWidth;if(p!=="NHWC")throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${p}'. Please use 'NHWC'.`);let se=a.makeOutput(f.outShape,"float32"),ne=a.dataIdMap.get(se.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return hS(y,j,te,Q,b,k,w,v,S,A,F,D,X,R,L,W,U,G,x,g,ie,m||0,ne),se}var Mte={kernelName:yi,backendName:"wasm",setupFunc:$te,kernelFunc:Dte},mS;function Rte(e){mS=e.wasm.cwrap(bi,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Pte(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dataFormat:p,dimRoundingMode:d,activation:h,leakyreluAlpha:m}=n,f=E.computeConv2DInfo(r.shape,s.shape,l,c,u,d,!0),g=gp[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ee=a.dataIdMap.get(i.dataId);if(ee.shape.length!==1)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${ee.shape.length}.`);if(ee.shape[0]!==x)throw new Error(`FusedDepthwiseConv2D bias shape (${ee.shape}) does not match the number of output channels (${x})`);v=ee.id}let k=f.filterHeight,w=f.filterWidth,S=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,D=f.padInfo.left,R=f.dilationHeight,L=f.dilationWidth,W=f.strideHeight,U=f.strideWidth,G=f.inChannels,X=f.padInfo.type==="SAME"?1:0,j=f.batchSize,te=f.inHeight,Q=f.inWidth;if(p!=="NHWC")throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${p}'. Please use 'NHWC'.`);let se=a.makeOutput(f.outShape,"float32"),ne=a.dataIdMap.get(se.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return mS(y,j,te,Q,b,k,w,v,S,A,F,D,X,R,L,W,U,G,x,g,ie,m||0,ne),se}var Ote={kernelName:bi,backendName:"wasm",setupFunc:Rte,kernelFunc:Pte},fS;function Lte(e){fS=e.wasm.cwrap(Ho,null,["number","number","number","number","number","number","array","number"])}function zte(e){let{backend:t,inputs:n}=e,{params:a,indices:r}=n,[s,i,o,l]=hy.prepareAndValidate(a,r),u=t.makeOutput(s,a.dtype);if(i===0)return u;let c=r.shape,p=c[c.length-1],d=t.dataIdMap.get(a.dataId).id,h=t.dataIdMap.get(r.dataId).id,m=new Uint8Array(new Int32Array(l).buffer),f=t.dataIdMap.get(u.dataId).id;return fS(d,Hn[a.dtype],h,i,p,o,m,f),u}var Wte={kernelName:Ho,backendName:"wasm",setupFunc:Lte,kernelFunc:zte},gS;function Bte(e){gS=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])}function Vte(e){let{backend:t,inputs:n,attrs:a}=e,{x:r,indices:s}=n,{axis:i,batchDims:o}=a,l=I.parseAxisParam(i,r.shape)[0],u=E.segment_util.collectGatherOpShapeInfo(r,s,l,o),c=Pa({inputs:{x:r},attrs:{shape:[u.batchSize,u.outerSize,u.dimSize,u.sliceSize]},backend:t}),p=I.sizeFromShape(s.shape),d=Pa({inputs:{x:s},attrs:{shape:[u.batchSize,p/u.batchSize]},backend:t}),h=[u.batchSize,u.outerSize,p/u.batchSize,u.sliceSize],m=t.makeOutput(h,r.dtype);if(I.sizeFromShape(r.shape)===0)return m;let f=c.shape.length-1,g=t.dataIdMap.get(c.dataId).id,y=t.dataIdMap.get(d.dataId).id,b=t.dataIdMap.get(m.dataId).id,x=new Uint8Array(new Int32Array(I.computeStrides(c.shape)).buffer),v=new Uint8Array(new Int32Array(I.computeStrides(h)).buffer);return gS(g,Hn[r.dtype],x,f,y,u.batchSize,v,b),t.disposeData(c.dataId),t.disposeData(d.dataId),m.shape=u.outputShape,m}var Ute={kernelName:Go,backendName:"wasm",setupFunc:Bte,kernelFunc:Vte},Gte=!1,Hte=gn(jo,Gte,"bool"),jte=!1,qte=gn(Ws,jte,"bool"),yS;function Xte(e){yS=e.wasm.cwrap(Vs,null,["number","number","number"])}function Kte(e){let{inputs:{x:t},attrs:{alpha:n},backend:a}=e,r=a.dataIdMap.get(t.dataId).id,s=a.makeOutput(t.shape,t.dtype);if(I.sizeFromShape(t.shape)!==0){let i=a.dataIdMap.get(s.dataId).id;yS(r,n,i)}return s}var Yte={kernelName:Vs,backendName:"wasm",setupFunc:Xte,kernelFunc:Kte},Jte=!1,Qte=gn(Yo,Jte,"bool"),Zte=!1,ene=gn(Jo,Zte,"bool"),tne=En(Us),nne=!1,ane=gn(Zo,nne,"bool"),bS;function rne(e){bS=e.wasm.cwrap(Gs,null,["number, number, number"])}function sne(e){let{backend:t,inputs:n,attrs:a}=e,{reductionIndices:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=i,{transposed:u,axes:c,originalAxes:p,inputWasTransposed:d}=mu(i,r,t);if(d){let b=t.dataIdMap.get(u.dataId).id;l=u,o=b}let h=l.shape.length;E.assertAxesAreInnerMostDims("max",c,h);let[m,f]=E.computeOutAndReduceShapes(l.shape,c),g=I.sizeFromShape(f),y=t.makeOutput(m,i.dtype);if(I.sizeFromShape(l.shape)!==0){let b=t.dataIdMap.get(y.dataId).id;bS(o,g,b)}if(d&&t.disposeData(u.dataId),s){let b=E.expandShapeToKeepDim(y.shape,p);y.shape=b}return y}var ine={kernelName:Gs,backendName:"wasm",setupFunc:rne,kernelFunc:sne},one=!1,lne=gn(Hs,one),xS;function une(e){xS=e.wasm.cwrap(js,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function cne(e){let{inputs:t,attrs:n,backend:a}=e,r=t.x,s=a.dataIdMap.get(r.dataId).id,{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=n,c=E.computePool2DInfo(r.shape,i,o,1,l,u),p=c.filterHeight,d=c.filterWidth,h=c.padInfo.top,m=c.padInfo.right,f=c.padInfo.bottom,g=c.padInfo.left,y=c.dilationHeight,b=c.dilationWidth,x=c.strideHeight,v=c.strideWidth,k=c.inChannels,w=c.outChannels;if(c.dataFormat!=="channelsLast")throw new Error(`wasm backend does not support dataFormat:'${c.dataFormat}'. Please use 'channelsLast'.`);let S=a.makeOutput(c.outShape,"float32"),A=a.dataIdMap.get(S.dataId).id;return xS(s,r.shape[0],r.shape[1],r.shape[2],p,d,h,m,f,g,y,b,x,v,k,w,A),S}var pne={kernelName:js,backendName:"wasm",setupFunc:une,kernelFunc:cne},vS;function dne(e){vS=e.wasm.cwrap(qs,null,["number, number, number"])}function hne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=mu(i,r,t),m=p;if(h){let v=t.dataIdMap.get(c.dataId).id;v!==o&&(u=c,l=v,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("mean",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=u;u.dtype!=="float32"&&(b=Vm({backend:t,inputs:{x:u},attrs:{dtype:"float32"}}),l=t.dataIdMap.get(b.dataId).id);let x=t.makeOutput(f,"float32");if(I.sizeFromShape(u.shape)!==0){let v=t.dataIdMap.get(x.dataId).id;vS(l,y,v)}if(h&&t.disposeData(c.dataId),s){let v=E.expandShapeToKeepDim(x.shape,d);x.shape=v}return u.dtype!=="float32"&&t.disposeData(b.dataId),x}var mne={kernelName:qs,backendName:"wasm",setupFunc:dne,kernelFunc:hne},wS;function fne(e){wS=e.wasm.cwrap(Xs,null,["number, number, number"])}function gne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=mu(i,r,t);if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x)}let m=u.shape.length;E.assertAxesAreInnerMostDims("min",p,m);let[f,g]=E.computeOutAndReduceShapes(u.shape,p),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;wS(l,y,x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var yne={kernelName:Xs,backendName:"wasm",setupFunc:fne,kernelFunc:gne},bne=!1,xne=gn(Ks,bne),vne=!0,wne=gn(Ys,vne),kne=En(tl);function Xv(e,t){let n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),a=n[0],r=n[1],s=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:a,selectedSize:r,pSelectedScores:s,pValidOutputs:i}}var kS;function Ine(e){kS=e.wasm.cwrap(al,"number",["number","number","number","number","number"])}function Nne(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i}=a,{boxes:o,scores:l}=n,u=t.dataIdMap.get(o.dataId).id,c=t.dataIdMap.get(l.dataId).id,p=kS(u,c,s,r,i),{pSelectedIndices:d,selectedSize:h,pSelectedScores:m,pValidOutputs:f}=Xv(t,p);return t.wasm._free(m),t.wasm._free(f),t.makeOutput([h],"int32",d)}var Tne={kernelName:al,backendName:"wasm",setupFunc:Ine,kernelFunc:Nne},IS;function Sne(e){IS=e.wasm.cwrap(rl,"number",["number","number","number","number","number","bool"])}function Cne(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,padToMaxOutputSize:o}=a,{boxes:l,scores:u}=n,c=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(u.dataId).id,d=IS(c,p,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=Xv(t,d);t.wasm._free(f);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([],"int32",g);return[y,b]}var Ane={kernelName:rl,backendName:"wasm",setupFunc:Sne,kernelFunc:Cne},NS;function Fne(e){NS=e.wasm.cwrap(sl,"number",["number","number","number","number","number","number"])}function _ne(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,softNmsSigma:o}=a,{boxes:l,scores:u}=n,c=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(u.dataId).id,d=NS(c,p,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=Xv(t,d);t.wasm._free(g);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([m],"float32",f);return[y,b]}var Ene={kernelName:sl,backendName:"wasm",setupFunc:Fne,kernelFunc:_ne},$ne=!1,Dne=gn(nl,$ne,"bool"),TS;function Mne(e){TS=e.wasm.cwrap(Js,null,["number","number","number","number","number"])}function Rne(e){let{inputs:t,backend:n,attrs:a}=e,{indices:r}=t,{depth:s,onValue:i,offValue:o}=a,l=n.makeOutput([...r.shape,s],"int32"),u=n.dataIdMap.get(l.dataId).id,c=n.dataIdMap.get(r.dataId).id;return TS(c,s,i,o,u),l}var Pne={kernelName:Js,backendName:"wasm",setupFunc:Mne,kernelFunc:Rne};function One(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(1),a}var Lne={kernelName:il,backendName:"wasm",kernelFunc:One};function zne(e){let{inputs:t,backend:n,attrs:a}=e,{axis:r}=a;if(t.length===1)return qv({inputs:{input:t[0]},backend:n,attrs:{dim:r}});let s=t[0].shape,i=t[0].dtype;t.forEach(c=>{I.assertShapesMatch(s,c.shape,"All tensors passed to stack must have matching shapes"),I.assert(i===c.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(c=>{let p=qv({inputs:{input:c},backend:n,attrs:{dim:r}});return o.push(p),p}),u=rS({inputs:l,backend:n,attrs:{axis:r}});return o.forEach(c=>n.disposeData(c.dataId)),u}var Wne={kernelName:ol,backendName:"wasm",kernelFunc:zne},SS;function Bne(e){SS=e.wasm.cwrap(Qs,null,["number","array","number","number","array","array","number","number"])}function Vne(e){let{inputs:{x:t},backend:n,attrs:{paddings:a,constantValue:r}}=e,s=a.map((m,f)=>m[0]+t.shape[f]+m[1]),i=n.dataIdMap.get(t.dataId).id,o=n.makeOutput(s,t.dtype),l=n.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),c=a.map(m=>m[0]),p=a.map(m=>m[1]),d=new Uint8Array(new Int32Array(c).buffer),h=new Uint8Array(new Int32Array(p).buffer);return SS(i,u,t.shape.length,Hn[t.dtype],d,h,r,l),o}var Une={kernelName:Qs,backendName:"wasm",kernelFunc:Vne,setupFunc:Bne},Gne=!1,Hne=gn(Zs,Gne),CS;function jne(e){CS=e.wasm.cwrap(ei,null,["number","number","number"])}function qne(e){let{inputs:t,backend:n}=e,{x:a,alpha:r}=t,s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,o=n.makeOutput(a.shape,"float32"),l=n.dataIdMap.get(o.dataId).id;return CS(s,i,l),o}var Xne={kernelName:ei,backendName:"wasm",setupFunc:jne,kernelFunc:qne},AS;function Kne(e){AS=e.wasm.cwrap(ll,null,["number","number","number","number"])}function Yne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=mu(i,r,t),m=p;if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("prod",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;AS(l,y,Hn[b.dtype],x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Jne={kernelName:ll,backendName:"wasm",setupFunc:Kne,kernelFunc:Yne},Qne=e=>{let{backend:t,attrs:n}=e,{start:a,stop:r,step:s,dtype:i}=n,o=bv(a,r,s,i),l=t.makeOutput([o.length],i);return t.typedArrayFromHeap(l).set(o),l},Zne={kernelName:oc,backendName:"wasm",kernelFunc:Qne},eae=!0,tae=gn(Rs,eae),nae=En(ti),aae=En(ai),FS;function rae(e){FS=e.wasm.cwrap(ni,null,["number","number","number","number","number","number","number","number","number","number"])}function sae(e){let{backend:t,inputs:n,attrs:a}=e,{images:r}=n,{alignCorners:s,halfPixelCenters:i,size:o}=a,[l,u]=o,[c,p,d,h]=r.shape,m=[c,l,u,h],f=t.dataIdMap.get(r.dataId),g;f.dtype!=="float32"&&(g=Vm({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(g.dataId));let y=f.id,b=t.makeOutput(m,"float32");if(I.sizeFromShape(r.shape)===0)return b;let x=t.dataIdMap.get(b.dataId).id;return FS(y,c,p,d,h,l,u,s?1:0,i?1:0,x),g!=null&&t.disposeData(g.dataId),b}var iae={kernelName:ni,backendName:"wasm",setupFunc:rae,kernelFunc:sae},_S;function oae(e){_S=e.wasm.cwrap(ri,null,["number","array","number","array","number","number"])}function lae(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dims:s}=a,i=I.parseAxisParam(s,r.shape);if(r.shape.length===0)return Wm({inputs:{x:r},backend:n});let o=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(r.dataId).id,u=n.dataIdMap.get(o.dataId).id,c=new Uint8Array(new Int32Array(i).buffer),p=new Uint8Array(new Int32Array(r.shape).buffer);_S(l,c,i.length,p,r.shape.length,u);let d=Pa({inputs:{x:o},attrs:{shape:r.shape},backend:n});return n.disposeData(o.dataId),d}var uae={kernelName:ri,backendName:"wasm",kernelFunc:lae,setupFunc:oae},ES;function cae(e){ES=e.wasm.cwrap(Nl,null,["number","number","number","number","number","number","number","number","array","number","number"])}function pae(e){let{inputs:t,backend:n,attrs:a}=e,{image:r}=t,{radians:s,fillValue:i,center:o}=a,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(r.dataId).id,c=n.dataIdMap.get(l.dataId).id,[p,d,h,m]=r.shape,[f,g]=E.getImageCenter(o,d,h),y=i===0,b=255,x=typeof i=="number"?[i,i,i,y?0:b]:[...i,b],v=new Uint8Array(new Int32Array(x).buffer);return ES(u,p,d,h,m,s,f,g,v,x.length,c),l}var dae={kernelName:Nl,backendName:"wasm",kernelFunc:pae,setupFunc:cae},hae=En(si),mae=En(ii),$S;function fae(e){$S=e.wasm.cwrap(pl,null,["number","number","number","number","number","number","array","number","number"])}function gae(e){let{backend:t,inputs:n,attrs:a}=e,{indices:r,updates:s}=n,{shape:i}=a,o=t.makeOutput(i,s.dtype);if(I.sizeFromShape(i)===0)return o;let{sliceRank:l,numUpdates:u,sliceSize:c,strides:p,outputSize:d}=my.calculateShapes(s,r,i),h=t.dataIdMap.get(r.dataId).id,m=t.dataIdMap.get(s.dataId).id,f=new Uint8Array(new Int32Array(p).buffer),g=t.dataIdMap.get(o.dataId).id;return $S(h,m,Hn[s.dtype],l,u,c,f,d,g),o}var yae={kernelName:pl,backendName:"wasm",setupFunc:fae,kernelFunc:gae},DS;function bae(e){DS=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}function xae(e){let{inputs:t,backend:n}=e,{condition:a,t:r,e:s}=t,i=n.dataIdMap.get(a.dataId).id,o=n.dataIdMap.get(r.dataId).id,l=n.dataIdMap.get(s.dataId).id,u=n.makeOutput(r.shape,r.dtype),c=n.dataIdMap.get(u.dataId).id,p=a.shape.length,d=r.shape.length,h=p===0||p>1||d===1?1:I.sizeFromShape(r.shape.slice(1));return DS(i,o,l,h,c),u}var vae={kernelName:dl,backendName:"wasm",kernelFunc:xae,setupFunc:bae},MS;function wae(e){MS=e.wasm.cwrap(li,null,["number","number"])}function kae(e){let{backend:t,inputs:{x:n}}=e,a=t.dataIdMap.get(n.dataId).id,r=t.makeOutput(n.shape,n.dtype),s=t.dataIdMap.get(r.dataId).id;return I.sizeFromShape(r.shape)===0||MS(a,s),r}var Iae={kernelName:"Sigmoid",backendName:"wasm",setupFunc:wae,kernelFunc:kae},Nae=En(oi);function Um(e){let{inputs:{x:t},attrs:{begin:n,size:a},backend:r}=e,[s,i]=pn.parseSliceParams(t,n,a),o=pn.isSliceContinous(t.shape,s,i),l=r.readSync(t.dataId),u=r.makeOutput(i,t.dtype),c=I.computeStrides(t.shape),p=r.dataIdMap.get(u.dataId);if(o){let m=pn.computeFlatOffset(s,c);return t.dtype==="string"?p.stringBytes=l.slice(m,m+I.sizeFromShape(i)):r.typedArrayFromHeap(u).set(l.subarray(m,m+I.sizeFromShape(i))),u}if(t.dtype==="string"){let m=km(l,s,i,t.shape,t.dtype);return p.stringBytes=m,u}let d=r.typedArrayFromHeap(u),h=t.shape.length;if(h===2)Tae(l,c[0],d,s,i);else if(h===3)Sae(l,c[0],c[1],d,s,i);else if(h===4)Cae(l,c[0],c[1],c[2],d,s,i);else{let m=km(l,s,i,t.shape,t.dtype);d.set(m)}return u}function Tae(e,t,n,a,r){let s=0,i=a[0],o=a[1],l=i+r[0];for(let u=i;u{let d=[...c];d[o]=p;let h=Um({inputs:{x:r},attrs:{begin:u,size:d},backend:a});return u[o]+=p,h})}var Dae={kernelName:bl,backendName:"wasm",kernelFunc:$ae},Mae=En(ui),Rae=En(cc),Pae=!0,Oae=gn(di,Pae),PS;function Lae(e){PS=e.wasm.cwrap(Gr,null,["number","number","number"])}function zae(e){let{backend:t,inputs:n,attrs:a}=e,{alpha:r}=a,{x:s}=n,i=t.dataIdMap.get(s.dataId).id,o=t.makeOutput(s.shape,s.dtype),l=t.dataIdMap.get(o.dataId).id;return PS(i,r,l),o}var Wae={kernelName:Gr,backendName:"wasm",setupFunc:Lae,kernelFunc:zae},OS;function Bae(e){OS=e.wasm.cwrap(xl,null,["number","array","number","array","array","array","array","array","number","number"])}function Vae(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{begin:s,end:i,strides:o}=a;o==null&&(o=new Array(s.length));let{beginMask:l,endMask:u,ellipsisMask:c,newAxisMask:p,shrinkAxisMask:d}=a,h=E.slice_util.maskToAxes(c);if(h.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(c!==0&&p!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(c!==0&&d!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let m=r.shape.length-s.length,f=E.slice_util.maskToAxes(p),g=r.shape.slice();f.forEach(D=>{s[D]=0,i[D]=1,g.splice(D,0,1)});let y=Pa({inputs:{x:r},attrs:{shape:g},backend:t}),{begin:b,end:x,strides:v}=E.slice_util.getNormalizedAxes(y.shape,h,m,s,i,o,l,u,c);s=b,i=x,o=v;let k=E.slice_util.maskToAxes(d);k.forEach(D=>{i[D]=s[D]+1,o[D]=1});let w=E.slice_util.computeOutShape(s,i,o),S=w.filter((D,R)=>k.indexOf(R)===-1);if(o.every(D=>D===1)){let D=Um({inputs:{x:y},attrs:{begin:s,size:w},backend:t});t.disposeData(y.dataId);let R=Pa({inputs:{x:D},attrs:{shape:S},backend:t});return t.disposeData(D.dataId),R}let A=t.makeOutput(S,"float32");if(!S.some(D=>D===0)){let D=t.dataIdMap.get(y.dataId).id,R=new Uint8Array(new Int32Array(I.computeStrides(y.shape)).buffer),L=new Uint8Array(new Int32Array(s).buffer),W=new Uint8Array(new Int32Array(i).buffer),U=new Uint8Array(new Int32Array(o).buffer),G=new Uint8Array(new Int32Array(S).buffer),X=new Uint8Array(new Int32Array(I.computeStrides(S)).buffer),j=t.dataIdMap.get(A.dataId).id;OS(D,R,y.shape.length,L,W,U,G,X,S.length,j)}t.disposeData(y.dataId);let F=Pa({inputs:{x:A},attrs:{shape:S},backend:t});return t.disposeData(A.dataId),F}var Uae={kernelName:xl,backendName:"wasm",setupFunc:Bae,kernelFunc:Vae},Gae=!0,Hae=gn(hi,Gae),LS;function jae(e){LS=e.wasm.cwrap(ci,null,["number, number, number"])}function qae(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=mu(i,r,t),m=p;if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("sum",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;LS(l,y,x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Xae={kernelName:ci,backendName:"wasm",setupFunc:jae,kernelFunc:qae},Kae=En(mi),zS;function Yae(e){zS=e.wasm.cwrap(Ur,null,["number","array","number","array","number","number"])}function Jae(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,s=n.dataIdMap.get(r.dataId).id,{reps:i}=a,o=new Array(r.shape.length);for(let d=0;d{let{x:a}=e,{k:r,sorted:s}=n,i=t.dataIdMap.get(a.dataId).id,o=new Uint8Array(new Int32Array(a.shape).buffer),l=a.shape.slice();l[l.length-1]=r;let u=t.makeOutput(l,a.dtype),c=t.dataIdMap.get(u.dataId).id,p=t.makeOutput(l,"int32"),d=t.dataIdMap.get(p.dataId).id;return WS(i,o,a.shape.length,Hn[a.dtype],r,s,c,d),[u,p]},tre={kernelName:wl,backendName:"wasm",setupFunc:Zae,kernelFunc:ere};function nre(e){let{inputs:t,backend:n,attrs:a}=e,{value:r}=t,{axis:s}=a;s<0&&(s+=r.shape.length);let i=r.shape[s],o=r.shape.length,l=new Array(o-1),u=0;for(let h=0;h({dataId:h,dtype:m,shape:l}))}var are={kernelName:kl,backendName:"wasm",kernelFunc:nre};function rre(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(0),a}var sre={kernelName:Il,backendName:"wasm",kernelFunc:rre},ire=[Tee,Cee,_ee,Lee,Bee,Hee,jee,qee,Yee,Jee,ete,ate,rte,ote,cte,hte,gte,bte,xte,vte,kte,Tte,Ste,Ate,Nee,Ete,Mte,Ote,Wte,Ute,Hte,qte,Eee,Yte,Qte,ene,tne,ane,ine,lne,pne,mne,yne,xne,wne,kne,Tne,Ane,Ene,Dne,Pne,Lne,Wne,Une,Hne,Xne,Jne,Zne,tae,nae,aae,Vee,iae,uae,dae,mae,hae,yae,vae,Iae,Nae,Aae,Eae,Dae,Mae,Rae,Oae,Wae,Uae,Hae,Xae,Kae,Qae,tre,Ree,are,sre];for(let e of ire)hc(e);var Kv=Z();Kv.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])));Kv.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(Kv.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}});var BS=Io(yF()),ore='var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance;moduleLoaded()})}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){self={location:{href:__filename}};var onmessage=this.onmessage;var nodeWorkerThreads=require("worker_threads");global.Worker=nodeWorkerThreads.Worker;var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");var nodeRead=function(filename){return nodeFS.readFileSync(filename,"utf8")};function globalEval(x){global.require=require;global.Module=Module;eval.call(null,x)}importScripts=function(f){globalEval(nodeRead(f))};postMessage=function(msg){parentPort.postMessage(msg)};if(typeof performance==="undefined"){performance={now:function(){return Date.now()}}}}',lre=Io(bF()),VS=class extends ju{constructor(e){super();this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.init(),this.dataIdMap=new sd(this,Ua())}write(e,t,n){let a={id:this.dataIdNextNumber++};return this.move(a,e,t,n,1),a}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=I.now();return e(),{kernelMs:I.now()-t}}move(e,t,n,a,r){let s=this.dataIdNextNumber++;if(a==="string"){let u=t;this.dataIdMap.set(e,{id:s,stringBytes:u,shape:n,dtype:a,memoryOffset:null,refCount:r});return}let i=I.sizeFromShape(n),o=i*I.bytesPerElement(a),l=this.wasm._malloc(o);this.dataIdMap.set(e,{id:s,memoryOffset:l,shape:n,dtype:a,refCount:r}),this.wasm.tfjs.registerTensor(s,i,l),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,o),l)}async read(e){return this.readSync(e)}readSync(e){let{memoryOffset:t,dtype:n,shape:a,stringBytes:r}=this.dataIdMap.get(e);if(n==="string")return r;let s=this.wasm.HEAPU8.slice(t,t+I.sizeFromShape(a)*I.bytesPerElement(n));return ure(s.buffer,n)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let a;if(n==null)a=this.write(null,e,t);else{let r=this.dataIdNextNumber++;a={id:r},this.dataIdMap.set(a,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});let s=I.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,s,n)}return{dataId:a,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){let a=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),s=I.sizeFromShape(e);switch(t){case"float32":return new Float32Array(a,r,s);case"int32":return new Int32Array(a,r,s);case"bool":return new Uint8Array(a,r,s);default:throw new Error(`Unknown dtype ${t}`)}}};function cre(e){return(t,n)=>(I.fetch(e,{credentials:"same-origin"}).then(a=>{a.ok||t.env.a(`failed to load wasm binary file at '${e}'`),a.arrayBuffer().then(r=>{WebAssembly.instantiate(r,t).then(s=>{n(s.instance)})})}),{})}function US(e,t,n){if(Gm!=null)return Gm;let a="tfjs-backend-wasm.wasm";return e&&t?a="tfjs-backend-wasm-threaded-simd.wasm":e&&(a="tfjs-backend-wasm-simd.wasm"),yp!=null&&yp[a]!=null?yp[a]:n+a}async function pre(){let[e,t]=await Promise.all([Z().getAsync("WASM_HAS_SIMD_SUPPORT"),Z().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((n,a)=>{let r={};r.locateFile=(o,l)=>{if(o.endsWith(".worker.js")){let u=ore,c=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(c)}return o.endsWith(".wasm")?US(e,t,bp!=null?bp:l):l+o},Yv&&(r.instantiateWasm=cre(US(e,t,bp!=null?bp:"")));let s=!1;r.onAbort=()=>{s||xp||(xp=!0,a({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"}))};let i;t&&e&&Gm==null?(r.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+BS.default.toString()],{type:"text/javascript"}),i=(0,BS.default)(r)):i=(0,lre.default)(r),i.then(o=>{s=!0,xp=!1;let l=null;o.tfjs={init:o.cwrap("init",null,[]),registerTensor:o.cwrap("register_tensor",null,["number","number","number"]),disposeData:o.cwrap("dispose_data",l,["number"]),dispose:o.cwrap("dispose",l,[])},n({wasm:o})})})}function ure(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}var dre=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],Gm=null,bp=null,yp={},xp=!1,Yv=!1;function hre(e,t=!1){if(vy("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),xp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");Gm=e,Yv=t}function mre(e,t=!1){if(xp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof e=="string")bp=e;else{yp=e;let n=dre.filter(a=>yp[a]==null);if(n.length>0)throw new Error(`There were no entries found for the following binaries: ${n.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}Yv=t}var fre="3.3.0",gre=2;Qd("wasm",async()=>{let{wasm:e}=await pre();return new VS(e)},gre);var ZS={};ad(ZS,{AnchorPosition:()=>ir,DrawBox:()=>Xm,DrawBoxOptions:()=>cw,DrawFaceLandmarks:()=>vw,DrawFaceLandmarksOptions:()=>xw,DrawTextField:()=>fs,DrawTextFieldOptions:()=>Ip,drawContour:()=>Tr,drawDetections:()=>Cre,drawFaceExpressions:()=>Ere,drawFaceLandmarks:()=>Dre});function Tr(e,t,n=!1){if(e.beginPath(),t.slice(1).forEach(({x:a,y:r},s)=>{let i=t[s];e.moveTo(i.x,i.y),e.lineTo(a,r)}),n){let a=t[t.length-1],r=t[0];if(!a||!r)return;e.moveTo(a.x,a.y),e.lineTo(r.x,r.y)}e.stroke()}var GS={};ad(GS,{computeReshapedDimensions:()=>Zv,getCenterPoint:()=>Ki,isDimensions:()=>jm,isEven:()=>Hm,isFloat:()=>Qv,isTensor:()=>qi,isTensor1D:()=>yre,isTensor2D:()=>Jv,isTensor3D:()=>Sr,isTensor4D:()=>aa,isValidNumber:()=>Oa,isValidProbablitiy:()=>fu,range:()=>rr,round:()=>Xi});var yn=class{constructor(t,n){if(!Oa(t)||!Oa(n))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:n})}`);this._width=t,this._height=n}get width(){return this._width}get height(){return this._height}reverse(){return new yn(1/this.width,1/this.height)}};function qi(e,t){return e instanceof Fe&&e.shape.length===t}function yre(e){return qi(e,1)}function Jv(e){return qi(e,2)}function Sr(e){return qi(e,3)}function aa(e){return qi(e,4)}function Qv(e){return e%1!=0}function Hm(e){return e%2==0}function Xi(e,t=2){let n=10**t;return Math.floor(e*n)/n}function jm(e){return e&&e.width&&e.height}function Zv({width:e,height:t},n){let a=n/Math.max(t,e);return new yn(Math.round(e*a),Math.round(t*a))}function Ki(e){return e.reduce((t,n)=>t.add(n),new De(0,0)).div(new De(e.length,e.length))}function rr(e,t,n){return Array(e).fill(0).map((a,r)=>t+r*n)}function Oa(e){return!!e&&e!==Infinity&&e!==-Infinity&&!Number.isNaN(e)||e===0}function fu(e){return Oa(e)&&e>=0&&e<=1}var De=class{constructor(t,n){this._x=t,this._y=n}get x(){return this._x}get y(){return this._y}add(t){return new De(this.x+t.x,this.y+t.y)}sub(t){return new De(this.x-t.x,this.y-t.y)}mul(t){return new De(this.x*t.x,this.y*t.y)}div(t){return new De(this.x/t.x,this.y/t.y)}abs(){return new De(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new De(Math.floor(this.x),Math.floor(this.y))}};var ut=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(Oa)}static assertIsValidBox(t,n,a=!1){if(!ut.isRect(t))throw new Error(`${n} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!a&&(t.width<0||t.height<0))throw new Error(`${n} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,n=!0){let a=t||{},r=[a.left,a.top,a.right,a.bottom].every(Oa),s=[a.x,a.y,a.width,a.height].every(Oa);if(!s&&!r)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(a)}`);let[i,o,l,u]=s?[a.x,a.y,a.width,a.height]:[a.left,a.top,a.right-a.left,a.bottom-a.top];ut.assertIsValidBox({x:i,y:o,width:l,height:u},"Box.constructor",n),this._x=i,this._y=o,this._width=l,this._height=u}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new De(this.left,this.top)}get topRight(){return new De(this.right,this.top)}get bottomLeft(){return new De(this.left,this.bottom)}get bottomRight(){return new De(this.right,this.bottom)}round(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new ut({x:t,y:n,width:a,height:r})}floor(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new ut({x:t,y:n,width:a,height:r})}toSquare(){let{x:t,y:n,width:a,height:r}=this,s=Math.abs(a-r);return an&&(o=-p+n+a,p=n),d>t&&(l=-d+t+r,d=t),u<1&&(l=2-u,u=1),c<1&&(l=2-c,c=1),{dy:i,edy:l,dx:s,edx:o,y:c,ey:d,x:u,ex:p,w:a,h:r}}calibrate(t){return new ut({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var gu=class extends ut{constructor(t,n,a,r,s=!1){super({left:t,top:n,right:a,bottom:r},s)}};var ms=class{constructor(t,n,a,r,s){this._imageDims=new yn(s.width,s.height),this._score=t,this._classScore=n,this._className=a,this._box=new ut(r).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new ut(this._box).rescale(this.imageDims.reverse())}forSize(t,n){return new ms(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:n})}};var yt=class extends ms{constructor(t,n,a){super(t,t,"",n,a)}forSize(t,n){let{score:a,relativeBox:r,imageDims:s}=super.forSize(t,n);return new yt(a,r,s)}};function ew(e,t,n=!0){let a=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),r=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),s=a*r;return n?s/(e.area+t.area-s):s/Math.min(e.area,t.area)}function tw(e){let t=e.map(o=>o.x),n=e.map(o=>o.y),a=t.reduce((o,l)=>lloo({score:i,boxIndex:o})).sort((i,o)=>i.score-o.score).map(i=>i.boxIndex),s=[];for(;r.length>0;){let i=r.pop();s.push(i);let o=r,l=[];for(let u=0;ul[c]<=n)}return s}function La(e,t){return M(()=>{let[n,a,r]=t,s=Sn([...e.shape.slice(0,3),1],n,"float32"),i=Sn([...e.shape.slice(0,3),1],a,"float32"),o=Sn([...e.shape.slice(0,3),1],r,"float32"),l=Je([s,i,o],3);return me(e,l)})}function aw(e,t=!1){return M(()=>{let[n,a]=e.shape.slice(1);if(n===a)return e;let r=Math.abs(n-a),s=Math.round(r*(t?.5:1)),i=n>a?2:1,o=d=>{let h=e.shape.slice();return h[i]=d,Sn(h,0,"float32")},l=o(s),u=r-l.shape[i],p=[t&&u?o(u):null,e,l].filter(d=>!!d).map(d=>ue(d,"float32"));return Je(p,i)})}function bre(e){let t=e.slice();for(let n=t.length-1;n>0;n--){let a=Math.floor(Math.random()*(n+1)),r=t[n];t[n]=t[a],t[a]=r}return t}function vp(e){return 1/(1+Math.exp(-e))}function xre(e){return Math.log(e/(1-e))}var yu=class extends ut{constructor(t,n,a,r,s=!1){super({x:t,y:n,width:a,height:r},s)}};var vre=.5,wre=.43,kre=.45,ra=class{constructor(t,n,a=new De(0,0)){let{width:r,height:s}=n;this._imgDims=new yn(r,s),this._shift=a,this._positions=t.map(i=>i.mul(new De(r,s)).add(a))}get shift(){return new De(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new De(this.imageWidth,this.imageHeight)))}forSize(t,n){return new this.constructor(this.relativePositions,{width:t,height:n})}shiftBy(t,n){return new this.constructor(this.relativePositions,this._imgDims,new De(t,n))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,n={}){if(t){let s=t instanceof yt?t.box.floor():new ut(t);return this.shiftBy(s.x,s.y).align(null,n)}let{useDlibAlignment:a,minBoxPadding:r}={useDlibAlignment:!1,minBoxPadding:.2,...n};return a?this.alignDlib():this.alignMinBbox(r)}alignDlib(){let t=this.getRefPointsForAlignment(),[n,a,r]=t,s=p=>r.sub(p).magnitude(),i=(s(n)+s(a))/2,o=Math.floor(i/kre),l=Ki(t),u=Math.floor(Math.max(0,l.x-vre*o)),c=Math.floor(Math.max(0,l.y-wre*o));return new yu(u,c,Math.min(o,this.imageWidth+u),Math.min(o,this.imageHeight+c))}alignMinBbox(t){let n=tw(this.positions);return n.pad(n.width*t,n.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var HS=class extends ra{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Ki([t[3],t[4]])]}};var bu=class extends ra{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Ki)}};var wp=class{constructor(t,n){this._label=t,this._distance=n}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Xi(this.distance)})`:""}`}};var kp=class extends ut{static assertIsValidLabeledBox(t,n){if(ut.assertIsValidBox(t,n),!Oa(t.label))throw new Error(`${n} - expected property label (${t.label}) to be a number`)}constructor(t,n){super(t);this._label=n}get label(){return this._label}};var Cr=class{constructor(t,n){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(n)||n.some(a=>!(a instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=n}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let n=t.descriptors.map(a=>new Float32Array(a));return new Cr(t.label,n)}};var jS=class extends kp{static assertIsValidPredictedBox(t,n){if(kp.assertIsValidLabeledBox(t,n),!fu(t.score)||!fu(t.classScore))throw new Error(`${n} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,n,a,r){super(t,n);this._score=a,this._classScore=r}get score(){return this._score}get classScore(){return this._classScore}};function sr(e){return e.detection instanceof yt}function Yi(e,t){return{...e,...{detection:t}}}function rw(){let e=window.fetch;if(!e)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:e,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function qm(e){let t="";if(!e)try{e=require("fs")}catch(a){t=a.toString()}return{readFile:e?a=>new Promise((r,s)=>{e.readFile(a,(i,o)=>i?s(i):r(o))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function sw(){let e=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,n=()=>{if(e)return new e;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},a=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},r=global.fetch,s=qm();return{Canvas:e||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:n,createImageElement:a,fetch:r,...s}}function iw(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var ow=PA(XS()),Zt;function Tre(){if(!Zt)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return Zt}function lw(e){Zt=e}function uw(){return iw()?lw(rw()):(0,ow.isNodejs)()?lw(sw()):null}function Sre(e){if(Zt||uw(),!Zt)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=Zt.Canvas,Image:n=Zt.Image}=e;Zt.Canvas=t,Zt.Image=n,Zt.createCanvasElement=e.createCanvasElement||(()=>new t),Zt.createImageElement=e.createImageElement||(()=>new n),Zt.ImageData=e.ImageData||Zt.ImageData,Zt.Video=e.Video||Zt.Video,Zt.fetch=e.fetch||Zt.fetch,Zt.readFile=e.readFile||Zt.readFile}var st={getEnv:Tre,setEnv:lw,initialize:uw,createBrowserEnv:rw,createFileSystem:qm,createNodejsEnv:sw,monkeyPatch:Sre,isBrowser:iw,isNodejs:ow.isNodejs};uw();function Ji(e){return!st.isNodejs()&&typeof e=="string"?document.getElementById(e):e}function $n(e){let{Canvas:t,CanvasRenderingContext2D:n}=st.getEnv();if(e instanceof n)return e;let a=Ji(e);if(!(a instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let r=a.getContext("2d");if(!r)throw new Error("resolveContext2d - canvas 2d context is null");return r}var ir;(function(e){e.TOP_LEFT="TOP_LEFT",e.TOP_RIGHT="TOP_RIGHT",e.BOTTOM_LEFT="BOTTOM_LEFT",e.BOTTOM_RIGHT="BOTTOM_RIGHT"})(ir||(ir={}));var Ip=class{constructor(t={}){let{anchorPosition:n,backgroundColor:a,fontColor:r,fontSize:s,fontStyle:i,padding:o}=t;this.anchorPosition=n||ir.TOP_LEFT,this.backgroundColor=a||"rgba(0, 0, 0, 0.5)",this.fontColor=r||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=o||4}},fs=class{constructor(t,n,a={}){this.text=typeof t=="string"?[t]:t instanceof fs?t.text:t,this.anchor=n,this.options=new Ip(a)}measureWidth(t){let{padding:n}=this.options;return this.text.map(a=>t.measureText(a).width).reduce((a,r)=>a{let m=l+p.x,f=l+p.y+(h+1)*i;a.fillText(d,m,f)})}};var cw=class{constructor(t={}){let{boxColor:n,lineWidth:a,label:r,drawLabelOptions:s}=t;this.boxColor=n||"rgba(0, 0, 255, 1)",this.lineWidth=a||2,this.label=r;let i={anchorPosition:ir.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Ip({...i,...s})}},Xm=class{constructor(t,n={}){this.box=new ut(t),this.options=new cw(n)}draw(t){let n=$n(t),{boxColor:a,lineWidth:r}=this.options,{x:s,y:i,width:o,height:l}=this.box;n.strokeStyle=a,n.lineWidth=r,n.strokeRect(s,i,o,l);let{label:u}=this.options;u&&new fs([u],{x:s-r/2,y:i},this.options.drawLabelOptions).draw(t)}};function Cre(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof yt?a.score:sr(a)?a.detection.score:void 0,s=a instanceof yt?a.box:sr(a)?a.detection.box:new ut(a),i=r?`${Xi(r)}`:void 0;new Xm(s,{label:i}).draw(e)})}function Np(e){let{Image:t,Video:n}=st.getEnv();return e instanceof t&&e.complete||e instanceof n&&e.readyState>=3}function pw(e){return new Promise((t,n)=>{if(e instanceof st.getEnv().Canvas||Np(e))return t(null);function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),n(s))}function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),t(s))}e.addEventListener("load",r),e.addEventListener("error",a)})}function dw(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToImage - expected buf to be of type: Blob"));let a=new FileReader;a.onload=()=>{typeof a.result!="string"&&n(new Error("bufferToImage - expected reader.result to be a string, in onload"));let r=st.getEnv().createImageElement();r.onload=()=>t(r),r.onerror=n,r.src=a.result},a.onerror=n,a.readAsDataURL(e)})}function Qi(e){let{Image:t,Video:n}=st.getEnv();return e instanceof t?new yn(e.naturalWidth,e.naturalHeight):e instanceof n?new yn(e.videoWidth,e.videoHeight):new yn(e.width,e.height)}function Zi({width:e,height:t}){let{createCanvasElement:n}=st.getEnv(),a=n();return a.width=e,a.height=t,a}function Tp(e,t){let{ImageData:n}=st.getEnv();if(!(e instanceof n)&&!Np(e))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:a,height:r}=t||Qi(e),s=Zi({width:a,height:r});return e instanceof n?$n(s).putImageData(e,0,0):$n(s).drawImage(e,0,0,a,r),s}async function hw(e,t){let n=t||st.getEnv().createCanvasElement(),[a,r,s]=e.shape.slice(aa(e)?1:0),i=M(()=>e.as3D(a,r,s).toInt());return await ki.toPixels(i,n),i.dispose(),n}function Km(e){let{Image:t,Canvas:n,Video:a}=st.getEnv();return e instanceof t||e instanceof n||e instanceof a}function mw(e,t,n=!1){let{Image:a,Canvas:r}=st.getEnv();if(!(e instanceof a||e instanceof r))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Zi({width:1,height:1});let s=Qi(e),i=t/Math.max(s.height,s.width),o=i*s.width,l=i*s.height,u=Zi({width:t,height:t}),c=e instanceof r?e:Tp(e),p=Math.abs(o-l)/2,d=n&&o0&&c.height>0&&$n(u).drawImage(c,d,h,o,l),u}var Ar=class{constructor(t,n=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=n,this._batchSize=t.length,t.forEach((a,r)=>{if(Sr(a)){this._imageTensors[r]=a,this._inputDimensions[r]=a.shape;return}if(aa(a)){let i=a.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[r]=a,this._inputDimensions[r]=a.shape.slice(1);return}let s=a instanceof st.getEnv().Canvas?a:Tp(a);this._canvases[r]=s,this._inputDimensions[r]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return rr(this.batchSize,0,1).map((t,n)=>this.getReshapedInputDimensions(n))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let n=this.getInputWidth(t),a=this.getInputHeight(t);return Zv({width:n,height:a},this.inputSize)}toBatchTensor(t,n=!0){return this._inputSize=t,M(()=>{let a=rr(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof Fe){let o=aa(i)?i:i.expandDims();return o=aw(o,n),(o.shape[1]!==t||o.shape[2]!==t)&&(o=Ka.resizeBilinear(o,[t,t])),o.as3D(t,t,3)}if(i instanceof st.getEnv().Canvas)return ki.fromPixels(mw(i,t,n));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return Dt(a.map(s=>ue(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function mt(e){if(e instanceof Ar)return e;let t=Array.isArray(e)?e:[e];if(!t.length)throw new Error("toNetInput - empty array passed as input");let n=r=>Array.isArray(e)?` at input index ${r}:`:"",a=t.map(Ji);return a.forEach((r,s)=>{if(!Km(r)&&!Sr(r)&&!aa(r))throw typeof t[s]=="string"?new Error(`toNetInput -${n(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${n(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(aa(r)){let i=r.shape[0];if(i!==1)throw new Error(`toNetInput -${n(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(a.map(r=>Km(r)&&pw(r))),new Ar(a,Array.isArray(e))}async function xu(e,t){let{Canvas:n}=st.getEnv(),a=e;if(!(e instanceof n)){let i=await mt(e);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let o=i.getInput(0);a=o instanceof n?o:await hw(o)}let r=$n(a);return t.map(i=>i instanceof yt?i.forSize(a.width,a.height).box.floor():i).map(i=>i.clipAtImageBorders(a.width,a.height)).map(({x:i,y:o,width:l,height:u})=>{let c=Zi({width:l,height:u});return l>0&&u>0&&$n(c).putImageData(r.getImageData(i,o,l,u),0,0),c})}async function vu(e,t){if(!Sr(e)&&!aa(e))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(aa(e)&&e.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return M(()=>{let[n,a,r]=e.shape.slice(aa(e)?1:0);return t.map(o=>o instanceof yt?o.forSize(a,n).box:o).map(o=>o.clipAtImageBorders(a,n)).map(({x:o,y:l,width:u,height:c})=>Wl(e.as3D(n,a,r),[l,o,0],[c,u,r]))})}async function eo(e,t){let{fetch:n}=st.getEnv(),a=await n(e,t);if(!(a.status<400))throw new Error(`failed to fetch: (${a.status}) ${a.statusText}, from url: ${a.url}`);return a}async function Are(e){let t=await eo(e),n=await t.blob();if(!n.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${n.type}, for url: ${t.url}`);return dw(n)}async function fw(e){return(await eo(e)).json()}async function Fre(e){return new Float32Array(await(await eo(e)).arrayBuffer())}function Ym(e,t){let n=`${t}-weights_manifest.json`;if(!e)return{modelBaseUri:"",manifestUri:n};if(e==="/")return{modelBaseUri:"/",manifestUri:`/${n}`};let a=e.startsWith("http://")?"http://":e.startsWith("https://")?"https://":"";e=e.replace(a,"");let r=e.split("/").filter(o=>o),s=e.endsWith(".json")?r[r.length-1]:n,i=a+(e.endsWith(".json")?r.slice(0,r.length-1):r).join("/");return i=e.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function gw(e,t){let{manifestUri:n,modelBaseUri:a}=Ym(e,t),r=await fw(n);return jt.loadWeights(r,a)}function _re(e,t,n=!1){let{width:a,height:r}=n?Qi(t):t;return e.width=a,e.height=r,{width:a,height:r}}var on=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:n,objProp:a}=this.traversePropertyPath(t);return n[a]}reassignParamFromPath(t,n){let{obj:a,objProp:r}=this.traversePropertyPath(t);a[r].dispose(),a[r]=n}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof Hr)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof Hr))}variable(){this.getFrozenParams().forEach(({path:t,tensor:n})=>{this.reassignParamFromPath(t,n.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:n})=>{let a=Yn(n.dataSync());n.dispose(),this.reassignParamFromPath(t,a)})}dispose(t=!0){this.getParamList().forEach(n=>{if(t&&n.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${n.path}`);n.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,n)=>t.concat(n)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let n=await gw(t,this.getDefaultModelName());this.loadFromWeightMap(n)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:n}=st.getEnv(),{manifestUri:a,modelBaseUri:r}=Ym(t,this.getDefaultModelName()),s=u=>Promise.all(u.map(c=>n(c).then(p=>p.buffer))),i=jt.weightsLoaderFactory(s),o=JSON.parse((await n(a)).toString()),l=await i(o,r);this.loadFromWeightMap(l)}loadFromWeightMap(t){let{paramMappings:n,params:a}=this.extractParamsFromWeightMap(t);this._paramMappings=n,this._params=a}extractWeights(t){let{paramMappings:n,params:a}=this.extractParams(t);this._paramMappings=n,this._params=a}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let n=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:a,objProp:r}=n;if(!a||!r||!(a[r]instanceof Fe))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:a,objProp:r}}};function Dn(e,t,n){return M(()=>{let a=Fi(e,t.depthwise_filter,t.pointwise_filter,n,"same");return a=J(a,t.bias),a})}function Jm(e,t,n=!1){return M(()=>{let a=qe(n?J(Et(e,t.conv0.filters,[2,2],"same"),t.conv0.bias):Dn(e,t.conv0,[2,2])),r=Dn(a,t.conv1,[1,1]),s=qe(J(a,r)),i=Dn(s,t.conv2,[1,1]);return qe(J(a,J(r,i)))})}function Sp(e,t,n=!1,a=!0){return M(()=>{let r=qe(n?J(Et(e,t.conv0.filters,a?[2,2]:[1,1],"same"),t.conv0.bias):Dn(e,t.conv0,a?[2,2]:[1,1])),s=Dn(r,t.conv1,[1,1]),i=qe(J(r,s)),o=Dn(i,t.conv2,[1,1]),l=qe(J(r,J(s,o))),u=Dn(l,t.conv3,[1,1]);return qe(J(r,J(s,J(o,u))))})}function to(e,t,n="same",a=!1){return M(()=>{let r=J(Et(e,t.filters,[1,1],n),t.bias);return a?qe(r):r})}function bn(e,t){Object.keys(e).forEach(n=>{t.some(a=>a.originalPath===n)||e[n].dispose()})}function wu(e,t){return(n,a,r,s)=>{let i=Ca(e(n*a*r*r),[r,r,n,a]),o=Qe(e(a));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:o}}}function Qm(e,t){return(n,a,r)=>{let s=Sa(e(n*a),[n,a]),i=Qe(e(a));return t.push({paramPath:`${r}/weights`},{paramPath:`${r}/bias`}),{weights:s,bias:i}}}var Zm=class{constructor(t,n,a){this.depthwise_filter=t;this.pointwise_filter=n;this.bias=a}};function ku(e,t){return(n,a,r)=>{let s=Ca(e(3*3*n),[3,3,n,1]),i=Ca(e(n*a),[1,1,n,a]),o=Qe(e(a));return t.push({paramPath:`${r}/depthwise_filter`},{paramPath:`${r}/pointwise_filter`},{paramPath:`${r}/bias`}),new Zm(s,i,o)}}function Iu(e){return t=>{let n=e(`${t}/depthwise_filter`,4),a=e(`${t}/pointwise_filter`,4),r=e(`${t}/bias`,1);return new Zm(n,a,r)}}function jn(e,t){return(n,a,r)=>{let s=e[n];if(!qi(s,a))throw new Error(`expected weightMap[${n}] to be a Tensor${a}D, instead have ${s}`);return t.push({originalPath:n,paramPath:r||n}),s}}function xn(e){let t=e;function n(r){let s=t.slice(0,r);return t=t.slice(r),s}function a(){return t}return{extractWeights:n,getRemainingWeights:a}}function ef(e,t){let n=wu(e,t),a=ku(e,t);function r(i,o,l,u=!1){let c=u?n(i,o,3,`${l}/conv0`):a(i,o,`${l}/conv0`),p=a(o,o,`${l}/conv1`),d=a(o,o,`${l}/conv2`);return{conv0:c,conv1:p,conv2:d}}function s(i,o,l,u=!1){let{conv0:c,conv1:p,conv2:d}=r(i,o,l,u),h=a(o,o,`${l}/conv3`);return{conv0:c,conv1:p,conv2:d,conv3:h}}return{extractDenseBlock3Params:r,extractDenseBlock4Params:s}}function KS(e){let t=[],{extractWeights:n,getRemainingWeights:a}=xn(e),{extractDenseBlock4Params:r}=ef(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2"),l=r(128,256,"dense3");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o,dense3:l}}}function tf(e){return t=>{let n=e(`${t}/filters`,4),a=e(`${t}/bias`,1);return{filters:n,bias:a}}}function nf(e,t){let n=jn(e,t),a=tf(n),r=Iu(n);function s(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),c=r(`${o}/conv1`),p=r(`${o}/conv2`);return{conv0:u,conv1:c,conv2:p}}function i(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),c=r(`${o}/conv1`),p=r(`${o}/conv2`),d=r(`${o}/conv3`);return{conv0:u,conv1:c,conv2:p,conv3:d}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function YS(e){let t=[],{extractDenseBlock4Params:n}=nf(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return bn(e,t),{params:a,paramMappings:t}}var Cp=class extends on{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=La(a,[122.782,117.001,104.298]).div(ce(255)),i=Sp(s,n.dense0,!0);return i=Sp(i,n.dense1),i=Sp(i,n.dense2),i=Sp(i,n.dense3),i=Qn(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return YS(t)}extractParams(t){return KS(t)}};function Ap(e,t){return M(()=>J(ze(e,t.weights),t.bias))}function JS(e,t,n){let a=[],{extractWeights:r,getRemainingWeights:s}=xn(e),o=Qm(r,a)(t,n,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:a,params:{fc:o}}}function QS(e){let t=[],n=jn(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:a("fc")};return bn(e,t),{params:r,paramMappings:t}}function af(e){let t={},n={};return Object.keys(e).forEach(a=>{let r=a.startsWith("fc")?n:t;r[a]=e[a]}),{featureExtractorMap:t,classifierMap:n}}var Fp=class extends on{constructor(t,n){super(t);this._faceFeatureExtractor=n}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:n}=this;if(!n)throw new Error(`${this._name} - load model before inference`);return M(()=>{let a=t instanceof Ar?this.faceFeatureExtractor.forwardInput(t):t;return Ap(a.as2D(a.shape[0],-1),n.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:n,paramMappings:a}=this.extractClassifierParams(t);this._params=n,this._paramMappings=a}extractClassifierParams(t){return JS(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:n,classifierMap:a}=af(t);return this.faceFeatureExtractor.loadFromWeightMap(n),QS(a)}extractParams(t){let n=this.getClassifierChannelsIn(),a=this.getClassifierChannelsOut(),r=a*n+a,s=t.slice(0,t.length-r),i=t.slice(t.length-r);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var yw=["neutral","happy","sad","angry","fearful","disgusted","surprised"],gs=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);yw.forEach((n,a)=>{this[n]=t[a]})}asSortedArray(){return yw.map(t=>({expression:t,probability:this[t]})).sort((t,n)=>n.probability-t.probability)}};var rf=class extends Fp{constructor(t=new Cp){super("FaceExpressionNet",t)}forwardInput(t){return M(()=>Ta(this.runNet(t)))}async forward(t){return this.forwardInput(await mt(t))}async predictExpressions(t){let n=await mt(t),a=await this.forwardInput(n),r=await Promise.all(ct(a).map(async i=>{let o=await i.data();return i.dispose(),o}));a.dispose();let s=r.map(i=>new gs(i));return n.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function bw(e){return e.expressions instanceof gs}function sf(e,t){return{...e,...{expressions:t}}}function Ere(e,t,n=.1,a){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof gs?s:bw(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let l=i.asSortedArray().filter(p=>p.probability>n),u=sr(s)?s.detection.box.bottomLeft:a||new De(0,0);new fs(l.map(p=>`${p.expression} (${Xi(p.probability)})`),u).draw(e)})}function no(e){return sr(e)&&e.landmarks instanceof ra&&e.unshiftedLandmarks instanceof ra&&e.alignedRect instanceof yt}function $re(e){let t=(o,l,u,c)=>Math.atan2(c-l,u-o)%Math.PI,n=o=>o*180/Math.PI,a={roll:void 0,pitch:void 0,yaw:void 0};if(!e||!e._positions||e._positions.length!==68)return a;let r=e._positions;a.roll=-t(r[36]._x,r[36]._y,r[45]._x,r[45]._y),a.pitch=t(0,Math.abs(r[0]._x-r[30]._x)/r[30]._x,Math.PI,Math.abs(r[16]._x-r[30]._x)/r[30]._x);let s=r.reduce((o,l)=>oo>l._y?o:l._y,-Infinity);return a.yaw=Math.PI*(e._imgDims._height/(i-s)/1.4-1),a}function Nu(e,t){let{box:n}=e.detection,a=t.shiftBy(n.x,n.y),r=a.align(),{imageDims:s}=e.detection,i=new yt(e.detection.score,r.rescale(s.reverse()),s),o=$re(t);return{...e,...{landmarks:a,unshiftedLandmarks:t,alignedRect:i,angle:o}}}var xw=class{constructor(t={}){let{drawLines:n=!0,drawPoints:a=!0,lineWidth:r,lineColor:s,pointSize:i,pointColor:o}=t;this.drawLines=n,this.drawPoints=a,this.lineWidth=r||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=o||"rgba(255, 0, 255, 1)"}},vw=class{constructor(t,n={}){this.faceLandmarks=t,this.options=new xw(n)}draw(t){let n=$n(t),{drawLines:a,drawPoints:r,lineWidth:s,lineColor:i,pointSize:o,pointColor:l}=this.options;if(a&&this.faceLandmarks instanceof bu&&(n.strokeStyle=i,n.lineWidth=s,Tr(n,this.faceLandmarks.getJawOutline()),Tr(n,this.faceLandmarks.getLeftEyeBrow()),Tr(n,this.faceLandmarks.getRightEyeBrow()),Tr(n,this.faceLandmarks.getNose()),Tr(n,this.faceLandmarks.getLeftEye(),!0),Tr(n,this.faceLandmarks.getRightEye(),!0),Tr(n,this.faceLandmarks.getMouth(),!0)),r){n.strokeStyle=l,n.fillStyle=l;let u=c=>{n.beginPath(),n.arc(c.x,c.y,o,0,2*Math.PI),n.fill()};this.faceLandmarks.positions.forEach(u)}}};function Dre(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof ra?a:no(a)?a.landmarks:void 0;if(!r)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new vw(r).draw(e)})}var eC="1.1.1";function Mre(e,t){let n=wu(e,t),a=ku(e,t);function r(i,o,l){let u=a(i,o,`${l}/separable_conv0`),c=a(o,o,`${l}/separable_conv1`),p=n(i,o,1,`${l}/expansion_conv`);return{separable_conv0:u,separable_conv1:c,expansion_conv:p}}function s(i,o){let l=a(i,i,`${o}/separable_conv0`),u=a(i,i,`${o}/separable_conv1`),c=a(i,i,`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:c}}return{extractConvParams:n,extractSeparableConvParams:a,extractReductionBlockParams:r,extractMainBlockParams:s}}function tC(e,t){let n=[],{extractWeights:a,getRemainingWeights:r}=xn(e),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:o,extractMainBlockParams:l}=Mre(a,n),u=s(3,32,3,"entry_flow/conv_in"),c=o(32,64,"entry_flow/reduction_block_0"),p=o(64,128,"entry_flow/reduction_block_1"),d={conv_in:u,reduction_block_0:c,reduction_block_1:p},h={};rr(t,0,1).forEach(y=>{h[`main_block_${y}`]=l(128,`middle_flow/main_block_${y}`)});let m=o(128,256,"exit_flow/reduction_block"),f=i(256,512,"exit_flow/separable_conv"),g={reduction_block:m,separable_conv:f};if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:n,params:{entry_flow:d,middle_flow:h,exit_flow:g}}}function Rre(e,t){let n=jn(e,t),a=tf(n),r=Iu(n);function s(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),c=a(`${o}/expansion_conv`);return{separable_conv0:l,separable_conv1:u,expansion_conv:c}}function i(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),c=r(`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:c}}return{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}}function nC(e,t){let n=[],{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}=Rre(e,n),o=a("entry_flow/conv_in"),l=s("entry_flow/reduction_block_0"),u=s("entry_flow/reduction_block_1"),c={conv_in:o,reduction_block_0:l,reduction_block_1:u},p={};rr(t,0,1).forEach(f=>{p[`main_block_${f}`]=i(`middle_flow/main_block_${f}`)});let d=s("exit_flow/reduction_block"),h=r("exit_flow/separable_conv"),m={reduction_block:d,separable_conv:h};return bn(e,n),{params:{entry_flow:c,middle_flow:p,exit_flow:m},paramMappings:n}}function aC(e,t,n){return J(Et(e,t.filters,n,"same"),t.bias)}function ww(e,t,n=!0){let a=n?qe(e):e;return a=Dn(a,t.separable_conv0,[1,1]),a=Dn(qe(a),t.separable_conv1,[1,1]),a=$t(a,[3,3],[2,2],"same"),a=J(a,aC(e,t.expansion_conv,[2,2])),a}function Pre(e,t){let n=Dn(qe(e),t.separable_conv0,[1,1]);return n=Dn(qe(n),t.separable_conv1,[1,1]),n=Dn(qe(n),t.separable_conv2,[1,1]),n=J(n,e),n}var kw=class extends on{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyXception - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=La(a,[122.782,117.001,104.298]).div(ce(256)),i=qe(aC(s,n.entry_flow.conv_in,[2,2]));return i=ww(i,n.entry_flow.reduction_block_0,!1),i=ww(i,n.entry_flow.reduction_block_1),rr(this._numMainBlocks,0,1).forEach(o=>{i=Pre(i,n.middle_flow[`main_block_${o}`])}),i=ww(i,n.exit_flow.reduction_block),i=qe(Dn(i,n.exit_flow.separable_conv,[1,1])),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return nC(t,this._numMainBlocks)}extractParams(t){return tC(t,this._numMainBlocks)}};function rC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=xn(e),r=Qm(n,t),s=r(512,1,"fc/age"),i=r(512,2,"fc/gender");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function sC(e){let t=[],n=jn(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:{age:a("fc/age"),gender:a("fc/gender")}};return bn(e,t),{params:r,paramMappings:t}}var Fr;(function(e){e.FEMALE="female",e.MALE="male"})(Fr||(Fr={}));var of=class extends on{constructor(t=new kw(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:n}=this;if(!n)throw new Error(`${this._name} - load model before inference`);return M(()=>{let a=t instanceof Ar?this.faceFeatureExtractor.forwardInput(t):t,r=Qn(a,[7,7],[2,2],"valid").as2D(a.shape[0],-1),s=Ap(r,n.fc.age).as1D(),i=Ap(r,n.fc.gender);return{age:s,gender:i}})}forwardInput(t){return M(()=>{let{age:n,gender:a}=this.runNet(t);return{age:n,gender:Ta(a)}})}async forward(t){return this.forwardInput(await mt(t))}async predictAgeAndGender(t){let n=await mt(t),a=await this.forwardInput(n),r=ct(a.age),s=ct(a.gender),i=r.map((l,u)=>({ageTensor:l,genderTensor:s[u]})),o=await Promise.all(i.map(async({ageTensor:l,genderTensor:u})=>{let c=(await l.data())[0],p=(await u.data())[0],d=p>.5,h=d?Fr.MALE:Fr.FEMALE,m=d?p:1-p;return l.dispose(),u.dispose(),{age:c,gender:h,genderProbability:m}}));return a.age.dispose(),a.gender.dispose(),n.isBatchInput?o:o[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:n,paramMappings:a}=this.extractClassifierParams(t);this._params=n,this._paramMappings=a}extractClassifierParams(t){return rC(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:n,classifierMap:a}=af(t);return this.faceFeatureExtractor.loadFromWeightMap(n),sC(a)}extractParams(t){let n=512*1+1+(512*2+2),a=t.slice(0,t.length-n),r=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(r)}};var _p=class extends Fp{postProcess(t,n,a){let r=a.map(({width:i,height:o})=>{let l=n/Math.max(o,i);return{width:i*l,height:o*l}}),s=r.length;return M(()=>{let i=(p,d)=>Dt([Sn([68],p,"float32"),Sn([68],d,"float32")],1).as2D(1,136).as1D(),o=(p,d)=>{let{width:h,height:m}=r[p];return d(h,m)?Math.abs(h-m)/2:0},l=p=>o(p,(d,h)=>do(p,(d,h)=>hi(l(d),u(d))))).div(Dt(Array.from(Array(s),(p,d)=>i(r[d].width,r[d].height))))})}forwardInput(t){return M(()=>{let n=this.runNet(t);return this.postProcess(n,t.inputSize,t.inputDimensions.map(([a,r])=>({height:a,width:r})))})}async forward(t){return this.forwardInput(await mt(t))}async detectLandmarks(t){let n=await mt(t),a=M(()=>ct(this.forwardInput(n))),r=await Promise.all(a.map(async(s,i)=>{let o=Array.from(await s.data()),l=o.filter((c,p)=>Hm(p)),u=o.filter((c,p)=>!Hm(p));return new bu(Array(68).fill(0).map((c,p)=>new De(l[p],u[p])),{height:n.getInputHeight(i),width:n.getInputWidth(i)})}));return a.forEach(s=>s.dispose()),n.isBatchInput?r:r[0]}getClassifierChannelsOut(){return 136}};var Tu=class extends _p{constructor(t=new Cp){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function iC(e){let t=[],{extractDenseBlock3Params:n}=nf(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2")};return bn(e,t),{params:a,paramMappings:t}}function oC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=xn(e),{extractDenseBlock3Params:r}=ef(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o}}}var Iw=class extends on{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyFaceFeatureExtractor - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=La(a,[122.782,117.001,104.298]).div(ce(255)),i=Jm(s,n.dense0,!0);return i=Jm(i,n.dense1),i=Jm(i,n.dense2),i=Qn(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return iC(t)}extractParams(t){return oC(t)}};var lf=class extends _p{constructor(t=new Iw){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var lC=class extends Tu{};function uC(e,t){return J(B(e,t.weights),t.biases)}function Nw(e,t,n,a,r="same"){let{filters:s,bias:i}=t.conv,o=Et(e,s,n,r);return o=J(o,i),o=uC(o,t.scale),a?qe(o):o}function cC(e,t){return Nw(e,t,[1,1],!0)}function Tw(e,t){return Nw(e,t,[1,1],!1)}function uf(e,t){return Nw(e,t,[2,2],!0,"valid")}function Ore(e,t){function n(o,l,u){let c=e(o),p=c.length/(l*u*u);if(Qv(p))throw new Error(`depth has to be an integer: ${p}, weights.length: ${c.length}, numFilters: ${l}, filterSize: ${u}`);return M(()=>Ve(Ca(c,[l,p,u,u]),[2,3,1,0]))}function a(o,l,u,c){let p=n(o,l,u),d=Qe(e(l));return t.push({paramPath:`${c}/filters`},{paramPath:`${c}/bias`}),{filters:p,bias:d}}function r(o,l){let u=Qe(e(o)),c=Qe(e(o));return t.push({paramPath:`${l}/weights`},{paramPath:`${l}/biases`}),{weights:u,biases:c}}function s(o,l,u,c){let p=a(o,l,u,`${c}/conv`),d=r(l,`${c}/scale`);return{conv:p,scale:d}}function i(o,l,u,c,p=!1){let d=s((p?.5:1)*o,l,u,`${c}/conv1`),h=s(o,l,u,`${c}/conv2`);return{conv1:d,conv2:h}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function pC(e){let{extractWeights:t,getRemainingWeights:n}=xn(e),a=[],{extractConvLayerParams:r,extractResidualLayerParams:s}=Ore(t,a),i=r(4704,32,7,"conv32_down"),o=s(9216,32,3,"conv32_1"),l=s(9216,32,3,"conv32_2"),u=s(9216,32,3,"conv32_3"),c=s(36864,64,3,"conv64_down",!0),p=s(36864,64,3,"conv64_1"),d=s(36864,64,3,"conv64_2"),h=s(36864,64,3,"conv64_3"),m=s(147456,128,3,"conv128_down",!0),f=s(147456,128,3,"conv128_1"),g=s(147456,128,3,"conv128_2"),y=s(589824,256,3,"conv256_down",!0),b=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),v=s(589824,256,3,"conv256_down_out"),k=M(()=>Ve(Sa(t(256*128),[128,256]),[1,0]));if(a.push({paramPath:"fc"}),n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{params:{conv32_down:i,conv32_1:o,conv32_2:l,conv32_3:u,conv64_down:c,conv64_1:p,conv64_2:d,conv64_3:h,conv128_down:m,conv128_1:f,conv128_2:g,conv256_down:y,conv256_1:b,conv256_2:x,conv256_down_out:v,fc:k},paramMappings:a}}function Lre(e,t){let n=jn(e,t);function a(i){let o=n(`${i}/scale/weights`,1),l=n(`${i}/scale/biases`,1);return{weights:o,biases:l}}function r(i){let o=n(`${i}/conv/filters`,4),l=n(`${i}/conv/bias`,1),u=a(i);return{conv:{filters:o,bias:l},scale:u}}function s(i){return{conv1:r(`${i}/conv1`),conv2:r(`${i}/conv2`)}}return{extractConvLayerParams:r,extractResidualLayerParams:s}}function dC(e){let t=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=Lre(e,t),r=n("conv32_down"),s=a("conv32_1"),i=a("conv32_2"),o=a("conv32_3"),l=a("conv64_down"),u=a("conv64_1"),c=a("conv64_2"),p=a("conv64_3"),d=a("conv128_down"),h=a("conv128_1"),m=a("conv128_2"),f=a("conv256_down"),g=a("conv256_1"),y=a("conv256_2"),b=a("conv256_down_out"),{fc:x}=e;if(t.push({originalPath:"fc",paramPath:"fc"}),!Jv(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let v={conv32_down:r,conv32_1:s,conv32_2:i,conv32_3:o,conv64_down:l,conv64_1:u,conv64_2:c,conv64_3:p,conv128_down:d,conv128_1:h,conv128_2:m,conv256_down:f,conv256_1:g,conv256_2:y,conv256_down_out:b,fc:x};return bn(e,t),{params:v,paramMappings:t}}function za(e,t){let n=cC(e,t.conv1);return n=Tw(n,t.conv2),n=J(n,e),n=qe(n),n}function Ep(e,t){let n=uf(e,t.conv1);n=Tw(n,t.conv2);let a=Qn(e,2,2,"valid"),r=vt(a.shape),s=a.shape[3]!==n.shape[3];if(a.shape[1]!==n.shape[1]||a.shape[2]!==n.shape[2]){let o=[...n.shape];o[1]=1;let l=vt(o);n=Je([n,l],1);let u=[...n.shape];u[2]=1;let c=vt(u);n=Je([n,c],2)}return a=s?Je([a,r],3):a,n=J(a,n),n=qe(n),n}var Su=class extends on{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceRecognitionNet - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(150,!0),"float32"),s=La(a,[122.782,117.001,104.298]).div(ce(256)),i=uf(s,n.conv32_down);i=$t(i,3,2,"valid"),i=za(i,n.conv32_1),i=za(i,n.conv32_2),i=za(i,n.conv32_3),i=Ep(i,n.conv64_down),i=za(i,n.conv64_1),i=za(i,n.conv64_2),i=za(i,n.conv64_3),i=Ep(i,n.conv128_down),i=za(i,n.conv128_1),i=za(i,n.conv128_2),i=Ep(i,n.conv256_down),i=za(i,n.conv256_1),i=za(i,n.conv256_2),i=Ep(i,n.conv256_down_out);let o=i.mean([1,2]);return ze(o,n.fc)})}async forward(t){return this.forwardInput(await mt(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)==null?void 0:s.some(i=>i<=0))return new Float32Array(128);let n=await mt(t),a=M(()=>ct(this.forwardInput(n))),r=await Promise.all(a.map(i=>i.data()));return a.forEach(i=>i.dispose()),n.isBatchInput?r:r[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return dC(t)}extractParams(t){return pC(t)}};function zre(e){let t=new Su;return t.extractWeights(e),t}function cf(e,t){return{...e,...{descriptor:t}}}function Wre(e){return typeof e.age=="number"}function pf(e,t){return{...e,...{age:t}}}function Bre(e){return(e.gender===Fr.MALE||e.gender===Fr.FEMALE)&&fu(e.genderProbability)}function df(e,t,n){return{...e,...{gender:t,genderProbability:n}}}function Vre(e,t){function n(l,u){let c=Ca(e(3*3*l),[3,3,l,1]),p=Qe(e(l)),d=Qe(e(l)),h=Qe(e(l)),m=Qe(e(l));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/batch_norm_scale`},{paramPath:`${u}/batch_norm_offset`},{paramPath:`${u}/batch_norm_mean`},{paramPath:`${u}/batch_norm_variance`}),{filters:c,batch_norm_scale:p,batch_norm_offset:d,batch_norm_mean:h,batch_norm_variance:m}}function a(l,u,c,p,d){let h=Ca(e(l*u*c*c),[c,c,l,u]),m=Qe(e(u));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/${d?"batch_norm_offset":"bias"}`}),{filters:h,bias:m}}function r(l,u,c,p){let{filters:d,bias:h}=a(l,u,c,p,!0);return{filters:d,batch_norm_offset:h}}function s(l,u,c){let p=n(l,`${c}/depthwise_conv`),d=r(l,u,1,`${c}/pointwise_conv`);return{depthwise_conv:p,pointwise_conv:d}}function i(){let l=r(3,32,3,"mobilenetv1/conv_0"),u=s(32,64,"mobilenetv1/conv_1"),c=s(64,128,"mobilenetv1/conv_2"),p=s(128,128,"mobilenetv1/conv_3"),d=s(128,256,"mobilenetv1/conv_4"),h=s(256,256,"mobilenetv1/conv_5"),m=s(256,512,"mobilenetv1/conv_6"),f=s(512,512,"mobilenetv1/conv_7"),g=s(512,512,"mobilenetv1/conv_8"),y=s(512,512,"mobilenetv1/conv_9"),b=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),v=s(512,1024,"mobilenetv1/conv_12"),k=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:l,conv_1:u,conv_2:c,conv_3:p,conv_4:d,conv_5:h,conv_6:m,conv_7:f,conv_8:g,conv_9:y,conv_10:b,conv_11:x,conv_12:v,conv_13:k}}function o(){let l=r(1024,256,1,"prediction_layer/conv_0"),u=r(256,512,3,"prediction_layer/conv_1"),c=r(512,128,1,"prediction_layer/conv_2"),p=r(128,256,3,"prediction_layer/conv_3"),d=r(256,128,1,"prediction_layer/conv_4"),h=r(128,256,3,"prediction_layer/conv_5"),m=r(256,64,1,"prediction_layer/conv_6"),f=r(64,128,3,"prediction_layer/conv_7"),g=a(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=a(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),b=a(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=a(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),v=a(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),k=a(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),w=a(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),S=a(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),A=a(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),F=a(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),D=a(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),R=a(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:l,conv_1:u,conv_2:c,conv_3:p,conv_4:d,conv_5:h,conv_6:m,conv_7:f,box_predictor_0:{box_encoding_predictor:g,class_predictor:y},box_predictor_1:{box_encoding_predictor:b,class_predictor:x},box_predictor_2:{box_encoding_predictor:v,class_predictor:k},box_predictor_3:{box_encoding_predictor:w,class_predictor:S},box_predictor_4:{box_encoding_predictor:A,class_predictor:F},box_predictor_5:{box_encoding_predictor:D,class_predictor:R}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:o}}function hC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=xn(e),{extractMobilenetV1Params:r,extractPredictionLayerParams:s}=Vre(n,t),i=r(),o=s(),u={extra_dim:Kd(n(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:{mobilenetv1:i,prediction_layer:o,output_layer:u},paramMappings:t}}function Ure(e,t){let n=jn(e,t);function a(u,c,p){let d=n(`${u}/Conv2d_${c}_pointwise/weights`,4,`${p}/filters`),h=n(`${u}/Conv2d_${c}_pointwise/convolution_bn_offset`,1,`${p}/batch_norm_offset`);return{filters:d,batch_norm_offset:h}}function r(u){let c=`mobilenetv1/conv_${u}`,p=`MobilenetV1/Conv2d_${u}_depthwise`,d=`${c}/depthwise_conv`,h=`${c}/pointwise_conv`,m=n(`${p}/depthwise_weights`,4,`${d}/filters`),f=n(`${p}/BatchNorm/gamma`,1,`${d}/batch_norm_scale`),g=n(`${p}/BatchNorm/beta`,1,`${d}/batch_norm_offset`),y=n(`${p}/BatchNorm/moving_mean`,1,`${d}/batch_norm_mean`),b=n(`${p}/BatchNorm/moving_variance`,1,`${d}/batch_norm_variance`);return{depthwise_conv:{filters:m,batch_norm_scale:f,batch_norm_offset:g,batch_norm_mean:y,batch_norm_variance:b},pointwise_conv:a("MobilenetV1",u,h)}}function s(){return{conv_0:a("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:r(1),conv_2:r(2),conv_3:r(3),conv_4:r(4),conv_5:r(5),conv_6:r(6),conv_7:r(7),conv_8:r(8),conv_9:r(9),conv_10:r(10),conv_11:r(11),conv_12:r(12),conv_13:r(13)}}function i(u,c){let p=n(`${u}/weights`,4,`${c}/filters`),d=n(`${u}/biases`,1,`${c}/bias`);return{filters:p,bias:d}}function o(u){let c=i(`Prediction/BoxPredictor_${u}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${u}/box_encoding_predictor`),p=i(`Prediction/BoxPredictor_${u}/ClassPredictor`,`prediction_layer/box_predictor_${u}/class_predictor`);return{box_encoding_predictor:c,class_predictor:p}}function l(){return{conv_0:a("Prediction",0,"prediction_layer/conv_0"),conv_1:a("Prediction",1,"prediction_layer/conv_1"),conv_2:a("Prediction",2,"prediction_layer/conv_2"),conv_3:a("Prediction",3,"prediction_layer/conv_3"),conv_4:a("Prediction",4,"prediction_layer/conv_4"),conv_5:a("Prediction",5,"prediction_layer/conv_5"),conv_6:a("Prediction",6,"prediction_layer/conv_6"),conv_7:a("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:o(0),box_predictor_1:o(1),box_predictor_2:o(2),box_predictor_3:o(3),box_predictor_4:o(4),box_predictor_5:o(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:l}}function mC(e){let t=[],{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Ure(e,t),r=e["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Sr(r))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${r}`);let s={mobilenetv1:n(),prediction_layer:a(),output_layer:{extra_dim:r}};return bn(e,t),{params:s,paramMappings:t}}function xa(e,t,n){return M(()=>{let a=Et(e,t.filters,n,"same");return a=J(a,t.batch_norm_offset),Xt(a,0,6)})}var Gre=.0010000000474974513;function Hre(e,t,n){return M(()=>{let a=Qr(e,t.filters,n,"same");return a=fr(a,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Gre),Xt(a,0,6)})}function jre(e){return[2,4,6,12].some(t=>t===e)?[2,2]:[1,1]}function fC(e,t){return M(()=>{let n,a=xa(e,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let o=i+1,l=jre(o);a=Hre(a,s.depthwise_conv,l),a=xa(a,s.pointwise_conv,[1,1]),o===11&&(n=a)}),n===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:a,conv11:n}})}function qre(e,t,n){let a=e.arraySync(),r=Math.min(a[t][0],a[t][2]),s=Math.min(a[t][1],a[t][3]),i=Math.max(a[t][0],a[t][2]),o=Math.max(a[t][1],a[t][3]),l=Math.min(a[n][0],a[n][2]),u=Math.min(a[n][1],a[n][3]),c=Math.max(a[n][0],a[n][2]),p=Math.max(a[n][1],a[n][3]),d=(i-r)*(o-s),h=(c-l)*(p-u);if(d<=0||h<=0)return 0;let m=Math.max(r,l),f=Math.max(s,u),g=Math.min(i,c),y=Math.min(o,p),b=Math.max(g-m,0)*Math.max(y-f,0);return b/(d+h-b)}function gC(e,t,n,a,r){let s=e.shape[0],i=Math.min(n,s),o=t.map((c,p)=>({score:c,boxIndex:p})).filter(c=>c.score>r).sort((c,p)=>p.score-c.score),l=c=>c<=a?1:0,u=[];return o.forEach(c=>{if(u.length>=i)return;let p=c.score;for(let d=u.length-1;d>=0;--d){let h=qre(e,c.boxIndex,u[d]);if(h!==0&&(c.score*=l(h),c.score<=r))break}p===c.score&&u.push(c.boxIndex)}),u}function Xre(e){let t=ct(Ve(e,[1,0])),n=[me(t[2],t[0]),me(t[3],t[1])],a=[J(t[0],xe(n[0],ce(2))),J(t[1],xe(n[1],ce(2)))];return{sizes:n,centers:a}}function Kre(e,t){let{sizes:n,centers:a}=Xre(e),r=ct(Ve(t,[1,0])),s=xe(B(dn(xe(r[2],ce(5))),n[0]),ce(2)),i=J(B(xe(r[0],ce(10)),n[0]),a[0]),o=xe(B(dn(xe(r[3],ce(5))),n[1]),ce(2)),l=J(B(xe(r[1],ce(10)),n[1]),a[1]);return Ve(Dt([me(i,s),me(l,o),J(i,s),J(l,o)]),[1,0])}function yC(e,t,n){return M(()=>{let a=e.shape[0],r=Kre(H(Ha(n.extra_dim,[a,1,1]),[-1,4]),H(e,[-1,4]));r=H(r,[a,r.shape[0]/a,4]);let s=ca(Be(t,[0,0,1],[-1,-1,-1])),i=Be(s,[0,0,0],[-1,-1,1]);i=H(i,[a,i.shape[1]]);let o=ct(r),l=ct(i);return{boxes:o,scores:l}})}function ao(e,t){return M(()=>{let n=e.shape[0],a=H(to(e,t.box_encoding_predictor),[n,-1,1,4]),r=H(to(e,t.class_predictor),[n,-1,3]);return{boxPredictionEncoding:a,classPrediction:r}})}function bC(e,t,n){return M(()=>{let a=xa(e,n.conv_0,[1,1]),r=xa(a,n.conv_1,[2,2]),s=xa(r,n.conv_2,[1,1]),i=xa(s,n.conv_3,[2,2]),o=xa(i,n.conv_4,[1,1]),l=xa(o,n.conv_5,[2,2]),u=xa(l,n.conv_6,[1,1]),c=xa(u,n.conv_7,[2,2]),p=ao(t,n.box_predictor_0),d=ao(e,n.box_predictor_1),h=ao(r,n.box_predictor_2),m=ao(i,n.box_predictor_3),f=ao(l,n.box_predictor_4),g=ao(c,n.box_predictor_5),y=Je([p.boxPredictionEncoding,d.boxPredictionEncoding,h.boxPredictionEncoding,m.boxPredictionEncoding,f.boxPredictionEncoding,g.boxPredictionEncoding],1),b=Je([p.classPrediction,d.classPrediction,h.classPrediction,m.classPrediction,f.classPrediction,g.classPrediction],1);return{boxPredictions:y,classPredictions:b}})}var va=class{constructor({minConfidence:t,maxResults:n}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=n||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var ro=class extends on{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("SsdMobilenetv1 - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(512,!1),"float32"),r=me(B(a,ce(.007843137718737125)),ce(1)),s=fC(r,n.mobilenetv1),{boxPredictions:i,classPredictions:o}=bC(s.out,s.conv11,n.prediction_layer);return yC(i,o,n.output_layer)})}async forward(t){return this.forwardInput(await mt(t))}async locateFaces(t,n={}){let{maxResults:a,minConfidence:r}=new va(n),s=await mt(t),{boxes:i,scores:o}=this.forwardInput(s),l=i[0],u=o[0];for(let x=1;x{let[v,k]=[Math.max(0,y[x][0]),Math.min(1,y[x][2])].map(A=>A*g),[w,S]=[Math.max(0,y[x][1]),Math.min(1,y[x][3])].map(A=>A*f);return new yt(c[x],new yu(w,v,S-w,k-v),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return l.dispose(),u.dispose(),b}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return mC(t)}extractParams(t){return hC(t)}};function xC(e){let t=new ro;return t.extractWeights(e),t}function Yre(e){return xC(e)}var vC=class extends ro{};var wC=.4,kC=[new De(.738768,.874946),new De(2.42204,2.65704),new De(4.30971,7.04493),new De(10.246,4.59428),new De(12.6868,11.8741)],IC=[new De(1.603231,2.094468),new De(6.041143,7.080126),new De(2.882459,3.518061),new De(4.266906,5.178857),new De(9.041765,10.66308)],NC=[117.001,114.697,97.404],TC="tiny_yolov2_model",SC="tiny_yolov2_separable_conv_model";var hf=e=>typeof e=="number";function Sw(e){if(!e)throw new Error(`invalid config: ${e}`);if(typeof e.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${e.withSeparableConvs}`);if(!hf(e.iouThreshold)||e.iouThreshold<0||e.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${e.iouThreshold}`);if(!Array.isArray(e.classes)||!e.classes.length||!e.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(e.classes)}`);if(!Array.isArray(e.anchors)||!e.anchors.length||!e.anchors.map(t=>t||{}).every(t=>hf(t.x)&&hf(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(e.anchors)}`);if(e.meanRgb&&(!Array.isArray(e.meanRgb)||e.meanRgb.length!==3||!e.meanRgb.every(hf)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(e.meanRgb)}`)}function Cu(e){return M(()=>{let t=B(e,ce(.10000000149011612));return J(qe(me(e,t)),t)})}function _r(e,t){return M(()=>{let n=ea(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Et(n,t.conv.filters,[1,1],"valid"),n=me(n,t.bn.sub),n=B(n,t.bn.truediv),n=J(n,t.conv.bias),Cu(n)})}function Er(e,t){return M(()=>{let n=ea(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Fi(n,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),n=J(n,t.bias),Cu(n)})}function Jre(e,t){let n=wu(e,t);function a(i,o){let l=Qe(e(i)),u=Qe(e(i));return t.push({paramPath:`${o}/sub`},{paramPath:`${o}/truediv`}),{sub:l,truediv:u}}function r(i,o,l){let u=n(i,o,3,`${l}/conv`),c=a(o,`${l}/bn`);return{conv:u,bn:c}}let s=ku(e,t);return{extractConvParams:n,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}}function CC(e,t,n,a){let{extractWeights:r,getRemainingWeights:s}=xn(e),i=[],{extractConvParams:o,extractConvWithBatchNormParams:l,extractSeparableConvParams:u}=Jre(r,i),c;if(t.withSeparableConvs){let[p,d,h,m,f,g,y,b,x]=a,v=t.isFirstLayerConv2d?o(p,d,3,"conv0"):u(p,d,"conv0"),k=u(d,h,"conv1"),w=u(h,m,"conv2"),S=u(m,f,"conv3"),A=u(f,g,"conv4"),F=u(g,y,"conv5"),D=b?u(y,b,"conv6"):void 0,R=x?u(b,x,"conv7"):void 0,L=o(x||b||y,5*n,1,"conv8");c={conv0:v,conv1:k,conv2:w,conv3:S,conv4:A,conv5:F,conv6:D,conv7:R,conv8:L}}else{let[p,d,h,m,f,g,y,b,x]=a,v=l(p,d,"conv0"),k=l(d,h,"conv1"),w=l(h,m,"conv2"),S=l(m,f,"conv3"),A=l(f,g,"conv4"),F=l(g,y,"conv5"),D=l(y,b,"conv6"),R=l(b,x,"conv7"),L=o(x,5*n,1,"conv8");c={conv0:v,conv1:k,conv2:w,conv3:S,conv4:A,conv5:F,conv6:D,conv7:R,conv8:L}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:c,paramMappings:i}}function Qre(e,t){let n=jn(e,t);function a(o){let l=n(`${o}/sub`,1),u=n(`${o}/truediv`,1);return{sub:l,truediv:u}}function r(o){let l=n(`${o}/filters`,4),u=n(`${o}/bias`,1);return{filters:l,bias:u}}function s(o){let l=r(`${o}/conv`),u=a(`${o}/bn`);return{conv:l,bn:u}}let i=Iu(n);return{extractConvParams:r,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function AC(e,t){let n=[],{extractConvParams:a,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}=Qre(e,n),i;if(t.withSeparableConvs){let o=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?a("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:o>7?s("conv6"):void 0,conv7:o>8?s("conv7"):void 0,conv8:a("conv8")}}else i={conv0:r("conv0"),conv1:r("conv1"),conv2:r("conv2"),conv3:r("conv3"),conv4:r("conv4"),conv5:r("conv5"),conv6:r("conv6"),conv7:r("conv7"),conv8:a("conv8")};return bn(e,n),{params:i,paramMappings:n}}var or=class{constructor({inputSize:t,scoreThreshold:n}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=n||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var Cw=class extends on{constructor(t){super("TinyYolov2");Sw(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,n){let a=_r(t,n.conv0);return a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv1),a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv2),a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv3),a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv4),a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv5),a=$t(a,[2,2],[1,1],"same"),a=_r(a,n.conv6),a=_r(a,n.conv7),to(a,n.conv8,"valid",!1)}runMobilenet(t,n){let a=this.config.isFirstLayerConv2d?Cu(to(t,n.conv0,"valid",!1)):Er(t,n.conv0);return a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv1),a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv2),a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv3),a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv4),a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv5),a=$t(a,[2,2],[1,1],"same"),a=n.conv6?Er(a,n.conv6):a,a=n.conv7?Er(a,n.conv7):a,to(a,n.conv8,"valid",!1)}forwardInput(t,n){let{params:a}=this;if(!a)throw new Error("TinyYolov2 - load model before inference");return M(()=>{let r=ue(t.toBatchTensor(n,!1),"float32");return r=this.config.meanRgb?La(r,this.config.meanRgb):r,r=r.div(ce(256)),this.config.withSeparableConvs?this.runMobilenet(r,a):this.runTinyYolov2(r,a)})}async forward(t,n){return this.forwardInput(await mt(t),n)}async detect(t,n={}){let{inputSize:a,scoreThreshold:r}=new or(n),s=await mt(t),i=await this.forwardInput(s,a),o=M(()=>ct(i)[0].expandDims()),l={width:s.getInputWidth(0),height:s.getInputHeight(0)},u=await this.extractBoxes(o,s.getReshapedInputDimensions(0),r);i.dispose(),o.dispose();let c=u.map(g=>g.box),p=u.map(g=>g.score),d=u.map(g=>g.classScore),h=u.map(g=>this.config.classes[g.label]);return nw(c.map(g=>g.rescale(a)),p,this.config.iouThreshold,!0).map(g=>new ms(p[g],d[g],h[g],c[g],l))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return AC(t,this.config)}extractParams(t){let n=this.config.filterSizes||Cw.DEFAULT_FILTER_SIZES,a=n?n.length:void 0;if(a!==7&&a!==8&&a!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${a} filterSizes in config`);return CC(t,this.config,this.boxEncodingSize,n)}async extractBoxes(t,n,a){let{width:r,height:s}=n,i=Math.max(r,s),o=i/r,l=i/s,u=t.shape[1],c=this.config.anchors.length,[p,d,h]=M(()=>{let y=t.reshape([u,u,c,this.boxEncodingSize]),b=y.slice([0,0,0,0],[u,u,c,4]),x=y.slice([0,0,0,4],[u,u,c,1]),v=this.withClassScores?Ta(y.slice([0,0,0,5],[u,u,c,this.config.classes.length]),3):ce(0);return[b,x,v]}),m=[],f=await d.array(),g=await p.array();for(let y=0;ya){let k=(b+vp(g[y][b][x][0]))/u*o,w=(y+vp(g[y][b][x][1]))/u*l,S=Math.exp(g[y][b][x][2])*this.config.anchors[x].x/u*o,A=Math.exp(g[y][b][x][3])*this.config.anchors[x].y/u*l,F=k-S/2,D=w-A/2,R={row:y,col:b,anchor:x},{classScore:L,label:W}=this.withClassScores?await this.extractPredictedClass(h,R):{classScore:1,label:0};m.push({box:new gu(F,D,F+S,D+A),score:v,classScore:v*L,label:W,...R})}}return p.dispose(),d.dispose(),h.dispose(),m}async extractPredictedClass(t,n){let{row:a,col:r,anchor:s}=n,i=await t.array();return Array(this.config.classes.length).fill(0).map((o,l)=>i[a][r][s][l]).map((o,l)=>({classScore:o,label:l})).reduce((o,l)=>o.classScore>l.classScore?o:l)}},Au=Cw;Au.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var Fu=class extends Au{constructor(t=!0){let n={withSeparableConvs:t,iouThreshold:wC,classes:["face"],...t?{anchors:IC,meanRgb:NC}:{anchors:kC,withClassScores:!0}};super(n)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new yt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?SC:TC}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function Zre(e,t=!0){let n=new Fu(t);return n.extractWeights(e),n}var mf=class extends or{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var wa=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function so(e,t,n,a,r=({alignedRect:s})=>s){let s=e.map(l=>no(l)?r(l):l.detection),i=a||(t instanceof Fe?await vu(t,s):await xu(t,s)),o=await n(i);return i.forEach(l=>l instanceof Fe&&l.dispose()),o}async function _u(e,t,n,a,r){return so([e],t,async s=>n(s[0]),a,r)}var FC=.4,_C=[new De(1.603231,2.094468),new De(6.041143,7.080126),new De(2.882459,3.518061),new De(4.266906,5.178857),new De(9.041765,10.66308)],EC=[117.001,114.697,97.404];var Eu=class extends Au{constructor(){let t={withSeparableConvs:!0,iouThreshold:FC,classes:["face"],anchors:_C,meanRgb:EC,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new yt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var Ze={ssdMobilenetv1:new ro,tinyFaceDetector:new Eu,tinyYolov2:new Fu,faceLandmark68Net:new Tu,faceLandmark68TinyNet:new lf,faceRecognitionNet:new Su,faceExpressionNet:new rf,ageGenderNet:new of},$C=(e,t)=>Ze.ssdMobilenetv1.locateFaces(e,t),ese=(e,t)=>Ze.tinyFaceDetector.locateFaces(e,t),tse=(e,t)=>Ze.tinyYolov2.locateFaces(e,t),DC=e=>Ze.faceLandmark68Net.detectLandmarks(e),nse=e=>Ze.faceLandmark68TinyNet.detectLandmarks(e),ase=e=>Ze.faceRecognitionNet.computeFaceDescriptor(e),rse=e=>Ze.faceExpressionNet.predictExpressions(e),sse=e=>Ze.ageGenderNet.predictAgeAndGender(e),MC=e=>Ze.ssdMobilenetv1.load(e),ise=e=>Ze.tinyFaceDetector.load(e),ose=e=>Ze.tinyYolov2.load(e),lse=e=>Ze.faceLandmark68Net.load(e),use=e=>Ze.faceLandmark68TinyNet.load(e),cse=e=>Ze.faceRecognitionNet.load(e),pse=e=>Ze.faceExpressionNet.load(e),dse=e=>Ze.ageGenderNet.load(e),hse=MC,mse=$C,fse=DC;var Aw=class extends wa{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.extractedFaces=a}},Mu=class extends Aw{async run(){let t=await this.parentTask,n=await so(t,this.input,async a=>Promise.all(a.map(r=>Ze.faceExpressionNet.predictExpressions(r))),this.extractedFaces);return t.map((a,r)=>sf(a,n[r]))}withAgeAndGender(){return new $u(this,this.input)}},Ru=class extends Aw{async run(){let t=await this.parentTask;if(!t)return;let n=await _u(t,this.input,a=>Ze.faceExpressionNet.predictExpressions(a),this.extractedFaces);return sf(t,n)}withAgeAndGender(){return new Du(this,this.input)}},lo=class extends Mu{withAgeAndGender(){return new io(this,this.input)}withFaceDescriptors(){return new ys(this,this.input)}},uo=class extends Ru{withAgeAndGender(){return new oo(this,this.input)}withFaceDescriptor(){return new bs(this,this.input)}};var Fw=class extends wa{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.extractedFaces=a}},$u=class extends Fw{async run(){let t=await this.parentTask,n=await so(t,this.input,async a=>Promise.all(a.map(r=>Ze.ageGenderNet.predictAgeAndGender(r))),this.extractedFaces);return t.map((a,r)=>{let{age:s,gender:i,genderProbability:o}=n[r];return pf(df(a,i,o),s)})}withFaceExpressions(){return new Mu(this,this.input)}},Du=class extends Fw{async run(){let t=await this.parentTask;if(!t)return;let{age:n,gender:a,genderProbability:r}=await _u(t,this.input,s=>Ze.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return pf(df(t,a,r),n)}withFaceExpressions(){return new Ru(this,this.input)}},io=class extends $u{withFaceExpressions(){return new lo(this,this.input)}withFaceDescriptors(){return new ys(this,this.input)}},oo=class extends Du{withFaceExpressions(){return new uo(this,this.input)}withFaceDescriptor(){return new bs(this,this.input)}};var ff=class extends wa{constructor(t,n){super();this.parentTask=t;this.input=n}},ys=class extends ff{async run(){let t=await this.parentTask;return(await so(t,this.input,a=>Promise.all(a.map(r=>Ze.faceRecognitionNet.computeFaceDescriptor(r))),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}))).map((a,r)=>cf(t[r],a))}withFaceExpressions(){return new lo(this,this.input)}withAgeAndGender(){return new io(this,this.input)}},bs=class extends ff{async run(){let t=await this.parentTask;if(!t)return;let n=await _u(t,this.input,a=>Ze.faceRecognitionNet.computeFaceDescriptor(a),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}));return cf(t,n)}withFaceExpressions(){return new uo(this,this.input)}withAgeAndGender(){return new oo(this,this.input)}};var gf=class extends wa{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.useTinyLandmarkNet=a}get landmarkNet(){return this.useTinyLandmarkNet?Ze.faceLandmark68TinyNet:Ze.faceLandmark68Net}},yf=class extends gf{async run(){let t=await this.parentTask,n=t.map(s=>s.detection),a=this.input instanceof Fe?await vu(this.input,n):await xu(this.input,n),r=await Promise.all(a.map(s=>this.landmarkNet.detectLandmarks(s)));return a.forEach(s=>s instanceof Fe&&s.dispose()),t.map((s,i)=>Nu(s,r[i]))}withFaceExpressions(){return new lo(this,this.input)}withAgeAndGender(){return new io(this,this.input)}withFaceDescriptors(){return new ys(this,this.input)}},bf=class extends gf{async run(){let t=await this.parentTask;if(!t)return;let{detection:n}=t,a=this.input instanceof Fe?await vu(this.input,[n]):await xu(this.input,[n]),r=await this.landmarkNet.detectLandmarks(a[0]);return a.forEach(s=>s instanceof Fe&&s.dispose()),Nu(t,r)}withFaceExpressions(){return new uo(this,this.input)}withAgeAndGender(){return new oo(this,this.input)}withFaceDescriptor(){return new bs(this,this.input)}};var xf=class extends wa{constructor(t,n=new va){super();this.input=t;this.options=n}},$p=class extends xf{async run(){let{input:t,options:n}=this,a;if(n instanceof mf)a=Ze.tinyFaceDetector.locateFaces(t,n);else if(n instanceof va)a=Ze.ssdMobilenetv1.locateFaces(t,n);else if(n instanceof or)a=Ze.tinyYolov2.locateFaces(t,n);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return a}runAndExtendWithFaceDetections(){return new Promise(async t=>{let n=await this.run();t(n.map(a=>Yi({},a)))})}withFaceLandmarks(t=!1){return new yf(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Mu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new $u(this.runAndExtendWithFaceDetections(),this.input)}},vf=class extends xf{async run(){let t=await new $p(this.input,this.options),n=t[0];return t.forEach(a=>{a.score>n.score&&(n=a)}),n}runAndExtendWithFaceDetection(){return new Promise(async t=>{let n=await this.run();t(n?Yi({},n):void 0)})}withFaceLandmarks(t=!1){return new bf(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Ru(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Du(this.runAndExtendWithFaceDetection(),this.input)}};function gse(e,t=new va){return new vf(e,t)}function wf(e,t=new va){return new $p(e,t)}async function RC(e,t){return wf(e,new va(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function yse(e,t={}){return wf(e,new or(t)).withFaceLandmarks().withFaceDescriptors()}var bse=RC;function _w(e,t){if(e.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let n=Array.from(e),a=Array.from(t);return Math.sqrt(n.map((r,s)=>r-a[s]).reduce((r,s)=>r+s**2,0))}var kf=class{constructor(t,n=.6){this._distanceThreshold=n;let a=Array.isArray(t)?t:[t];if(!a.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let r=1,s=()=>`person ${r++}`;this._labeledDescriptors=a.map(i=>{if(i instanceof Cr)return i;if(i instanceof Float32Array)return new Cr(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new Cr(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,n){return n.map(a=>_w(a,t)).reduce((a,r)=>a+r,0)/(n.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:n,label:a})=>new wp(a,this.computeMeanDistance(t,n))).reduce((n,a)=>n.distancet.toJSON())}}static fromJSON(t){let n=t.labeledDescriptors.map(a=>Cr.fromJSON(a));return new kf(n,t.distanceThreshold)}};function xse(e){let t=new Eu;return t.extractWeights(e),t}function PC(e,t){let{width:n,height:a}=new yn(t.width,t.height);if(n<=0||a<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:n,height:a})}`);if(Array.isArray(e))return e.map(r=>PC(r,{width:n,height:a}));if(no(e)){let r=e.detection.forSize(n,a),s=e.unshiftedLandmarks.forSize(r.box.width,r.box.height);return Nu(Yi(e,r),s)}return sr(e)?Yi(e,e.detection.forSize(n,a)):e instanceof ra||e instanceof yt?e.forSize(n,a):e}var vse=typeof process!="undefined",wse=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",kse={faceapi:eC,node:vse,browser:wse};export{of as AgeGenderNet,gu as BoundingBox,ut as Box,wa as ComposableTask,ys as ComputeAllFaceDescriptorsTask,ff as ComputeFaceDescriptorsTaskBase,bs as ComputeSingleFaceDescriptorTask,yf as DetectAllFaceLandmarksTask,$p as DetectAllFacesTask,gf as DetectFaceLandmarksTaskBase,xf as DetectFacesTaskBase,bf as DetectSingleFaceLandmarksTask,vf as DetectSingleFaceTask,yn as Dimensions,yw as FACE_EXPRESSION_LABELS,yt as FaceDetection,vC as FaceDetectionNet,rf as FaceExpressionNet,gs as FaceExpressions,Tu as FaceLandmark68Net,lf as FaceLandmark68TinyNet,lC as FaceLandmarkNet,ra as FaceLandmarks,HS as FaceLandmarks5,bu as FaceLandmarks68,wp as FaceMatch,kf as FaceMatcher,Su as FaceRecognitionNet,Fr as Gender,kp as LabeledBox,Cr as LabeledFaceDescriptors,Ar as NetInput,on as NeuralNetwork,ms as ObjectDetection,De as Point,jS as PredictedBox,yu as Rect,ro as SsdMobilenetv1,va as SsdMobilenetv1Options,Eu as TinyFaceDetector,mf as TinyFaceDetectorOptions,Fu as TinyYolov2,or as TinyYolov2Options,bse as allFaces,RC as allFacesSsdMobilenetv1,yse as allFacesTinyYolov2,pw as awaitMediaLoaded,dw as bufferToImage,ase as computeFaceDescriptor,Zi as createCanvas,Tp as createCanvasFromMedia,Yre as createFaceDetectionNet,zre as createFaceRecognitionNet,xC as createSsdMobilenetv1,xse as createTinyFaceDetector,Zre as createTinyYolov2,wf as detectAllFaces,DC as detectFaceLandmarks,nse as detectFaceLandmarksTiny,fse as detectLandmarks,gse as detectSingleFace,ZS as draw,st as env,_w as euclideanDistance,pf as extendWithAge,cf as extendWithFaceDescriptor,Yi as extendWithFaceDetection,sf as extendWithFaceExpressions,Nu as extendWithFaceLandmarks,df as extendWithGender,vu as extractFaceTensors,xu as extractFaces,Are as fetchImage,fw as fetchJson,Fre as fetchNetWeights,eo as fetchOrThrow,$n as getContext2dOrThrow,Qi as getMediaDimensions,hw as imageTensorToCanvas,mw as imageToSquare,xre as inverseSigmoid,ew as iou,Km as isMediaElement,Np as isMediaLoaded,Wre as isWithAge,sr as isWithFaceDetection,bw as isWithFaceExpressions,no as isWithFaceLandmarks,Bre as isWithGender,dse as loadAgeGenderModel,hse as loadFaceDetectionModel,pse as loadFaceExpressionModel,lse as loadFaceLandmarkModel,use as loadFaceLandmarkTinyModel,cse as loadFaceRecognitionModel,MC as loadSsdMobilenetv1Model,ise as loadTinyFaceDetectorModel,ose as loadTinyYolov2Model,gw as loadWeightMap,mse as locateFaces,_re as matchDimensions,tw as minBbox,Ze as nets,nw as nonMaxSuppression,La as normalize,aw as padToSquare,sse as predictAgeAndGender,rse as recognizeFaceExpressions,PC as resizeResults,Ji as resolveInput,bre as shuffleArray,vp as sigmoid,$C as ssdMobilenetv1,Gw as tf,ese as tinyFaceDetector,tse as tinyYolov2,mt as toNetInput,GS as utils,Sw as validateConfig,kse as version}; + `}};function yee(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,segmentIds:s}=t,{numSegments:i}=a,o=r.shape.length,l=[],u=0,c=E.getAxesPermutation([u],o),p=r;c!=null&&(p=_n({inputs:{x:r},backend:n,attrs:{perm:c}}),l.push(p),u=E.getInnerMostAxes(1,o)[0]);let d=E.segment_util.computeOutShape(p.shape,u,i),h=I.sizeFromShape([p.shape[u]]),m=ye({inputs:{x:p},backend:n,attrs:{shape:[-1,h]}});l.push(m);let f=jd(r.dtype),g=(v,k,w,S,A)=>{let F=v.shape[0],D=v.shape[1],R=E.segment_util.segOpComputeOptimalWindowSize(D,A),L={windowSize:R,inSize:D,batchSize:F,numSegments:A},W=new gee(L,k),U=n.compileAndRun(W,[v,w],S);if(l.push(U),U.shape[1]===A)return U;let G=qT({backend:n,attrs:{start:0,stop:A,step:1,dtype:"float32"}}),X=YT({inputs:{x:G},backend:n,attrs:{reps:[D/R]}});return l.push(G),l.push(X),g(U,k,X,S,A)},y=g(m,"unsortedSegmentSum",s,f,i),b=ye({inputs:{x:y},backend:n,attrs:{shape:d}}),x=b;if(c!=null){l.push(b);let v=E.getUndoAxesPermutation(c);x=_n({inputs:{x},backend:n,attrs:{perm:v}})}return l.forEach(v=>n.disposeIntermediateTensorInfo(v)),x}var bee={kernelName:pc,backendName:"webgl",kernelFunc:yee},xee=[lJ,pJ,YX,QX,tK,rK,iK,uK,pK,hK,yK,xK,kK,TK,$K,AK,RK,zK,OK,UK,HK,qK,JK,r7,i7,d7,m7,b7,w7,EX,T7,R7,O7,F7,B7,U7,z7,j7,K7,Q7,eY,nY,sY,pY,hY,oY,gY,xY,IY,CY,EY,MY,RY,PY,LY,WY,VY,GY,jY,YY,e9,n9,r9,o9,p9,f9,x9,_X,w9,N7,N9,C9,_9,DX,M9,L9,W9,q9,G9,J9,eJ,rJ,hJ,wJ,xJ,TJ,CJ,FJ,yJ,EJ,DJ,OJ,BJ,HJ,ZJ,LX,tQ,rQ,oQ,cQ,l7,hQ,fQ,yQ,vQ,NQ,RX,SQ,CQ,u7,KJ,_Q,LQ,MQ,WX,VQ,HQ,XQ,JQ,tZ,aZ,iZ,uZ,pZ,mZ,yZ,vZ,IZ,SZ,FZ,n7,JJ,$Z,MZ,PZ,LZ,BZ,GZ,jZ,XZ,JZ,YJ,qX,eee,aee,iee,lee,pee,XX,hee,fee,bee,mQ];for(let e of xee)hc(e);var vee="3.3.0",wee={"tfjs-core":Q0,"tfjs-backend-cpu":BU,"tfjs-backend-webgl":FX,"tfjs-data":TN,"tfjs-layers":im,"tfjs-converter":xN,tfjs:vee},Hn;(function(e){e[e.float32=0]="float32",e[e.int32=1]="int32",e[e.bool=2]="bool",e[e.string=3]="string",e[e.complex64=4]="complex64"})(Hn||(Hn={}));var gp;(function(e){e[e.linear=0]="linear",e[e.relu=1]="relu",e[e.relu6=2]="relu6",e[e.prelu=3]="prelu",e[e.leakyrelu=4]="leakyrelu"})(gp||(gp={}));var JT;function kee(e){JT=e.wasm.cwrap(gi,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])}function Iee(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s,bias:i,preluActivationWeights:o}=t;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");let{transposeA:l,transposeB:u,activation:c,leakyreluAlpha:p}=a,d=n.dataIdMap.get(r.dataId).id,h=n.dataIdMap.get(s.dataId).id,m=0;if(i!=null){let A=n.dataIdMap.get(i.dataId);if(A.shape.length!==1)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${A.shape.length}.`);m=A.id}let f=o==null?0:n.dataIdMap.get(o.dataId).id,g=gp[c];if(g==null)throw new Error(`${c} activation not yet supported for FusedConv2D in the wasm backend.`);let y=l?r.shape[2]:r.shape[1],b=u?s.shape[1]:s.shape[2],x=r.shape[0],v=n.makeOutput([x,y,b],r.dtype),k=n.dataIdMap.get(v.dataId).id,w=new Uint8Array(new Int32Array(r.shape).buffer),S=new Uint8Array(new Int32Array(s.shape).buffer);return JT(d,w,r.shape.length,h,S,s.shape.length,l,u,g,m,f,p||0,k),v}var Nee={kernelName:gi,backendName:"wasm",setupFunc:kee,kernelFunc:Iee};function En(e){let t;function n(r){t=r.wasm.cwrap(e,null,["number","number"])}function a(r){let{backend:s,inputs:{x:i}}=r,o=s.dataIdMap.get(i.dataId).id,l=s.makeOutput(i.shape,i.dtype),u=s.dataIdMap.get(l.dataId).id;return I.sizeFromShape(l.shape)===0||t(o,u),l}return{kernelName:e,backendName:"wasm",setupFunc:n,kernelFunc:a}}var Tee=En(So);function gn(e,t,n){let a;function r(i){a=i.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])}function s(i){let{backend:o,inputs:l}=i,{a:u,b:c}=l,p=o.dataIdMap.get(u.dataId).id,d=o.dataIdMap.get(c.dataId).id,h=n!=null?n:u.dtype,m=E.assertAndGetBroadcastShape(u.shape,c.shape),f=o.makeOutput(m,h);if(I.sizeFromShape(m)===0)return f;let g=new Uint8Array(new Int32Array(u.shape).buffer),y=new Uint8Array(new Int32Array(c.shape).buffer),b=o.dataIdMap.get(f.dataId).id,x=()=>a(p,g,u.shape.length,d,y,c.shape.length,Hn[u.dtype],b);if(t&&u.dtype==="float32")return x(),f;let v=E.getBroadcastDims(u.shape,m),k=E.getBroadcastDims(c.shape,m),w=v.every((A,F)=>A===F),S=k.every((A,F)=>A===F);if(w&&S)return x(),f;throw new Error(`Broadcasting along outer dims is not yet supported for ${u.dtype} ${e}.`)}return{kernelName:e,backendName:"wasm",setupFunc:r,kernelFunc:s}}var See=!0,Cee=gn(Br,See),QT;function Aee(e){QT=e.wasm.cwrap(Ns,null,["array","number","number","number"])}function Fee(e){let{inputs:t,backend:n}=e,a=n.makeOutput(t[0].shape,t[0].dtype);if(I.sizeFromShape(a.shape)===0)return a;let r=t.map(o=>n.dataIdMap.get(o.dataId).id),s=new Uint8Array(new Int32Array(r).buffer),i=n.dataIdMap.get(a.dataId).id;return QT(s,r.length,Hn[a.dtype],i),a}var _ee={kernelName:Ns,backendName:"wasm",setupFunc:Aee,kernelFunc:Fee};function Wm(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype),r=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(a).set(r),a}var Eee={kernelName:Bs,backendName:"wasm",kernelFunc:Wm},ZT;function $ee(e){ZT=e.wasm.cwrap(fi,null,["number","array","number","number","number","array","number"])}function Bm(e){let{inputs:t,backend:n,attrs:a}=e,[r,s]=Mee(t.x.shape,a.perm),i=!0;for(let m=0;m=r&&(s===-1||a[s]>a[i])&&(s=i);a[s]=r}return[n,a]}var Ree={kernelName:fi,backendName:"wasm",kernelFunc:Bm,setupFunc:$ee};function mu(e,t,n){let a=e.shape,r=e.shape.length,s=I.parseAxisParam(t,a),i=s,o=E.getAxesPermutation(i,r),l=null,u=!1;if(o!=null){let c=new Array(r);for(let d=0;d`new shape: ${i}, old shape: ${a.shape}. New shape and old shape must have the same number of elements.`),e.backend.incRef(a.dataId),{dataId:a.dataId,shape:i,dtype:a.dtype}}var Vee={kernelName:cl,backendName:"wasm",kernelFunc:Pa},nS;function Uee(e){nS=e.wasm.cwrap(Cs,null,["number","array","number","number","array","number","number","number","number"])}function Gee(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=a;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");let l=r.shape.length,u=s.shape.length,c=i?r.shape[l-2]:r.shape[l-1],p=o?s.shape[u-1]:s.shape[u-2],d=i?r.shape[l-1]:r.shape[l-2],h=o?s.shape[u-2]:s.shape[u-1],m=r.shape.slice(0,-2),f=s.shape.slice(0,-2),g=I.sizeFromShape(m),y=I.sizeFromShape(f),b=g===y||g===1||y===1;I.assert(l>=2&&u>=2&&b,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${m}) and (${f}).`);let x=(g>y?r.shape.slice(0,-2):s.shape.slice(0,-2)).concat([d,h]);I.assert(c===p,()=>`Error in matMul: inner shapes (${c}) and (${p}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let v=i?[g,c,d]:[g,d,c],k=o?[y,h,p]:[y,p,h],w=Pa({inputs:{x:r},backend:n,attrs:{shape:v}}),S=Pa({inputs:{x:s},backend:n,attrs:{shape:k}}),A=n.dataIdMap.get(w.dataId).id,F=n.dataIdMap.get(S.dataId).id,D=i?w.shape[2]:w.shape[1],R=o?S.shape[1]:S.shape[2],L=Math.max(g,y),W=n.makeOutput([L,D,R],w.dtype),U=n.dataIdMap.get(W.dataId).id,G=new Uint8Array(new Int32Array(w.shape).buffer),X=new Uint8Array(new Int32Array(S.shape).buffer);return nS(A,G,w.shape.length,F,X,S.shape.length,i,o,U),n.disposeData(w.dataId),n.disposeData(S.dataId),W.shape=x,W}var Hee={kernelName:Cs,backendName:"wasm",setupFunc:Uee,kernelFunc:Gee};function Vm(e){let{inputs:{x:t},attrs:{dtype:n},backend:a}=e,r=a.makeOutput(t.shape,n),s=a.typedArrayFromHeap(t);return a.typedArrayFromHeap(r).set(s),r}var jee={kernelName:As,backendName:"wasm",kernelFunc:Vm},qee=En(Fs),aS;function Xee(e){aS=e.wasm.cwrap(Vr,null,["number","number","number","number"])}function Kee(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{clipValueMin:s,clipValueMax:i}=a,o=n.dataIdMap.get(r.dataId).id,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(l.dataId).id;return aS(o,s,i,u),l}var Yee={kernelName:Vr,backendName:"wasm",setupFunc:Xee,kernelFunc:Kee};function rS(e){let{inputs:t,backend:n}=e,a=I.parseAxisParam(e.attrs.axis,t[0].shape)[0],r=E.computeOutShape(t.map(h=>h.shape),a),s=t.filter(h=>I.sizeFromShape(h.shape)>0);if(s.length===1)return Wm({inputs:{x:s[0]},backend:n});let i=n.makeOutput(r,t[0].dtype);if(I.sizeFromShape(r)===0)return i;let o=s.map(h=>h.shape);if(E.assertParamsConsistent(o,a),s[0].dtype==="string"){let h=s.map(x=>{let v=I.sizeFromShape(x.shape.slice(a));return Pa({inputs:{x},backend:n,attrs:{shape:[-1,v]}})}),m=h.map(x=>({vals:n.readSync(x.dataId),shape:x.shape}));r=E.computeOutShape(h.map(x=>x.shape),1);let f=h[0].shape[0]===1,g=fv(m,r,t[0].dtype,f),y=E.computeOutShape(s.map(x=>x.shape),a);i.shape=y;let b=n.dataIdMap.get(i.dataId);return b.stringBytes=E.fromStringArrayToUint8(g),h.forEach(x=>n.disposeData(x.dataId)),i}let l=I.sizeFromShape(s[0].shape.slice(0,a)),u=0,c=s.map(h=>{let m=I.sizeFromShape(h.shape.slice(a));return u+=m,m}),p=s.map(h=>n.typedArrayFromHeap(h)),d=n.typedArrayFromHeap(i);for(let h=0;h`cumsum does not support ${r.dtype} tensors in the WASM backend`);let u=E.getAxesPermutation([s],l),c=r;u!==null&&(c=Bm({inputs:{x:r},attrs:{perm:u},backend:n}));let p=E.getInnerMostAxes(1,l)[0];E.assertAxesAreInnerMostDims("cumsum",[p],l);let d=n.makeOutput(c.shape,c.dtype),h=c.shape[p],m=n.dataIdMap.get(c.dataId).id,f=n.dataIdMap.get(d.dataId).id;lS(m,i?1:0,o?1:0,h,f,Hn[r.dtype]);let g=d;if(u!==null){let y=E.getUndoAxesPermutation(u);g=Bm({inputs:{x:d},attrs:{perm:y},backend:n}),n.disposeData(c.dataId),n.disposeData(d.dataId)}return g}var cte={kernelName:Ds,backendName:"wasm",setupFunc:lte,kernelFunc:ute},uS;function pte(e){uS=e.wasm.cwrap(Oo,null,["number","number","number","array","number","array","array","number","number"])}function dte(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{blockSize:s,dataFormat:i}=a;I.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=r.shape[0],l=i==="NHWC"?r.shape[1]:r.shape[2],u=i==="NHWC"?r.shape[2]:r.shape[3],c=i==="NHWC"?r.shape[3]:r.shape[1],p=l*s,d=u*s,h=c/(s*s),m=i==="NHWC"?[o,p,d,h]:[o,h,p,d],f=t.makeOutput(m,"float32"),g=t.dataIdMap.get(r.dataId).id,y=new Uint8Array(new Int32Array(I.computeStrides(r.shape)).buffer),b=new Uint8Array(new Int32Array(m).buffer),x=new Uint8Array(new Int32Array(I.computeStrides(m)).buffer),v=t.dataIdMap.get(f.dataId).id;return uS(g,s,i==="NHWC"?1:0,y,r.shape.length-1,b,x,m.length,v),f}var hte={kernelName:Oo,backendName:"wasm",setupFunc:pte,kernelFunc:dte},cS;function mte(e){cS=e.wasm.cwrap(Ms,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function fte(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s}=t,i=a.dataIdMap.get(r.dataId).id,o=a.dataIdMap.get(s.dataId).id,{strides:l,dilations:u,pad:c,dimRoundingMode:p}=n,d=u==null?[1,1]:u,h=E.computeConv2DInfo(r.shape,s.shape,l,d,c,p,!0),m=h.filterHeight,f=h.filterWidth,g=h.padInfo.top,y=h.padInfo.right,b=h.padInfo.bottom,x=h.padInfo.left,v=h.dilationHeight,k=h.dilationWidth,w=h.strideHeight,S=h.strideWidth,A=h.inChannels,F=h.outChannels,D=h.padInfo.type==="SAME"?1:0;if(h.dataFormat!=="channelsLast")throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);let R=a.makeOutput(h.outShape,"float32"),L=a.dataIdMap.get(R.dataId).id;return cS(i,r.shape[0],r.shape[1],r.shape[2],o,m,f,g,y,b,x,D,v,k,w,S,A,F,L),R}var gte={kernelName:Ms,backendName:"wasm",setupFunc:mte,kernelFunc:fte},yte=!1,bte=gn(Wo,yte,"bool"),xte=En(Ps);function qv(e){let{inputs:t,attrs:n,backend:a}=e,{input:r}=t,{dim:s}=n,i=r.shape.length,o=r.shape.slice(),l=s;return s<0&&(I.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),Pa({inputs:{x:r},backend:a,attrs:{shape:o}})}var vte={kernelName:Bo,backendName:"wasm",kernelFunc:qv};function wte(e){let{attrs:{shape:t,value:n,dtype:a},backend:r}=e,s=r.makeOutput(t,a);return r.typedArrayFromHeap(s).fill(n),s}var kte={kernelName:tc,backendName:"wasm",kernelFunc:wte},pS;function Ite(e){pS=e.wasm.cwrap(Uo,null,["number","number","number","number","number","number"])}function Nte(e){let{inputs:t,backend:n}=e,{image:a}=t,r=n.makeOutput(a.shape,a.dtype),s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,[o,l,u,c]=a.shape;return pS(s,o,l,u,c,i),r}var Tte={kernelName:Uo,backendName:"wasm",kernelFunc:Nte,setupFunc:Ite},Ste=En(Os),Cte=!1,Ate=gn(Ls,Cte),dS;function Fte(e){dS=e.wasm.cwrap(zs,null,["number","number","number","number","number","number","number"])}function _te(e){let{backend:t,inputs:n,attrs:a}=e,{varianceEpsilon:r}=a,{x:s,mean:i,variance:o,offset:l,scale:u}=n,c=t.dataIdMap.get(s.dataId).id,p=t.dataIdMap.get(i.dataId).id,d=t.dataIdMap.get(o.dataId).id,h=l!=null?t.dataIdMap.get(l.dataId).id:0,m=u!=null?t.dataIdMap.get(u.dataId).id:0,f=t.makeOutput(s.shape,s.dtype);if(I.sizeFromShape(s.shape)===0)return f;let g=t.dataIdMap.get(f.dataId).id;return dS(c,p,d,h,m,r,g),f}var Ete={kernelName:zs,backendName:"wasm",setupFunc:Fte,kernelFunc:_te},hS;function $te(e){hS=e.wasm.cwrap(yi,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Dte(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dataFormat:p,dimRoundingMode:d,activation:h,leakyreluAlpha:m}=n,f=E.computeConv2DInfo(r.shape,s.shape,l,c,u,d),g=gp[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ee=a.dataIdMap.get(i.dataId);if(ee.shape.length!==1)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${ee.shape.length}.`);if(ee.shape[0]!==x)throw new Error(`FusedConv2D bias shape (${ee.shape}) does not match the number of output channels (${x})`);v=ee.id}let k=f.filterHeight,w=f.filterWidth,S=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,D=f.padInfo.left,R=f.dilationHeight,L=f.dilationWidth,W=f.strideHeight,U=f.strideWidth,G=f.inChannels,X=f.padInfo.type==="SAME"?1:0,j=f.batchSize,te=f.inHeight,Q=f.inWidth;if(p!=="NHWC")throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${p}'. Please use 'NHWC'.`);let se=a.makeOutput(f.outShape,"float32"),ne=a.dataIdMap.get(se.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return hS(y,j,te,Q,b,k,w,v,S,A,F,D,X,R,L,W,U,G,x,g,ie,m||0,ne),se}var Mte={kernelName:yi,backendName:"wasm",setupFunc:$te,kernelFunc:Dte},mS;function Rte(e){mS=e.wasm.cwrap(bi,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Pte(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dataFormat:p,dimRoundingMode:d,activation:h,leakyreluAlpha:m}=n,f=E.computeConv2DInfo(r.shape,s.shape,l,c,u,d,!0),g=gp[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ee=a.dataIdMap.get(i.dataId);if(ee.shape.length!==1)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${ee.shape.length}.`);if(ee.shape[0]!==x)throw new Error(`FusedDepthwiseConv2D bias shape (${ee.shape}) does not match the number of output channels (${x})`);v=ee.id}let k=f.filterHeight,w=f.filterWidth,S=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,D=f.padInfo.left,R=f.dilationHeight,L=f.dilationWidth,W=f.strideHeight,U=f.strideWidth,G=f.inChannels,X=f.padInfo.type==="SAME"?1:0,j=f.batchSize,te=f.inHeight,Q=f.inWidth;if(p!=="NHWC")throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${p}'. Please use 'NHWC'.`);let se=a.makeOutput(f.outShape,"float32"),ne=a.dataIdMap.get(se.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return mS(y,j,te,Q,b,k,w,v,S,A,F,D,X,R,L,W,U,G,x,g,ie,m||0,ne),se}var Ote={kernelName:bi,backendName:"wasm",setupFunc:Rte,kernelFunc:Pte},fS;function Lte(e){fS=e.wasm.cwrap(Ho,null,["number","number","number","number","number","number","array","number"])}function zte(e){let{backend:t,inputs:n}=e,{params:a,indices:r}=n,[s,i,o,l]=hy.prepareAndValidate(a,r),u=t.makeOutput(s,a.dtype);if(i===0)return u;let c=r.shape,p=c[c.length-1],d=t.dataIdMap.get(a.dataId).id,h=t.dataIdMap.get(r.dataId).id,m=new Uint8Array(new Int32Array(l).buffer),f=t.dataIdMap.get(u.dataId).id;return fS(d,Hn[a.dtype],h,i,p,o,m,f),u}var Wte={kernelName:Ho,backendName:"wasm",setupFunc:Lte,kernelFunc:zte},gS;function Bte(e){gS=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])}function Vte(e){let{backend:t,inputs:n,attrs:a}=e,{x:r,indices:s}=n,{axis:i,batchDims:o}=a,l=I.parseAxisParam(i,r.shape)[0],u=E.segment_util.collectGatherOpShapeInfo(r,s,l,o),c=Pa({inputs:{x:r},attrs:{shape:[u.batchSize,u.outerSize,u.dimSize,u.sliceSize]},backend:t}),p=I.sizeFromShape(s.shape),d=Pa({inputs:{x:s},attrs:{shape:[u.batchSize,p/u.batchSize]},backend:t}),h=[u.batchSize,u.outerSize,p/u.batchSize,u.sliceSize],m=t.makeOutput(h,r.dtype);if(I.sizeFromShape(r.shape)===0)return m;let f=c.shape.length-1,g=t.dataIdMap.get(c.dataId).id,y=t.dataIdMap.get(d.dataId).id,b=t.dataIdMap.get(m.dataId).id,x=new Uint8Array(new Int32Array(I.computeStrides(c.shape)).buffer),v=new Uint8Array(new Int32Array(I.computeStrides(h)).buffer);return gS(g,Hn[r.dtype],x,f,y,u.batchSize,v,b),t.disposeData(c.dataId),t.disposeData(d.dataId),m.shape=u.outputShape,m}var Ute={kernelName:Go,backendName:"wasm",setupFunc:Bte,kernelFunc:Vte},Gte=!1,Hte=gn(jo,Gte,"bool"),jte=!1,qte=gn(Ws,jte,"bool"),yS;function Xte(e){yS=e.wasm.cwrap(Vs,null,["number","number","number"])}function Kte(e){let{inputs:{x:t},attrs:{alpha:n},backend:a}=e,r=a.dataIdMap.get(t.dataId).id,s=a.makeOutput(t.shape,t.dtype);if(I.sizeFromShape(t.shape)!==0){let i=a.dataIdMap.get(s.dataId).id;yS(r,n,i)}return s}var Yte={kernelName:Vs,backendName:"wasm",setupFunc:Xte,kernelFunc:Kte},Jte=!1,Qte=gn(Yo,Jte,"bool"),Zte=!1,ene=gn(Jo,Zte,"bool"),tne=En(Us),nne=!1,ane=gn(Zo,nne,"bool"),bS;function rne(e){bS=e.wasm.cwrap(Gs,null,["number, number, number"])}function sne(e){let{backend:t,inputs:n,attrs:a}=e,{reductionIndices:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=i,{transposed:u,axes:c,originalAxes:p,inputWasTransposed:d}=mu(i,r,t);if(d){let b=t.dataIdMap.get(u.dataId).id;l=u,o=b}let h=l.shape.length;E.assertAxesAreInnerMostDims("max",c,h);let[m,f]=E.computeOutAndReduceShapes(l.shape,c),g=I.sizeFromShape(f),y=t.makeOutput(m,i.dtype);if(I.sizeFromShape(l.shape)!==0){let b=t.dataIdMap.get(y.dataId).id;bS(o,g,b)}if(d&&t.disposeData(u.dataId),s){let b=E.expandShapeToKeepDim(y.shape,p);y.shape=b}return y}var ine={kernelName:Gs,backendName:"wasm",setupFunc:rne,kernelFunc:sne},one=!1,lne=gn(Hs,one),xS;function une(e){xS=e.wasm.cwrap(js,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function cne(e){let{inputs:t,attrs:n,backend:a}=e,r=t.x,s=a.dataIdMap.get(r.dataId).id,{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=n,c=E.computePool2DInfo(r.shape,i,o,1,l,u),p=c.filterHeight,d=c.filterWidth,h=c.padInfo.top,m=c.padInfo.right,f=c.padInfo.bottom,g=c.padInfo.left,y=c.dilationHeight,b=c.dilationWidth,x=c.strideHeight,v=c.strideWidth,k=c.inChannels,w=c.outChannels;if(c.dataFormat!=="channelsLast")throw new Error(`wasm backend does not support dataFormat:'${c.dataFormat}'. Please use 'channelsLast'.`);let S=a.makeOutput(c.outShape,"float32"),A=a.dataIdMap.get(S.dataId).id;return xS(s,r.shape[0],r.shape[1],r.shape[2],p,d,h,m,f,g,y,b,x,v,k,w,A),S}var pne={kernelName:js,backendName:"wasm",setupFunc:une,kernelFunc:cne},vS;function dne(e){vS=e.wasm.cwrap(qs,null,["number, number, number"])}function hne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=mu(i,r,t),m=p;if(h){let v=t.dataIdMap.get(c.dataId).id;v!==o&&(u=c,l=v,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("mean",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=u;u.dtype!=="float32"&&(b=Vm({backend:t,inputs:{x:u},attrs:{dtype:"float32"}}),l=t.dataIdMap.get(b.dataId).id);let x=t.makeOutput(f,"float32");if(I.sizeFromShape(u.shape)!==0){let v=t.dataIdMap.get(x.dataId).id;vS(l,y,v)}if(h&&t.disposeData(c.dataId),s){let v=E.expandShapeToKeepDim(x.shape,d);x.shape=v}return u.dtype!=="float32"&&t.disposeData(b.dataId),x}var mne={kernelName:qs,backendName:"wasm",setupFunc:dne,kernelFunc:hne},wS;function fne(e){wS=e.wasm.cwrap(Xs,null,["number, number, number"])}function gne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=mu(i,r,t);if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x)}let m=u.shape.length;E.assertAxesAreInnerMostDims("min",p,m);let[f,g]=E.computeOutAndReduceShapes(u.shape,p),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;wS(l,y,x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var yne={kernelName:Xs,backendName:"wasm",setupFunc:fne,kernelFunc:gne},bne=!1,xne=gn(Ks,bne),vne=!0,wne=gn(Ys,vne),kne=En(tl);function Xv(e,t){let n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),a=n[0],r=n[1],s=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:a,selectedSize:r,pSelectedScores:s,pValidOutputs:i}}var kS;function Ine(e){kS=e.wasm.cwrap(al,"number",["number","number","number","number","number"])}function Nne(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i}=a,{boxes:o,scores:l}=n,u=t.dataIdMap.get(o.dataId).id,c=t.dataIdMap.get(l.dataId).id,p=kS(u,c,s,r,i),{pSelectedIndices:d,selectedSize:h,pSelectedScores:m,pValidOutputs:f}=Xv(t,p);return t.wasm._free(m),t.wasm._free(f),t.makeOutput([h],"int32",d)}var Tne={kernelName:al,backendName:"wasm",setupFunc:Ine,kernelFunc:Nne},IS;function Sne(e){IS=e.wasm.cwrap(rl,"number",["number","number","number","number","number","bool"])}function Cne(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,padToMaxOutputSize:o}=a,{boxes:l,scores:u}=n,c=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(u.dataId).id,d=IS(c,p,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=Xv(t,d);t.wasm._free(f);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([],"int32",g);return[y,b]}var Ane={kernelName:rl,backendName:"wasm",setupFunc:Sne,kernelFunc:Cne},NS;function Fne(e){NS=e.wasm.cwrap(sl,"number",["number","number","number","number","number","number"])}function _ne(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,softNmsSigma:o}=a,{boxes:l,scores:u}=n,c=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(u.dataId).id,d=NS(c,p,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=Xv(t,d);t.wasm._free(g);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([m],"float32",f);return[y,b]}var Ene={kernelName:sl,backendName:"wasm",setupFunc:Fne,kernelFunc:_ne},$ne=!1,Dne=gn(nl,$ne,"bool"),TS;function Mne(e){TS=e.wasm.cwrap(Js,null,["number","number","number","number","number"])}function Rne(e){let{inputs:t,backend:n,attrs:a}=e,{indices:r}=t,{depth:s,onValue:i,offValue:o}=a,l=n.makeOutput([...r.shape,s],"int32"),u=n.dataIdMap.get(l.dataId).id,c=n.dataIdMap.get(r.dataId).id;return TS(c,s,i,o,u),l}var Pne={kernelName:Js,backendName:"wasm",setupFunc:Mne,kernelFunc:Rne};function One(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(1),a}var Lne={kernelName:il,backendName:"wasm",kernelFunc:One};function zne(e){let{inputs:t,backend:n,attrs:a}=e,{axis:r}=a;if(t.length===1)return qv({inputs:{input:t[0]},backend:n,attrs:{dim:r}});let s=t[0].shape,i=t[0].dtype;t.forEach(c=>{I.assertShapesMatch(s,c.shape,"All tensors passed to stack must have matching shapes"),I.assert(i===c.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(c=>{let p=qv({inputs:{input:c},backend:n,attrs:{dim:r}});return o.push(p),p}),u=rS({inputs:l,backend:n,attrs:{axis:r}});return o.forEach(c=>n.disposeData(c.dataId)),u}var Wne={kernelName:ol,backendName:"wasm",kernelFunc:zne},SS;function Bne(e){SS=e.wasm.cwrap(Qs,null,["number","array","number","number","array","array","number","number"])}function Vne(e){let{inputs:{x:t},backend:n,attrs:{paddings:a,constantValue:r}}=e,s=a.map((m,f)=>m[0]+t.shape[f]+m[1]),i=n.dataIdMap.get(t.dataId).id,o=n.makeOutput(s,t.dtype),l=n.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),c=a.map(m=>m[0]),p=a.map(m=>m[1]),d=new Uint8Array(new Int32Array(c).buffer),h=new Uint8Array(new Int32Array(p).buffer);return SS(i,u,t.shape.length,Hn[t.dtype],d,h,r,l),o}var Une={kernelName:Qs,backendName:"wasm",kernelFunc:Vne,setupFunc:Bne},Gne=!1,Hne=gn(Zs,Gne),CS;function jne(e){CS=e.wasm.cwrap(ei,null,["number","number","number"])}function qne(e){let{inputs:t,backend:n}=e,{x:a,alpha:r}=t,s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,o=n.makeOutput(a.shape,"float32"),l=n.dataIdMap.get(o.dataId).id;return CS(s,i,l),o}var Xne={kernelName:ei,backendName:"wasm",setupFunc:jne,kernelFunc:qne},AS;function Kne(e){AS=e.wasm.cwrap(ll,null,["number","number","number","number"])}function Yne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=mu(i,r,t),m=p;if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("prod",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;AS(l,y,Hn[b.dtype],x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Jne={kernelName:ll,backendName:"wasm",setupFunc:Kne,kernelFunc:Yne},Qne=e=>{let{backend:t,attrs:n}=e,{start:a,stop:r,step:s,dtype:i}=n,o=bv(a,r,s,i),l=t.makeOutput([o.length],i);return t.typedArrayFromHeap(l).set(o),l},Zne={kernelName:oc,backendName:"wasm",kernelFunc:Qne},eae=!0,tae=gn(Rs,eae),nae=En(ti),aae=En(ai),FS;function rae(e){FS=e.wasm.cwrap(ni,null,["number","number","number","number","number","number","number","number","number","number"])}function sae(e){let{backend:t,inputs:n,attrs:a}=e,{images:r}=n,{alignCorners:s,halfPixelCenters:i,size:o}=a,[l,u]=o,[c,p,d,h]=r.shape,m=[c,l,u,h],f=t.dataIdMap.get(r.dataId),g;f.dtype!=="float32"&&(g=Vm({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(g.dataId));let y=f.id,b=t.makeOutput(m,"float32");if(I.sizeFromShape(r.shape)===0)return b;let x=t.dataIdMap.get(b.dataId).id;return FS(y,c,p,d,h,l,u,s?1:0,i?1:0,x),g!=null&&t.disposeData(g.dataId),b}var iae={kernelName:ni,backendName:"wasm",setupFunc:rae,kernelFunc:sae},_S;function oae(e){_S=e.wasm.cwrap(ri,null,["number","array","number","array","number","number"])}function lae(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dims:s}=a,i=I.parseAxisParam(s,r.shape);if(r.shape.length===0)return Wm({inputs:{x:r},backend:n});let o=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(r.dataId).id,u=n.dataIdMap.get(o.dataId).id,c=new Uint8Array(new Int32Array(i).buffer),p=new Uint8Array(new Int32Array(r.shape).buffer);_S(l,c,i.length,p,r.shape.length,u);let d=Pa({inputs:{x:o},attrs:{shape:r.shape},backend:n});return n.disposeData(o.dataId),d}var uae={kernelName:ri,backendName:"wasm",kernelFunc:lae,setupFunc:oae},ES;function cae(e){ES=e.wasm.cwrap(Nl,null,["number","number","number","number","number","number","number","number","array","number","number"])}function pae(e){let{inputs:t,backend:n,attrs:a}=e,{image:r}=t,{radians:s,fillValue:i,center:o}=a,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(r.dataId).id,c=n.dataIdMap.get(l.dataId).id,[p,d,h,m]=r.shape,[f,g]=E.getImageCenter(o,d,h),y=i===0,b=255,x=typeof i=="number"?[i,i,i,y?0:b]:[...i,b],v=new Uint8Array(new Int32Array(x).buffer);return ES(u,p,d,h,m,s,f,g,v,x.length,c),l}var dae={kernelName:Nl,backendName:"wasm",kernelFunc:pae,setupFunc:cae},hae=En(si),mae=En(ii),$S;function fae(e){$S=e.wasm.cwrap(pl,null,["number","number","number","number","number","number","array","number","number"])}function gae(e){let{backend:t,inputs:n,attrs:a}=e,{indices:r,updates:s}=n,{shape:i}=a,o=t.makeOutput(i,s.dtype);if(I.sizeFromShape(i)===0)return o;let{sliceRank:l,numUpdates:u,sliceSize:c,strides:p,outputSize:d}=my.calculateShapes(s,r,i),h=t.dataIdMap.get(r.dataId).id,m=t.dataIdMap.get(s.dataId).id,f=new Uint8Array(new Int32Array(p).buffer),g=t.dataIdMap.get(o.dataId).id;return $S(h,m,Hn[s.dtype],l,u,c,f,d,g),o}var yae={kernelName:pl,backendName:"wasm",setupFunc:fae,kernelFunc:gae},DS;function bae(e){DS=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}function xae(e){let{inputs:t,backend:n}=e,{condition:a,t:r,e:s}=t,i=n.dataIdMap.get(a.dataId).id,o=n.dataIdMap.get(r.dataId).id,l=n.dataIdMap.get(s.dataId).id,u=n.makeOutput(r.shape,r.dtype),c=n.dataIdMap.get(u.dataId).id,p=a.shape.length,d=r.shape.length,h=p===0||p>1||d===1?1:I.sizeFromShape(r.shape.slice(1));return DS(i,o,l,h,c),u}var vae={kernelName:dl,backendName:"wasm",kernelFunc:xae,setupFunc:bae},MS;function wae(e){MS=e.wasm.cwrap(li,null,["number","number"])}function kae(e){let{backend:t,inputs:{x:n}}=e,a=t.dataIdMap.get(n.dataId).id,r=t.makeOutput(n.shape,n.dtype),s=t.dataIdMap.get(r.dataId).id;return I.sizeFromShape(r.shape)===0||MS(a,s),r}var Iae={kernelName:"Sigmoid",backendName:"wasm",setupFunc:wae,kernelFunc:kae},Nae=En(oi);function Um(e){let{inputs:{x:t},attrs:{begin:n,size:a},backend:r}=e,[s,i]=pn.parseSliceParams(t,n,a),o=pn.isSliceContinous(t.shape,s,i),l=r.readSync(t.dataId),u=r.makeOutput(i,t.dtype),c=I.computeStrides(t.shape),p=r.dataIdMap.get(u.dataId);if(o){let m=pn.computeFlatOffset(s,c);return t.dtype==="string"?p.stringBytes=l.slice(m,m+I.sizeFromShape(i)):r.typedArrayFromHeap(u).set(l.subarray(m,m+I.sizeFromShape(i))),u}if(t.dtype==="string"){let m=km(l,s,i,t.shape,t.dtype);return p.stringBytes=m,u}let d=r.typedArrayFromHeap(u),h=t.shape.length;if(h===2)Tae(l,c[0],d,s,i);else if(h===3)Sae(l,c[0],c[1],d,s,i);else if(h===4)Cae(l,c[0],c[1],c[2],d,s,i);else{let m=km(l,s,i,t.shape,t.dtype);d.set(m)}return u}function Tae(e,t,n,a,r){let s=0,i=a[0],o=a[1],l=i+r[0];for(let u=i;u{let d=[...c];d[o]=p;let h=Um({inputs:{x:r},attrs:{begin:u,size:d},backend:a});return u[o]+=p,h})}var Dae={kernelName:bl,backendName:"wasm",kernelFunc:$ae},Mae=En(ui),Rae=En(cc),Pae=!0,Oae=gn(di,Pae),PS;function Lae(e){PS=e.wasm.cwrap(Gr,null,["number","number","number"])}function zae(e){let{backend:t,inputs:n,attrs:a}=e,{alpha:r}=a,{x:s}=n,i=t.dataIdMap.get(s.dataId).id,o=t.makeOutput(s.shape,s.dtype),l=t.dataIdMap.get(o.dataId).id;return PS(i,r,l),o}var Wae={kernelName:Gr,backendName:"wasm",setupFunc:Lae,kernelFunc:zae},OS;function Bae(e){OS=e.wasm.cwrap(xl,null,["number","array","number","array","array","array","array","array","number","number"])}function Vae(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{begin:s,end:i,strides:o}=a;o==null&&(o=new Array(s.length));let{beginMask:l,endMask:u,ellipsisMask:c,newAxisMask:p,shrinkAxisMask:d}=a,h=E.slice_util.maskToAxes(c);if(h.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(c!==0&&p!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(c!==0&&d!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let m=r.shape.length-s.length,f=E.slice_util.maskToAxes(p),g=r.shape.slice();f.forEach(D=>{s[D]=0,i[D]=1,g.splice(D,0,1)});let y=Pa({inputs:{x:r},attrs:{shape:g},backend:t}),{begin:b,end:x,strides:v}=E.slice_util.getNormalizedAxes(y.shape,h,m,s,i,o,l,u,c);s=b,i=x,o=v;let k=E.slice_util.maskToAxes(d);k.forEach(D=>{i[D]=s[D]+1,o[D]=1});let w=E.slice_util.computeOutShape(s,i,o),S=w.filter((D,R)=>k.indexOf(R)===-1);if(o.every(D=>D===1)){let D=Um({inputs:{x:y},attrs:{begin:s,size:w},backend:t});t.disposeData(y.dataId);let R=Pa({inputs:{x:D},attrs:{shape:S},backend:t});return t.disposeData(D.dataId),R}let A=t.makeOutput(S,"float32");if(!S.some(D=>D===0)){let D=t.dataIdMap.get(y.dataId).id,R=new Uint8Array(new Int32Array(I.computeStrides(y.shape)).buffer),L=new Uint8Array(new Int32Array(s).buffer),W=new Uint8Array(new Int32Array(i).buffer),U=new Uint8Array(new Int32Array(o).buffer),G=new Uint8Array(new Int32Array(S).buffer),X=new Uint8Array(new Int32Array(I.computeStrides(S)).buffer),j=t.dataIdMap.get(A.dataId).id;OS(D,R,y.shape.length,L,W,U,G,X,S.length,j)}t.disposeData(y.dataId);let F=Pa({inputs:{x:A},attrs:{shape:S},backend:t});return t.disposeData(A.dataId),F}var Uae={kernelName:xl,backendName:"wasm",setupFunc:Bae,kernelFunc:Vae},Gae=!0,Hae=gn(hi,Gae),LS;function jae(e){LS=e.wasm.cwrap(ci,null,["number, number, number"])}function qae(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=mu(i,r,t),m=p;if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("sum",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;LS(l,y,x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Xae={kernelName:ci,backendName:"wasm",setupFunc:jae,kernelFunc:qae},Kae=En(mi),zS;function Yae(e){zS=e.wasm.cwrap(Ur,null,["number","array","number","array","number","number"])}function Jae(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,s=n.dataIdMap.get(r.dataId).id,{reps:i}=a,o=new Array(r.shape.length);for(let d=0;d{let{x:a}=e,{k:r,sorted:s}=n,i=t.dataIdMap.get(a.dataId).id,o=new Uint8Array(new Int32Array(a.shape).buffer),l=a.shape.slice();l[l.length-1]=r;let u=t.makeOutput(l,a.dtype),c=t.dataIdMap.get(u.dataId).id,p=t.makeOutput(l,"int32"),d=t.dataIdMap.get(p.dataId).id;return WS(i,o,a.shape.length,Hn[a.dtype],r,s,c,d),[u,p]},tre={kernelName:wl,backendName:"wasm",setupFunc:Zae,kernelFunc:ere};function nre(e){let{inputs:t,backend:n,attrs:a}=e,{value:r}=t,{axis:s}=a;s<0&&(s+=r.shape.length);let i=r.shape[s],o=r.shape.length,l=new Array(o-1),u=0;for(let h=0;h({dataId:h,dtype:m,shape:l}))}var are={kernelName:kl,backendName:"wasm",kernelFunc:nre};function rre(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(0),a}var sre={kernelName:Il,backendName:"wasm",kernelFunc:rre},ire=[Tee,Cee,_ee,Lee,Bee,Hee,jee,qee,Yee,Jee,ete,ate,rte,ote,cte,hte,gte,bte,xte,vte,kte,Tte,Ste,Ate,Nee,Ete,Mte,Ote,Wte,Ute,Hte,qte,Eee,Yte,Qte,ene,tne,ane,ine,lne,pne,mne,yne,xne,wne,kne,Tne,Ane,Ene,Dne,Pne,Lne,Wne,Une,Hne,Xne,Jne,Zne,tae,nae,aae,Vee,iae,uae,dae,mae,hae,yae,vae,Iae,Nae,Aae,Eae,Dae,Mae,Rae,Oae,Wae,Uae,Hae,Xae,Kae,Qae,tre,Ree,are,sre];for(let e of ire)hc(e);var Kv=Z();Kv.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])));Kv.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(Kv.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}});var BS=Io(yF()),ore='var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance;moduleLoaded()})}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){self={location:{href:__filename}};var onmessage=this.onmessage;var nodeWorkerThreads=require("worker_threads");global.Worker=nodeWorkerThreads.Worker;var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");var nodeRead=function(filename){return nodeFS.readFileSync(filename,"utf8")};function globalEval(x){global.require=require;global.Module=Module;eval.call(null,x)}importScripts=function(f){globalEval(nodeRead(f))};postMessage=function(msg){parentPort.postMessage(msg)};if(typeof performance==="undefined"){performance={now:function(){return Date.now()}}}}',lre=Io(bF()),VS=class extends ju{constructor(e){super();this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.init(),this.dataIdMap=new sd(this,Ua())}write(e,t,n){let a={id:this.dataIdNextNumber++};return this.move(a,e,t,n,1),a}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=I.now();return e(),{kernelMs:I.now()-t}}move(e,t,n,a,r){let s=this.dataIdNextNumber++;if(a==="string"){let u=t;this.dataIdMap.set(e,{id:s,stringBytes:u,shape:n,dtype:a,memoryOffset:null,refCount:r});return}let i=I.sizeFromShape(n),o=i*I.bytesPerElement(a),l=this.wasm._malloc(o);this.dataIdMap.set(e,{id:s,memoryOffset:l,shape:n,dtype:a,refCount:r}),this.wasm.tfjs.registerTensor(s,i,l),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,o),l)}async read(e){return this.readSync(e)}readSync(e){let{memoryOffset:t,dtype:n,shape:a,stringBytes:r}=this.dataIdMap.get(e);if(n==="string")return r;let s=this.wasm.HEAPU8.slice(t,t+I.sizeFromShape(a)*I.bytesPerElement(n));return ure(s.buffer,n)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let a;if(n==null)a=this.write(null,e,t);else{let r=this.dataIdNextNumber++;a={id:r},this.dataIdMap.set(a,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});let s=I.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,s,n)}return{dataId:a,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){let a=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),s=I.sizeFromShape(e);switch(t){case"float32":return new Float32Array(a,r,s);case"int32":return new Int32Array(a,r,s);case"bool":return new Uint8Array(a,r,s);default:throw new Error(`Unknown dtype ${t}`)}}};function cre(e){return(t,n)=>(I.fetch(e,{credentials:"same-origin"}).then(a=>{a.ok||t.env.a(`failed to load wasm binary file at '${e}'`),a.arrayBuffer().then(r=>{WebAssembly.instantiate(r,t).then(s=>{n(s.instance)})})}),{})}function US(e,t,n){if(Gm!=null)return Gm;let a="tfjs-backend-wasm.wasm";return e&&t?a="tfjs-backend-wasm-threaded-simd.wasm":e&&(a="tfjs-backend-wasm-simd.wasm"),yp!=null&&yp[a]!=null?yp[a]:n+a}async function pre(){let[e,t]=await Promise.all([Z().getAsync("WASM_HAS_SIMD_SUPPORT"),Z().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((n,a)=>{let r={};r.locateFile=(o,l)=>{if(o.endsWith(".worker.js")){let u=ore,c=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(c)}return o.endsWith(".wasm")?US(e,t,bp!=null?bp:l):l+o},Yv&&(r.instantiateWasm=cre(US(e,t,bp!=null?bp:"")));let s=!1;r.onAbort=()=>{s||xp||(xp=!0,a({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"}))};let i;t&&e&&Gm==null?(r.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+BS.default.toString()],{type:"text/javascript"}),i=(0,BS.default)(r)):i=(0,lre.default)(r),i.then(o=>{s=!0,xp=!1;let l=null;o.tfjs={init:o.cwrap("init",null,[]),registerTensor:o.cwrap("register_tensor",null,["number","number","number"]),disposeData:o.cwrap("dispose_data",l,["number"]),dispose:o.cwrap("dispose",l,[])},n({wasm:o})})})}function ure(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}var dre=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],Gm=null,bp=null,yp={},xp=!1,Yv=!1;function hre(e,t=!1){if(vy("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),xp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");Gm=e,Yv=t}function mre(e,t=!1){if(xp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof e=="string")bp=e;else{yp=e;let n=dre.filter(a=>yp[a]==null);if(n.length>0)throw new Error(`There were no entries found for the following binaries: ${n.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}Yv=t}var fre="3.3.0",gre=2;Qd("wasm",async()=>{let{wasm:e}=await pre();return new VS(e)},gre);var ZS={};ad(ZS,{AnchorPosition:()=>ir,DrawBox:()=>Xm,DrawBoxOptions:()=>cw,DrawFaceLandmarks:()=>vw,DrawFaceLandmarksOptions:()=>xw,DrawTextField:()=>fs,DrawTextFieldOptions:()=>Ip,drawContour:()=>Tr,drawDetections:()=>Cre,drawFaceExpressions:()=>Ere,drawFaceLandmarks:()=>Dre});function Tr(e,t,n=!1){if(e.beginPath(),t.slice(1).forEach(({x:a,y:r},s)=>{let i=t[s];e.moveTo(i.x,i.y),e.lineTo(a,r)}),n){let a=t[t.length-1],r=t[0];if(!a||!r)return;e.moveTo(a.x,a.y),e.lineTo(r.x,r.y)}e.stroke()}var GS={};ad(GS,{computeReshapedDimensions:()=>Zv,getCenterPoint:()=>Ki,isDimensions:()=>jm,isEven:()=>Hm,isFloat:()=>Qv,isTensor:()=>qi,isTensor1D:()=>yre,isTensor2D:()=>Jv,isTensor3D:()=>Sr,isTensor4D:()=>aa,isValidNumber:()=>Oa,isValidProbablitiy:()=>fu,range:()=>rr,round:()=>Xi});var yn=class{constructor(t,n){if(!Oa(t)||!Oa(n))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:n})}`);this._width=t,this._height=n}get width(){return this._width}get height(){return this._height}reverse(){return new yn(1/this.width,1/this.height)}};function qi(e,t){return e instanceof Fe&&e.shape.length===t}function yre(e){return qi(e,1)}function Jv(e){return qi(e,2)}function Sr(e){return qi(e,3)}function aa(e){return qi(e,4)}function Qv(e){return e%1!=0}function Hm(e){return e%2==0}function Xi(e,t=2){let n=10**t;return Math.floor(e*n)/n}function jm(e){return e&&e.width&&e.height}function Zv({width:e,height:t},n){let a=n/Math.max(t,e);return new yn(Math.round(e*a),Math.round(t*a))}function Ki(e){return e.reduce((t,n)=>t.add(n),new De(0,0)).div(new De(e.length,e.length))}function rr(e,t,n){return Array(e).fill(0).map((a,r)=>t+r*n)}function Oa(e){return!!e&&e!==Infinity&&e!==-Infinity&&!Number.isNaN(e)||e===0}function fu(e){return Oa(e)&&e>=0&&e<=1}var De=class{constructor(t,n){this._x=t,this._y=n}get x(){return this._x}get y(){return this._y}add(t){return new De(this.x+t.x,this.y+t.y)}sub(t){return new De(this.x-t.x,this.y-t.y)}mul(t){return new De(this.x*t.x,this.y*t.y)}div(t){return new De(this.x/t.x,this.y/t.y)}abs(){return new De(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new De(Math.floor(this.x),Math.floor(this.y))}};var ut=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(Oa)}static assertIsValidBox(t,n,a=!1){if(!ut.isRect(t))throw new Error(`${n} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!a&&(t.width<0||t.height<0))throw new Error(`${n} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,n=!0){let a=t||{},r=[a.left,a.top,a.right,a.bottom].every(Oa),s=[a.x,a.y,a.width,a.height].every(Oa);if(!s&&!r)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(a)}`);let[i,o,l,u]=s?[a.x,a.y,a.width,a.height]:[a.left,a.top,a.right-a.left,a.bottom-a.top];ut.assertIsValidBox({x:i,y:o,width:l,height:u},"Box.constructor",n),this._x=i,this._y=o,this._width=l,this._height=u}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new De(this.left,this.top)}get topRight(){return new De(this.right,this.top)}get bottomLeft(){return new De(this.left,this.bottom)}get bottomRight(){return new De(this.right,this.bottom)}round(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new ut({x:t,y:n,width:a,height:r})}floor(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new ut({x:t,y:n,width:a,height:r})}toSquare(){let{x:t,y:n,width:a,height:r}=this,s=Math.abs(a-r);return an&&(o=-p+n+a,p=n),d>t&&(l=-d+t+r,d=t),u<1&&(l=2-u,u=1),c<1&&(l=2-c,c=1),{dy:i,edy:l,dx:s,edx:o,y:c,ey:d,x:u,ex:p,w:a,h:r}}calibrate(t){return new ut({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var gu=class extends ut{constructor(t,n,a,r,s=!1){super({left:t,top:n,right:a,bottom:r},s)}};var ms=class{constructor(t,n,a,r,s){this._imageDims=new yn(s.width,s.height),this._score=t,this._classScore=n,this._className=a,this._box=new ut(r).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new ut(this._box).rescale(this.imageDims.reverse())}forSize(t,n){return new ms(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:n})}};var yt=class extends ms{constructor(t,n,a){super(t,t,"",n,a)}forSize(t,n){let{score:a,relativeBox:r,imageDims:s}=super.forSize(t,n);return new yt(a,r,s)}};function ew(e,t,n=!0){let a=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),r=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),s=a*r;return n?s/(e.area+t.area-s):s/Math.min(e.area,t.area)}function tw(e){let t=e.map(o=>o.x),n=e.map(o=>o.y),a=t.reduce((o,l)=>lloo({score:i,boxIndex:o})).sort((i,o)=>i.score-o.score).map(i=>i.boxIndex),s=[];for(;r.length>0;){let i=r.pop();s.push(i);let o=r,l=[];for(let u=0;ul[c]<=n)}return s}function La(e,t){return M(()=>{let[n,a,r]=t,s=Sn([...e.shape.slice(0,3),1],n,"float32"),i=Sn([...e.shape.slice(0,3),1],a,"float32"),o=Sn([...e.shape.slice(0,3),1],r,"float32"),l=Je([s,i,o],3);return me(e,l)})}function aw(e,t=!1){return M(()=>{let[n,a]=e.shape.slice(1);if(n===a)return e;let r=Math.abs(n-a),s=Math.round(r*(t?.5:1)),i=n>a?2:1,o=d=>{let h=e.shape.slice();return h[i]=d,Sn(h,0,"float32")},l=o(s),u=r-l.shape[i],p=[t&&u?o(u):null,e,l].filter(d=>!!d).map(d=>ue(d,"float32"));return Je(p,i)})}function bre(e){let t=e.slice();for(let n=t.length-1;n>0;n--){let a=Math.floor(Math.random()*(n+1)),r=t[n];t[n]=t[a],t[a]=r}return t}function vp(e){return 1/(1+Math.exp(-e))}function xre(e){return Math.log(e/(1-e))}var yu=class extends ut{constructor(t,n,a,r,s=!1){super({x:t,y:n,width:a,height:r},s)}};var vre=.5,wre=.43,kre=.45,ra=class{constructor(t,n,a=new De(0,0)){let{width:r,height:s}=n;this._imgDims=new yn(r,s),this._shift=a,this._positions=t.map(i=>i.mul(new De(r,s)).add(a))}get shift(){return new De(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new De(this.imageWidth,this.imageHeight)))}forSize(t,n){return new this.constructor(this.relativePositions,{width:t,height:n})}shiftBy(t,n){return new this.constructor(this.relativePositions,this._imgDims,new De(t,n))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,n={}){if(t){let s=t instanceof yt?t.box.floor():new ut(t);return this.shiftBy(s.x,s.y).align(null,n)}let{useDlibAlignment:a,minBoxPadding:r}={useDlibAlignment:!1,minBoxPadding:.2,...n};return a?this.alignDlib():this.alignMinBbox(r)}alignDlib(){let t=this.getRefPointsForAlignment(),[n,a,r]=t,s=p=>r.sub(p).magnitude(),i=(s(n)+s(a))/2,o=Math.floor(i/kre),l=Ki(t),u=Math.floor(Math.max(0,l.x-vre*o)),c=Math.floor(Math.max(0,l.y-wre*o));return new yu(u,c,Math.min(o,this.imageWidth+u),Math.min(o,this.imageHeight+c))}alignMinBbox(t){let n=tw(this.positions);return n.pad(n.width*t,n.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var HS=class extends ra{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Ki([t[3],t[4]])]}};var bu=class extends ra{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Ki)}};var wp=class{constructor(t,n){this._label=t,this._distance=n}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Xi(this.distance)})`:""}`}};var kp=class extends ut{static assertIsValidLabeledBox(t,n){if(ut.assertIsValidBox(t,n),!Oa(t.label))throw new Error(`${n} - expected property label (${t.label}) to be a number`)}constructor(t,n){super(t);this._label=n}get label(){return this._label}};var Cr=class{constructor(t,n){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(n)||n.some(a=>!(a instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=n}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let n=t.descriptors.map(a=>new Float32Array(a));return new Cr(t.label,n)}};var jS=class extends kp{static assertIsValidPredictedBox(t,n){if(kp.assertIsValidLabeledBox(t,n),!fu(t.score)||!fu(t.classScore))throw new Error(`${n} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,n,a,r){super(t,n);this._score=a,this._classScore=r}get score(){return this._score}get classScore(){return this._classScore}};function sr(e){return e.detection instanceof yt}function Yi(e,t){return{...e,...{detection:t}}}function rw(){let e=window.fetch;if(!e)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:e,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function qm(e){let t="";if(!e)try{e=require("fs")}catch(a){t=a.toString()}return{readFile:e?a=>new Promise((r,s)=>{e.readFile(a,(i,o)=>i?s(i):r(o))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function sw(){let e=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,n=()=>{if(e)return new e;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},a=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},r=global.fetch,s=qm();return{Canvas:e||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:n,createImageElement:a,fetch:r,...s}}function iw(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var ow=PA(XS()),Zt;function Tre(){if(!Zt)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return Zt}function lw(e){Zt=e}function uw(){return iw()?lw(rw()):(0,ow.isNodejs)()?lw(sw()):null}function Sre(e){if(Zt||uw(),!Zt)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=Zt.Canvas,Image:n=Zt.Image}=e;Zt.Canvas=t,Zt.Image=n,Zt.createCanvasElement=e.createCanvasElement||(()=>new t),Zt.createImageElement=e.createImageElement||(()=>new n),Zt.ImageData=e.ImageData||Zt.ImageData,Zt.Video=e.Video||Zt.Video,Zt.fetch=e.fetch||Zt.fetch,Zt.readFile=e.readFile||Zt.readFile}var st={getEnv:Tre,setEnv:lw,initialize:uw,createBrowserEnv:rw,createFileSystem:qm,createNodejsEnv:sw,monkeyPatch:Sre,isBrowser:iw,isNodejs:ow.isNodejs};uw();function Ji(e){return!st.isNodejs()&&typeof e=="string"?document.getElementById(e):e}function $n(e){let{Canvas:t,CanvasRenderingContext2D:n}=st.getEnv();if(e instanceof n)return e;let a=Ji(e);if(!(a instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let r=a.getContext("2d");if(!r)throw new Error("resolveContext2d - canvas 2d context is null");return r}var ir;(function(e){e.TOP_LEFT="TOP_LEFT",e.TOP_RIGHT="TOP_RIGHT",e.BOTTOM_LEFT="BOTTOM_LEFT",e.BOTTOM_RIGHT="BOTTOM_RIGHT"})(ir||(ir={}));var Ip=class{constructor(t={}){let{anchorPosition:n,backgroundColor:a,fontColor:r,fontSize:s,fontStyle:i,padding:o}=t;this.anchorPosition=n||ir.TOP_LEFT,this.backgroundColor=a||"rgba(0, 0, 0, 0.5)",this.fontColor=r||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=o||4}},fs=class{constructor(t,n,a={}){this.text=typeof t=="string"?[t]:t instanceof fs?t.text:t,this.anchor=n,this.options=new Ip(a)}measureWidth(t){let{padding:n}=this.options;return this.text.map(a=>t.measureText(a).width).reduce((a,r)=>a{let m=l+p.x,f=l+p.y+(h+1)*i;a.fillText(d,m,f)})}};var cw=class{constructor(t={}){let{boxColor:n,lineWidth:a,label:r,drawLabelOptions:s}=t;this.boxColor=n||"rgba(0, 0, 255, 1)",this.lineWidth=a||2,this.label=r;let i={anchorPosition:ir.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Ip({...i,...s})}},Xm=class{constructor(t,n={}){this.box=new ut(t),this.options=new cw(n)}draw(t){let n=$n(t),{boxColor:a,lineWidth:r}=this.options,{x:s,y:i,width:o,height:l}=this.box;n.strokeStyle=a,n.lineWidth=r,n.strokeRect(s,i,o,l);let{label:u}=this.options;u&&new fs([u],{x:s-r/2,y:i},this.options.drawLabelOptions).draw(t)}};function Cre(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof yt?a.score:sr(a)?a.detection.score:void 0,s=a instanceof yt?a.box:sr(a)?a.detection.box:new ut(a),i=r?`${Xi(r)}`:void 0;new Xm(s,{label:i}).draw(e)})}function Np(e){let{Image:t,Video:n}=st.getEnv();return e instanceof t&&e.complete||e instanceof n&&e.readyState>=3}function pw(e){return new Promise((t,n)=>{if(e instanceof st.getEnv().Canvas||Np(e))return t(null);function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),n(s))}function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),t(s))}e.addEventListener("load",r),e.addEventListener("error",a)})}function dw(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToImage - expected buf to be of type: Blob"));let a=new FileReader;a.onload=()=>{typeof a.result!="string"&&n(new Error("bufferToImage - expected reader.result to be a string, in onload"));let r=st.getEnv().createImageElement();r.onload=()=>t(r),r.onerror=n,r.src=a.result},a.onerror=n,a.readAsDataURL(e)})}function Qi(e){let{Image:t,Video:n}=st.getEnv();return e instanceof t?new yn(e.naturalWidth,e.naturalHeight):e instanceof n?new yn(e.videoWidth,e.videoHeight):new yn(e.width,e.height)}function Zi({width:e,height:t}){let{createCanvasElement:n}=st.getEnv(),a=n();return a.width=e,a.height=t,a}function Tp(e,t){let{ImageData:n}=st.getEnv();if(!(e instanceof n)&&!Np(e))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:a,height:r}=t||Qi(e),s=Zi({width:a,height:r});return e instanceof n?$n(s).putImageData(e,0,0):$n(s).drawImage(e,0,0,a,r),s}async function hw(e,t){let n=t||st.getEnv().createCanvasElement(),[a,r,s]=e.shape.slice(aa(e)?1:0),i=M(()=>e.as3D(a,r,s).toInt());return await ki.toPixels(i,n),i.dispose(),n}function Km(e){let{Image:t,Canvas:n,Video:a}=st.getEnv();return e instanceof t||e instanceof n||e instanceof a}function mw(e,t,n=!1){let{Image:a,Canvas:r}=st.getEnv();if(!(e instanceof a||e instanceof r))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Zi({width:1,height:1});let s=Qi(e),i=t/Math.max(s.height,s.width),o=i*s.width,l=i*s.height,u=Zi({width:t,height:t}),c=e instanceof r?e:Tp(e),p=Math.abs(o-l)/2,d=n&&o0&&c.height>0&&$n(u).drawImage(c,d,h,o,l),u}var Ar=class{constructor(t,n=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=n,this._batchSize=t.length,t.forEach((a,r)=>{if(Sr(a)){this._imageTensors[r]=a,this._inputDimensions[r]=a.shape;return}if(aa(a)){let i=a.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[r]=a,this._inputDimensions[r]=a.shape.slice(1);return}let s=a instanceof st.getEnv().Canvas?a:Tp(a);this._canvases[r]=s,this._inputDimensions[r]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return rr(this.batchSize,0,1).map((t,n)=>this.getReshapedInputDimensions(n))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let n=this.getInputWidth(t),a=this.getInputHeight(t);return Zv({width:n,height:a},this.inputSize)}toBatchTensor(t,n=!0){return this._inputSize=t,M(()=>{let a=rr(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof Fe){let o=aa(i)?i:i.expandDims();return o=aw(o,n),(o.shape[1]!==t||o.shape[2]!==t)&&(o=Ka.resizeBilinear(o,[t,t])),o.as3D(t,t,3)}if(i instanceof st.getEnv().Canvas)return ki.fromPixels(mw(i,t,n));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return Dt(a.map(s=>ue(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function mt(e){if(e instanceof Ar)return e;let t=Array.isArray(e)?e:[e];if(!t.length)throw new Error("toNetInput - empty array passed as input");let n=r=>Array.isArray(e)?` at input index ${r}:`:"",a=t.map(Ji);return a.forEach((r,s)=>{if(!Km(r)&&!Sr(r)&&!aa(r))throw typeof t[s]=="string"?new Error(`toNetInput -${n(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${n(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(aa(r)){let i=r.shape[0];if(i!==1)throw new Error(`toNetInput -${n(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(a.map(r=>Km(r)&&pw(r))),new Ar(a,Array.isArray(e))}async function xu(e,t){let{Canvas:n}=st.getEnv(),a=e;if(!(e instanceof n)){let i=await mt(e);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let o=i.getInput(0);a=o instanceof n?o:await hw(o)}let r=$n(a);return t.map(i=>i instanceof yt?i.forSize(a.width,a.height).box.floor():i).map(i=>i.clipAtImageBorders(a.width,a.height)).map(({x:i,y:o,width:l,height:u})=>{let c=Zi({width:l,height:u});return l>0&&u>0&&$n(c).putImageData(r.getImageData(i,o,l,u),0,0),c})}async function vu(e,t){if(!Sr(e)&&!aa(e))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(aa(e)&&e.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return M(()=>{let[n,a,r]=e.shape.slice(aa(e)?1:0);return t.map(o=>o instanceof yt?o.forSize(a,n).box:o).map(o=>o.clipAtImageBorders(a,n)).map(({x:o,y:l,width:u,height:c})=>Wl(e.as3D(n,a,r),[l,o,0],[c,u,r]))})}async function eo(e,t){let{fetch:n}=st.getEnv(),a=await n(e,t);if(!(a.status<400))throw new Error(`failed to fetch: (${a.status}) ${a.statusText}, from url: ${a.url}`);return a}async function Are(e){let t=await eo(e),n=await t.blob();if(!n.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${n.type}, for url: ${t.url}`);return dw(n)}async function fw(e){return(await eo(e)).json()}async function Fre(e){return new Float32Array(await(await eo(e)).arrayBuffer())}function Ym(e,t){let n=`${t}-weights_manifest.json`;if(!e)return{modelBaseUri:"",manifestUri:n};if(e==="/")return{modelBaseUri:"/",manifestUri:`/${n}`};let a=e.startsWith("http://")?"http://":e.startsWith("https://")?"https://":"";e=e.replace(a,"");let r=e.split("/").filter(o=>o),s=e.endsWith(".json")?r[r.length-1]:n,i=a+(e.endsWith(".json")?r.slice(0,r.length-1):r).join("/");return i=e.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function gw(e,t){let{manifestUri:n,modelBaseUri:a}=Ym(e,t),r=await fw(n);return jt.loadWeights(r,a)}function _re(e,t,n=!1){let{width:a,height:r}=n?Qi(t):t;return e.width=a,e.height=r,{width:a,height:r}}var on=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:n,objProp:a}=this.traversePropertyPath(t);return n[a]}reassignParamFromPath(t,n){let{obj:a,objProp:r}=this.traversePropertyPath(t);a[r].dispose(),a[r]=n}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof Hr)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof Hr))}variable(){this.getFrozenParams().forEach(({path:t,tensor:n})=>{this.reassignParamFromPath(t,n.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:n})=>{let a=Yn(n.dataSync());n.dispose(),this.reassignParamFromPath(t,a)})}dispose(t=!0){this.getParamList().forEach(n=>{if(t&&n.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${n.path}`);n.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,n)=>t.concat(n)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let n=await gw(t,this.getDefaultModelName());this.loadFromWeightMap(n)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:n}=st.getEnv(),{manifestUri:a,modelBaseUri:r}=Ym(t,this.getDefaultModelName()),s=u=>Promise.all(u.map(c=>n(c).then(p=>p.buffer))),i=jt.weightsLoaderFactory(s),o=JSON.parse((await n(a)).toString()),l=await i(o,r);this.loadFromWeightMap(l)}loadFromWeightMap(t){let{paramMappings:n,params:a}=this.extractParamsFromWeightMap(t);this._paramMappings=n,this._params=a}extractWeights(t){let{paramMappings:n,params:a}=this.extractParams(t);this._paramMappings=n,this._params=a}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let n=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:a,objProp:r}=n;if(!a||!r||!(a[r]instanceof Fe))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:a,objProp:r}}};function Dn(e,t,n){return M(()=>{let a=Fi(e,t.depthwise_filter,t.pointwise_filter,n,"same");return a=J(a,t.bias),a})}function Jm(e,t,n=!1){return M(()=>{let a=qe(n?J(Et(e,t.conv0.filters,[2,2],"same"),t.conv0.bias):Dn(e,t.conv0,[2,2])),r=Dn(a,t.conv1,[1,1]),s=qe(J(a,r)),i=Dn(s,t.conv2,[1,1]);return qe(J(a,J(r,i)))})}function Sp(e,t,n=!1,a=!0){return M(()=>{let r=qe(n?J(Et(e,t.conv0.filters,a?[2,2]:[1,1],"same"),t.conv0.bias):Dn(e,t.conv0,a?[2,2]:[1,1])),s=Dn(r,t.conv1,[1,1]),i=qe(J(r,s)),o=Dn(i,t.conv2,[1,1]),l=qe(J(r,J(s,o))),u=Dn(l,t.conv3,[1,1]);return qe(J(r,J(s,J(o,u))))})}function to(e,t,n="same",a=!1){return M(()=>{let r=J(Et(e,t.filters,[1,1],n),t.bias);return a?qe(r):r})}function bn(e,t){Object.keys(e).forEach(n=>{t.some(a=>a.originalPath===n)||e[n].dispose()})}function wu(e,t){return(n,a,r,s)=>{let i=Ca(e(n*a*r*r),[r,r,n,a]),o=Qe(e(a));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:o}}}function Qm(e,t){return(n,a,r)=>{let s=Sa(e(n*a),[n,a]),i=Qe(e(a));return t.push({paramPath:`${r}/weights`},{paramPath:`${r}/bias`}),{weights:s,bias:i}}}var Zm=class{constructor(t,n,a){this.depthwise_filter=t;this.pointwise_filter=n;this.bias=a}};function ku(e,t){return(n,a,r)=>{let s=Ca(e(3*3*n),[3,3,n,1]),i=Ca(e(n*a),[1,1,n,a]),o=Qe(e(a));return t.push({paramPath:`${r}/depthwise_filter`},{paramPath:`${r}/pointwise_filter`},{paramPath:`${r}/bias`}),new Zm(s,i,o)}}function Iu(e){return t=>{let n=e(`${t}/depthwise_filter`,4),a=e(`${t}/pointwise_filter`,4),r=e(`${t}/bias`,1);return new Zm(n,a,r)}}function jn(e,t){return(n,a,r)=>{let s=e[n];if(!qi(s,a))throw new Error(`expected weightMap[${n}] to be a Tensor${a}D, instead have ${s}`);return t.push({originalPath:n,paramPath:r||n}),s}}function xn(e){let t=e;function n(r){let s=t.slice(0,r);return t=t.slice(r),s}function a(){return t}return{extractWeights:n,getRemainingWeights:a}}function ef(e,t){let n=wu(e,t),a=ku(e,t);function r(i,o,l,u=!1){let c=u?n(i,o,3,`${l}/conv0`):a(i,o,`${l}/conv0`),p=a(o,o,`${l}/conv1`),d=a(o,o,`${l}/conv2`);return{conv0:c,conv1:p,conv2:d}}function s(i,o,l,u=!1){let{conv0:c,conv1:p,conv2:d}=r(i,o,l,u),h=a(o,o,`${l}/conv3`);return{conv0:c,conv1:p,conv2:d,conv3:h}}return{extractDenseBlock3Params:r,extractDenseBlock4Params:s}}function KS(e){let t=[],{extractWeights:n,getRemainingWeights:a}=xn(e),{extractDenseBlock4Params:r}=ef(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2"),l=r(128,256,"dense3");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o,dense3:l}}}function tf(e){return t=>{let n=e(`${t}/filters`,4),a=e(`${t}/bias`,1);return{filters:n,bias:a}}}function nf(e,t){let n=jn(e,t),a=tf(n),r=Iu(n);function s(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),c=r(`${o}/conv1`),p=r(`${o}/conv2`);return{conv0:u,conv1:c,conv2:p}}function i(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),c=r(`${o}/conv1`),p=r(`${o}/conv2`),d=r(`${o}/conv3`);return{conv0:u,conv1:c,conv2:p,conv3:d}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function YS(e){let t=[],{extractDenseBlock4Params:n}=nf(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return bn(e,t),{params:a,paramMappings:t}}var Cp=class extends on{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=La(a,[122.782,117.001,104.298]).div(ce(255)),i=Sp(s,n.dense0,!0);return i=Sp(i,n.dense1),i=Sp(i,n.dense2),i=Sp(i,n.dense3),i=Qn(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return YS(t)}extractParams(t){return KS(t)}};function Ap(e,t){return M(()=>J(ze(e,t.weights),t.bias))}function JS(e,t,n){let a=[],{extractWeights:r,getRemainingWeights:s}=xn(e),o=Qm(r,a)(t,n,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:a,params:{fc:o}}}function QS(e){let t=[],n=jn(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:a("fc")};return bn(e,t),{params:r,paramMappings:t}}function af(e){let t={},n={};return Object.keys(e).forEach(a=>{let r=a.startsWith("fc")?n:t;r[a]=e[a]}),{featureExtractorMap:t,classifierMap:n}}var Fp=class extends on{constructor(t,n){super(t);this._faceFeatureExtractor=n}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:n}=this;if(!n)throw new Error(`${this._name} - load model before inference`);return M(()=>{let a=t instanceof Ar?this.faceFeatureExtractor.forwardInput(t):t;return Ap(a.as2D(a.shape[0],-1),n.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:n,paramMappings:a}=this.extractClassifierParams(t);this._params=n,this._paramMappings=a}extractClassifierParams(t){return JS(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:n,classifierMap:a}=af(t);return this.faceFeatureExtractor.loadFromWeightMap(n),QS(a)}extractParams(t){let n=this.getClassifierChannelsIn(),a=this.getClassifierChannelsOut(),r=a*n+a,s=t.slice(0,t.length-r),i=t.slice(t.length-r);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var yw=["neutral","happy","sad","angry","fearful","disgusted","surprised"],gs=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);yw.forEach((n,a)=>{this[n]=t[a]})}asSortedArray(){return yw.map(t=>({expression:t,probability:this[t]})).sort((t,n)=>n.probability-t.probability)}};var rf=class extends Fp{constructor(t=new Cp){super("FaceExpressionNet",t)}forwardInput(t){return M(()=>Ta(this.runNet(t)))}async forward(t){return this.forwardInput(await mt(t))}async predictExpressions(t){let n=await mt(t),a=await this.forwardInput(n),r=await Promise.all(ct(a).map(async i=>{let o=await i.data();return i.dispose(),o}));a.dispose();let s=r.map(i=>new gs(i));return n.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function bw(e){return e.expressions instanceof gs}function sf(e,t){return{...e,...{expressions:t}}}function Ere(e,t,n=.1,a){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof gs?s:bw(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let l=i.asSortedArray().filter(p=>p.probability>n),u=sr(s)?s.detection.box.bottomLeft:a||new De(0,0);new fs(l.map(p=>`${p.expression} (${Xi(p.probability)})`),u).draw(e)})}function no(e){return sr(e)&&e.landmarks instanceof ra&&e.unshiftedLandmarks instanceof ra&&e.alignedRect instanceof yt}function $re(e){let t=(o,l,u,c)=>Math.atan2(c-l,u-o)%Math.PI,n=o=>o*180/Math.PI,a={roll:void 0,pitch:void 0,yaw:void 0};if(!e||!e._positions||e._positions.length!==68)return a;let r=e._positions;a.roll=-t(r[36]._x,r[36]._y,r[45]._x,r[45]._y),a.pitch=t(0,Math.abs(r[0]._x-r[30]._x)/r[30]._x,Math.PI,Math.abs(r[16]._x-r[30]._x)/r[30]._x);let s=r.reduce((o,l)=>oo>l._y?o:l._y,-Infinity);return a.yaw=Math.PI*(e._imgDims._height/(i-s)/1.4-1),a}function Nu(e,t){let{box:n}=e.detection,a=t.shiftBy(n.x,n.y),r=a.align(),{imageDims:s}=e.detection,i=new yt(e.detection.score,r.rescale(s.reverse()),s),o=$re(t);return{...e,...{landmarks:a,unshiftedLandmarks:t,alignedRect:i,angle:o}}}var xw=class{constructor(t={}){let{drawLines:n=!0,drawPoints:a=!0,lineWidth:r,lineColor:s,pointSize:i,pointColor:o}=t;this.drawLines=n,this.drawPoints=a,this.lineWidth=r||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=o||"rgba(255, 0, 255, 1)"}},vw=class{constructor(t,n={}){this.faceLandmarks=t,this.options=new xw(n)}draw(t){let n=$n(t),{drawLines:a,drawPoints:r,lineWidth:s,lineColor:i,pointSize:o,pointColor:l}=this.options;if(a&&this.faceLandmarks instanceof bu&&(n.strokeStyle=i,n.lineWidth=s,Tr(n,this.faceLandmarks.getJawOutline()),Tr(n,this.faceLandmarks.getLeftEyeBrow()),Tr(n,this.faceLandmarks.getRightEyeBrow()),Tr(n,this.faceLandmarks.getNose()),Tr(n,this.faceLandmarks.getLeftEye(),!0),Tr(n,this.faceLandmarks.getRightEye(),!0),Tr(n,this.faceLandmarks.getMouth(),!0)),r){n.strokeStyle=l,n.fillStyle=l;let u=c=>{n.beginPath(),n.arc(c.x,c.y,o,0,2*Math.PI),n.fill()};this.faceLandmarks.positions.forEach(u)}}};function Dre(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof ra?a:no(a)?a.landmarks:void 0;if(!r)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new vw(r).draw(e)})}var eC="1.1.2";function Mre(e,t){let n=wu(e,t),a=ku(e,t);function r(i,o,l){let u=a(i,o,`${l}/separable_conv0`),c=a(o,o,`${l}/separable_conv1`),p=n(i,o,1,`${l}/expansion_conv`);return{separable_conv0:u,separable_conv1:c,expansion_conv:p}}function s(i,o){let l=a(i,i,`${o}/separable_conv0`),u=a(i,i,`${o}/separable_conv1`),c=a(i,i,`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:c}}return{extractConvParams:n,extractSeparableConvParams:a,extractReductionBlockParams:r,extractMainBlockParams:s}}function tC(e,t){let n=[],{extractWeights:a,getRemainingWeights:r}=xn(e),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:o,extractMainBlockParams:l}=Mre(a,n),u=s(3,32,3,"entry_flow/conv_in"),c=o(32,64,"entry_flow/reduction_block_0"),p=o(64,128,"entry_flow/reduction_block_1"),d={conv_in:u,reduction_block_0:c,reduction_block_1:p},h={};rr(t,0,1).forEach(y=>{h[`main_block_${y}`]=l(128,`middle_flow/main_block_${y}`)});let m=o(128,256,"exit_flow/reduction_block"),f=i(256,512,"exit_flow/separable_conv"),g={reduction_block:m,separable_conv:f};if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:n,params:{entry_flow:d,middle_flow:h,exit_flow:g}}}function Rre(e,t){let n=jn(e,t),a=tf(n),r=Iu(n);function s(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),c=a(`${o}/expansion_conv`);return{separable_conv0:l,separable_conv1:u,expansion_conv:c}}function i(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),c=r(`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:c}}return{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}}function nC(e,t){let n=[],{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}=Rre(e,n),o=a("entry_flow/conv_in"),l=s("entry_flow/reduction_block_0"),u=s("entry_flow/reduction_block_1"),c={conv_in:o,reduction_block_0:l,reduction_block_1:u},p={};rr(t,0,1).forEach(f=>{p[`main_block_${f}`]=i(`middle_flow/main_block_${f}`)});let d=s("exit_flow/reduction_block"),h=r("exit_flow/separable_conv"),m={reduction_block:d,separable_conv:h};return bn(e,n),{params:{entry_flow:c,middle_flow:p,exit_flow:m},paramMappings:n}}function aC(e,t,n){return J(Et(e,t.filters,n,"same"),t.bias)}function ww(e,t,n=!0){let a=n?qe(e):e;return a=Dn(a,t.separable_conv0,[1,1]),a=Dn(qe(a),t.separable_conv1,[1,1]),a=$t(a,[3,3],[2,2],"same"),a=J(a,aC(e,t.expansion_conv,[2,2])),a}function Pre(e,t){let n=Dn(qe(e),t.separable_conv0,[1,1]);return n=Dn(qe(n),t.separable_conv1,[1,1]),n=Dn(qe(n),t.separable_conv2,[1,1]),n=J(n,e),n}var kw=class extends on{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyXception - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=La(a,[122.782,117.001,104.298]).div(ce(256)),i=qe(aC(s,n.entry_flow.conv_in,[2,2]));return i=ww(i,n.entry_flow.reduction_block_0,!1),i=ww(i,n.entry_flow.reduction_block_1),rr(this._numMainBlocks,0,1).forEach(o=>{i=Pre(i,n.middle_flow[`main_block_${o}`])}),i=ww(i,n.exit_flow.reduction_block),i=qe(Dn(i,n.exit_flow.separable_conv,[1,1])),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return nC(t,this._numMainBlocks)}extractParams(t){return tC(t,this._numMainBlocks)}};function rC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=xn(e),r=Qm(n,t),s=r(512,1,"fc/age"),i=r(512,2,"fc/gender");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function sC(e){let t=[],n=jn(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:{age:a("fc/age"),gender:a("fc/gender")}};return bn(e,t),{params:r,paramMappings:t}}var Fr;(function(e){e.FEMALE="female",e.MALE="male"})(Fr||(Fr={}));var of=class extends on{constructor(t=new kw(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:n}=this;if(!n)throw new Error(`${this._name} - load model before inference`);return M(()=>{let a=t instanceof Ar?this.faceFeatureExtractor.forwardInput(t):t,r=Qn(a,[7,7],[2,2],"valid").as2D(a.shape[0],-1),s=Ap(r,n.fc.age).as1D(),i=Ap(r,n.fc.gender);return{age:s,gender:i}})}forwardInput(t){return M(()=>{let{age:n,gender:a}=this.runNet(t);return{age:n,gender:Ta(a)}})}async forward(t){return this.forwardInput(await mt(t))}async predictAgeAndGender(t){let n=await mt(t),a=await this.forwardInput(n),r=ct(a.age),s=ct(a.gender),i=r.map((l,u)=>({ageTensor:l,genderTensor:s[u]})),o=await Promise.all(i.map(async({ageTensor:l,genderTensor:u})=>{let c=(await l.data())[0],p=(await u.data())[0],d=p>.5,h=d?Fr.MALE:Fr.FEMALE,m=d?p:1-p;return l.dispose(),u.dispose(),{age:c,gender:h,genderProbability:m}}));return a.age.dispose(),a.gender.dispose(),n.isBatchInput?o:o[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:n,paramMappings:a}=this.extractClassifierParams(t);this._params=n,this._paramMappings=a}extractClassifierParams(t){return rC(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:n,classifierMap:a}=af(t);return this.faceFeatureExtractor.loadFromWeightMap(n),sC(a)}extractParams(t){let n=512*1+1+(512*2+2),a=t.slice(0,t.length-n),r=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(r)}};var _p=class extends Fp{postProcess(t,n,a){let r=a.map(({width:i,height:o})=>{let l=n/Math.max(o,i);return{width:i*l,height:o*l}}),s=r.length;return M(()=>{let i=(p,d)=>Dt([Sn([68],p,"float32"),Sn([68],d,"float32")],1).as2D(1,136).as1D(),o=(p,d)=>{let{width:h,height:m}=r[p];return d(h,m)?Math.abs(h-m)/2:0},l=p=>o(p,(d,h)=>do(p,(d,h)=>hi(l(d),u(d))))).div(Dt(Array.from(Array(s),(p,d)=>i(r[d].width,r[d].height))))})}forwardInput(t){return M(()=>{let n=this.runNet(t);return this.postProcess(n,t.inputSize,t.inputDimensions.map(([a,r])=>({height:a,width:r})))})}async forward(t){return this.forwardInput(await mt(t))}async detectLandmarks(t){let n=await mt(t),a=M(()=>ct(this.forwardInput(n))),r=await Promise.all(a.map(async(s,i)=>{let o=Array.from(await s.data()),l=o.filter((c,p)=>Hm(p)),u=o.filter((c,p)=>!Hm(p));return new bu(Array(68).fill(0).map((c,p)=>new De(l[p],u[p])),{height:n.getInputHeight(i),width:n.getInputWidth(i)})}));return a.forEach(s=>s.dispose()),n.isBatchInput?r:r[0]}getClassifierChannelsOut(){return 136}};var Tu=class extends _p{constructor(t=new Cp){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function iC(e){let t=[],{extractDenseBlock3Params:n}=nf(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2")};return bn(e,t),{params:a,paramMappings:t}}function oC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=xn(e),{extractDenseBlock3Params:r}=ef(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o}}}var Iw=class extends on{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyFaceFeatureExtractor - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=La(a,[122.782,117.001,104.298]).div(ce(255)),i=Jm(s,n.dense0,!0);return i=Jm(i,n.dense1),i=Jm(i,n.dense2),i=Qn(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return iC(t)}extractParams(t){return oC(t)}};var lf=class extends _p{constructor(t=new Iw){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var lC=class extends Tu{};function uC(e,t){return J(B(e,t.weights),t.biases)}function Nw(e,t,n,a,r="same"){let{filters:s,bias:i}=t.conv,o=Et(e,s,n,r);return o=J(o,i),o=uC(o,t.scale),a?qe(o):o}function cC(e,t){return Nw(e,t,[1,1],!0)}function Tw(e,t){return Nw(e,t,[1,1],!1)}function uf(e,t){return Nw(e,t,[2,2],!0,"valid")}function Ore(e,t){function n(o,l,u){let c=e(o),p=c.length/(l*u*u);if(Qv(p))throw new Error(`depth has to be an integer: ${p}, weights.length: ${c.length}, numFilters: ${l}, filterSize: ${u}`);return M(()=>Ve(Ca(c,[l,p,u,u]),[2,3,1,0]))}function a(o,l,u,c){let p=n(o,l,u),d=Qe(e(l));return t.push({paramPath:`${c}/filters`},{paramPath:`${c}/bias`}),{filters:p,bias:d}}function r(o,l){let u=Qe(e(o)),c=Qe(e(o));return t.push({paramPath:`${l}/weights`},{paramPath:`${l}/biases`}),{weights:u,biases:c}}function s(o,l,u,c){let p=a(o,l,u,`${c}/conv`),d=r(l,`${c}/scale`);return{conv:p,scale:d}}function i(o,l,u,c,p=!1){let d=s((p?.5:1)*o,l,u,`${c}/conv1`),h=s(o,l,u,`${c}/conv2`);return{conv1:d,conv2:h}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function pC(e){let{extractWeights:t,getRemainingWeights:n}=xn(e),a=[],{extractConvLayerParams:r,extractResidualLayerParams:s}=Ore(t,a),i=r(4704,32,7,"conv32_down"),o=s(9216,32,3,"conv32_1"),l=s(9216,32,3,"conv32_2"),u=s(9216,32,3,"conv32_3"),c=s(36864,64,3,"conv64_down",!0),p=s(36864,64,3,"conv64_1"),d=s(36864,64,3,"conv64_2"),h=s(36864,64,3,"conv64_3"),m=s(147456,128,3,"conv128_down",!0),f=s(147456,128,3,"conv128_1"),g=s(147456,128,3,"conv128_2"),y=s(589824,256,3,"conv256_down",!0),b=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),v=s(589824,256,3,"conv256_down_out"),k=M(()=>Ve(Sa(t(256*128),[128,256]),[1,0]));if(a.push({paramPath:"fc"}),n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{params:{conv32_down:i,conv32_1:o,conv32_2:l,conv32_3:u,conv64_down:c,conv64_1:p,conv64_2:d,conv64_3:h,conv128_down:m,conv128_1:f,conv128_2:g,conv256_down:y,conv256_1:b,conv256_2:x,conv256_down_out:v,fc:k},paramMappings:a}}function Lre(e,t){let n=jn(e,t);function a(i){let o=n(`${i}/scale/weights`,1),l=n(`${i}/scale/biases`,1);return{weights:o,biases:l}}function r(i){let o=n(`${i}/conv/filters`,4),l=n(`${i}/conv/bias`,1),u=a(i);return{conv:{filters:o,bias:l},scale:u}}function s(i){return{conv1:r(`${i}/conv1`),conv2:r(`${i}/conv2`)}}return{extractConvLayerParams:r,extractResidualLayerParams:s}}function dC(e){let t=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=Lre(e,t),r=n("conv32_down"),s=a("conv32_1"),i=a("conv32_2"),o=a("conv32_3"),l=a("conv64_down"),u=a("conv64_1"),c=a("conv64_2"),p=a("conv64_3"),d=a("conv128_down"),h=a("conv128_1"),m=a("conv128_2"),f=a("conv256_down"),g=a("conv256_1"),y=a("conv256_2"),b=a("conv256_down_out"),{fc:x}=e;if(t.push({originalPath:"fc",paramPath:"fc"}),!Jv(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let v={conv32_down:r,conv32_1:s,conv32_2:i,conv32_3:o,conv64_down:l,conv64_1:u,conv64_2:c,conv64_3:p,conv128_down:d,conv128_1:h,conv128_2:m,conv256_down:f,conv256_1:g,conv256_2:y,conv256_down_out:b,fc:x};return bn(e,t),{params:v,paramMappings:t}}function za(e,t){let n=cC(e,t.conv1);return n=Tw(n,t.conv2),n=J(n,e),n=qe(n),n}function Ep(e,t){let n=uf(e,t.conv1);n=Tw(n,t.conv2);let a=Qn(e,2,2,"valid"),r=vt(a.shape),s=a.shape[3]!==n.shape[3];if(a.shape[1]!==n.shape[1]||a.shape[2]!==n.shape[2]){let o=[...n.shape];o[1]=1;let l=vt(o);n=Je([n,l],1);let u=[...n.shape];u[2]=1;let c=vt(u);n=Je([n,c],2)}return a=s?Je([a,r],3):a,n=J(a,n),n=qe(n),n}var Su=class extends on{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceRecognitionNet - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(150,!0),"float32"),s=La(a,[122.782,117.001,104.298]).div(ce(256)),i=uf(s,n.conv32_down);i=$t(i,3,2,"valid"),i=za(i,n.conv32_1),i=za(i,n.conv32_2),i=za(i,n.conv32_3),i=Ep(i,n.conv64_down),i=za(i,n.conv64_1),i=za(i,n.conv64_2),i=za(i,n.conv64_3),i=Ep(i,n.conv128_down),i=za(i,n.conv128_1),i=za(i,n.conv128_2),i=Ep(i,n.conv256_down),i=za(i,n.conv256_1),i=za(i,n.conv256_2),i=Ep(i,n.conv256_down_out);let o=i.mean([1,2]);return ze(o,n.fc)})}async forward(t){return this.forwardInput(await mt(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)==null?void 0:s.some(i=>i<=0))return new Float32Array(128);let n=await mt(t),a=M(()=>ct(this.forwardInput(n))),r=await Promise.all(a.map(i=>i.data()));return a.forEach(i=>i.dispose()),n.isBatchInput?r:r[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return dC(t)}extractParams(t){return pC(t)}};function zre(e){let t=new Su;return t.extractWeights(e),t}function cf(e,t){return{...e,...{descriptor:t}}}function Wre(e){return typeof e.age=="number"}function pf(e,t){return{...e,...{age:t}}}function Bre(e){return(e.gender===Fr.MALE||e.gender===Fr.FEMALE)&&fu(e.genderProbability)}function df(e,t,n){return{...e,...{gender:t,genderProbability:n}}}function Vre(e,t){function n(l,u){let c=Ca(e(3*3*l),[3,3,l,1]),p=Qe(e(l)),d=Qe(e(l)),h=Qe(e(l)),m=Qe(e(l));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/batch_norm_scale`},{paramPath:`${u}/batch_norm_offset`},{paramPath:`${u}/batch_norm_mean`},{paramPath:`${u}/batch_norm_variance`}),{filters:c,batch_norm_scale:p,batch_norm_offset:d,batch_norm_mean:h,batch_norm_variance:m}}function a(l,u,c,p,d){let h=Ca(e(l*u*c*c),[c,c,l,u]),m=Qe(e(u));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/${d?"batch_norm_offset":"bias"}`}),{filters:h,bias:m}}function r(l,u,c,p){let{filters:d,bias:h}=a(l,u,c,p,!0);return{filters:d,batch_norm_offset:h}}function s(l,u,c){let p=n(l,`${c}/depthwise_conv`),d=r(l,u,1,`${c}/pointwise_conv`);return{depthwise_conv:p,pointwise_conv:d}}function i(){let l=r(3,32,3,"mobilenetv1/conv_0"),u=s(32,64,"mobilenetv1/conv_1"),c=s(64,128,"mobilenetv1/conv_2"),p=s(128,128,"mobilenetv1/conv_3"),d=s(128,256,"mobilenetv1/conv_4"),h=s(256,256,"mobilenetv1/conv_5"),m=s(256,512,"mobilenetv1/conv_6"),f=s(512,512,"mobilenetv1/conv_7"),g=s(512,512,"mobilenetv1/conv_8"),y=s(512,512,"mobilenetv1/conv_9"),b=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),v=s(512,1024,"mobilenetv1/conv_12"),k=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:l,conv_1:u,conv_2:c,conv_3:p,conv_4:d,conv_5:h,conv_6:m,conv_7:f,conv_8:g,conv_9:y,conv_10:b,conv_11:x,conv_12:v,conv_13:k}}function o(){let l=r(1024,256,1,"prediction_layer/conv_0"),u=r(256,512,3,"prediction_layer/conv_1"),c=r(512,128,1,"prediction_layer/conv_2"),p=r(128,256,3,"prediction_layer/conv_3"),d=r(256,128,1,"prediction_layer/conv_4"),h=r(128,256,3,"prediction_layer/conv_5"),m=r(256,64,1,"prediction_layer/conv_6"),f=r(64,128,3,"prediction_layer/conv_7"),g=a(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=a(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),b=a(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=a(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),v=a(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),k=a(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),w=a(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),S=a(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),A=a(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),F=a(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),D=a(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),R=a(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:l,conv_1:u,conv_2:c,conv_3:p,conv_4:d,conv_5:h,conv_6:m,conv_7:f,box_predictor_0:{box_encoding_predictor:g,class_predictor:y},box_predictor_1:{box_encoding_predictor:b,class_predictor:x},box_predictor_2:{box_encoding_predictor:v,class_predictor:k},box_predictor_3:{box_encoding_predictor:w,class_predictor:S},box_predictor_4:{box_encoding_predictor:A,class_predictor:F},box_predictor_5:{box_encoding_predictor:D,class_predictor:R}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:o}}function hC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=xn(e),{extractMobilenetV1Params:r,extractPredictionLayerParams:s}=Vre(n,t),i=r(),o=s(),u={extra_dim:Kd(n(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:{mobilenetv1:i,prediction_layer:o,output_layer:u},paramMappings:t}}function Ure(e,t){let n=jn(e,t);function a(u,c,p){let d=n(`${u}/Conv2d_${c}_pointwise/weights`,4,`${p}/filters`),h=n(`${u}/Conv2d_${c}_pointwise/convolution_bn_offset`,1,`${p}/batch_norm_offset`);return{filters:d,batch_norm_offset:h}}function r(u){let c=`mobilenetv1/conv_${u}`,p=`MobilenetV1/Conv2d_${u}_depthwise`,d=`${c}/depthwise_conv`,h=`${c}/pointwise_conv`,m=n(`${p}/depthwise_weights`,4,`${d}/filters`),f=n(`${p}/BatchNorm/gamma`,1,`${d}/batch_norm_scale`),g=n(`${p}/BatchNorm/beta`,1,`${d}/batch_norm_offset`),y=n(`${p}/BatchNorm/moving_mean`,1,`${d}/batch_norm_mean`),b=n(`${p}/BatchNorm/moving_variance`,1,`${d}/batch_norm_variance`);return{depthwise_conv:{filters:m,batch_norm_scale:f,batch_norm_offset:g,batch_norm_mean:y,batch_norm_variance:b},pointwise_conv:a("MobilenetV1",u,h)}}function s(){return{conv_0:a("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:r(1),conv_2:r(2),conv_3:r(3),conv_4:r(4),conv_5:r(5),conv_6:r(6),conv_7:r(7),conv_8:r(8),conv_9:r(9),conv_10:r(10),conv_11:r(11),conv_12:r(12),conv_13:r(13)}}function i(u,c){let p=n(`${u}/weights`,4,`${c}/filters`),d=n(`${u}/biases`,1,`${c}/bias`);return{filters:p,bias:d}}function o(u){let c=i(`Prediction/BoxPredictor_${u}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${u}/box_encoding_predictor`),p=i(`Prediction/BoxPredictor_${u}/ClassPredictor`,`prediction_layer/box_predictor_${u}/class_predictor`);return{box_encoding_predictor:c,class_predictor:p}}function l(){return{conv_0:a("Prediction",0,"prediction_layer/conv_0"),conv_1:a("Prediction",1,"prediction_layer/conv_1"),conv_2:a("Prediction",2,"prediction_layer/conv_2"),conv_3:a("Prediction",3,"prediction_layer/conv_3"),conv_4:a("Prediction",4,"prediction_layer/conv_4"),conv_5:a("Prediction",5,"prediction_layer/conv_5"),conv_6:a("Prediction",6,"prediction_layer/conv_6"),conv_7:a("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:o(0),box_predictor_1:o(1),box_predictor_2:o(2),box_predictor_3:o(3),box_predictor_4:o(4),box_predictor_5:o(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:l}}function mC(e){let t=[],{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Ure(e,t),r=e["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Sr(r))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${r}`);let s={mobilenetv1:n(),prediction_layer:a(),output_layer:{extra_dim:r}};return bn(e,t),{params:s,paramMappings:t}}function xa(e,t,n){return M(()=>{let a=Et(e,t.filters,n,"same");return a=J(a,t.batch_norm_offset),Xt(a,0,6)})}var Gre=.0010000000474974513;function Hre(e,t,n){return M(()=>{let a=Qr(e,t.filters,n,"same");return a=fr(a,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Gre),Xt(a,0,6)})}function jre(e){return[2,4,6,12].some(t=>t===e)?[2,2]:[1,1]}function fC(e,t){return M(()=>{let n,a=xa(e,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let o=i+1,l=jre(o);a=Hre(a,s.depthwise_conv,l),a=xa(a,s.pointwise_conv,[1,1]),o===11&&(n=a)}),n===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:a,conv11:n}})}function qre(e,t,n){let a=e.arraySync(),r=Math.min(a[t][0],a[t][2]),s=Math.min(a[t][1],a[t][3]),i=Math.max(a[t][0],a[t][2]),o=Math.max(a[t][1],a[t][3]),l=Math.min(a[n][0],a[n][2]),u=Math.min(a[n][1],a[n][3]),c=Math.max(a[n][0],a[n][2]),p=Math.max(a[n][1],a[n][3]),d=(i-r)*(o-s),h=(c-l)*(p-u);if(d<=0||h<=0)return 0;let m=Math.max(r,l),f=Math.max(s,u),g=Math.min(i,c),y=Math.min(o,p),b=Math.max(g-m,0)*Math.max(y-f,0);return b/(d+h-b)}function gC(e,t,n,a,r){let s=e.shape[0],i=Math.min(n,s),o=t.map((c,p)=>({score:c,boxIndex:p})).filter(c=>c.score>r).sort((c,p)=>p.score-c.score),l=c=>c<=a?1:0,u=[];return o.forEach(c=>{if(u.length>=i)return;let p=c.score;for(let d=u.length-1;d>=0;--d){let h=qre(e,c.boxIndex,u[d]);if(h!==0&&(c.score*=l(h),c.score<=r))break}p===c.score&&u.push(c.boxIndex)}),u}function Xre(e){let t=ct(Ve(e,[1,0])),n=[me(t[2],t[0]),me(t[3],t[1])],a=[J(t[0],xe(n[0],ce(2))),J(t[1],xe(n[1],ce(2)))];return{sizes:n,centers:a}}function Kre(e,t){let{sizes:n,centers:a}=Xre(e),r=ct(Ve(t,[1,0])),s=xe(B(dn(xe(r[2],ce(5))),n[0]),ce(2)),i=J(B(xe(r[0],ce(10)),n[0]),a[0]),o=xe(B(dn(xe(r[3],ce(5))),n[1]),ce(2)),l=J(B(xe(r[1],ce(10)),n[1]),a[1]);return Ve(Dt([me(i,s),me(l,o),J(i,s),J(l,o)]),[1,0])}function yC(e,t,n){return M(()=>{let a=e.shape[0],r=Kre(H(Ha(n.extra_dim,[a,1,1]),[-1,4]),H(e,[-1,4]));r=H(r,[a,r.shape[0]/a,4]);let s=ca(Be(t,[0,0,1],[-1,-1,-1])),i=Be(s,[0,0,0],[-1,-1,1]);i=H(i,[a,i.shape[1]]);let o=ct(r),l=ct(i);return{boxes:o,scores:l}})}function ao(e,t){return M(()=>{let n=e.shape[0],a=H(to(e,t.box_encoding_predictor),[n,-1,1,4]),r=H(to(e,t.class_predictor),[n,-1,3]);return{boxPredictionEncoding:a,classPrediction:r}})}function bC(e,t,n){return M(()=>{let a=xa(e,n.conv_0,[1,1]),r=xa(a,n.conv_1,[2,2]),s=xa(r,n.conv_2,[1,1]),i=xa(s,n.conv_3,[2,2]),o=xa(i,n.conv_4,[1,1]),l=xa(o,n.conv_5,[2,2]),u=xa(l,n.conv_6,[1,1]),c=xa(u,n.conv_7,[2,2]),p=ao(t,n.box_predictor_0),d=ao(e,n.box_predictor_1),h=ao(r,n.box_predictor_2),m=ao(i,n.box_predictor_3),f=ao(l,n.box_predictor_4),g=ao(c,n.box_predictor_5),y=Je([p.boxPredictionEncoding,d.boxPredictionEncoding,h.boxPredictionEncoding,m.boxPredictionEncoding,f.boxPredictionEncoding,g.boxPredictionEncoding],1),b=Je([p.classPrediction,d.classPrediction,h.classPrediction,m.classPrediction,f.classPrediction,g.classPrediction],1);return{boxPredictions:y,classPredictions:b}})}var va=class{constructor({minConfidence:t,maxResults:n}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=n||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var ro=class extends on{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("SsdMobilenetv1 - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(512,!1),"float32"),r=me(B(a,ce(.007843137718737125)),ce(1)),s=fC(r,n.mobilenetv1),{boxPredictions:i,classPredictions:o}=bC(s.out,s.conv11,n.prediction_layer);return yC(i,o,n.output_layer)})}async forward(t){return this.forwardInput(await mt(t))}async locateFaces(t,n={}){let{maxResults:a,minConfidence:r}=new va(n),s=await mt(t),{boxes:i,scores:o}=this.forwardInput(s),l=i[0],u=o[0];for(let x=1;x{let[v,k]=[Math.max(0,y[x][0]),Math.min(1,y[x][2])].map(A=>A*g),[w,S]=[Math.max(0,y[x][1]),Math.min(1,y[x][3])].map(A=>A*f);return new yt(c[x],new yu(w,v,S-w,k-v),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return l.dispose(),u.dispose(),b}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return mC(t)}extractParams(t){return hC(t)}};function xC(e){let t=new ro;return t.extractWeights(e),t}function Yre(e){return xC(e)}var vC=class extends ro{};var wC=.4,kC=[new De(.738768,.874946),new De(2.42204,2.65704),new De(4.30971,7.04493),new De(10.246,4.59428),new De(12.6868,11.8741)],IC=[new De(1.603231,2.094468),new De(6.041143,7.080126),new De(2.882459,3.518061),new De(4.266906,5.178857),new De(9.041765,10.66308)],NC=[117.001,114.697,97.404],TC="tiny_yolov2_model",SC="tiny_yolov2_separable_conv_model";var hf=e=>typeof e=="number";function Sw(e){if(!e)throw new Error(`invalid config: ${e}`);if(typeof e.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${e.withSeparableConvs}`);if(!hf(e.iouThreshold)||e.iouThreshold<0||e.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${e.iouThreshold}`);if(!Array.isArray(e.classes)||!e.classes.length||!e.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(e.classes)}`);if(!Array.isArray(e.anchors)||!e.anchors.length||!e.anchors.map(t=>t||{}).every(t=>hf(t.x)&&hf(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(e.anchors)}`);if(e.meanRgb&&(!Array.isArray(e.meanRgb)||e.meanRgb.length!==3||!e.meanRgb.every(hf)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(e.meanRgb)}`)}function Cu(e){return M(()=>{let t=B(e,ce(.10000000149011612));return J(qe(me(e,t)),t)})}function _r(e,t){return M(()=>{let n=ea(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Et(n,t.conv.filters,[1,1],"valid"),n=me(n,t.bn.sub),n=B(n,t.bn.truediv),n=J(n,t.conv.bias),Cu(n)})}function Er(e,t){return M(()=>{let n=ea(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Fi(n,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),n=J(n,t.bias),Cu(n)})}function Jre(e,t){let n=wu(e,t);function a(i,o){let l=Qe(e(i)),u=Qe(e(i));return t.push({paramPath:`${o}/sub`},{paramPath:`${o}/truediv`}),{sub:l,truediv:u}}function r(i,o,l){let u=n(i,o,3,`${l}/conv`),c=a(o,`${l}/bn`);return{conv:u,bn:c}}let s=ku(e,t);return{extractConvParams:n,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}}function CC(e,t,n,a){let{extractWeights:r,getRemainingWeights:s}=xn(e),i=[],{extractConvParams:o,extractConvWithBatchNormParams:l,extractSeparableConvParams:u}=Jre(r,i),c;if(t.withSeparableConvs){let[p,d,h,m,f,g,y,b,x]=a,v=t.isFirstLayerConv2d?o(p,d,3,"conv0"):u(p,d,"conv0"),k=u(d,h,"conv1"),w=u(h,m,"conv2"),S=u(m,f,"conv3"),A=u(f,g,"conv4"),F=u(g,y,"conv5"),D=b?u(y,b,"conv6"):void 0,R=x?u(b,x,"conv7"):void 0,L=o(x||b||y,5*n,1,"conv8");c={conv0:v,conv1:k,conv2:w,conv3:S,conv4:A,conv5:F,conv6:D,conv7:R,conv8:L}}else{let[p,d,h,m,f,g,y,b,x]=a,v=l(p,d,"conv0"),k=l(d,h,"conv1"),w=l(h,m,"conv2"),S=l(m,f,"conv3"),A=l(f,g,"conv4"),F=l(g,y,"conv5"),D=l(y,b,"conv6"),R=l(b,x,"conv7"),L=o(x,5*n,1,"conv8");c={conv0:v,conv1:k,conv2:w,conv3:S,conv4:A,conv5:F,conv6:D,conv7:R,conv8:L}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:c,paramMappings:i}}function Qre(e,t){let n=jn(e,t);function a(o){let l=n(`${o}/sub`,1),u=n(`${o}/truediv`,1);return{sub:l,truediv:u}}function r(o){let l=n(`${o}/filters`,4),u=n(`${o}/bias`,1);return{filters:l,bias:u}}function s(o){let l=r(`${o}/conv`),u=a(`${o}/bn`);return{conv:l,bn:u}}let i=Iu(n);return{extractConvParams:r,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function AC(e,t){let n=[],{extractConvParams:a,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}=Qre(e,n),i;if(t.withSeparableConvs){let o=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?a("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:o>7?s("conv6"):void 0,conv7:o>8?s("conv7"):void 0,conv8:a("conv8")}}else i={conv0:r("conv0"),conv1:r("conv1"),conv2:r("conv2"),conv3:r("conv3"),conv4:r("conv4"),conv5:r("conv5"),conv6:r("conv6"),conv7:r("conv7"),conv8:a("conv8")};return bn(e,n),{params:i,paramMappings:n}}var or=class{constructor({inputSize:t,scoreThreshold:n}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=n||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var Cw=class extends on{constructor(t){super("TinyYolov2");Sw(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,n){let a=_r(t,n.conv0);return a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv1),a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv2),a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv3),a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv4),a=$t(a,[2,2],[2,2],"same"),a=_r(a,n.conv5),a=$t(a,[2,2],[1,1],"same"),a=_r(a,n.conv6),a=_r(a,n.conv7),to(a,n.conv8,"valid",!1)}runMobilenet(t,n){let a=this.config.isFirstLayerConv2d?Cu(to(t,n.conv0,"valid",!1)):Er(t,n.conv0);return a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv1),a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv2),a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv3),a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv4),a=$t(a,[2,2],[2,2],"same"),a=Er(a,n.conv5),a=$t(a,[2,2],[1,1],"same"),a=n.conv6?Er(a,n.conv6):a,a=n.conv7?Er(a,n.conv7):a,to(a,n.conv8,"valid",!1)}forwardInput(t,n){let{params:a}=this;if(!a)throw new Error("TinyYolov2 - load model before inference");return M(()=>{let r=ue(t.toBatchTensor(n,!1),"float32");return r=this.config.meanRgb?La(r,this.config.meanRgb):r,r=r.div(ce(256)),this.config.withSeparableConvs?this.runMobilenet(r,a):this.runTinyYolov2(r,a)})}async forward(t,n){return this.forwardInput(await mt(t),n)}async detect(t,n={}){let{inputSize:a,scoreThreshold:r}=new or(n),s=await mt(t),i=await this.forwardInput(s,a),o=M(()=>ct(i)[0].expandDims()),l={width:s.getInputWidth(0),height:s.getInputHeight(0)},u=await this.extractBoxes(o,s.getReshapedInputDimensions(0),r);i.dispose(),o.dispose();let c=u.map(g=>g.box),p=u.map(g=>g.score),d=u.map(g=>g.classScore),h=u.map(g=>this.config.classes[g.label]);return nw(c.map(g=>g.rescale(a)),p,this.config.iouThreshold,!0).map(g=>new ms(p[g],d[g],h[g],c[g],l))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return AC(t,this.config)}extractParams(t){let n=this.config.filterSizes||Cw.DEFAULT_FILTER_SIZES,a=n?n.length:void 0;if(a!==7&&a!==8&&a!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${a} filterSizes in config`);return CC(t,this.config,this.boxEncodingSize,n)}async extractBoxes(t,n,a){let{width:r,height:s}=n,i=Math.max(r,s),o=i/r,l=i/s,u=t.shape[1],c=this.config.anchors.length,[p,d,h]=M(()=>{let y=t.reshape([u,u,c,this.boxEncodingSize]),b=y.slice([0,0,0,0],[u,u,c,4]),x=y.slice([0,0,0,4],[u,u,c,1]),v=this.withClassScores?Ta(y.slice([0,0,0,5],[u,u,c,this.config.classes.length]),3):ce(0);return[b,x,v]}),m=[],f=await d.array(),g=await p.array();for(let y=0;ya){let k=(b+vp(g[y][b][x][0]))/u*o,w=(y+vp(g[y][b][x][1]))/u*l,S=Math.exp(g[y][b][x][2])*this.config.anchors[x].x/u*o,A=Math.exp(g[y][b][x][3])*this.config.anchors[x].y/u*l,F=k-S/2,D=w-A/2,R={row:y,col:b,anchor:x},{classScore:L,label:W}=this.withClassScores?await this.extractPredictedClass(h,R):{classScore:1,label:0};m.push({box:new gu(F,D,F+S,D+A),score:v,classScore:v*L,label:W,...R})}}return p.dispose(),d.dispose(),h.dispose(),m}async extractPredictedClass(t,n){let{row:a,col:r,anchor:s}=n,i=await t.array();return Array(this.config.classes.length).fill(0).map((o,l)=>i[a][r][s][l]).map((o,l)=>({classScore:o,label:l})).reduce((o,l)=>o.classScore>l.classScore?o:l)}},Au=Cw;Au.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var Fu=class extends Au{constructor(t=!0){let n={withSeparableConvs:t,iouThreshold:wC,classes:["face"],...t?{anchors:IC,meanRgb:NC}:{anchors:kC,withClassScores:!0}};super(n)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new yt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?SC:TC}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function Zre(e,t=!0){let n=new Fu(t);return n.extractWeights(e),n}var mf=class extends or{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var wa=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function so(e,t,n,a,r=({alignedRect:s})=>s){let s=e.map(l=>no(l)?r(l):l.detection),i=a||(t instanceof Fe?await vu(t,s):await xu(t,s)),o=await n(i);return i.forEach(l=>l instanceof Fe&&l.dispose()),o}async function _u(e,t,n,a,r){return so([e],t,async s=>n(s[0]),a,r)}var FC=.4,_C=[new De(1.603231,2.094468),new De(6.041143,7.080126),new De(2.882459,3.518061),new De(4.266906,5.178857),new De(9.041765,10.66308)],EC=[117.001,114.697,97.404];var Eu=class extends Au{constructor(){let t={withSeparableConvs:!0,iouThreshold:FC,classes:["face"],anchors:_C,meanRgb:EC,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new yt(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var Ze={ssdMobilenetv1:new ro,tinyFaceDetector:new Eu,tinyYolov2:new Fu,faceLandmark68Net:new Tu,faceLandmark68TinyNet:new lf,faceRecognitionNet:new Su,faceExpressionNet:new rf,ageGenderNet:new of},$C=(e,t)=>Ze.ssdMobilenetv1.locateFaces(e,t),ese=(e,t)=>Ze.tinyFaceDetector.locateFaces(e,t),tse=(e,t)=>Ze.tinyYolov2.locateFaces(e,t),DC=e=>Ze.faceLandmark68Net.detectLandmarks(e),nse=e=>Ze.faceLandmark68TinyNet.detectLandmarks(e),ase=e=>Ze.faceRecognitionNet.computeFaceDescriptor(e),rse=e=>Ze.faceExpressionNet.predictExpressions(e),sse=e=>Ze.ageGenderNet.predictAgeAndGender(e),MC=e=>Ze.ssdMobilenetv1.load(e),ise=e=>Ze.tinyFaceDetector.load(e),ose=e=>Ze.tinyYolov2.load(e),lse=e=>Ze.faceLandmark68Net.load(e),use=e=>Ze.faceLandmark68TinyNet.load(e),cse=e=>Ze.faceRecognitionNet.load(e),pse=e=>Ze.faceExpressionNet.load(e),dse=e=>Ze.ageGenderNet.load(e),hse=MC,mse=$C,fse=DC;var Aw=class extends wa{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.extractedFaces=a}},Mu=class extends Aw{async run(){let t=await this.parentTask,n=await so(t,this.input,async a=>Promise.all(a.map(r=>Ze.faceExpressionNet.predictExpressions(r))),this.extractedFaces);return t.map((a,r)=>sf(a,n[r]))}withAgeAndGender(){return new $u(this,this.input)}},Ru=class extends Aw{async run(){let t=await this.parentTask;if(!t)return;let n=await _u(t,this.input,a=>Ze.faceExpressionNet.predictExpressions(a),this.extractedFaces);return sf(t,n)}withAgeAndGender(){return new Du(this,this.input)}},lo=class extends Mu{withAgeAndGender(){return new io(this,this.input)}withFaceDescriptors(){return new ys(this,this.input)}},uo=class extends Ru{withAgeAndGender(){return new oo(this,this.input)}withFaceDescriptor(){return new bs(this,this.input)}};var Fw=class extends wa{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.extractedFaces=a}},$u=class extends Fw{async run(){let t=await this.parentTask,n=await so(t,this.input,async a=>Promise.all(a.map(r=>Ze.ageGenderNet.predictAgeAndGender(r))),this.extractedFaces);return t.map((a,r)=>{let{age:s,gender:i,genderProbability:o}=n[r];return pf(df(a,i,o),s)})}withFaceExpressions(){return new Mu(this,this.input)}},Du=class extends Fw{async run(){let t=await this.parentTask;if(!t)return;let{age:n,gender:a,genderProbability:r}=await _u(t,this.input,s=>Ze.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return pf(df(t,a,r),n)}withFaceExpressions(){return new Ru(this,this.input)}},io=class extends $u{withFaceExpressions(){return new lo(this,this.input)}withFaceDescriptors(){return new ys(this,this.input)}},oo=class extends Du{withFaceExpressions(){return new uo(this,this.input)}withFaceDescriptor(){return new bs(this,this.input)}};var ff=class extends wa{constructor(t,n){super();this.parentTask=t;this.input=n}},ys=class extends ff{async run(){let t=await this.parentTask;return(await so(t,this.input,a=>Promise.all(a.map(r=>Ze.faceRecognitionNet.computeFaceDescriptor(r))),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}))).map((a,r)=>cf(t[r],a))}withFaceExpressions(){return new lo(this,this.input)}withAgeAndGender(){return new io(this,this.input)}},bs=class extends ff{async run(){let t=await this.parentTask;if(!t)return;let n=await _u(t,this.input,a=>Ze.faceRecognitionNet.computeFaceDescriptor(a),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}));return cf(t,n)}withFaceExpressions(){return new uo(this,this.input)}withAgeAndGender(){return new oo(this,this.input)}};var gf=class extends wa{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.useTinyLandmarkNet=a}get landmarkNet(){return this.useTinyLandmarkNet?Ze.faceLandmark68TinyNet:Ze.faceLandmark68Net}},yf=class extends gf{async run(){let t=await this.parentTask,n=t.map(s=>s.detection),a=this.input instanceof Fe?await vu(this.input,n):await xu(this.input,n),r=await Promise.all(a.map(s=>this.landmarkNet.detectLandmarks(s)));return a.forEach(s=>s instanceof Fe&&s.dispose()),t.map((s,i)=>Nu(s,r[i]))}withFaceExpressions(){return new lo(this,this.input)}withAgeAndGender(){return new io(this,this.input)}withFaceDescriptors(){return new ys(this,this.input)}},bf=class extends gf{async run(){let t=await this.parentTask;if(!t)return;let{detection:n}=t,a=this.input instanceof Fe?await vu(this.input,[n]):await xu(this.input,[n]),r=await this.landmarkNet.detectLandmarks(a[0]);return a.forEach(s=>s instanceof Fe&&s.dispose()),Nu(t,r)}withFaceExpressions(){return new uo(this,this.input)}withAgeAndGender(){return new oo(this,this.input)}withFaceDescriptor(){return new bs(this,this.input)}};var xf=class extends wa{constructor(t,n=new va){super();this.input=t;this.options=n}},$p=class extends xf{async run(){let{input:t,options:n}=this,a;if(n instanceof mf)a=Ze.tinyFaceDetector.locateFaces(t,n);else if(n instanceof va)a=Ze.ssdMobilenetv1.locateFaces(t,n);else if(n instanceof or)a=Ze.tinyYolov2.locateFaces(t,n);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return a}runAndExtendWithFaceDetections(){return new Promise(async t=>{let n=await this.run();t(n.map(a=>Yi({},a)))})}withFaceLandmarks(t=!1){return new yf(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Mu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new $u(this.runAndExtendWithFaceDetections(),this.input)}},vf=class extends xf{async run(){let t=await new $p(this.input,this.options),n=t[0];return t.forEach(a=>{a.score>n.score&&(n=a)}),n}runAndExtendWithFaceDetection(){return new Promise(async t=>{let n=await this.run();t(n?Yi({},n):void 0)})}withFaceLandmarks(t=!1){return new bf(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Ru(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Du(this.runAndExtendWithFaceDetection(),this.input)}};function gse(e,t=new va){return new vf(e,t)}function wf(e,t=new va){return new $p(e,t)}async function RC(e,t){return wf(e,new va(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function yse(e,t={}){return wf(e,new or(t)).withFaceLandmarks().withFaceDescriptors()}var bse=RC;function _w(e,t){if(e.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let n=Array.from(e),a=Array.from(t);return Math.sqrt(n.map((r,s)=>r-a[s]).reduce((r,s)=>r+s**2,0))}var kf=class{constructor(t,n=.6){this._distanceThreshold=n;let a=Array.isArray(t)?t:[t];if(!a.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let r=1,s=()=>`person ${r++}`;this._labeledDescriptors=a.map(i=>{if(i instanceof Cr)return i;if(i instanceof Float32Array)return new Cr(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new Cr(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,n){return n.map(a=>_w(a,t)).reduce((a,r)=>a+r,0)/(n.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:n,label:a})=>new wp(a,this.computeMeanDistance(t,n))).reduce((n,a)=>n.distancet.toJSON())}}static fromJSON(t){let n=t.labeledDescriptors.map(a=>Cr.fromJSON(a));return new kf(n,t.distanceThreshold)}};function xse(e){let t=new Eu;return t.extractWeights(e),t}function PC(e,t){let{width:n,height:a}=new yn(t.width,t.height);if(n<=0||a<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:n,height:a})}`);if(Array.isArray(e))return e.map(r=>PC(r,{width:n,height:a}));if(no(e)){let r=e.detection.forSize(n,a),s=e.unshiftedLandmarks.forSize(r.box.width,r.box.height);return Nu(Yi(e,r),s)}return sr(e)?Yi(e,e.detection.forSize(n,a)):e instanceof ra||e instanceof yt?e.forSize(n,a):e}var vse=typeof process!="undefined",wse=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",kse={faceapi:eC,node:vse,browser:wse};export{of as AgeGenderNet,gu as BoundingBox,ut as Box,wa as ComposableTask,ys as ComputeAllFaceDescriptorsTask,ff as ComputeFaceDescriptorsTaskBase,bs as ComputeSingleFaceDescriptorTask,yf as DetectAllFaceLandmarksTask,$p as DetectAllFacesTask,gf as DetectFaceLandmarksTaskBase,xf as DetectFacesTaskBase,bf as DetectSingleFaceLandmarksTask,vf as DetectSingleFaceTask,yn as Dimensions,yw as FACE_EXPRESSION_LABELS,yt as FaceDetection,vC as FaceDetectionNet,rf as FaceExpressionNet,gs as FaceExpressions,Tu as FaceLandmark68Net,lf as FaceLandmark68TinyNet,lC as FaceLandmarkNet,ra as FaceLandmarks,HS as FaceLandmarks5,bu as FaceLandmarks68,wp as FaceMatch,kf as FaceMatcher,Su as FaceRecognitionNet,Fr as Gender,kp as LabeledBox,Cr as LabeledFaceDescriptors,Ar as NetInput,on as NeuralNetwork,ms as ObjectDetection,De as Point,jS as PredictedBox,yu as Rect,ro as SsdMobilenetv1,va as SsdMobilenetv1Options,Eu as TinyFaceDetector,mf as TinyFaceDetectorOptions,Fu as TinyYolov2,or as TinyYolov2Options,bse as allFaces,RC as allFacesSsdMobilenetv1,yse as allFacesTinyYolov2,pw as awaitMediaLoaded,dw as bufferToImage,ase as computeFaceDescriptor,Zi as createCanvas,Tp as createCanvasFromMedia,Yre as createFaceDetectionNet,zre as createFaceRecognitionNet,xC as createSsdMobilenetv1,xse as createTinyFaceDetector,Zre as createTinyYolov2,wf as detectAllFaces,DC as detectFaceLandmarks,nse as detectFaceLandmarksTiny,fse as detectLandmarks,gse as detectSingleFace,ZS as draw,st as env,_w as euclideanDistance,pf as extendWithAge,cf as extendWithFaceDescriptor,Yi as extendWithFaceDetection,sf as extendWithFaceExpressions,Nu as extendWithFaceLandmarks,df as extendWithGender,vu as extractFaceTensors,xu as extractFaces,Are as fetchImage,fw as fetchJson,Fre as fetchNetWeights,eo as fetchOrThrow,$n as getContext2dOrThrow,Qi as getMediaDimensions,hw as imageTensorToCanvas,mw as imageToSquare,xre as inverseSigmoid,ew as iou,Km as isMediaElement,Np as isMediaLoaded,Wre as isWithAge,sr as isWithFaceDetection,bw as isWithFaceExpressions,no as isWithFaceLandmarks,Bre as isWithGender,dse as loadAgeGenderModel,hse as loadFaceDetectionModel,pse as loadFaceExpressionModel,lse as loadFaceLandmarkModel,use as loadFaceLandmarkTinyModel,cse as loadFaceRecognitionModel,MC as loadSsdMobilenetv1Model,ise as loadTinyFaceDetectorModel,ose as loadTinyYolov2Model,gw as loadWeightMap,mse as locateFaces,_re as matchDimensions,tw as minBbox,Ze as nets,nw as nonMaxSuppression,La as normalize,aw as padToSquare,sse as predictAgeAndGender,rse as recognizeFaceExpressions,PC as resizeResults,Ji as resolveInput,bre as shuffleArray,vp as sigmoid,$C as ssdMobilenetv1,Gw as tf,ese as tinyFaceDetector,tse as tinyYolov2,mt as toNetInput,GS as utils,Sw as validateConfig,kse as version}; /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/face-api.js b/dist/face-api.js index 4f9b902..a1fef8a 100644 --- a/dist/face-api.js +++ b/dist/face-api.js @@ -4163,7 +4163,7 @@ return a / b;`,TQ=` } setOutput(${l}); } - `}};function Xee(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,segmentIds:s}=t,{numSegments:i}=a,o=r.shape.length,l=[],u=0,c=E.getAxesPermutation([u],o),p=r;c!=null&&(p=En({inputs:{x:r},backend:n,attrs:{perm:c}}),l.push(p),u=E.getInnerMostAxes(1,o)[0]);let d=E.segment_util.computeOutShape(p.shape,u,i),h=I.sizeFromShape([p.shape[u]]),m=ye({inputs:{x:p},backend:n,attrs:{shape:[-1,h]}});l.push(m);let f=uh(r.dtype),g=(v,k,w,S,A)=>{let F=v.shape[0],D=v.shape[1],R=E.segment_util.segOpComputeOptimalWindowSize(D,A),L={windowSize:R,inSize:D,batchSize:F,numSegments:A},W=new qee(L,k),U=n.compileAndRun(W,[v,w],S);if(l.push(U),U.shape[1]===A)return U;let G=sS({backend:n,attrs:{start:0,stop:A,step:1,dtype:"float32"}}),X=lS({inputs:{x:G},backend:n,attrs:{reps:[D/R]}});return l.push(G),l.push(X),g(U,k,X,S,A)},y=g(m,"unsortedSegmentSum",s,f,i),b=ye({inputs:{x:y},backend:n,attrs:{shape:d}}),x=b;if(c!=null){l.push(b);let v=E.getUndoAxesPermutation(c);x=En({inputs:{x},backend:n,attrs:{perm:v}})}return l.forEach(v=>n.disposeIntermediateTensorInfo(v)),x}var Kee={kernelName:bc,backendName:"webgl",kernelFunc:Xee},Yee=[zJ,VJ,CK,FK,$K,RK,OK,WK,VK,GK,XK,YK,ZK,n7,u7,s7,d7,g7,m7,v7,k7,N7,A7,R7,O7,U7,H7,K7,Q7,lK,nY,dY,mY,iY,bY,vY,gY,IY,SY,FY,EY,DY,PY,VY,GY,LY,qY,YY,e9,r9,l9,p9,d9,h9,f9,y9,x9,w9,I9,C9,E9,D9,R9,L9,V9,j9,Y9,oK,Q9,tY,tJ,rJ,oJ,cK,pJ,fJ,yJ,NJ,wJ,AJ,EJ,RJ,GJ,QJ,YJ,nQ,rQ,iQ,XJ,lQ,cQ,mQ,bQ,kQ,_Q,fK,$Q,RQ,LQ,BQ,z7,GQ,jQ,XQ,JQ,tZ,dK,aZ,rZ,W7,SQ,oZ,fZ,pZ,yK,xZ,kZ,TZ,AZ,$Z,MZ,OZ,WZ,VZ,HZ,XZ,JZ,eee,aee,iee,D7,AQ,uee,pee,hee,fee,bee,wee,Iee,Tee,Aee,CQ,NK,Eee,Mee,Oee,zee,Vee,TK,Gee,jee,Kee,HQ];for(let e of Yee)vc(e);var Jee="3.3.0",Qee={"tfjs-core":c1,"tfjs-backend-cpu":bG,"tfjs-backend-webgl":iK,"tfjs-data":ON,"tfjs-layers":Im,"tfjs-converter":EN,tfjs:Jee},Hn;(function(e){e[e.float32=0]="float32",e[e.int32=1]="int32",e[e.bool=2]="bool",e[e.string=3]="string",e[e.complex64=4]="complex64"})(Hn||(Hn={}));var Ip;(function(e){e[e.linear=0]="linear",e[e.relu=1]="relu",e[e.relu6=2]="relu6",e[e.prelu=3]="prelu",e[e.leakyrelu=4]="leakyrelu"})(Ip||(Ip={}));var uS;function Zee(e){uS=e.wasm.cwrap(Ii,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])}function ete(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s,bias:i,preluActivationWeights:o}=t;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");let{transposeA:l,transposeB:u,activation:c,leakyreluAlpha:p}=a,d=n.dataIdMap.get(r.dataId).id,h=n.dataIdMap.get(s.dataId).id,m=0;if(i!=null){let A=n.dataIdMap.get(i.dataId);if(A.shape.length!==1)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${A.shape.length}.`);m=A.id}let f=o==null?0:n.dataIdMap.get(o.dataId).id,g=Ip[c];if(g==null)throw new Error(`${c} activation not yet supported for FusedConv2D in the wasm backend.`);let y=l?r.shape[2]:r.shape[1],b=u?s.shape[1]:s.shape[2],x=r.shape[0],v=n.makeOutput([x,y,b],r.dtype),k=n.dataIdMap.get(v.dataId).id,w=new Uint8Array(new Int32Array(r.shape).buffer),S=new Uint8Array(new Int32Array(s.shape).buffer);return uS(d,w,r.shape.length,h,S,s.shape.length,l,u,g,m,f,p||0,k),v}var tte={kernelName:Ii,backendName:"wasm",setupFunc:Zee,kernelFunc:ete};function $n(e){let t;function n(r){t=r.wasm.cwrap(e,null,["number","number"])}function a(r){let{backend:s,inputs:{x:i}}=r,o=s.dataIdMap.get(i.dataId).id,l=s.makeOutput(i.shape,i.dtype),u=s.dataIdMap.get(l.dataId).id;return I.sizeFromShape(l.shape)===0||t(o,u),l}return{kernelName:e,backendName:"wasm",setupFunc:n,kernelFunc:a}}var nte=$n(Po);function yn(e,t,n){let a;function r(i){a=i.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])}function s(i){let{backend:o,inputs:l}=i,{a:u,b:c}=l,p=o.dataIdMap.get(u.dataId).id,d=o.dataIdMap.get(c.dataId).id,h=n!=null?n:u.dtype,m=E.assertAndGetBroadcastShape(u.shape,c.shape),f=o.makeOutput(m,h);if(I.sizeFromShape(m)===0)return f;let g=new Uint8Array(new Int32Array(u.shape).buffer),y=new Uint8Array(new Int32Array(c.shape).buffer),b=o.dataIdMap.get(f.dataId).id,x=()=>a(p,g,u.shape.length,d,y,c.shape.length,Hn[u.dtype],b);if(t&&u.dtype==="float32")return x(),f;let v=E.getBroadcastDims(u.shape,m),k=E.getBroadcastDims(c.shape,m),w=v.every((A,F)=>A===F),S=k.every((A,F)=>A===F);if(w&&S)return x(),f;throw new Error(`Broadcasting along outer dims is not yet supported for ${u.dtype} ${e}.`)}return{kernelName:e,backendName:"wasm",setupFunc:r,kernelFunc:s}}var ate=!0,rte=yn(Hr,ate),cS;function ste(e){cS=e.wasm.cwrap(Es,null,["array","number","number","number"])}function ite(e){let{inputs:t,backend:n}=e,a=n.makeOutput(t[0].shape,t[0].dtype);if(I.sizeFromShape(a.shape)===0)return a;let r=t.map(o=>n.dataIdMap.get(o.dataId).id),s=new Uint8Array(new Int32Array(r).buffer),i=n.dataIdMap.get(a.dataId).id;return cS(s,r.length,Hn[a.dtype],i),a}var ote={kernelName:Es,backendName:"wasm",setupFunc:ste,kernelFunc:ite};function af(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype),r=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(a).set(r),a}var lte={kernelName:Xs,backendName:"wasm",kernelFunc:af},pS;function ute(e){pS=e.wasm.cwrap(ki,null,["number","array","number","number","number","array","number"])}function rf(e){let{inputs:t,backend:n,attrs:a}=e,[r,s]=pte(t.x.shape,a.perm),i=!0;for(let m=0;m=r&&(s===-1||a[s]>a[i])&&(s=i);a[s]=r}return[n,a]}var dte={kernelName:ki,backendName:"wasm",kernelFunc:rf,setupFunc:ute};function Nu(e,t,n){let a=e.shape,r=e.shape.length,s=I.parseAxisParam(t,a),i=s,o=E.getAxesPermutation(i,r),l=null,u=!1;if(o!=null){let c=new Array(r);for(let d=0;d`new shape: ${i}, old shape: ${a.shape}. New shape and old shape must have the same number of elements.`),e.backend.incRef(a.dataId),{dataId:a.dataId,shape:i,dtype:a.dtype}}var xte={kernelName:vl,backendName:"wasm",kernelFunc:Oa},mS;function vte(e){mS=e.wasm.cwrap(Ms,null,["number","array","number","number","array","number","number","number","number"])}function wte(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=a;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");let l=r.shape.length,u=s.shape.length,c=i?r.shape[l-2]:r.shape[l-1],p=o?s.shape[u-1]:s.shape[u-2],d=i?r.shape[l-1]:r.shape[l-2],h=o?s.shape[u-2]:s.shape[u-1],m=r.shape.slice(0,-2),f=s.shape.slice(0,-2),g=I.sizeFromShape(m),y=I.sizeFromShape(f),b=g===y||g===1||y===1;I.assert(l>=2&&u>=2&&b,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${m}) and (${f}).`);let x=(g>y?r.shape.slice(0,-2):s.shape.slice(0,-2)).concat([d,h]);I.assert(c===p,()=>`Error in matMul: inner shapes (${c}) and (${p}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let v=i?[g,c,d]:[g,d,c],k=o?[y,h,p]:[y,p,h],w=Oa({inputs:{x:r},backend:n,attrs:{shape:v}}),S=Oa({inputs:{x:s},backend:n,attrs:{shape:k}}),A=n.dataIdMap.get(w.dataId).id,F=n.dataIdMap.get(S.dataId).id,D=i?w.shape[2]:w.shape[1],R=o?S.shape[1]:S.shape[2],L=Math.max(g,y),W=n.makeOutput([L,D,R],w.dtype),U=n.dataIdMap.get(W.dataId).id,G=new Uint8Array(new Int32Array(w.shape).buffer),X=new Uint8Array(new Int32Array(S.shape).buffer);return mS(A,G,w.shape.length,F,X,S.shape.length,i,o,U),n.disposeData(w.dataId),n.disposeData(S.dataId),W.shape=x,W}var kte={kernelName:Ms,backendName:"wasm",setupFunc:vte,kernelFunc:wte};function sf(e){let{inputs:{x:t},attrs:{dtype:n},backend:a}=e,r=a.makeOutput(t.shape,n),s=a.typedArrayFromHeap(t);return a.typedArrayFromHeap(r).set(s),r}var Ite={kernelName:Rs,backendName:"wasm",kernelFunc:sf},Nte=$n(Ps),fS;function Tte(e){fS=e.wasm.cwrap(jr,null,["number","number","number","number"])}function Ste(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{clipValueMin:s,clipValueMax:i}=a,o=n.dataIdMap.get(r.dataId).id,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(l.dataId).id;return fS(o,s,i,u),l}var Cte={kernelName:jr,backendName:"wasm",setupFunc:Tte,kernelFunc:Ste};function gS(e){let{inputs:t,backend:n}=e,a=I.parseAxisParam(e.attrs.axis,t[0].shape)[0],r=E.computeOutShape(t.map(h=>h.shape),a),s=t.filter(h=>I.sizeFromShape(h.shape)>0);if(s.length===1)return af({inputs:{x:s[0]},backend:n});let i=n.makeOutput(r,t[0].dtype);if(I.sizeFromShape(r)===0)return i;let o=s.map(h=>h.shape);if(E.assertParamsConsistent(o,a),s[0].dtype==="string"){let h=s.map(x=>{let v=I.sizeFromShape(x.shape.slice(a));return Oa({inputs:{x},backend:n,attrs:{shape:[-1,v]}})}),m=h.map(x=>({vals:n.readSync(x.dataId),shape:x.shape}));r=E.computeOutShape(h.map(x=>x.shape),1);let f=h[0].shape[0]===1,g=_v(m,r,t[0].dtype,f),y=E.computeOutShape(s.map(x=>x.shape),a);i.shape=y;let b=n.dataIdMap.get(i.dataId);return b.stringBytes=E.fromStringArrayToUint8(g),h.forEach(x=>n.disposeData(x.dataId)),i}let l=I.sizeFromShape(s[0].shape.slice(0,a)),u=0,c=s.map(h=>{let m=I.sizeFromShape(h.shape.slice(a));return u+=m,m}),p=s.map(h=>n.typedArrayFromHeap(h)),d=n.typedArrayFromHeap(i);for(let h=0;h`cumsum does not support ${r.dtype} tensors in the WASM backend`);let u=E.getAxesPermutation([s],l),c=r;u!==null&&(c=rf({inputs:{x:r},attrs:{perm:u},backend:n}));let p=E.getInnerMostAxes(1,l)[0];E.assertAxesAreInnerMostDims("cumsum",[p],l);let d=n.makeOutput(c.shape,c.dtype),h=c.shape[p],m=n.dataIdMap.get(c.dataId).id,f=n.dataIdMap.get(d.dataId).id;vS(m,i?1:0,o?1:0,h,f,Hn[r.dtype]);let g=d;if(u!==null){let y=E.getUndoAxesPermutation(u);g=rf({inputs:{x:d},attrs:{perm:y},backend:n}),n.disposeData(c.dataId),n.disposeData(d.dataId)}return g}var Bte={kernelName:Ws,backendName:"wasm",setupFunc:zte,kernelFunc:Wte},wS;function Vte(e){wS=e.wasm.cwrap(qo,null,["number","number","number","array","number","array","array","number","number"])}function Ute(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{blockSize:s,dataFormat:i}=a;I.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=r.shape[0],l=i==="NHWC"?r.shape[1]:r.shape[2],u=i==="NHWC"?r.shape[2]:r.shape[3],c=i==="NHWC"?r.shape[3]:r.shape[1],p=l*s,d=u*s,h=c/(s*s),m=i==="NHWC"?[o,p,d,h]:[o,h,p,d],f=t.makeOutput(m,"float32"),g=t.dataIdMap.get(r.dataId).id,y=new Uint8Array(new Int32Array(I.computeStrides(r.shape)).buffer),b=new Uint8Array(new Int32Array(m).buffer),x=new Uint8Array(new Int32Array(I.computeStrides(m)).buffer),v=t.dataIdMap.get(f.dataId).id;return wS(g,s,i==="NHWC"?1:0,y,r.shape.length-1,b,x,m.length,v),f}var Gte={kernelName:qo,backendName:"wasm",setupFunc:Vte,kernelFunc:Ute},kS;function Hte(e){kS=e.wasm.cwrap(Bs,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function jte(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s}=t,i=a.dataIdMap.get(r.dataId).id,o=a.dataIdMap.get(s.dataId).id,{strides:l,dilations:u,pad:c,dimRoundingMode:p}=n,d=u==null?[1,1]:u,h=E.computeConv2DInfo(r.shape,s.shape,l,d,c,p,!0),m=h.filterHeight,f=h.filterWidth,g=h.padInfo.top,y=h.padInfo.right,b=h.padInfo.bottom,x=h.padInfo.left,v=h.dilationHeight,k=h.dilationWidth,w=h.strideHeight,S=h.strideWidth,A=h.inChannels,F=h.outChannels,D=h.padInfo.type==="SAME"?1:0;if(h.dataFormat!=="channelsLast")throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);let R=a.makeOutput(h.outShape,"float32"),L=a.dataIdMap.get(R.dataId).id;return kS(i,r.shape[0],r.shape[1],r.shape[2],o,m,f,g,y,b,x,D,v,k,w,S,A,F,L),R}var qte={kernelName:Bs,backendName:"wasm",setupFunc:Hte,kernelFunc:jte},Xte=!1,Kte=yn(Yo,Xte,"bool"),Yte=$n(Us);function lw(e){let{inputs:t,attrs:n,backend:a}=e,{input:r}=t,{dim:s}=n,i=r.shape.length,o=r.shape.slice(),l=s;return s<0&&(I.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),Oa({inputs:{x:r},backend:a,attrs:{shape:o}})}var Jte={kernelName:Jo,backendName:"wasm",kernelFunc:lw};function Qte(e){let{attrs:{shape:t,value:n,dtype:a},backend:r}=e,s=r.makeOutput(t,a);return r.typedArrayFromHeap(s).fill(n),s}var Zte={kernelName:lc,backendName:"wasm",kernelFunc:Qte},IS;function ene(e){IS=e.wasm.cwrap(Zo,null,["number","number","number","number","number","number"])}function tne(e){let{inputs:t,backend:n}=e,{image:a}=t,r=n.makeOutput(a.shape,a.dtype),s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,[o,l,u,c]=a.shape;return IS(s,o,l,u,c,i),r}var nne={kernelName:Zo,backendName:"wasm",kernelFunc:tne,setupFunc:ene},ane=$n(Gs),rne=!1,sne=yn(Hs,rne),NS;function ine(e){NS=e.wasm.cwrap(js,null,["number","number","number","number","number","number","number"])}function one(e){let{backend:t,inputs:n,attrs:a}=e,{varianceEpsilon:r}=a,{x:s,mean:i,variance:o,offset:l,scale:u}=n,c=t.dataIdMap.get(s.dataId).id,p=t.dataIdMap.get(i.dataId).id,d=t.dataIdMap.get(o.dataId).id,h=l!=null?t.dataIdMap.get(l.dataId).id:0,m=u!=null?t.dataIdMap.get(u.dataId).id:0,f=t.makeOutput(s.shape,s.dtype);if(I.sizeFromShape(s.shape)===0)return f;let g=t.dataIdMap.get(f.dataId).id;return NS(c,p,d,h,m,r,g),f}var lne={kernelName:js,backendName:"wasm",setupFunc:ine,kernelFunc:one},TS;function une(e){TS=e.wasm.cwrap(Ni,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function cne(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dataFormat:p,dimRoundingMode:d,activation:h,leakyreluAlpha:m}=n,f=E.computeConv2DInfo(r.shape,s.shape,l,c,u,d),g=Ip[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ee=a.dataIdMap.get(i.dataId);if(ee.shape.length!==1)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${ee.shape.length}.`);if(ee.shape[0]!==x)throw new Error(`FusedConv2D bias shape (${ee.shape}) does not match the number of output channels (${x})`);v=ee.id}let k=f.filterHeight,w=f.filterWidth,S=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,D=f.padInfo.left,R=f.dilationHeight,L=f.dilationWidth,W=f.strideHeight,U=f.strideWidth,G=f.inChannels,X=f.padInfo.type==="SAME"?1:0,j=f.batchSize,te=f.inHeight,Q=f.inWidth;if(p!=="NHWC")throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${p}'. Please use 'NHWC'.`);let se=a.makeOutput(f.outShape,"float32"),ne=a.dataIdMap.get(se.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return TS(y,j,te,Q,b,k,w,v,S,A,F,D,X,R,L,W,U,G,x,g,ie,m||0,ne),se}var pne={kernelName:Ni,backendName:"wasm",setupFunc:une,kernelFunc:cne},SS;function dne(e){SS=e.wasm.cwrap(Ti,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function hne(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dataFormat:p,dimRoundingMode:d,activation:h,leakyreluAlpha:m}=n,f=E.computeConv2DInfo(r.shape,s.shape,l,c,u,d,!0),g=Ip[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ee=a.dataIdMap.get(i.dataId);if(ee.shape.length!==1)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${ee.shape.length}.`);if(ee.shape[0]!==x)throw new Error(`FusedDepthwiseConv2D bias shape (${ee.shape}) does not match the number of output channels (${x})`);v=ee.id}let k=f.filterHeight,w=f.filterWidth,S=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,D=f.padInfo.left,R=f.dilationHeight,L=f.dilationWidth,W=f.strideHeight,U=f.strideWidth,G=f.inChannels,X=f.padInfo.type==="SAME"?1:0,j=f.batchSize,te=f.inHeight,Q=f.inWidth;if(p!=="NHWC")throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${p}'. Please use 'NHWC'.`);let se=a.makeOutput(f.outShape,"float32"),ne=a.dataIdMap.get(se.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return SS(y,j,te,Q,b,k,w,v,S,A,F,D,X,R,L,W,U,G,x,g,ie,m||0,ne),se}var mne={kernelName:Ti,backendName:"wasm",setupFunc:dne,kernelFunc:hne},CS;function fne(e){CS=e.wasm.cwrap(tl,null,["number","number","number","number","number","number","array","number"])}function gne(e){let{backend:t,inputs:n}=e,{params:a,indices:r}=n,[s,i,o,l]=Ay.prepareAndValidate(a,r),u=t.makeOutput(s,a.dtype);if(i===0)return u;let c=r.shape,p=c[c.length-1],d=t.dataIdMap.get(a.dataId).id,h=t.dataIdMap.get(r.dataId).id,m=new Uint8Array(new Int32Array(l).buffer),f=t.dataIdMap.get(u.dataId).id;return CS(d,Hn[a.dtype],h,i,p,o,m,f),u}var yne={kernelName:tl,backendName:"wasm",setupFunc:fne,kernelFunc:gne},AS;function bne(e){AS=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])}function xne(e){let{backend:t,inputs:n,attrs:a}=e,{x:r,indices:s}=n,{axis:i,batchDims:o}=a,l=I.parseAxisParam(i,r.shape)[0],u=E.segment_util.collectGatherOpShapeInfo(r,s,l,o),c=Oa({inputs:{x:r},attrs:{shape:[u.batchSize,u.outerSize,u.dimSize,u.sliceSize]},backend:t}),p=I.sizeFromShape(s.shape),d=Oa({inputs:{x:s},attrs:{shape:[u.batchSize,p/u.batchSize]},backend:t}),h=[u.batchSize,u.outerSize,p/u.batchSize,u.sliceSize],m=t.makeOutput(h,r.dtype);if(I.sizeFromShape(r.shape)===0)return m;let f=c.shape.length-1,g=t.dataIdMap.get(c.dataId).id,y=t.dataIdMap.get(d.dataId).id,b=t.dataIdMap.get(m.dataId).id,x=new Uint8Array(new Int32Array(I.computeStrides(c.shape)).buffer),v=new Uint8Array(new Int32Array(I.computeStrides(h)).buffer);return AS(g,Hn[r.dtype],x,f,y,u.batchSize,v,b),t.disposeData(c.dataId),t.disposeData(d.dataId),m.shape=u.outputShape,m}var vne={kernelName:el,backendName:"wasm",setupFunc:bne,kernelFunc:xne},wne=!1,kne=yn(nl,wne,"bool"),Ine=!1,Nne=yn(qs,Ine,"bool"),FS;function Tne(e){FS=e.wasm.cwrap(Ks,null,["number","number","number"])}function Sne(e){let{inputs:{x:t},attrs:{alpha:n},backend:a}=e,r=a.dataIdMap.get(t.dataId).id,s=a.makeOutput(t.shape,t.dtype);if(I.sizeFromShape(t.shape)!==0){let i=a.dataIdMap.get(s.dataId).id;FS(r,n,i)}return s}var Cne={kernelName:Ks,backendName:"wasm",setupFunc:Tne,kernelFunc:Sne},Ane=!1,Fne=yn(il,Ane,"bool"),_ne=!1,Ene=yn(ol,_ne,"bool"),$ne=$n(Ys),Dne=!1,Mne=yn(ul,Dne,"bool"),_S;function Rne(e){_S=e.wasm.cwrap(Js,null,["number, number, number"])}function Pne(e){let{backend:t,inputs:n,attrs:a}=e,{reductionIndices:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=i,{transposed:u,axes:c,originalAxes:p,inputWasTransposed:d}=Nu(i,r,t);if(d){let b=t.dataIdMap.get(u.dataId).id;l=u,o=b}let h=l.shape.length;E.assertAxesAreInnerMostDims("max",c,h);let[m,f]=E.computeOutAndReduceShapes(l.shape,c),g=I.sizeFromShape(f),y=t.makeOutput(m,i.dtype);if(I.sizeFromShape(l.shape)!==0){let b=t.dataIdMap.get(y.dataId).id;_S(o,g,b)}if(d&&t.disposeData(u.dataId),s){let b=E.expandShapeToKeepDim(y.shape,p);y.shape=b}return y}var One={kernelName:Js,backendName:"wasm",setupFunc:Rne,kernelFunc:Pne},Lne=!1,zne=yn(Qs,Lne),ES;function Wne(e){ES=e.wasm.cwrap(Zs,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Bne(e){let{inputs:t,attrs:n,backend:a}=e,r=t.x,s=a.dataIdMap.get(r.dataId).id,{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=n,c=E.computePool2DInfo(r.shape,i,o,1,l,u),p=c.filterHeight,d=c.filterWidth,h=c.padInfo.top,m=c.padInfo.right,f=c.padInfo.bottom,g=c.padInfo.left,y=c.dilationHeight,b=c.dilationWidth,x=c.strideHeight,v=c.strideWidth,k=c.inChannels,w=c.outChannels;if(c.dataFormat!=="channelsLast")throw new Error(`wasm backend does not support dataFormat:'${c.dataFormat}'. Please use 'channelsLast'.`);let S=a.makeOutput(c.outShape,"float32"),A=a.dataIdMap.get(S.dataId).id;return ES(s,r.shape[0],r.shape[1],r.shape[2],p,d,h,m,f,g,y,b,x,v,k,w,A),S}var Vne={kernelName:Zs,backendName:"wasm",setupFunc:Wne,kernelFunc:Bne},$S;function Une(e){$S=e.wasm.cwrap(ei,null,["number, number, number"])}function Gne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=Nu(i,r,t),m=p;if(h){let v=t.dataIdMap.get(c.dataId).id;v!==o&&(u=c,l=v,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("mean",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=u;u.dtype!=="float32"&&(b=sf({backend:t,inputs:{x:u},attrs:{dtype:"float32"}}),l=t.dataIdMap.get(b.dataId).id);let x=t.makeOutput(f,"float32");if(I.sizeFromShape(u.shape)!==0){let v=t.dataIdMap.get(x.dataId).id;$S(l,y,v)}if(h&&t.disposeData(c.dataId),s){let v=E.expandShapeToKeepDim(x.shape,d);x.shape=v}return u.dtype!=="float32"&&t.disposeData(b.dataId),x}var Hne={kernelName:ei,backendName:"wasm",setupFunc:Une,kernelFunc:Gne},DS;function jne(e){DS=e.wasm.cwrap(ti,null,["number, number, number"])}function qne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=Nu(i,r,t);if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x)}let m=u.shape.length;E.assertAxesAreInnerMostDims("min",p,m);let[f,g]=E.computeOutAndReduceShapes(u.shape,p),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;DS(l,y,x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Xne={kernelName:ti,backendName:"wasm",setupFunc:jne,kernelFunc:qne},Kne=!1,Yne=yn(ni,Kne),Jne=!0,Qne=yn(ai,Jne),Zne=$n(pl);function uw(e,t){let n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),a=n[0],r=n[1],s=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:a,selectedSize:r,pSelectedScores:s,pValidOutputs:i}}var MS;function eae(e){MS=e.wasm.cwrap(hl,"number",["number","number","number","number","number"])}function tae(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i}=a,{boxes:o,scores:l}=n,u=t.dataIdMap.get(o.dataId).id,c=t.dataIdMap.get(l.dataId).id,p=MS(u,c,s,r,i),{pSelectedIndices:d,selectedSize:h,pSelectedScores:m,pValidOutputs:f}=uw(t,p);return t.wasm._free(m),t.wasm._free(f),t.makeOutput([h],"int32",d)}var nae={kernelName:hl,backendName:"wasm",setupFunc:eae,kernelFunc:tae},RS;function aae(e){RS=e.wasm.cwrap(ml,"number",["number","number","number","number","number","bool"])}function rae(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,padToMaxOutputSize:o}=a,{boxes:l,scores:u}=n,c=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(u.dataId).id,d=RS(c,p,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=uw(t,d);t.wasm._free(f);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([],"int32",g);return[y,b]}var sae={kernelName:ml,backendName:"wasm",setupFunc:aae,kernelFunc:rae},PS;function iae(e){PS=e.wasm.cwrap(fl,"number",["number","number","number","number","number","number"])}function oae(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,softNmsSigma:o}=a,{boxes:l,scores:u}=n,c=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(u.dataId).id,d=PS(c,p,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=uw(t,d);t.wasm._free(g);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([m],"float32",f);return[y,b]}var lae={kernelName:fl,backendName:"wasm",setupFunc:iae,kernelFunc:oae},uae=!1,cae=yn(dl,uae,"bool"),OS;function pae(e){OS=e.wasm.cwrap(ri,null,["number","number","number","number","number"])}function dae(e){let{inputs:t,backend:n,attrs:a}=e,{indices:r}=t,{depth:s,onValue:i,offValue:o}=a,l=n.makeOutput([...r.shape,s],"int32"),u=n.dataIdMap.get(l.dataId).id,c=n.dataIdMap.get(r.dataId).id;return OS(c,s,i,o,u),l}var hae={kernelName:ri,backendName:"wasm",setupFunc:pae,kernelFunc:dae};function mae(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(1),a}var fae={kernelName:gl,backendName:"wasm",kernelFunc:mae};function gae(e){let{inputs:t,backend:n,attrs:a}=e,{axis:r}=a;if(t.length===1)return lw({inputs:{input:t[0]},backend:n,attrs:{dim:r}});let s=t[0].shape,i=t[0].dtype;t.forEach(c=>{I.assertShapesMatch(s,c.shape,"All tensors passed to stack must have matching shapes"),I.assert(i===c.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(c=>{let p=lw({inputs:{input:c},backend:n,attrs:{dim:r}});return o.push(p),p}),u=gS({inputs:l,backend:n,attrs:{axis:r}});return o.forEach(c=>n.disposeData(c.dataId)),u}var yae={kernelName:yl,backendName:"wasm",kernelFunc:gae},LS;function bae(e){LS=e.wasm.cwrap(si,null,["number","array","number","number","array","array","number","number"])}function xae(e){let{inputs:{x:t},backend:n,attrs:{paddings:a,constantValue:r}}=e,s=a.map((m,f)=>m[0]+t.shape[f]+m[1]),i=n.dataIdMap.get(t.dataId).id,o=n.makeOutput(s,t.dtype),l=n.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),c=a.map(m=>m[0]),p=a.map(m=>m[1]),d=new Uint8Array(new Int32Array(c).buffer),h=new Uint8Array(new Int32Array(p).buffer);return LS(i,u,t.shape.length,Hn[t.dtype],d,h,r,l),o}var vae={kernelName:si,backendName:"wasm",kernelFunc:xae,setupFunc:bae},wae=!1,kae=yn(ii,wae),zS;function Iae(e){zS=e.wasm.cwrap(oi,null,["number","number","number"])}function Nae(e){let{inputs:t,backend:n}=e,{x:a,alpha:r}=t,s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,o=n.makeOutput(a.shape,"float32"),l=n.dataIdMap.get(o.dataId).id;return zS(s,i,l),o}var Tae={kernelName:oi,backendName:"wasm",setupFunc:Iae,kernelFunc:Nae},WS;function Sae(e){WS=e.wasm.cwrap(bl,null,["number","number","number","number"])}function Cae(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=Nu(i,r,t),m=p;if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("prod",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;WS(l,y,Hn[b.dtype],x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Aae={kernelName:bl,backendName:"wasm",setupFunc:Sae,kernelFunc:Cae},Fae=e=>{let{backend:t,attrs:n}=e,{start:a,stop:r,step:s,dtype:i}=n,o=Dv(a,r,s,i),l=t.makeOutput([o.length],i);return t.typedArrayFromHeap(l).set(o),l},_ae={kernelName:mc,backendName:"wasm",kernelFunc:Fae},Eae=!0,$ae=yn(Vs,Eae),Dae=$n(li),Mae=$n(ci),BS;function Rae(e){BS=e.wasm.cwrap(ui,null,["number","number","number","number","number","number","number","number","number","number"])}function Pae(e){let{backend:t,inputs:n,attrs:a}=e,{images:r}=n,{alignCorners:s,halfPixelCenters:i,size:o}=a,[l,u]=o,[c,p,d,h]=r.shape,m=[c,l,u,h],f=t.dataIdMap.get(r.dataId),g;f.dtype!=="float32"&&(g=sf({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(g.dataId));let y=f.id,b=t.makeOutput(m,"float32");if(I.sizeFromShape(r.shape)===0)return b;let x=t.dataIdMap.get(b.dataId).id;return BS(y,c,p,d,h,l,u,s?1:0,i?1:0,x),g!=null&&t.disposeData(g.dataId),b}var Oae={kernelName:ui,backendName:"wasm",setupFunc:Rae,kernelFunc:Pae},VS;function Lae(e){VS=e.wasm.cwrap(pi,null,["number","array","number","array","number","number"])}function zae(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dims:s}=a,i=I.parseAxisParam(s,r.shape);if(r.shape.length===0)return af({inputs:{x:r},backend:n});let o=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(r.dataId).id,u=n.dataIdMap.get(o.dataId).id,c=new Uint8Array(new Int32Array(i).buffer),p=new Uint8Array(new Int32Array(r.shape).buffer);VS(l,c,i.length,p,r.shape.length,u);let d=Oa({inputs:{x:o},attrs:{shape:r.shape},backend:n});return n.disposeData(o.dataId),d}var Wae={kernelName:pi,backendName:"wasm",kernelFunc:zae,setupFunc:Lae},US;function Bae(e){US=e.wasm.cwrap(Ml,null,["number","number","number","number","number","number","number","number","array","number","number"])}function Vae(e){let{inputs:t,backend:n,attrs:a}=e,{image:r}=t,{radians:s,fillValue:i,center:o}=a,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(r.dataId).id,c=n.dataIdMap.get(l.dataId).id,[p,d,h,m]=r.shape,[f,g]=E.getImageCenter(o,d,h),y=i===0,b=255,x=typeof i=="number"?[i,i,i,y?0:b]:[...i,b],v=new Uint8Array(new Int32Array(x).buffer);return US(u,p,d,h,m,s,f,g,v,x.length,c),l}var Uae={kernelName:Ml,backendName:"wasm",kernelFunc:Vae,setupFunc:Bae},Gae=$n(di),Hae=$n(hi),GS;function jae(e){GS=e.wasm.cwrap(wl,null,["number","number","number","number","number","number","array","number","number"])}function qae(e){let{backend:t,inputs:n,attrs:a}=e,{indices:r,updates:s}=n,{shape:i}=a,o=t.makeOutput(i,s.dtype);if(I.sizeFromShape(i)===0)return o;let{sliceRank:l,numUpdates:u,sliceSize:c,strides:p,outputSize:d}=Fy.calculateShapes(s,r,i),h=t.dataIdMap.get(r.dataId).id,m=t.dataIdMap.get(s.dataId).id,f=new Uint8Array(new Int32Array(p).buffer),g=t.dataIdMap.get(o.dataId).id;return GS(h,m,Hn[s.dtype],l,u,c,f,d,g),o}var Xae={kernelName:wl,backendName:"wasm",setupFunc:jae,kernelFunc:qae},HS;function Kae(e){HS=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}function Yae(e){let{inputs:t,backend:n}=e,{condition:a,t:r,e:s}=t,i=n.dataIdMap.get(a.dataId).id,o=n.dataIdMap.get(r.dataId).id,l=n.dataIdMap.get(s.dataId).id,u=n.makeOutput(r.shape,r.dtype),c=n.dataIdMap.get(u.dataId).id,p=a.shape.length,d=r.shape.length,h=p===0||p>1||d===1?1:I.sizeFromShape(r.shape.slice(1));return HS(i,o,l,h,c),u}var Jae={kernelName:kl,backendName:"wasm",kernelFunc:Yae,setupFunc:Kae},jS;function Qae(e){jS=e.wasm.cwrap(fi,null,["number","number"])}function Zae(e){let{backend:t,inputs:{x:n}}=e,a=t.dataIdMap.get(n.dataId).id,r=t.makeOutput(n.shape,n.dtype),s=t.dataIdMap.get(r.dataId).id;return I.sizeFromShape(r.shape)===0||jS(a,s),r}var ere={kernelName:"Sigmoid",backendName:"wasm",setupFunc:Qae,kernelFunc:Zae},tre=$n(mi);function of(e){let{inputs:{x:t},attrs:{begin:n,size:a},backend:r}=e,[s,i]=dn.parseSliceParams(t,n,a),o=dn.isSliceContinous(t.shape,s,i),l=r.readSync(t.dataId),u=r.makeOutput(i,t.dtype),c=I.computeStrides(t.shape),p=r.dataIdMap.get(u.dataId);if(o){let m=dn.computeFlatOffset(s,c);return t.dtype==="string"?p.stringBytes=l.slice(m,m+I.sizeFromShape(i)):r.typedArrayFromHeap(u).set(l.subarray(m,m+I.sizeFromShape(i))),u}if(t.dtype==="string"){let m=zm(l,s,i,t.shape,t.dtype);return p.stringBytes=m,u}let d=r.typedArrayFromHeap(u),h=t.shape.length;if(h===2)nre(l,c[0],d,s,i);else if(h===3)are(l,c[0],c[1],d,s,i);else if(h===4)rre(l,c[0],c[1],c[2],d,s,i);else{let m=zm(l,s,i,t.shape,t.dtype);d.set(m)}return u}function nre(e,t,n,a,r){let s=0,i=a[0],o=a[1],l=i+r[0];for(let u=i;u{let d=[...c];d[o]=p;let h=of({inputs:{x:r},attrs:{begin:u,size:d},backend:a});return u[o]+=p,h})}var cre={kernelName:Al,backendName:"wasm",kernelFunc:ure},pre=$n(gi),dre=$n(yc),hre=!0,mre=yn(xi,hre),XS;function fre(e){XS=e.wasm.cwrap(Xr,null,["number","number","number"])}function gre(e){let{backend:t,inputs:n,attrs:a}=e,{alpha:r}=a,{x:s}=n,i=t.dataIdMap.get(s.dataId).id,o=t.makeOutput(s.shape,s.dtype),l=t.dataIdMap.get(o.dataId).id;return XS(i,r,l),o}var yre={kernelName:Xr,backendName:"wasm",setupFunc:fre,kernelFunc:gre},KS;function bre(e){KS=e.wasm.cwrap(Fl,null,["number","array","number","array","array","array","array","array","number","number"])}function xre(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{begin:s,end:i,strides:o}=a;o==null&&(o=new Array(s.length));let{beginMask:l,endMask:u,ellipsisMask:c,newAxisMask:p,shrinkAxisMask:d}=a,h=E.slice_util.maskToAxes(c);if(h.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(c!==0&&p!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(c!==0&&d!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let m=r.shape.length-s.length,f=E.slice_util.maskToAxes(p),g=r.shape.slice();f.forEach(D=>{s[D]=0,i[D]=1,g.splice(D,0,1)});let y=Oa({inputs:{x:r},attrs:{shape:g},backend:t}),{begin:b,end:x,strides:v}=E.slice_util.getNormalizedAxes(y.shape,h,m,s,i,o,l,u,c);s=b,i=x,o=v;let k=E.slice_util.maskToAxes(d);k.forEach(D=>{i[D]=s[D]+1,o[D]=1});let w=E.slice_util.computeOutShape(s,i,o),S=w.filter((D,R)=>k.indexOf(R)===-1);if(o.every(D=>D===1)){let D=of({inputs:{x:y},attrs:{begin:s,size:w},backend:t});t.disposeData(y.dataId);let R=Oa({inputs:{x:D},attrs:{shape:S},backend:t});return t.disposeData(D.dataId),R}let A=t.makeOutput(S,"float32");if(!S.some(D=>D===0)){let D=t.dataIdMap.get(y.dataId).id,R=new Uint8Array(new Int32Array(I.computeStrides(y.shape)).buffer),L=new Uint8Array(new Int32Array(s).buffer),W=new Uint8Array(new Int32Array(i).buffer),U=new Uint8Array(new Int32Array(o).buffer),G=new Uint8Array(new Int32Array(S).buffer),X=new Uint8Array(new Int32Array(I.computeStrides(S)).buffer),j=t.dataIdMap.get(A.dataId).id;KS(D,R,y.shape.length,L,W,U,G,X,S.length,j)}t.disposeData(y.dataId);let F=Oa({inputs:{x:A},attrs:{shape:S},backend:t});return t.disposeData(A.dataId),F}var vre={kernelName:Fl,backendName:"wasm",setupFunc:bre,kernelFunc:xre},wre=!0,kre=yn(vi,wre),YS;function Ire(e){YS=e.wasm.cwrap(yi,null,["number, number, number"])}function Nre(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=Nu(i,r,t),m=p;if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("sum",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;YS(l,y,x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Tre={kernelName:yi,backendName:"wasm",setupFunc:Ire,kernelFunc:Nre},Sre=$n(wi),JS;function Cre(e){JS=e.wasm.cwrap(qr,null,["number","array","number","array","number","number"])}function Are(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,s=n.dataIdMap.get(r.dataId).id,{reps:i}=a,o=new Array(r.shape.length);for(let d=0;d{let{x:a}=e,{k:r,sorted:s}=n,i=t.dataIdMap.get(a.dataId).id,o=new Uint8Array(new Int32Array(a.shape).buffer),l=a.shape.slice();l[l.length-1]=r;let u=t.makeOutput(l,a.dtype),c=t.dataIdMap.get(u.dataId).id,p=t.makeOutput(l,"int32"),d=t.dataIdMap.get(p.dataId).id;return QS(i,o,a.shape.length,Hn[a.dtype],r,s,c,d),[u,p]},$re={kernelName:El,backendName:"wasm",setupFunc:_re,kernelFunc:Ere};function Dre(e){let{inputs:t,backend:n,attrs:a}=e,{value:r}=t,{axis:s}=a;s<0&&(s+=r.shape.length);let i=r.shape[s],o=r.shape.length,l=new Array(o-1),u=0;for(let h=0;h({dataId:h,dtype:m,shape:l}))}var Mre={kernelName:$l,backendName:"wasm",kernelFunc:Dre};function Rre(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(0),a}var Pre={kernelName:Dl,backendName:"wasm",kernelFunc:Rre},Ore=[nte,rte,ote,fte,bte,kte,Ite,Nte,Cte,Ate,Ete,Mte,Rte,Lte,Bte,Gte,qte,Kte,Yte,Jte,Zte,nne,ane,sne,tte,lne,pne,mne,yne,vne,kne,Nne,lte,Cne,Fne,Ene,$ne,Mne,One,zne,Vne,Hne,Xne,Yne,Qne,Zne,nae,sae,lae,cae,hae,fae,yae,vae,kae,Tae,Aae,_ae,$ae,Dae,Mae,xte,Oae,Wae,Uae,Hae,Gae,Xae,Jae,ere,tre,sre,lre,cre,pre,dre,mre,yre,vre,kre,Tre,Sre,Fre,$re,dte,Mre,Pre];for(let e of Ore)vc(e);var cw=Z();cw.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])));cw.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(cw.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}});var ZS=Do(XF()),Lre='var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance;moduleLoaded()})}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){self={location:{href:__filename}};var onmessage=this.onmessage;var nodeWorkerThreads=require("worker_threads");global.Worker=nodeWorkerThreads.Worker;var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");var nodeRead=function(filename){return nodeFS.readFileSync(filename,"utf8")};function globalEval(x){global.require=require;global.Module=Module;eval.call(null,x)}importScripts=function(f){globalEval(nodeRead(f))};postMessage=function(msg){parentPort.postMessage(msg)};if(typeof performance==="undefined"){performance={now:function(){return Date.now()}}}}',zre=Do(KF()),eC=class extends Zu{constructor(e){super();this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.init(),this.dataIdMap=new kd(this,Ha())}write(e,t,n){let a={id:this.dataIdNextNumber++};return this.move(a,e,t,n,1),a}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=I.now();return e(),{kernelMs:I.now()-t}}move(e,t,n,a,r){let s=this.dataIdNextNumber++;if(a==="string"){let u=t;this.dataIdMap.set(e,{id:s,stringBytes:u,shape:n,dtype:a,memoryOffset:null,refCount:r});return}let i=I.sizeFromShape(n),o=i*I.bytesPerElement(a),l=this.wasm._malloc(o);this.dataIdMap.set(e,{id:s,memoryOffset:l,shape:n,dtype:a,refCount:r}),this.wasm.tfjs.registerTensor(s,i,l),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,o),l)}async read(e){return this.readSync(e)}readSync(e){let{memoryOffset:t,dtype:n,shape:a,stringBytes:r}=this.dataIdMap.get(e);if(n==="string")return r;let s=this.wasm.HEAPU8.slice(t,t+I.sizeFromShape(a)*I.bytesPerElement(n));return Wre(s.buffer,n)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let a;if(n==null)a=this.write(null,e,t);else{let r=this.dataIdNextNumber++;a={id:r},this.dataIdMap.set(a,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});let s=I.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,s,n)}return{dataId:a,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){let a=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),s=I.sizeFromShape(e);switch(t){case"float32":return new Float32Array(a,r,s);case"int32":return new Int32Array(a,r,s);case"bool":return new Uint8Array(a,r,s);default:throw new Error(`Unknown dtype ${t}`)}}};function Bre(e){return(t,n)=>(I.fetch(e,{credentials:"same-origin"}).then(a=>{a.ok||t.env.a(`failed to load wasm binary file at '${e}'`),a.arrayBuffer().then(r=>{WebAssembly.instantiate(r,t).then(s=>{n(s.instance)})})}),{})}function tC(e,t,n){if(lf!=null)return lf;let a="tfjs-backend-wasm.wasm";return e&&t?a="tfjs-backend-wasm-threaded-simd.wasm":e&&(a="tfjs-backend-wasm-simd.wasm"),Np!=null&&Np[a]!=null?Np[a]:n+a}async function Vre(){let[e,t]=await Promise.all([Z().getAsync("WASM_HAS_SIMD_SUPPORT"),Z().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((n,a)=>{let r={};r.locateFile=(o,l)=>{if(o.endsWith(".worker.js")){let u=Lre,c=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(c)}return o.endsWith(".wasm")?tC(e,t,Tp!=null?Tp:l):l+o},pw&&(r.instantiateWasm=Bre(tC(e,t,Tp!=null?Tp:"")));let s=!1;r.onAbort=()=>{s||Sp||(Sp=!0,a({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"}))};let i;t&&e&&lf==null?(r.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+ZS.default.toString()],{type:"text/javascript"}),i=(0,ZS.default)(r)):i=(0,zre.default)(r),i.then(o=>{s=!0,Sp=!1;let l=null;o.tfjs={init:o.cwrap("init",null,[]),registerTensor:o.cwrap("register_tensor",null,["number","number","number"]),disposeData:o.cwrap("dispose_data",l,["number"]),dispose:o.cwrap("dispose",l,[])},n({wasm:o})})})}function Wre(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}var Ure=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],lf=null,Tp=null,Np={},Sp=!1,pw=!1;function Gre(e,t=!1){if(Ry("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),Sp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");lf=e,pw=t}function Hre(e,t=!1){if(Sp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof e=="string")Tp=e;else{Np=e;let n=Ure.filter(a=>Np[a]==null);if(n.length>0)throw new Error(`There were no entries found for the following binaries: ${n.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}pw=t}var jre="3.3.0",qre=2;fh("wasm",async()=>{let{wasm:e}=await Vre();return new eC(e)},qre);var Cw={};Ju(Cw,{AnchorPosition:()=>lr,DrawBox:()=>gf,DrawBoxOptions:()=>Nw,DrawFaceLandmarks:()=>Sw,DrawFaceLandmarksOptions:()=>Tw,DrawTextField:()=>vs,DrawTextFieldOptions:()=>Cp,drawContour:()=>Ar,drawDetections:()=>nse,drawFaceExpressions:()=>ase,drawFaceLandmarks:()=>sse});function Ar(e,t,n=!1){if(e.beginPath(),t.slice(1).forEach(({x:a,y:r},s)=>{let i=t[s];e.moveTo(i.x,i.y),e.lineTo(a,r)}),n){let a=t[t.length-1],r=t[0];if(!a||!r)return;e.moveTo(a.x,a.y),e.lineTo(r.x,r.y)}e.stroke()}var dw={};Ju(dw,{computeReshapedDimensions:()=>fw,getCenterPoint:()=>no,isDimensions:()=>cf,isEven:()=>uf,isFloat:()=>mw,isTensor:()=>eo,isTensor1D:()=>Xre,isTensor2D:()=>hw,isTensor3D:()=>Fr,isTensor4D:()=>ra,isValidNumber:()=>La,isValidProbablitiy:()=>Tu,range:()=>ir,round:()=>to});var cn=class{constructor(t,n){if(!La(t)||!La(n))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:n})}`);this._width=t,this._height=n}get width(){return this._width}get height(){return this._height}reverse(){return new cn(1/this.width,1/this.height)}};function eo(e,t){return e instanceof Fe&&e.shape.length===t}function Xre(e){return eo(e,1)}function hw(e){return eo(e,2)}function Fr(e){return eo(e,3)}function ra(e){return eo(e,4)}function mw(e){return e%1!=0}function uf(e){return e%2==0}function to(e,t=2){let n=10**t;return Math.floor(e*n)/n}function cf(e){return e&&e.width&&e.height}function fw({width:e,height:t},n){let a=n/Math.max(t,e);return new cn(Math.round(e*a),Math.round(t*a))}function no(e){return e.reduce((t,n)=>t.add(n),new De(0,0)).div(new De(e.length,e.length))}function ir(e,t,n){return Array(e).fill(0).map((a,r)=>t+r*n)}function La(e){return!!e&&e!==Infinity&&e!==-Infinity&&!Number.isNaN(e)||e===0}function Tu(e){return La(e)&&e>=0&&e<=1}var De=class{constructor(t,n){this._x=t,this._y=n}get x(){return this._x}get y(){return this._y}add(t){return new De(this.x+t.x,this.y+t.y)}sub(t){return new De(this.x-t.x,this.y-t.y)}mul(t){return new De(this.x*t.x,this.y*t.y)}div(t){return new De(this.x/t.x,this.y/t.y)}abs(){return new De(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new De(Math.floor(this.x),Math.floor(this.y))}};var ot=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(La)}static assertIsValidBox(t,n,a=!1){if(!ot.isRect(t))throw new Error(`${n} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!a&&(t.width<0||t.height<0))throw new Error(`${n} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,n=!0){let a=t||{},r=[a.left,a.top,a.right,a.bottom].every(La),s=[a.x,a.y,a.width,a.height].every(La);if(!s&&!r)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(a)}`);let[i,o,l,u]=s?[a.x,a.y,a.width,a.height]:[a.left,a.top,a.right-a.left,a.bottom-a.top];ot.assertIsValidBox({x:i,y:o,width:l,height:u},"Box.constructor",n),this._x=i,this._y=o,this._width=l,this._height=u}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new De(this.left,this.top)}get topRight(){return new De(this.right,this.top)}get bottomLeft(){return new De(this.left,this.bottom)}get bottomRight(){return new De(this.right,this.bottom)}round(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new ot({x:t,y:n,width:a,height:r})}floor(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new ot({x:t,y:n,width:a,height:r})}toSquare(){let{x:t,y:n,width:a,height:r}=this,s=Math.abs(a-r);return an&&(o=-p+n+a,p=n),d>t&&(l=-d+t+r,d=t),u<1&&(l=2-u,u=1),c<1&&(l=2-c,c=1),{dy:i,edy:l,dx:s,edx:o,y:c,ey:d,x:u,ex:p,w:a,h:r}}calibrate(t){return new ot({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var ao=class extends ot{constructor(t,n,a,r,s=!1){super({left:t,top:n,right:a,bottom:r},s)}};var _r=class{constructor(t,n,a,r,s){this._imageDims=new cn(s.width,s.height),this._score=t,this._classScore=n,this._className=a,this._box=new ot(r).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new ot(this._box).rescale(this.imageDims.reverse())}forSize(t,n){return new _r(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:n})}};var ft=class extends _r{constructor(t,n,a){super(t,t,"",n,a)}forSize(t,n){let{score:a,relativeBox:r,imageDims:s}=super.forSize(t,n);return new ft(a,r,s)}};function pf(e,t,n=!0){let a=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),r=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),s=a*r;return n?s/(e.area+t.area-s):s/Math.min(e.area,t.area)}function df(e){let t=e.map(o=>o.x),n=e.map(o=>o.y),a=t.reduce((o,l)=>lloo({score:i,boxIndex:o})).sort((i,o)=>i.score-o.score).map(i=>i.boxIndex),s=[];for(;r.length>0;){let i=r.pop();s.push(i);let o=r,l=[];for(let u=0;ul[c]<=n)}return s}function wa(e,t){return M(()=>{let[n,a,r]=t,s=Cn([...e.shape.slice(0,3),1],n,"float32"),i=Cn([...e.shape.slice(0,3),1],a,"float32"),o=Cn([...e.shape.slice(0,3),1],r,"float32"),l=Je([s,i,o],3);return me(e,l)})}function mf(e,t=!1){return M(()=>{let[n,a]=e.shape.slice(1);if(n===a)return e;let r=Math.abs(n-a),s=Math.round(r*(t?.5:1)),i=n>a?2:1,o=d=>{let h=e.shape.slice();return h[i]=d,Cn(h,0,"float32")},l=o(s),u=r-l.shape[i],p=[t&&u?o(u):null,e,l].filter(d=>!!d).map(d=>ue(d,"float32"));return Je(p,i)})}function nC(e){let t=e.slice();for(let n=t.length-1;n>0;n--){let a=Math.floor(Math.random()*(n+1)),r=t[n];t[n]=t[a],t[a]=r}return t}function Su(e){return 1/(1+Math.exp(-e))}function aC(e){return Math.log(e/(1-e))}var ro=class extends ot{constructor(t,n,a,r,s=!1){super({x:t,y:n,width:a,height:r},s)}};var Kre=.5,Yre=.43,Jre=.45,jn=class{constructor(t,n,a=new De(0,0)){let{width:r,height:s}=n;this._imgDims=new cn(r,s),this._shift=a,this._positions=t.map(i=>i.mul(new De(r,s)).add(a))}get shift(){return new De(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new De(this.imageWidth,this.imageHeight)))}forSize(t,n){return new this.constructor(this.relativePositions,{width:t,height:n})}shiftBy(t,n){return new this.constructor(this.relativePositions,this._imgDims,new De(t,n))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,n={}){if(t){let s=t instanceof ft?t.box.floor():new ot(t);return this.shiftBy(s.x,s.y).align(null,n)}let{useDlibAlignment:a,minBoxPadding:r}={useDlibAlignment:!1,minBoxPadding:.2,...n};return a?this.alignDlib():this.alignMinBbox(r)}alignDlib(){let t=this.getRefPointsForAlignment(),[n,a,r]=t,s=p=>r.sub(p).magnitude(),i=(s(n)+s(a))/2,o=Math.floor(i/Jre),l=no(t),u=Math.floor(Math.max(0,l.x-Kre*o)),c=Math.floor(Math.max(0,l.y-Yre*o));return new ro(u,c,Math.min(o,this.imageWidth+u),Math.min(o,this.imageHeight+c))}alignMinBbox(t){let n=df(this.positions);return n.pad(n.width*t,n.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var gw=class extends jn{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],no([t[3],t[4]])]}};var so=class extends jn{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(no)}};var Cu=class{constructor(t,n){this._label=t,this._distance=n}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${to(this.distance)})`:""}`}};var Au=class extends ot{static assertIsValidLabeledBox(t,n){if(ot.assertIsValidBox(t,n),!La(t.label))throw new Error(`${n} - expected property label (${t.label}) to be a number`)}constructor(t,n){super(t);this._label=n}get label(){return this._label}};var or=class{constructor(t,n){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(n)||n.some(a=>!(a instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=n}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let n=t.descriptors.map(a=>new Float32Array(a));return new or(t.label,n)}};var yw=class extends Au{static assertIsValidPredictedBox(t,n){if(Au.assertIsValidLabeledBox(t,n),!Tu(t.score)||!Tu(t.classScore))throw new Error(`${n} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,n,a,r){super(t,n);this._score=a,this._classScore=r}get score(){return this._score}get classScore(){return this._classScore}};function za(e){return e.detection instanceof ft}function bs(e,t){return{...e,...{detection:t}}}function bw(){let e=window.fetch;if(!e)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:e,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function ff(e){let t="";if(!e)try{e=require("fs")}catch(a){t=a.toString()}return{readFile:e?a=>new Promise((r,s)=>{e.readFile(a,(i,o)=>i?s(i):r(o))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function xw(){let e=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,n=()=>{if(e)return new e;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},a=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},r=global.fetch,s=ff();return{Canvas:e||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:n,createImageElement:a,fetch:r,...s}}function vw(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var ww=hF(sC()),Zt;function ese(){if(!Zt)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return Zt}function kw(e){Zt=e}function Iw(){return vw()?kw(bw()):(0,ww.isNodejs)()?kw(xw()):null}function tse(e){if(Zt||Iw(),!Zt)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=Zt.Canvas,Image:n=Zt.Image}=e;Zt.Canvas=t,Zt.Image=n,Zt.createCanvasElement=e.createCanvasElement||(()=>new t),Zt.createImageElement=e.createImageElement||(()=>new n),Zt.ImageData=e.ImageData||Zt.ImageData,Zt.Video=e.Video||Zt.Video,Zt.fetch=e.fetch||Zt.fetch,Zt.readFile=e.readFile||Zt.readFile}var nt={getEnv:ese,setEnv:kw,initialize:Iw,createBrowserEnv:bw,createFileSystem:ff,createNodejsEnv:xw,monkeyPatch:tse,isBrowser:vw,isNodejs:ww.isNodejs};Iw();function xs(e){return!nt.isNodejs()&&typeof e=="string"?document.getElementById(e):e}function bn(e){let{Canvas:t,CanvasRenderingContext2D:n}=nt.getEnv();if(e instanceof n)return e;let a=xs(e);if(!(a instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let r=a.getContext("2d");if(!r)throw new Error("resolveContext2d - canvas 2d context is null");return r}var lr;(function(e){e.TOP_LEFT="TOP_LEFT",e.TOP_RIGHT="TOP_RIGHT",e.BOTTOM_LEFT="BOTTOM_LEFT",e.BOTTOM_RIGHT="BOTTOM_RIGHT"})(lr||(lr={}));var Cp=class{constructor(t={}){let{anchorPosition:n,backgroundColor:a,fontColor:r,fontSize:s,fontStyle:i,padding:o}=t;this.anchorPosition=n||lr.TOP_LEFT,this.backgroundColor=a||"rgba(0, 0, 0, 0.5)",this.fontColor=r||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=o||4}},vs=class{constructor(t,n,a={}){this.text=typeof t=="string"?[t]:t instanceof vs?t.text:t,this.anchor=n,this.options=new Cp(a)}measureWidth(t){let{padding:n}=this.options;return this.text.map(a=>t.measureText(a).width).reduce((a,r)=>a{let m=l+p.x,f=l+p.y+(h+1)*i;a.fillText(d,m,f)})}};var Nw=class{constructor(t={}){let{boxColor:n,lineWidth:a,label:r,drawLabelOptions:s}=t;this.boxColor=n||"rgba(0, 0, 255, 1)",this.lineWidth=a||2,this.label=r;let i={anchorPosition:lr.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Cp({...i,...s})}},gf=class{constructor(t,n={}){this.box=new ot(t),this.options=new Nw(n)}draw(t){let n=bn(t),{boxColor:a,lineWidth:r}=this.options,{x:s,y:i,width:o,height:l}=this.box;n.strokeStyle=a,n.lineWidth=r,n.strokeRect(s,i,o,l);let{label:u}=this.options;u&&new vs([u],{x:s-r/2,y:i},this.options.drawLabelOptions).draw(t)}};function nse(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof ft?a.score:za(a)?a.detection.score:void 0,s=a instanceof ft?a.box:za(a)?a.detection.box:new ot(a),i=r?`${to(r)}`:void 0;new gf(s,{label:i}).draw(e)})}function Fu(e){let{Image:t,Video:n}=nt.getEnv();return e instanceof t&&e.complete||e instanceof n&&e.readyState>=3}function yf(e){return new Promise((t,n)=>{if(e instanceof nt.getEnv().Canvas||Fu(e))return t(null);function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),n(s))}function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),t(s))}e.addEventListener("load",r),e.addEventListener("error",a)})}function bf(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToImage - expected buf to be of type: Blob"));let a=new FileReader;a.onload=()=>{typeof a.result!="string"&&n(new Error("bufferToImage - expected reader.result to be a string, in onload"));let r=nt.getEnv().createImageElement();r.onload=()=>t(r),r.onerror=n,r.src=a.result},a.onerror=n,a.readAsDataURL(e)})}function ws(e){let{Image:t,Video:n}=nt.getEnv();return e instanceof t?new cn(e.naturalWidth,e.naturalHeight):e instanceof n?new cn(e.videoWidth,e.videoHeight):new cn(e.width,e.height)}function ks({width:e,height:t}){let{createCanvasElement:n}=nt.getEnv(),a=n();return a.width=e,a.height=t,a}function _u(e,t){let{ImageData:n}=nt.getEnv();if(!(e instanceof n)&&!Fu(e))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:a,height:r}=t||ws(e),s=ks({width:a,height:r});return e instanceof n?bn(s).putImageData(e,0,0):bn(s).drawImage(e,0,0,a,r),s}async function xf(e,t){let n=t||nt.getEnv().createCanvasElement(),[a,r,s]=e.shape.slice(ra(e)?1:0),i=M(()=>e.as3D(a,r,s).toInt());return await Fi.toPixels(i,n),i.dispose(),n}function Ap(e){let{Image:t,Canvas:n,Video:a}=nt.getEnv();return e instanceof t||e instanceof n||e instanceof a}function vf(e,t,n=!1){let{Image:a,Canvas:r}=nt.getEnv();if(!(e instanceof a||e instanceof r))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return ks({width:1,height:1});let s=ws(e),i=t/Math.max(s.height,s.width),o=i*s.width,l=i*s.height,u=ks({width:t,height:t}),c=e instanceof r?e:_u(e),p=Math.abs(o-l)/2,d=n&&o0&&c.height>0&&bn(u).drawImage(c,d,h,o,l),u}var ur=class{constructor(t,n=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=n,this._batchSize=t.length,t.forEach((a,r)=>{if(Fr(a)){this._imageTensors[r]=a,this._inputDimensions[r]=a.shape;return}if(ra(a)){let i=a.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[r]=a,this._inputDimensions[r]=a.shape.slice(1);return}let s=a instanceof nt.getEnv().Canvas?a:_u(a);this._canvases[r]=s,this._inputDimensions[r]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return ir(this.batchSize,0,1).map((t,n)=>this.getReshapedInputDimensions(n))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let n=this.getInputWidth(t),a=this.getInputHeight(t);return fw({width:n,height:a},this.inputSize)}toBatchTensor(t,n=!0){return this._inputSize=t,M(()=>{let a=ir(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof Fe){let o=ra(i)?i:i.expandDims();return o=mf(o,n),(o.shape[1]!==t||o.shape[2]!==t)&&(o=Ja.resizeBilinear(o,[t,t])),o.as3D(t,t,3)}if(i instanceof nt.getEnv().Canvas)return Fi.fromPixels(vf(i,t,n));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return Dt(a.map(s=>ue(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function mt(e){if(e instanceof ur)return e;let t=Array.isArray(e)?e:[e];if(!t.length)throw new Error("toNetInput - empty array passed as input");let n=r=>Array.isArray(e)?` at input index ${r}:`:"",a=t.map(xs);return a.forEach((r,s)=>{if(!Ap(r)&&!Fr(r)&&!ra(r))throw typeof t[s]=="string"?new Error(`toNetInput -${n(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${n(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(ra(r)){let i=r.shape[0];if(i!==1)throw new Error(`toNetInput -${n(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(a.map(r=>Ap(r)&&yf(r))),new ur(a,Array.isArray(e))}async function io(e,t){let{Canvas:n}=nt.getEnv(),a=e;if(!(e instanceof n)){let i=await mt(e);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let o=i.getInput(0);a=o instanceof n?o:await xf(o)}let r=bn(a);return t.map(i=>i instanceof ft?i.forSize(a.width,a.height).box.floor():i).map(i=>i.clipAtImageBorders(a.width,a.height)).map(({x:i,y:o,width:l,height:u})=>{let c=ks({width:l,height:u});return l>0&&u>0&&bn(c).putImageData(r.getImageData(i,o,l,u),0,0),c})}async function oo(e,t){if(!Fr(e)&&!ra(e))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(ra(e)&&e.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return M(()=>{let[n,a,r]=e.shape.slice(ra(e)?1:0);return t.map(o=>o instanceof ft?o.forSize(a,n).box:o).map(o=>o.clipAtImageBorders(a,n)).map(({x:o,y:l,width:u,height:c})=>Yl(e.as3D(n,a,r),[l,o,0],[c,u,r]))})}async function Is(e,t){let{fetch:n}=nt.getEnv(),a=await n(e,t);if(!(a.status<400))throw new Error(`failed to fetch: (${a.status}) ${a.statusText}, from url: ${a.url}`);return a}async function iC(e){let t=await Is(e),n=await t.blob();if(!n.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${n.type}, for url: ${t.url}`);return bf(n)}async function wf(e){return(await Is(e)).json()}async function oC(e){return new Float32Array(await(await Is(e)).arrayBuffer())}function kf(e,t){let n=`${t}-weights_manifest.json`;if(!e)return{modelBaseUri:"",manifestUri:n};if(e==="/")return{modelBaseUri:"/",manifestUri:`/${n}`};let a=e.startsWith("http://")?"http://":e.startsWith("https://")?"https://":"";e=e.replace(a,"");let r=e.split("/").filter(o=>o),s=e.endsWith(".json")?r[r.length-1]:n,i=a+(e.endsWith(".json")?r.slice(0,r.length-1):r).join("/");return i=e.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function If(e,t){let{manifestUri:n,modelBaseUri:a}=kf(e,t),r=await wf(n);return jt.loadWeights(r,a)}function lC(e,t,n=!1){let{width:a,height:r}=n?ws(t):t;return e.width=a,e.height=r,{width:a,height:r}}var en=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:n,objProp:a}=this.traversePropertyPath(t);return n[a]}reassignParamFromPath(t,n){let{obj:a,objProp:r}=this.traversePropertyPath(t);a[r].dispose(),a[r]=n}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof Kr)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof Kr))}variable(){this.getFrozenParams().forEach(({path:t,tensor:n})=>{this.reassignParamFromPath(t,n.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:n})=>{let a=Jn(n.dataSync());n.dispose(),this.reassignParamFromPath(t,a)})}dispose(t=!0){this.getParamList().forEach(n=>{if(t&&n.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${n.path}`);n.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,n)=>t.concat(n)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let n=await If(t,this.getDefaultModelName());this.loadFromWeightMap(n)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:n}=nt.getEnv(),{manifestUri:a,modelBaseUri:r}=kf(t,this.getDefaultModelName()),s=u=>Promise.all(u.map(c=>n(c).then(p=>p.buffer))),i=jt.weightsLoaderFactory(s),o=JSON.parse((await n(a)).toString()),l=await i(o,r);this.loadFromWeightMap(l)}loadFromWeightMap(t){let{paramMappings:n,params:a}=this.extractParamsFromWeightMap(t);this._paramMappings=n,this._params=a}extractWeights(t){let{paramMappings:n,params:a}=this.extractParams(t);this._paramMappings=n,this._params=a}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let n=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:a,objProp:r}=n;if(!a||!r||!(a[r]instanceof Fe))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:a,objProp:r}}};function Dn(e,t,n){return M(()=>{let a=Pi(e,t.depthwise_filter,t.pointwise_filter,n,"same");return a=J(a,t.bias),a})}function Nf(e,t,n=!1){return M(()=>{let a=qe(n?J(Et(e,t.conv0.filters,[2,2],"same"),t.conv0.bias):Dn(e,t.conv0,[2,2])),r=Dn(a,t.conv1,[1,1]),s=qe(J(a,r)),i=Dn(s,t.conv2,[1,1]);return qe(J(a,J(r,i)))})}function Fp(e,t,n=!1,a=!0){return M(()=>{let r=qe(n?J(Et(e,t.conv0.filters,a?[2,2]:[1,1],"same"),t.conv0.bias):Dn(e,t.conv0,a?[2,2]:[1,1])),s=Dn(r,t.conv1,[1,1]),i=qe(J(r,s)),o=Dn(i,t.conv2,[1,1]),l=qe(J(r,J(s,o))),u=Dn(l,t.conv3,[1,1]);return qe(J(r,J(s,J(o,u))))})}function lo(e,t,n="same",a=!1){return M(()=>{let r=J(Et(e,t.filters,[1,1],n),t.bias);return a?qe(r):r})}function xn(e,t){Object.keys(e).forEach(n=>{t.some(a=>a.originalPath===n)||e[n].dispose()})}function Eu(e,t){return(n,a,r,s)=>{let i=Aa(e(n*a*r*r),[r,r,n,a]),o=Ze(e(a));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:o}}}function Tf(e,t){return(n,a,r)=>{let s=Ca(e(n*a),[n,a]),i=Ze(e(a));return t.push({paramPath:`${r}/weights`},{paramPath:`${r}/bias`}),{weights:s,bias:i}}}var Sf=class{constructor(t,n,a){this.depthwise_filter=t;this.pointwise_filter=n;this.bias=a}};function $u(e,t){return(n,a,r)=>{let s=Aa(e(3*3*n),[3,3,n,1]),i=Aa(e(n*a),[1,1,n,a]),o=Ze(e(a));return t.push({paramPath:`${r}/depthwise_filter`},{paramPath:`${r}/pointwise_filter`},{paramPath:`${r}/bias`}),new Sf(s,i,o)}}function Du(e){return t=>{let n=e(`${t}/depthwise_filter`,4),a=e(`${t}/pointwise_filter`,4),r=e(`${t}/bias`,1);return new Sf(n,a,r)}}function qn(e,t){return(n,a,r)=>{let s=e[n];if(!eo(s,a))throw new Error(`expected weightMap[${n}] to be a Tensor${a}D, instead have ${s}`);return t.push({originalPath:n,paramPath:r||n}),s}}function vn(e){let t=e;function n(r){let s=t.slice(0,r);return t=t.slice(r),s}function a(){return t}return{extractWeights:n,getRemainingWeights:a}}function Cf(e,t){let n=Eu(e,t),a=$u(e,t);function r(i,o,l,u=!1){let c=u?n(i,o,3,`${l}/conv0`):a(i,o,`${l}/conv0`),p=a(o,o,`${l}/conv1`),d=a(o,o,`${l}/conv2`);return{conv0:c,conv1:p,conv2:d}}function s(i,o,l,u=!1){let{conv0:c,conv1:p,conv2:d}=r(i,o,l,u),h=a(o,o,`${l}/conv3`);return{conv0:c,conv1:p,conv2:d,conv3:h}}return{extractDenseBlock3Params:r,extractDenseBlock4Params:s}}function uC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=vn(e),{extractDenseBlock4Params:r}=Cf(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2"),l=r(128,256,"dense3");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o,dense3:l}}}function Af(e){return t=>{let n=e(`${t}/filters`,4),a=e(`${t}/bias`,1);return{filters:n,bias:a}}}function Ff(e,t){let n=qn(e,t),a=Af(n),r=Du(n);function s(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),c=r(`${o}/conv1`),p=r(`${o}/conv2`);return{conv0:u,conv1:c,conv2:p}}function i(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),c=r(`${o}/conv1`),p=r(`${o}/conv2`),d=r(`${o}/conv3`);return{conv0:u,conv1:c,conv2:p,conv3:d}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function cC(e){let t=[],{extractDenseBlock4Params:n}=Ff(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return xn(e,t),{params:a,paramMappings:t}}var _p=class extends en{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=wa(a,[122.782,117.001,104.298]).div(ce(255)),i=Fp(s,n.dense0,!0);return i=Fp(i,n.dense1),i=Fp(i,n.dense2),i=Fp(i,n.dense3),i=Zn(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return cC(t)}extractParams(t){return uC(t)}};function Ep(e,t){return M(()=>J(ze(e,t.weights),t.bias))}function pC(e,t,n){let a=[],{extractWeights:r,getRemainingWeights:s}=vn(e),o=Tf(r,a)(t,n,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:a,params:{fc:o}}}function dC(e){let t=[],n=qn(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:a("fc")};return xn(e,t),{params:r,paramMappings:t}}function _f(e){let t={},n={};return Object.keys(e).forEach(a=>{let r=a.startsWith("fc")?n:t;r[a]=e[a]}),{featureExtractorMap:t,classifierMap:n}}var $p=class extends en{constructor(t,n){super(t);this._faceFeatureExtractor=n}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:n}=this;if(!n)throw new Error(`${this._name} - load model before inference`);return M(()=>{let a=t instanceof ur?this.faceFeatureExtractor.forwardInput(t):t;return Ep(a.as2D(a.shape[0],-1),n.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:n,paramMappings:a}=this.extractClassifierParams(t);this._params=n,this._paramMappings=a}extractClassifierParams(t){return pC(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:n,classifierMap:a}=_f(t);return this.faceFeatureExtractor.loadFromWeightMap(n),dC(a)}extractParams(t){let n=this.getClassifierChannelsIn(),a=this.getClassifierChannelsOut(),r=a*n+a,s=t.slice(0,t.length-r),i=t.slice(t.length-r);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var Ef=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Er=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Ef.forEach((n,a)=>{this[n]=t[a]})}asSortedArray(){return Ef.map(t=>({expression:t,probability:this[t]})).sort((t,n)=>n.probability-t.probability)}};var Dp=class extends $p{constructor(t=new _p){super("FaceExpressionNet",t)}forwardInput(t){return M(()=>Sa(this.runNet(t)))}async forward(t){return this.forwardInput(await mt(t))}async predictExpressions(t){let n=await mt(t),a=await this.forwardInput(n),r=await Promise.all(ct(a).map(async i=>{let o=await i.data();return i.dispose(),o}));a.dispose();let s=r.map(i=>new Er(i));return n.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function $f(e){return e.expressions instanceof Er}function Mp(e,t){return{...e,...{expressions:t}}}function ase(e,t,n=.1,a){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof Er?s:$f(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let l=i.asSortedArray().filter(p=>p.probability>n),u=za(s)?s.detection.box.bottomLeft:a||new De(0,0);new vs(l.map(p=>`${p.expression} (${to(p.probability)})`),u).draw(e)})}function Ns(e){return za(e)&&e.landmarks instanceof jn&&e.unshiftedLandmarks instanceof jn&&e.alignedRect instanceof ft}function rse(e){let t=(o,l,u,c)=>Math.atan2(c-l,u-o)%Math.PI,n=o=>o*180/Math.PI,a={roll:void 0,pitch:void 0,yaw:void 0};if(!e||!e._positions||e._positions.length!==68)return a;let r=e._positions;a.roll=-t(r[36]._x,r[36]._y,r[45]._x,r[45]._y),a.pitch=t(0,Math.abs(r[0]._x-r[30]._x)/r[30]._x,Math.PI,Math.abs(r[16]._x-r[30]._x)/r[30]._x);let s=r.reduce((o,l)=>oo>l._y?o:l._y,-Infinity);return a.yaw=Math.PI*(e._imgDims._height/(i-s)/1.4-1),a}function uo(e,t){let{box:n}=e.detection,a=t.shiftBy(n.x,n.y),r=a.align(),{imageDims:s}=e.detection,i=new ft(e.detection.score,r.rescale(s.reverse()),s),o=rse(t);return{...e,...{landmarks:a,unshiftedLandmarks:t,alignedRect:i,angle:o}}}var Tw=class{constructor(t={}){let{drawLines:n=!0,drawPoints:a=!0,lineWidth:r,lineColor:s,pointSize:i,pointColor:o}=t;this.drawLines=n,this.drawPoints=a,this.lineWidth=r||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=o||"rgba(255, 0, 255, 1)"}},Sw=class{constructor(t,n={}){this.faceLandmarks=t,this.options=new Tw(n)}draw(t){let n=bn(t),{drawLines:a,drawPoints:r,lineWidth:s,lineColor:i,pointSize:o,pointColor:l}=this.options;if(a&&this.faceLandmarks instanceof so&&(n.strokeStyle=i,n.lineWidth=s,Ar(n,this.faceLandmarks.getJawOutline()),Ar(n,this.faceLandmarks.getLeftEyeBrow()),Ar(n,this.faceLandmarks.getRightEyeBrow()),Ar(n,this.faceLandmarks.getNose()),Ar(n,this.faceLandmarks.getLeftEye(),!0),Ar(n,this.faceLandmarks.getRightEye(),!0),Ar(n,this.faceLandmarks.getMouth(),!0)),r){n.strokeStyle=l,n.fillStyle=l;let u=c=>{n.beginPath(),n.arc(c.x,c.y,o,0,2*Math.PI),n.fill()};this.faceLandmarks.positions.forEach(u)}}};function sse(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof jn?a:Ns(a)?a.landmarks:void 0;if(!r)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new Sw(r).draw(e)})}var hC="1.1.1";function ise(e,t){let n=Eu(e,t),a=$u(e,t);function r(i,o,l){let u=a(i,o,`${l}/separable_conv0`),c=a(o,o,`${l}/separable_conv1`),p=n(i,o,1,`${l}/expansion_conv`);return{separable_conv0:u,separable_conv1:c,expansion_conv:p}}function s(i,o){let l=a(i,i,`${o}/separable_conv0`),u=a(i,i,`${o}/separable_conv1`),c=a(i,i,`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:c}}return{extractConvParams:n,extractSeparableConvParams:a,extractReductionBlockParams:r,extractMainBlockParams:s}}function mC(e,t){let n=[],{extractWeights:a,getRemainingWeights:r}=vn(e),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:o,extractMainBlockParams:l}=ise(a,n),u=s(3,32,3,"entry_flow/conv_in"),c=o(32,64,"entry_flow/reduction_block_0"),p=o(64,128,"entry_flow/reduction_block_1"),d={conv_in:u,reduction_block_0:c,reduction_block_1:p},h={};ir(t,0,1).forEach(y=>{h[`main_block_${y}`]=l(128,`middle_flow/main_block_${y}`)});let m=o(128,256,"exit_flow/reduction_block"),f=i(256,512,"exit_flow/separable_conv"),g={reduction_block:m,separable_conv:f};if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:n,params:{entry_flow:d,middle_flow:h,exit_flow:g}}}function ose(e,t){let n=qn(e,t),a=Af(n),r=Du(n);function s(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),c=a(`${o}/expansion_conv`);return{separable_conv0:l,separable_conv1:u,expansion_conv:c}}function i(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),c=r(`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:c}}return{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}}function fC(e,t){let n=[],{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}=ose(e,n),o=a("entry_flow/conv_in"),l=s("entry_flow/reduction_block_0"),u=s("entry_flow/reduction_block_1"),c={conv_in:o,reduction_block_0:l,reduction_block_1:u},p={};ir(t,0,1).forEach(f=>{p[`main_block_${f}`]=i(`middle_flow/main_block_${f}`)});let d=s("exit_flow/reduction_block"),h=r("exit_flow/separable_conv"),m={reduction_block:d,separable_conv:h};return xn(e,n),{params:{entry_flow:c,middle_flow:p,exit_flow:m},paramMappings:n}}function gC(e,t,n){return J(Et(e,t.filters,n,"same"),t.bias)}function Aw(e,t,n=!0){let a=n?qe(e):e;return a=Dn(a,t.separable_conv0,[1,1]),a=Dn(qe(a),t.separable_conv1,[1,1]),a=$t(a,[3,3],[2,2],"same"),a=J(a,gC(e,t.expansion_conv,[2,2])),a}function lse(e,t){let n=Dn(qe(e),t.separable_conv0,[1,1]);return n=Dn(qe(n),t.separable_conv1,[1,1]),n=Dn(qe(n),t.separable_conv2,[1,1]),n=J(n,e),n}var Fw=class extends en{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyXception - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=wa(a,[122.782,117.001,104.298]).div(ce(256)),i=qe(gC(s,n.entry_flow.conv_in,[2,2]));return i=Aw(i,n.entry_flow.reduction_block_0,!1),i=Aw(i,n.entry_flow.reduction_block_1),ir(this._numMainBlocks,0,1).forEach(o=>{i=lse(i,n.middle_flow[`main_block_${o}`])}),i=Aw(i,n.exit_flow.reduction_block),i=qe(Dn(i,n.exit_flow.separable_conv,[1,1])),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return fC(t,this._numMainBlocks)}extractParams(t){return mC(t,this._numMainBlocks)}};function yC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=vn(e),r=Tf(n,t),s=r(512,1,"fc/age"),i=r(512,2,"fc/gender");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function bC(e){let t=[],n=qn(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:{age:a("fc/age"),gender:a("fc/gender")}};return xn(e,t),{params:r,paramMappings:t}}var cr;(function(e){e.FEMALE="female",e.MALE="male"})(cr||(cr={}));var Rp=class extends en{constructor(t=new Fw(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:n}=this;if(!n)throw new Error(`${this._name} - load model before inference`);return M(()=>{let a=t instanceof ur?this.faceFeatureExtractor.forwardInput(t):t,r=Zn(a,[7,7],[2,2],"valid").as2D(a.shape[0],-1),s=Ep(r,n.fc.age).as1D(),i=Ep(r,n.fc.gender);return{age:s,gender:i}})}forwardInput(t){return M(()=>{let{age:n,gender:a}=this.runNet(t);return{age:n,gender:Sa(a)}})}async forward(t){return this.forwardInput(await mt(t))}async predictAgeAndGender(t){let n=await mt(t),a=await this.forwardInput(n),r=ct(a.age),s=ct(a.gender),i=r.map((l,u)=>({ageTensor:l,genderTensor:s[u]})),o=await Promise.all(i.map(async({ageTensor:l,genderTensor:u})=>{let c=(await l.data())[0],p=(await u.data())[0],d=p>.5,h=d?cr.MALE:cr.FEMALE,m=d?p:1-p;return l.dispose(),u.dispose(),{age:c,gender:h,genderProbability:m}}));return a.age.dispose(),a.gender.dispose(),n.isBatchInput?o:o[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:n,paramMappings:a}=this.extractClassifierParams(t);this._params=n,this._paramMappings=a}extractClassifierParams(t){return yC(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:n,classifierMap:a}=_f(t);return this.faceFeatureExtractor.loadFromWeightMap(n),bC(a)}extractParams(t){let n=512*1+1+(512*2+2),a=t.slice(0,t.length-n),r=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(r)}};var Pp=class extends $p{postProcess(t,n,a){let r=a.map(({width:i,height:o})=>{let l=n/Math.max(o,i);return{width:i*l,height:o*l}}),s=r.length;return M(()=>{let i=(p,d)=>Dt([Cn([68],p,"float32"),Cn([68],d,"float32")],1).as2D(1,136).as1D(),o=(p,d)=>{let{width:h,height:m}=r[p];return d(h,m)?Math.abs(h-m)/2:0},l=p=>o(p,(d,h)=>do(p,(d,h)=>hi(l(d),u(d))))).div(Dt(Array.from(Array(s),(p,d)=>i(r[d].width,r[d].height))))})}forwardInput(t){return M(()=>{let n=this.runNet(t);return this.postProcess(n,t.inputSize,t.inputDimensions.map(([a,r])=>({height:a,width:r})))})}async forward(t){return this.forwardInput(await mt(t))}async detectLandmarks(t){let n=await mt(t),a=M(()=>ct(this.forwardInput(n))),r=await Promise.all(a.map(async(s,i)=>{let o=Array.from(await s.data()),l=o.filter((c,p)=>uf(p)),u=o.filter((c,p)=>!uf(p));return new so(Array(68).fill(0).map((c,p)=>new De(l[p],u[p])),{height:n.getInputHeight(i),width:n.getInputWidth(i)})}));return a.forEach(s=>s.dispose()),n.isBatchInput?r:r[0]}getClassifierChannelsOut(){return 136}};var co=class extends Pp{constructor(t=new _p){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function xC(e){let t=[],{extractDenseBlock3Params:n}=Ff(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2")};return xn(e,t),{params:a,paramMappings:t}}function vC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=vn(e),{extractDenseBlock3Params:r}=Cf(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o}}}var _w=class extends en{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyFaceFeatureExtractor - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=wa(a,[122.782,117.001,104.298]).div(ce(255)),i=Nf(s,n.dense0,!0);return i=Nf(i,n.dense1),i=Nf(i,n.dense2),i=Zn(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return xC(t)}extractParams(t){return vC(t)}};var Op=class extends Pp{constructor(t=new _w){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var Ew=class extends co{};function wC(e,t){return J(B(e,t.weights),t.biases)}function $w(e,t,n,a,r="same"){let{filters:s,bias:i}=t.conv,o=Et(e,s,n,r);return o=J(o,i),o=wC(o,t.scale),a?qe(o):o}function kC(e,t){return $w(e,t,[1,1],!0)}function Dw(e,t){return $w(e,t,[1,1],!1)}function Df(e,t){return $w(e,t,[2,2],!0,"valid")}function use(e,t){function n(o,l,u){let c=e(o),p=c.length/(l*u*u);if(mw(p))throw new Error(`depth has to be an integer: ${p}, weights.length: ${c.length}, numFilters: ${l}, filterSize: ${u}`);return M(()=>Ve(Aa(c,[l,p,u,u]),[2,3,1,0]))}function a(o,l,u,c){let p=n(o,l,u),d=Ze(e(l));return t.push({paramPath:`${c}/filters`},{paramPath:`${c}/bias`}),{filters:p,bias:d}}function r(o,l){let u=Ze(e(o)),c=Ze(e(o));return t.push({paramPath:`${l}/weights`},{paramPath:`${l}/biases`}),{weights:u,biases:c}}function s(o,l,u,c){let p=a(o,l,u,`${c}/conv`),d=r(l,`${c}/scale`);return{conv:p,scale:d}}function i(o,l,u,c,p=!1){let d=s((p?.5:1)*o,l,u,`${c}/conv1`),h=s(o,l,u,`${c}/conv2`);return{conv1:d,conv2:h}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function IC(e){let{extractWeights:t,getRemainingWeights:n}=vn(e),a=[],{extractConvLayerParams:r,extractResidualLayerParams:s}=use(t,a),i=r(4704,32,7,"conv32_down"),o=s(9216,32,3,"conv32_1"),l=s(9216,32,3,"conv32_2"),u=s(9216,32,3,"conv32_3"),c=s(36864,64,3,"conv64_down",!0),p=s(36864,64,3,"conv64_1"),d=s(36864,64,3,"conv64_2"),h=s(36864,64,3,"conv64_3"),m=s(147456,128,3,"conv128_down",!0),f=s(147456,128,3,"conv128_1"),g=s(147456,128,3,"conv128_2"),y=s(589824,256,3,"conv256_down",!0),b=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),v=s(589824,256,3,"conv256_down_out"),k=M(()=>Ve(Ca(t(256*128),[128,256]),[1,0]));if(a.push({paramPath:"fc"}),n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{params:{conv32_down:i,conv32_1:o,conv32_2:l,conv32_3:u,conv64_down:c,conv64_1:p,conv64_2:d,conv64_3:h,conv128_down:m,conv128_1:f,conv128_2:g,conv256_down:y,conv256_1:b,conv256_2:x,conv256_down_out:v,fc:k},paramMappings:a}}function cse(e,t){let n=qn(e,t);function a(i){let o=n(`${i}/scale/weights`,1),l=n(`${i}/scale/biases`,1);return{weights:o,biases:l}}function r(i){let o=n(`${i}/conv/filters`,4),l=n(`${i}/conv/bias`,1),u=a(i);return{conv:{filters:o,bias:l},scale:u}}function s(i){return{conv1:r(`${i}/conv1`),conv2:r(`${i}/conv2`)}}return{extractConvLayerParams:r,extractResidualLayerParams:s}}function NC(e){let t=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=cse(e,t),r=n("conv32_down"),s=a("conv32_1"),i=a("conv32_2"),o=a("conv32_3"),l=a("conv64_down"),u=a("conv64_1"),c=a("conv64_2"),p=a("conv64_3"),d=a("conv128_down"),h=a("conv128_1"),m=a("conv128_2"),f=a("conv256_down"),g=a("conv256_1"),y=a("conv256_2"),b=a("conv256_down_out"),{fc:x}=e;if(t.push({originalPath:"fc",paramPath:"fc"}),!hw(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let v={conv32_down:r,conv32_1:s,conv32_2:i,conv32_3:o,conv64_down:l,conv64_1:u,conv64_2:c,conv64_3:p,conv128_down:d,conv128_1:h,conv128_2:m,conv256_down:f,conv256_1:g,conv256_2:y,conv256_down_out:b,fc:x};return xn(e,t),{params:v,paramMappings:t}}function Wa(e,t){let n=kC(e,t.conv1);return n=Dw(n,t.conv2),n=J(n,e),n=qe(n),n}function Lp(e,t){let n=Df(e,t.conv1);n=Dw(n,t.conv2);let a=Zn(e,2,2,"valid"),r=vt(a.shape),s=a.shape[3]!==n.shape[3];if(a.shape[1]!==n.shape[1]||a.shape[2]!==n.shape[2]){let o=[...n.shape];o[1]=1;let l=vt(o);n=Je([n,l],1);let u=[...n.shape];u[2]=1;let c=vt(u);n=Je([n,c],2)}return a=s?Je([a,r],3):a,n=J(a,n),n=qe(n),n}var po=class extends en{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceRecognitionNet - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(150,!0),"float32"),s=wa(a,[122.782,117.001,104.298]).div(ce(256)),i=Df(s,n.conv32_down);i=$t(i,3,2,"valid"),i=Wa(i,n.conv32_1),i=Wa(i,n.conv32_2),i=Wa(i,n.conv32_3),i=Lp(i,n.conv64_down),i=Wa(i,n.conv64_1),i=Wa(i,n.conv64_2),i=Wa(i,n.conv64_3),i=Lp(i,n.conv128_down),i=Wa(i,n.conv128_1),i=Wa(i,n.conv128_2),i=Lp(i,n.conv256_down),i=Wa(i,n.conv256_1),i=Wa(i,n.conv256_2),i=Lp(i,n.conv256_down_out);let o=i.mean([1,2]);return ze(o,n.fc)})}async forward(t){return this.forwardInput(await mt(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)==null?void 0:s.some(i=>i<=0))return new Float32Array(128);let n=await mt(t),a=M(()=>ct(this.forwardInput(n))),r=await Promise.all(a.map(i=>i.data()));return a.forEach(i=>i.dispose()),n.isBatchInput?r:r[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return NC(t)}extractParams(t){return IC(t)}};function TC(e){let t=new po;return t.extractWeights(e),t}function zp(e,t){return{...e,...{descriptor:t}}}function SC(e){return typeof e.age=="number"}function Wp(e,t){return{...e,...{age:t}}}function CC(e){return(e.gender===cr.MALE||e.gender===cr.FEMALE)&&Tu(e.genderProbability)}function Bp(e,t,n){return{...e,...{gender:t,genderProbability:n}}}function pse(e,t){function n(l,u){let c=Aa(e(3*3*l),[3,3,l,1]),p=Ze(e(l)),d=Ze(e(l)),h=Ze(e(l)),m=Ze(e(l));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/batch_norm_scale`},{paramPath:`${u}/batch_norm_offset`},{paramPath:`${u}/batch_norm_mean`},{paramPath:`${u}/batch_norm_variance`}),{filters:c,batch_norm_scale:p,batch_norm_offset:d,batch_norm_mean:h,batch_norm_variance:m}}function a(l,u,c,p,d){let h=Aa(e(l*u*c*c),[c,c,l,u]),m=Ze(e(u));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/${d?"batch_norm_offset":"bias"}`}),{filters:h,bias:m}}function r(l,u,c,p){let{filters:d,bias:h}=a(l,u,c,p,!0);return{filters:d,batch_norm_offset:h}}function s(l,u,c){let p=n(l,`${c}/depthwise_conv`),d=r(l,u,1,`${c}/pointwise_conv`);return{depthwise_conv:p,pointwise_conv:d}}function i(){let l=r(3,32,3,"mobilenetv1/conv_0"),u=s(32,64,"mobilenetv1/conv_1"),c=s(64,128,"mobilenetv1/conv_2"),p=s(128,128,"mobilenetv1/conv_3"),d=s(128,256,"mobilenetv1/conv_4"),h=s(256,256,"mobilenetv1/conv_5"),m=s(256,512,"mobilenetv1/conv_6"),f=s(512,512,"mobilenetv1/conv_7"),g=s(512,512,"mobilenetv1/conv_8"),y=s(512,512,"mobilenetv1/conv_9"),b=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),v=s(512,1024,"mobilenetv1/conv_12"),k=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:l,conv_1:u,conv_2:c,conv_3:p,conv_4:d,conv_5:h,conv_6:m,conv_7:f,conv_8:g,conv_9:y,conv_10:b,conv_11:x,conv_12:v,conv_13:k}}function o(){let l=r(1024,256,1,"prediction_layer/conv_0"),u=r(256,512,3,"prediction_layer/conv_1"),c=r(512,128,1,"prediction_layer/conv_2"),p=r(128,256,3,"prediction_layer/conv_3"),d=r(256,128,1,"prediction_layer/conv_4"),h=r(128,256,3,"prediction_layer/conv_5"),m=r(256,64,1,"prediction_layer/conv_6"),f=r(64,128,3,"prediction_layer/conv_7"),g=a(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=a(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),b=a(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=a(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),v=a(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),k=a(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),w=a(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),S=a(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),A=a(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),F=a(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),D=a(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),R=a(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:l,conv_1:u,conv_2:c,conv_3:p,conv_4:d,conv_5:h,conv_6:m,conv_7:f,box_predictor_0:{box_encoding_predictor:g,class_predictor:y},box_predictor_1:{box_encoding_predictor:b,class_predictor:x},box_predictor_2:{box_encoding_predictor:v,class_predictor:k},box_predictor_3:{box_encoding_predictor:w,class_predictor:S},box_predictor_4:{box_encoding_predictor:A,class_predictor:F},box_predictor_5:{box_encoding_predictor:D,class_predictor:R}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:o}}function AC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=vn(e),{extractMobilenetV1Params:r,extractPredictionLayerParams:s}=pse(n,t),i=r(),o=s(),u={extra_dim:dh(n(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:{mobilenetv1:i,prediction_layer:o,output_layer:u},paramMappings:t}}function dse(e,t){let n=qn(e,t);function a(u,c,p){let d=n(`${u}/Conv2d_${c}_pointwise/weights`,4,`${p}/filters`),h=n(`${u}/Conv2d_${c}_pointwise/convolution_bn_offset`,1,`${p}/batch_norm_offset`);return{filters:d,batch_norm_offset:h}}function r(u){let c=`mobilenetv1/conv_${u}`,p=`MobilenetV1/Conv2d_${u}_depthwise`,d=`${c}/depthwise_conv`,h=`${c}/pointwise_conv`,m=n(`${p}/depthwise_weights`,4,`${d}/filters`),f=n(`${p}/BatchNorm/gamma`,1,`${d}/batch_norm_scale`),g=n(`${p}/BatchNorm/beta`,1,`${d}/batch_norm_offset`),y=n(`${p}/BatchNorm/moving_mean`,1,`${d}/batch_norm_mean`),b=n(`${p}/BatchNorm/moving_variance`,1,`${d}/batch_norm_variance`);return{depthwise_conv:{filters:m,batch_norm_scale:f,batch_norm_offset:g,batch_norm_mean:y,batch_norm_variance:b},pointwise_conv:a("MobilenetV1",u,h)}}function s(){return{conv_0:a("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:r(1),conv_2:r(2),conv_3:r(3),conv_4:r(4),conv_5:r(5),conv_6:r(6),conv_7:r(7),conv_8:r(8),conv_9:r(9),conv_10:r(10),conv_11:r(11),conv_12:r(12),conv_13:r(13)}}function i(u,c){let p=n(`${u}/weights`,4,`${c}/filters`),d=n(`${u}/biases`,1,`${c}/bias`);return{filters:p,bias:d}}function o(u){let c=i(`Prediction/BoxPredictor_${u}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${u}/box_encoding_predictor`),p=i(`Prediction/BoxPredictor_${u}/ClassPredictor`,`prediction_layer/box_predictor_${u}/class_predictor`);return{box_encoding_predictor:c,class_predictor:p}}function l(){return{conv_0:a("Prediction",0,"prediction_layer/conv_0"),conv_1:a("Prediction",1,"prediction_layer/conv_1"),conv_2:a("Prediction",2,"prediction_layer/conv_2"),conv_3:a("Prediction",3,"prediction_layer/conv_3"),conv_4:a("Prediction",4,"prediction_layer/conv_4"),conv_5:a("Prediction",5,"prediction_layer/conv_5"),conv_6:a("Prediction",6,"prediction_layer/conv_6"),conv_7:a("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:o(0),box_predictor_1:o(1),box_predictor_2:o(2),box_predictor_3:o(3),box_predictor_4:o(4),box_predictor_5:o(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:l}}function FC(e){let t=[],{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=dse(e,t),r=e["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Fr(r))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${r}`);let s={mobilenetv1:n(),prediction_layer:a(),output_layer:{extra_dim:r}};return xn(e,t),{params:s,paramMappings:t}}function ka(e,t,n){return M(()=>{let a=Et(e,t.filters,n,"same");return a=J(a,t.batch_norm_offset),Xt(a,0,6)})}var hse=.0010000000474974513;function mse(e,t,n){return M(()=>{let a=ns(e,t.filters,n,"same");return a=br(a,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,hse),Xt(a,0,6)})}function fse(e){return[2,4,6,12].some(t=>t===e)?[2,2]:[1,1]}function _C(e,t){return M(()=>{let n,a=ka(e,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let o=i+1,l=fse(o);a=mse(a,s.depthwise_conv,l),a=ka(a,s.pointwise_conv,[1,1]),o===11&&(n=a)}),n===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:a,conv11:n}})}function gse(e,t,n){let a=e.arraySync(),r=Math.min(a[t][0],a[t][2]),s=Math.min(a[t][1],a[t][3]),i=Math.max(a[t][0],a[t][2]),o=Math.max(a[t][1],a[t][3]),l=Math.min(a[n][0],a[n][2]),u=Math.min(a[n][1],a[n][3]),c=Math.max(a[n][0],a[n][2]),p=Math.max(a[n][1],a[n][3]),d=(i-r)*(o-s),h=(c-l)*(p-u);if(d<=0||h<=0)return 0;let m=Math.max(r,l),f=Math.max(s,u),g=Math.min(i,c),y=Math.min(o,p),b=Math.max(g-m,0)*Math.max(y-f,0);return b/(d+h-b)}function EC(e,t,n,a,r){let s=e.shape[0],i=Math.min(n,s),o=t.map((c,p)=>({score:c,boxIndex:p})).filter(c=>c.score>r).sort((c,p)=>p.score-c.score),l=c=>c<=a?1:0,u=[];return o.forEach(c=>{if(u.length>=i)return;let p=c.score;for(let d=u.length-1;d>=0;--d){let h=gse(e,c.boxIndex,u[d]);if(h!==0&&(c.score*=l(h),c.score<=r))break}p===c.score&&u.push(c.boxIndex)}),u}function yse(e){let t=ct(Ve(e,[1,0])),n=[me(t[2],t[0]),me(t[3],t[1])],a=[J(t[0],xe(n[0],ce(2))),J(t[1],xe(n[1],ce(2)))];return{sizes:n,centers:a}}function bse(e,t){let{sizes:n,centers:a}=yse(e),r=ct(Ve(t,[1,0])),s=xe(B(hn(xe(r[2],ce(5))),n[0]),ce(2)),i=J(B(xe(r[0],ce(10)),n[0]),a[0]),o=xe(B(hn(xe(r[3],ce(5))),n[1]),ce(2)),l=J(B(xe(r[1],ce(10)),n[1]),a[1]);return Ve(Dt([me(i,s),me(l,o),J(i,s),J(l,o)]),[1,0])}function $C(e,t,n){return M(()=>{let a=e.shape[0],r=bse(H(qa(n.extra_dim,[a,1,1]),[-1,4]),H(e,[-1,4]));r=H(r,[a,r.shape[0]/a,4]);let s=da(Be(t,[0,0,1],[-1,-1,-1])),i=Be(s,[0,0,0],[-1,-1,1]);i=H(i,[a,i.shape[1]]);let o=ct(r),l=ct(i);return{boxes:o,scores:l}})}function ho(e,t){return M(()=>{let n=e.shape[0],a=H(lo(e,t.box_encoding_predictor),[n,-1,1,4]),r=H(lo(e,t.class_predictor),[n,-1,3]);return{boxPredictionEncoding:a,classPrediction:r}})}function DC(e,t,n){return M(()=>{let a=ka(e,n.conv_0,[1,1]),r=ka(a,n.conv_1,[2,2]),s=ka(r,n.conv_2,[1,1]),i=ka(s,n.conv_3,[2,2]),o=ka(i,n.conv_4,[1,1]),l=ka(o,n.conv_5,[2,2]),u=ka(l,n.conv_6,[1,1]),c=ka(u,n.conv_7,[2,2]),p=ho(t,n.box_predictor_0),d=ho(e,n.box_predictor_1),h=ho(r,n.box_predictor_2),m=ho(i,n.box_predictor_3),f=ho(l,n.box_predictor_4),g=ho(c,n.box_predictor_5),y=Je([p.boxPredictionEncoding,d.boxPredictionEncoding,h.boxPredictionEncoding,m.boxPredictionEncoding,f.boxPredictionEncoding,g.boxPredictionEncoding],1),b=Je([p.classPrediction,d.classPrediction,h.classPrediction,m.classPrediction,f.classPrediction,g.classPrediction],1);return{boxPredictions:y,classPredictions:b}})}var sa=class{constructor({minConfidence:t,maxResults:n}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=n||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Ts=class extends en{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("SsdMobilenetv1 - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(512,!1),"float32"),r=me(B(a,ce(.007843137718737125)),ce(1)),s=_C(r,n.mobilenetv1),{boxPredictions:i,classPredictions:o}=DC(s.out,s.conv11,n.prediction_layer);return $C(i,o,n.output_layer)})}async forward(t){return this.forwardInput(await mt(t))}async locateFaces(t,n={}){let{maxResults:a,minConfidence:r}=new sa(n),s=await mt(t),{boxes:i,scores:o}=this.forwardInput(s),l=i[0],u=o[0];for(let x=1;x{let[v,k]=[Math.max(0,y[x][0]),Math.min(1,y[x][2])].map(A=>A*g),[w,S]=[Math.max(0,y[x][1]),Math.min(1,y[x][3])].map(A=>A*f);return new ft(c[x],new ro(w,v,S-w,k-v),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return l.dispose(),u.dispose(),b}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return FC(t)}extractParams(t){return AC(t)}};function Mw(e){let t=new Ts;return t.extractWeights(e),t}function MC(e){return Mw(e)}var Rw=class extends Ts{};var RC=.4,PC=[new De(.738768,.874946),new De(2.42204,2.65704),new De(4.30971,7.04493),new De(10.246,4.59428),new De(12.6868,11.8741)],OC=[new De(1.603231,2.094468),new De(6.041143,7.080126),new De(2.882459,3.518061),new De(4.266906,5.178857),new De(9.041765,10.66308)],LC=[117.001,114.697,97.404],zC="tiny_yolov2_model",WC="tiny_yolov2_separable_conv_model";var Mf=e=>typeof e=="number";function Rf(e){if(!e)throw new Error(`invalid config: ${e}`);if(typeof e.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${e.withSeparableConvs}`);if(!Mf(e.iouThreshold)||e.iouThreshold<0||e.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${e.iouThreshold}`);if(!Array.isArray(e.classes)||!e.classes.length||!e.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(e.classes)}`);if(!Array.isArray(e.anchors)||!e.anchors.length||!e.anchors.map(t=>t||{}).every(t=>Mf(t.x)&&Mf(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(e.anchors)}`);if(e.meanRgb&&(!Array.isArray(e.meanRgb)||e.meanRgb.length!==3||!e.meanRgb.every(Mf)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(e.meanRgb)}`)}function Mu(e){return M(()=>{let t=B(e,ce(.10000000149011612));return J(qe(me(e,t)),t)})}function $r(e,t){return M(()=>{let n=ta(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Et(n,t.conv.filters,[1,1],"valid"),n=me(n,t.bn.sub),n=B(n,t.bn.truediv),n=J(n,t.conv.bias),Mu(n)})}function Dr(e,t){return M(()=>{let n=ta(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Pi(n,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),n=J(n,t.bias),Mu(n)})}function xse(e,t){let n=Eu(e,t);function a(i,o){let l=Ze(e(i)),u=Ze(e(i));return t.push({paramPath:`${o}/sub`},{paramPath:`${o}/truediv`}),{sub:l,truediv:u}}function r(i,o,l){let u=n(i,o,3,`${l}/conv`),c=a(o,`${l}/bn`);return{conv:u,bn:c}}let s=$u(e,t);return{extractConvParams:n,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}}function BC(e,t,n,a){let{extractWeights:r,getRemainingWeights:s}=vn(e),i=[],{extractConvParams:o,extractConvWithBatchNormParams:l,extractSeparableConvParams:u}=xse(r,i),c;if(t.withSeparableConvs){let[p,d,h,m,f,g,y,b,x]=a,v=t.isFirstLayerConv2d?o(p,d,3,"conv0"):u(p,d,"conv0"),k=u(d,h,"conv1"),w=u(h,m,"conv2"),S=u(m,f,"conv3"),A=u(f,g,"conv4"),F=u(g,y,"conv5"),D=b?u(y,b,"conv6"):void 0,R=x?u(b,x,"conv7"):void 0,L=o(x||b||y,5*n,1,"conv8");c={conv0:v,conv1:k,conv2:w,conv3:S,conv4:A,conv5:F,conv6:D,conv7:R,conv8:L}}else{let[p,d,h,m,f,g,y,b,x]=a,v=l(p,d,"conv0"),k=l(d,h,"conv1"),w=l(h,m,"conv2"),S=l(m,f,"conv3"),A=l(f,g,"conv4"),F=l(g,y,"conv5"),D=l(y,b,"conv6"),R=l(b,x,"conv7"),L=o(x,5*n,1,"conv8");c={conv0:v,conv1:k,conv2:w,conv3:S,conv4:A,conv5:F,conv6:D,conv7:R,conv8:L}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:c,paramMappings:i}}function vse(e,t){let n=qn(e,t);function a(o){let l=n(`${o}/sub`,1),u=n(`${o}/truediv`,1);return{sub:l,truediv:u}}function r(o){let l=n(`${o}/filters`,4),u=n(`${o}/bias`,1);return{filters:l,bias:u}}function s(o){let l=r(`${o}/conv`),u=a(`${o}/bn`);return{conv:l,bn:u}}let i=Du(n);return{extractConvParams:r,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function VC(e,t){let n=[],{extractConvParams:a,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}=vse(e,n),i;if(t.withSeparableConvs){let o=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?a("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:o>7?s("conv6"):void 0,conv7:o>8?s("conv7"):void 0,conv8:a("conv8")}}else i={conv0:r("conv0"),conv1:r("conv1"),conv2:r("conv2"),conv3:r("conv3"),conv4:r("conv4"),conv5:r("conv5"),conv6:r("conv6"),conv7:r("conv7"),conv8:a("conv8")};return xn(e,n),{params:i,paramMappings:n}}var Ba=class{constructor({inputSize:t,scoreThreshold:n}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=n||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var Pw=class extends en{constructor(t){super("TinyYolov2");Rf(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,n){let a=$r(t,n.conv0);return a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv1),a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv2),a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv3),a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv4),a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv5),a=$t(a,[2,2],[1,1],"same"),a=$r(a,n.conv6),a=$r(a,n.conv7),lo(a,n.conv8,"valid",!1)}runMobilenet(t,n){let a=this.config.isFirstLayerConv2d?Mu(lo(t,n.conv0,"valid",!1)):Dr(t,n.conv0);return a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv1),a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv2),a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv3),a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv4),a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv5),a=$t(a,[2,2],[1,1],"same"),a=n.conv6?Dr(a,n.conv6):a,a=n.conv7?Dr(a,n.conv7):a,lo(a,n.conv8,"valid",!1)}forwardInput(t,n){let{params:a}=this;if(!a)throw new Error("TinyYolov2 - load model before inference");return M(()=>{let r=ue(t.toBatchTensor(n,!1),"float32");return r=this.config.meanRgb?wa(r,this.config.meanRgb):r,r=r.div(ce(256)),this.config.withSeparableConvs?this.runMobilenet(r,a):this.runTinyYolov2(r,a)})}async forward(t,n){return this.forwardInput(await mt(t),n)}async detect(t,n={}){let{inputSize:a,scoreThreshold:r}=new Ba(n),s=await mt(t),i=await this.forwardInput(s,a),o=M(()=>ct(i)[0].expandDims()),l={width:s.getInputWidth(0),height:s.getInputHeight(0)},u=await this.extractBoxes(o,s.getReshapedInputDimensions(0),r);i.dispose(),o.dispose();let c=u.map(g=>g.box),p=u.map(g=>g.score),d=u.map(g=>g.classScore),h=u.map(g=>this.config.classes[g.label]);return hf(c.map(g=>g.rescale(a)),p,this.config.iouThreshold,!0).map(g=>new _r(p[g],d[g],h[g],c[g],l))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return VC(t,this.config)}extractParams(t){let n=this.config.filterSizes||Pw.DEFAULT_FILTER_SIZES,a=n?n.length:void 0;if(a!==7&&a!==8&&a!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${a} filterSizes in config`);return BC(t,this.config,this.boxEncodingSize,n)}async extractBoxes(t,n,a){let{width:r,height:s}=n,i=Math.max(r,s),o=i/r,l=i/s,u=t.shape[1],c=this.config.anchors.length,[p,d,h]=M(()=>{let y=t.reshape([u,u,c,this.boxEncodingSize]),b=y.slice([0,0,0,0],[u,u,c,4]),x=y.slice([0,0,0,4],[u,u,c,1]),v=this.withClassScores?Sa(y.slice([0,0,0,5],[u,u,c,this.config.classes.length]),3):ce(0);return[b,x,v]}),m=[],f=await d.array(),g=await p.array();for(let y=0;ya){let k=(b+Su(g[y][b][x][0]))/u*o,w=(y+Su(g[y][b][x][1]))/u*l,S=Math.exp(g[y][b][x][2])*this.config.anchors[x].x/u*o,A=Math.exp(g[y][b][x][3])*this.config.anchors[x].y/u*l,F=k-S/2,D=w-A/2,R={row:y,col:b,anchor:x},{classScore:L,label:W}=this.withClassScores?await this.extractPredictedClass(h,R):{classScore:1,label:0};m.push({box:new ao(F,D,F+S,D+A),score:v,classScore:v*L,label:W,...R})}}return p.dispose(),d.dispose(),h.dispose(),m}async extractPredictedClass(t,n){let{row:a,col:r,anchor:s}=n,i=await t.array();return Array(this.config.classes.length).fill(0).map((o,l)=>i[a][r][s][l]).map((o,l)=>({classScore:o,label:l})).reduce((o,l)=>o.classScore>l.classScore?o:l)}},Ru=Pw;Ru.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var mo=class extends Ru{constructor(t=!0){let n={withSeparableConvs:t,iouThreshold:RC,classes:["face"],...t?{anchors:OC,meanRgb:LC}:{anchors:PC,withClassScores:!0}};super(n)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new ft(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?WC:zC}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function UC(e,t=!0){let n=new mo(t);return n.extractWeights(e),n}var Vp=class extends Ba{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var ia=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function fo(e,t,n,a,r=({alignedRect:s})=>s){let s=e.map(l=>Ns(l)?r(l):l.detection),i=a||(t instanceof Fe?await oo(t,s):await io(t,s)),o=await n(i);return i.forEach(l=>l instanceof Fe&&l.dispose()),o}async function Pu(e,t,n,a,r){return fo([e],t,async s=>n(s[0]),a,r)}var GC=.4,HC=[new De(1.603231,2.094468),new De(6.041143,7.080126),new De(2.882459,3.518061),new De(4.266906,5.178857),new De(9.041765,10.66308)],jC=[117.001,114.697,97.404];var go=class extends Ru{constructor(){let t={withSeparableConvs:!0,iouThreshold:GC,classes:["face"],anchors:HC,meanRgb:jC,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new ft(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var Qe={ssdMobilenetv1:new Ts,tinyFaceDetector:new go,tinyYolov2:new mo,faceLandmark68Net:new co,faceLandmark68TinyNet:new Op,faceRecognitionNet:new po,faceExpressionNet:new Dp,ageGenderNet:new Rp},Ow=(e,t)=>Qe.ssdMobilenetv1.locateFaces(e,t),qC=(e,t)=>Qe.tinyFaceDetector.locateFaces(e,t),XC=(e,t)=>Qe.tinyYolov2.locateFaces(e,t),Lw=e=>Qe.faceLandmark68Net.detectLandmarks(e),KC=e=>Qe.faceLandmark68TinyNet.detectLandmarks(e),YC=e=>Qe.faceRecognitionNet.computeFaceDescriptor(e),JC=e=>Qe.faceExpressionNet.predictExpressions(e),QC=e=>Qe.ageGenderNet.predictAgeAndGender(e),zw=e=>Qe.ssdMobilenetv1.load(e),ZC=e=>Qe.tinyFaceDetector.load(e),eA=e=>Qe.tinyYolov2.load(e),tA=e=>Qe.faceLandmark68Net.load(e),nA=e=>Qe.faceLandmark68TinyNet.load(e),aA=e=>Qe.faceRecognitionNet.load(e),rA=e=>Qe.faceExpressionNet.load(e),sA=e=>Qe.ageGenderNet.load(e),iA=zw,oA=Ow,lA=Lw;var Ww=class extends ia{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.extractedFaces=a}},zu=class extends Ww{async run(){let t=await this.parentTask,n=await fo(t,this.input,async a=>Promise.all(a.map(r=>Qe.faceExpressionNet.predictExpressions(r))),this.extractedFaces);return t.map((a,r)=>Mp(a,n[r]))}withAgeAndGender(){return new Ou(this,this.input)}},Wu=class extends Ww{async run(){let t=await this.parentTask;if(!t)return;let n=await Pu(t,this.input,a=>Qe.faceExpressionNet.predictExpressions(a),this.extractedFaces);return Mp(t,n)}withAgeAndGender(){return new Lu(this,this.input)}},xo=class extends zu{withAgeAndGender(){return new yo(this,this.input)}withFaceDescriptors(){return new Mr(this,this.input)}},vo=class extends Wu{withAgeAndGender(){return new bo(this,this.input)}withFaceDescriptor(){return new Rr(this,this.input)}};var Bw=class extends ia{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.extractedFaces=a}},Ou=class extends Bw{async run(){let t=await this.parentTask,n=await fo(t,this.input,async a=>Promise.all(a.map(r=>Qe.ageGenderNet.predictAgeAndGender(r))),this.extractedFaces);return t.map((a,r)=>{let{age:s,gender:i,genderProbability:o}=n[r];return Wp(Bp(a,i,o),s)})}withFaceExpressions(){return new zu(this,this.input)}},Lu=class extends Bw{async run(){let t=await this.parentTask;if(!t)return;let{age:n,gender:a,genderProbability:r}=await Pu(t,this.input,s=>Qe.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return Wp(Bp(t,a,r),n)}withFaceExpressions(){return new Wu(this,this.input)}},yo=class extends Ou{withFaceExpressions(){return new xo(this,this.input)}withFaceDescriptors(){return new Mr(this,this.input)}},bo=class extends Lu{withFaceExpressions(){return new vo(this,this.input)}withFaceDescriptor(){return new Rr(this,this.input)}};var Up=class extends ia{constructor(t,n){super();this.parentTask=t;this.input=n}},Mr=class extends Up{async run(){let t=await this.parentTask;return(await fo(t,this.input,a=>Promise.all(a.map(r=>Qe.faceRecognitionNet.computeFaceDescriptor(r))),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}))).map((a,r)=>zp(t[r],a))}withFaceExpressions(){return new xo(this,this.input)}withAgeAndGender(){return new yo(this,this.input)}},Rr=class extends Up{async run(){let t=await this.parentTask;if(!t)return;let n=await Pu(t,this.input,a=>Qe.faceRecognitionNet.computeFaceDescriptor(a),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}));return zp(t,n)}withFaceExpressions(){return new vo(this,this.input)}withAgeAndGender(){return new bo(this,this.input)}};var Gp=class extends ia{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.useTinyLandmarkNet=a}get landmarkNet(){return this.useTinyLandmarkNet?Qe.faceLandmark68TinyNet:Qe.faceLandmark68Net}},Hp=class extends Gp{async run(){let t=await this.parentTask,n=t.map(s=>s.detection),a=this.input instanceof Fe?await oo(this.input,n):await io(this.input,n),r=await Promise.all(a.map(s=>this.landmarkNet.detectLandmarks(s)));return a.forEach(s=>s instanceof Fe&&s.dispose()),t.map((s,i)=>uo(s,r[i]))}withFaceExpressions(){return new xo(this,this.input)}withAgeAndGender(){return new yo(this,this.input)}withFaceDescriptors(){return new Mr(this,this.input)}},jp=class extends Gp{async run(){let t=await this.parentTask;if(!t)return;let{detection:n}=t,a=this.input instanceof Fe?await oo(this.input,[n]):await io(this.input,[n]),r=await this.landmarkNet.detectLandmarks(a[0]);return a.forEach(s=>s instanceof Fe&&s.dispose()),uo(t,r)}withFaceExpressions(){return new vo(this,this.input)}withAgeAndGender(){return new bo(this,this.input)}withFaceDescriptor(){return new Rr(this,this.input)}};var qp=class extends ia{constructor(t,n=new sa){super();this.input=t;this.options=n}},Bu=class extends qp{async run(){let{input:t,options:n}=this,a;if(n instanceof Vp)a=Qe.tinyFaceDetector.locateFaces(t,n);else if(n instanceof sa)a=Qe.ssdMobilenetv1.locateFaces(t,n);else if(n instanceof Ba)a=Qe.tinyYolov2.locateFaces(t,n);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return a}runAndExtendWithFaceDetections(){return new Promise(async t=>{let n=await this.run();t(n.map(a=>bs({},a)))})}withFaceLandmarks(t=!1){return new Hp(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new zu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Ou(this.runAndExtendWithFaceDetections(),this.input)}},Xp=class extends qp{async run(){let t=await new Bu(this.input,this.options),n=t[0];return t.forEach(a=>{a.score>n.score&&(n=a)}),n}runAndExtendWithFaceDetection(){return new Promise(async t=>{let n=await this.run();t(n?bs({},n):void 0)})}withFaceLandmarks(t=!1){return new jp(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Wu(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Lu(this.runAndExtendWithFaceDetection(),this.input)}};function uA(e,t=new sa){return new Xp(e,t)}function Kp(e,t=new sa){return new Bu(e,t)}async function Vw(e,t){return Kp(e,new sa(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function cA(e,t={}){return Kp(e,new Ba(t)).withFaceLandmarks().withFaceDescriptors()}var pA=Vw;function Pf(e,t){if(e.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let n=Array.from(e),a=Array.from(t);return Math.sqrt(n.map((r,s)=>r-a[s]).reduce((r,s)=>r+s**2,0))}var Yp=class{constructor(t,n=.6){this._distanceThreshold=n;let a=Array.isArray(t)?t:[t];if(!a.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let r=1,s=()=>`person ${r++}`;this._labeledDescriptors=a.map(i=>{if(i instanceof or)return i;if(i instanceof Float32Array)return new or(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new or(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,n){return n.map(a=>Pf(a,t)).reduce((a,r)=>a+r,0)/(n.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:n,label:a})=>new Cu(a,this.computeMeanDistance(t,n))).reduce((n,a)=>n.distancet.toJSON())}}static fromJSON(t){let n=t.labeledDescriptors.map(a=>or.fromJSON(a));return new Yp(n,t.distanceThreshold)}};function dA(e){let t=new go;return t.extractWeights(e),t}function Uw(e,t){let{width:n,height:a}=new cn(t.width,t.height);if(n<=0||a<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:n,height:a})}`);if(Array.isArray(e))return e.map(r=>Uw(r,{width:n,height:a}));if(Ns(e)){let r=e.detection.forSize(n,a),s=e.unshiftedLandmarks.forSize(r.box.width,r.box.height);return uo(bs(e,r),s)}return za(e)?bs(e,e.detection.forSize(n,a)):e instanceof jn||e instanceof ft?e.forSize(n,a):e}var kse=typeof process!="undefined",Ise=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",hA={faceapi:hC,node:kse,browser:Ise};return wse;})(); + `}};function Xee(e){let{inputs:t,backend:n,attrs:a}=e,{x:r,segmentIds:s}=t,{numSegments:i}=a,o=r.shape.length,l=[],u=0,c=E.getAxesPermutation([u],o),p=r;c!=null&&(p=En({inputs:{x:r},backend:n,attrs:{perm:c}}),l.push(p),u=E.getInnerMostAxes(1,o)[0]);let d=E.segment_util.computeOutShape(p.shape,u,i),h=I.sizeFromShape([p.shape[u]]),m=ye({inputs:{x:p},backend:n,attrs:{shape:[-1,h]}});l.push(m);let f=uh(r.dtype),g=(v,k,w,S,A)=>{let F=v.shape[0],D=v.shape[1],R=E.segment_util.segOpComputeOptimalWindowSize(D,A),L={windowSize:R,inSize:D,batchSize:F,numSegments:A},W=new qee(L,k),U=n.compileAndRun(W,[v,w],S);if(l.push(U),U.shape[1]===A)return U;let G=sS({backend:n,attrs:{start:0,stop:A,step:1,dtype:"float32"}}),X=lS({inputs:{x:G},backend:n,attrs:{reps:[D/R]}});return l.push(G),l.push(X),g(U,k,X,S,A)},y=g(m,"unsortedSegmentSum",s,f,i),b=ye({inputs:{x:y},backend:n,attrs:{shape:d}}),x=b;if(c!=null){l.push(b);let v=E.getUndoAxesPermutation(c);x=En({inputs:{x},backend:n,attrs:{perm:v}})}return l.forEach(v=>n.disposeIntermediateTensorInfo(v)),x}var Kee={kernelName:bc,backendName:"webgl",kernelFunc:Xee},Yee=[zJ,VJ,CK,FK,$K,RK,OK,WK,VK,GK,XK,YK,ZK,n7,u7,s7,d7,g7,m7,v7,k7,N7,A7,R7,O7,U7,H7,K7,Q7,lK,nY,dY,mY,iY,bY,vY,gY,IY,SY,FY,EY,DY,PY,VY,GY,LY,qY,YY,e9,r9,l9,p9,d9,h9,f9,y9,x9,w9,I9,C9,E9,D9,R9,L9,V9,j9,Y9,oK,Q9,tY,tJ,rJ,oJ,cK,pJ,fJ,yJ,NJ,wJ,AJ,EJ,RJ,GJ,QJ,YJ,nQ,rQ,iQ,XJ,lQ,cQ,mQ,bQ,kQ,_Q,fK,$Q,RQ,LQ,BQ,z7,GQ,jQ,XQ,JQ,tZ,dK,aZ,rZ,W7,SQ,oZ,fZ,pZ,yK,xZ,kZ,TZ,AZ,$Z,MZ,OZ,WZ,VZ,HZ,XZ,JZ,eee,aee,iee,D7,AQ,uee,pee,hee,fee,bee,wee,Iee,Tee,Aee,CQ,NK,Eee,Mee,Oee,zee,Vee,TK,Gee,jee,Kee,HQ];for(let e of Yee)vc(e);var Jee="3.3.0",Qee={"tfjs-core":c1,"tfjs-backend-cpu":bG,"tfjs-backend-webgl":iK,"tfjs-data":ON,"tfjs-layers":Im,"tfjs-converter":EN,tfjs:Jee},Hn;(function(e){e[e.float32=0]="float32",e[e.int32=1]="int32",e[e.bool=2]="bool",e[e.string=3]="string",e[e.complex64=4]="complex64"})(Hn||(Hn={}));var Ip;(function(e){e[e.linear=0]="linear",e[e.relu=1]="relu",e[e.relu6=2]="relu6",e[e.prelu=3]="prelu",e[e.leakyrelu=4]="leakyrelu"})(Ip||(Ip={}));var uS;function Zee(e){uS=e.wasm.cwrap(Ii,null,["number","array","number","number","array","number","number","number","number","number","number","number","number"])}function ete(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s,bias:i,preluActivationWeights:o}=t;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("_FusedMatMul for non non-float32 tensors not yet supported.");let{transposeA:l,transposeB:u,activation:c,leakyreluAlpha:p}=a,d=n.dataIdMap.get(r.dataId).id,h=n.dataIdMap.get(s.dataId).id,m=0;if(i!=null){let A=n.dataIdMap.get(i.dataId);if(A.shape.length!==1)throw new Error(`_FusedMatMul only supports rank-1 bias but got rank ${A.shape.length}.`);m=A.id}let f=o==null?0:n.dataIdMap.get(o.dataId).id,g=Ip[c];if(g==null)throw new Error(`${c} activation not yet supported for FusedConv2D in the wasm backend.`);let y=l?r.shape[2]:r.shape[1],b=u?s.shape[1]:s.shape[2],x=r.shape[0],v=n.makeOutput([x,y,b],r.dtype),k=n.dataIdMap.get(v.dataId).id,w=new Uint8Array(new Int32Array(r.shape).buffer),S=new Uint8Array(new Int32Array(s.shape).buffer);return uS(d,w,r.shape.length,h,S,s.shape.length,l,u,g,m,f,p||0,k),v}var tte={kernelName:Ii,backendName:"wasm",setupFunc:Zee,kernelFunc:ete};function $n(e){let t;function n(r){t=r.wasm.cwrap(e,null,["number","number"])}function a(r){let{backend:s,inputs:{x:i}}=r,o=s.dataIdMap.get(i.dataId).id,l=s.makeOutput(i.shape,i.dtype),u=s.dataIdMap.get(l.dataId).id;return I.sizeFromShape(l.shape)===0||t(o,u),l}return{kernelName:e,backendName:"wasm",setupFunc:n,kernelFunc:a}}var nte=$n(Po);function yn(e,t,n){let a;function r(i){a=i.wasm.cwrap(e,null,["number","array","number","number","array","number","number","number"])}function s(i){let{backend:o,inputs:l}=i,{a:u,b:c}=l,p=o.dataIdMap.get(u.dataId).id,d=o.dataIdMap.get(c.dataId).id,h=n!=null?n:u.dtype,m=E.assertAndGetBroadcastShape(u.shape,c.shape),f=o.makeOutput(m,h);if(I.sizeFromShape(m)===0)return f;let g=new Uint8Array(new Int32Array(u.shape).buffer),y=new Uint8Array(new Int32Array(c.shape).buffer),b=o.dataIdMap.get(f.dataId).id,x=()=>a(p,g,u.shape.length,d,y,c.shape.length,Hn[u.dtype],b);if(t&&u.dtype==="float32")return x(),f;let v=E.getBroadcastDims(u.shape,m),k=E.getBroadcastDims(c.shape,m),w=v.every((A,F)=>A===F),S=k.every((A,F)=>A===F);if(w&&S)return x(),f;throw new Error(`Broadcasting along outer dims is not yet supported for ${u.dtype} ${e}.`)}return{kernelName:e,backendName:"wasm",setupFunc:r,kernelFunc:s}}var ate=!0,rte=yn(Hr,ate),cS;function ste(e){cS=e.wasm.cwrap(Es,null,["array","number","number","number"])}function ite(e){let{inputs:t,backend:n}=e,a=n.makeOutput(t[0].shape,t[0].dtype);if(I.sizeFromShape(a.shape)===0)return a;let r=t.map(o=>n.dataIdMap.get(o.dataId).id),s=new Uint8Array(new Int32Array(r).buffer),i=n.dataIdMap.get(a.dataId).id;return cS(s,r.length,Hn[a.dtype],i),a}var ote={kernelName:Es,backendName:"wasm",setupFunc:ste,kernelFunc:ite};function af(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype),r=n.typedArrayFromHeap(t);return n.typedArrayFromHeap(a).set(r),a}var lte={kernelName:Xs,backendName:"wasm",kernelFunc:af},pS;function ute(e){pS=e.wasm.cwrap(ki,null,["number","array","number","number","number","array","number"])}function rf(e){let{inputs:t,backend:n,attrs:a}=e,[r,s]=pte(t.x.shape,a.perm),i=!0;for(let m=0;m=r&&(s===-1||a[s]>a[i])&&(s=i);a[s]=r}return[n,a]}var dte={kernelName:ki,backendName:"wasm",kernelFunc:rf,setupFunc:ute};function Nu(e,t,n){let a=e.shape,r=e.shape.length,s=I.parseAxisParam(t,a),i=s,o=E.getAxesPermutation(i,r),l=null,u=!1;if(o!=null){let c=new Array(r);for(let d=0;d`new shape: ${i}, old shape: ${a.shape}. New shape and old shape must have the same number of elements.`),e.backend.incRef(a.dataId),{dataId:a.dataId,shape:i,dtype:a.dtype}}var xte={kernelName:vl,backendName:"wasm",kernelFunc:Oa},mS;function vte(e){mS=e.wasm.cwrap(Ms,null,["number","array","number","number","array","number","number","number","number"])}function wte(e){let{inputs:t,backend:n,attrs:a}=e,{a:r,b:s}=t,{transposeA:i,transposeB:o}=a;if(r.dtype!=="float32"||s.dtype!=="float32")throw new Error("BatchMatMul for non non-float32 tensors not yet supported.");let l=r.shape.length,u=s.shape.length,c=i?r.shape[l-2]:r.shape[l-1],p=o?s.shape[u-1]:s.shape[u-2],d=i?r.shape[l-1]:r.shape[l-2],h=o?s.shape[u-2]:s.shape[u-1],m=r.shape.slice(0,-2),f=s.shape.slice(0,-2),g=I.sizeFromShape(m),y=I.sizeFromShape(f),b=g===y||g===1||y===1;I.assert(l>=2&&u>=2&&b,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${m}) and (${f}).`);let x=(g>y?r.shape.slice(0,-2):s.shape.slice(0,-2)).concat([d,h]);I.assert(c===p,()=>`Error in matMul: inner shapes (${c}) and (${p}) of Tensors with shapes ${r.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let v=i?[g,c,d]:[g,d,c],k=o?[y,h,p]:[y,p,h],w=Oa({inputs:{x:r},backend:n,attrs:{shape:v}}),S=Oa({inputs:{x:s},backend:n,attrs:{shape:k}}),A=n.dataIdMap.get(w.dataId).id,F=n.dataIdMap.get(S.dataId).id,D=i?w.shape[2]:w.shape[1],R=o?S.shape[1]:S.shape[2],L=Math.max(g,y),W=n.makeOutput([L,D,R],w.dtype),U=n.dataIdMap.get(W.dataId).id,G=new Uint8Array(new Int32Array(w.shape).buffer),X=new Uint8Array(new Int32Array(S.shape).buffer);return mS(A,G,w.shape.length,F,X,S.shape.length,i,o,U),n.disposeData(w.dataId),n.disposeData(S.dataId),W.shape=x,W}var kte={kernelName:Ms,backendName:"wasm",setupFunc:vte,kernelFunc:wte};function sf(e){let{inputs:{x:t},attrs:{dtype:n},backend:a}=e,r=a.makeOutput(t.shape,n),s=a.typedArrayFromHeap(t);return a.typedArrayFromHeap(r).set(s),r}var Ite={kernelName:Rs,backendName:"wasm",kernelFunc:sf},Nte=$n(Ps),fS;function Tte(e){fS=e.wasm.cwrap(jr,null,["number","number","number","number"])}function Ste(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{clipValueMin:s,clipValueMax:i}=a,o=n.dataIdMap.get(r.dataId).id,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(l.dataId).id;return fS(o,s,i,u),l}var Cte={kernelName:jr,backendName:"wasm",setupFunc:Tte,kernelFunc:Ste};function gS(e){let{inputs:t,backend:n}=e,a=I.parseAxisParam(e.attrs.axis,t[0].shape)[0],r=E.computeOutShape(t.map(h=>h.shape),a),s=t.filter(h=>I.sizeFromShape(h.shape)>0);if(s.length===1)return af({inputs:{x:s[0]},backend:n});let i=n.makeOutput(r,t[0].dtype);if(I.sizeFromShape(r)===0)return i;let o=s.map(h=>h.shape);if(E.assertParamsConsistent(o,a),s[0].dtype==="string"){let h=s.map(x=>{let v=I.sizeFromShape(x.shape.slice(a));return Oa({inputs:{x},backend:n,attrs:{shape:[-1,v]}})}),m=h.map(x=>({vals:n.readSync(x.dataId),shape:x.shape}));r=E.computeOutShape(h.map(x=>x.shape),1);let f=h[0].shape[0]===1,g=_v(m,r,t[0].dtype,f),y=E.computeOutShape(s.map(x=>x.shape),a);i.shape=y;let b=n.dataIdMap.get(i.dataId);return b.stringBytes=E.fromStringArrayToUint8(g),h.forEach(x=>n.disposeData(x.dataId)),i}let l=I.sizeFromShape(s[0].shape.slice(0,a)),u=0,c=s.map(h=>{let m=I.sizeFromShape(h.shape.slice(a));return u+=m,m}),p=s.map(h=>n.typedArrayFromHeap(h)),d=n.typedArrayFromHeap(i);for(let h=0;h`cumsum does not support ${r.dtype} tensors in the WASM backend`);let u=E.getAxesPermutation([s],l),c=r;u!==null&&(c=rf({inputs:{x:r},attrs:{perm:u},backend:n}));let p=E.getInnerMostAxes(1,l)[0];E.assertAxesAreInnerMostDims("cumsum",[p],l);let d=n.makeOutput(c.shape,c.dtype),h=c.shape[p],m=n.dataIdMap.get(c.dataId).id,f=n.dataIdMap.get(d.dataId).id;vS(m,i?1:0,o?1:0,h,f,Hn[r.dtype]);let g=d;if(u!==null){let y=E.getUndoAxesPermutation(u);g=rf({inputs:{x:d},attrs:{perm:y},backend:n}),n.disposeData(c.dataId),n.disposeData(d.dataId)}return g}var Bte={kernelName:Ws,backendName:"wasm",setupFunc:zte,kernelFunc:Wte},wS;function Vte(e){wS=e.wasm.cwrap(qo,null,["number","number","number","array","number","array","array","number","number"])}function Ute(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{blockSize:s,dataFormat:i}=a;I.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=r.shape[0],l=i==="NHWC"?r.shape[1]:r.shape[2],u=i==="NHWC"?r.shape[2]:r.shape[3],c=i==="NHWC"?r.shape[3]:r.shape[1],p=l*s,d=u*s,h=c/(s*s),m=i==="NHWC"?[o,p,d,h]:[o,h,p,d],f=t.makeOutput(m,"float32"),g=t.dataIdMap.get(r.dataId).id,y=new Uint8Array(new Int32Array(I.computeStrides(r.shape)).buffer),b=new Uint8Array(new Int32Array(m).buffer),x=new Uint8Array(new Int32Array(I.computeStrides(m)).buffer),v=t.dataIdMap.get(f.dataId).id;return wS(g,s,i==="NHWC"?1:0,y,r.shape.length-1,b,x,m.length,v),f}var Gte={kernelName:qo,backendName:"wasm",setupFunc:Vte,kernelFunc:Ute},kS;function Hte(e){kS=e.wasm.cwrap(Bs,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function jte(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s}=t,i=a.dataIdMap.get(r.dataId).id,o=a.dataIdMap.get(s.dataId).id,{strides:l,dilations:u,pad:c,dimRoundingMode:p}=n,d=u==null?[1,1]:u,h=E.computeConv2DInfo(r.shape,s.shape,l,d,c,p,!0),m=h.filterHeight,f=h.filterWidth,g=h.padInfo.top,y=h.padInfo.right,b=h.padInfo.bottom,x=h.padInfo.left,v=h.dilationHeight,k=h.dilationWidth,w=h.strideHeight,S=h.strideWidth,A=h.inChannels,F=h.outChannels,D=h.padInfo.type==="SAME"?1:0;if(h.dataFormat!=="channelsLast")throw new Error(`wasm backend DepthwiseConv2dNative does not support dataFormat:'${h.dataFormat}'. Please use 'channelsLast'.`);let R=a.makeOutput(h.outShape,"float32"),L=a.dataIdMap.get(R.dataId).id;return kS(i,r.shape[0],r.shape[1],r.shape[2],o,m,f,g,y,b,x,D,v,k,w,S,A,F,L),R}var qte={kernelName:Bs,backendName:"wasm",setupFunc:Hte,kernelFunc:jte},Xte=!1,Kte=yn(Yo,Xte,"bool"),Yte=$n(Us);function lw(e){let{inputs:t,attrs:n,backend:a}=e,{input:r}=t,{dim:s}=n,i=r.shape.length,o=r.shape.slice(),l=s;return s<0&&(I.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),Oa({inputs:{x:r},backend:a,attrs:{shape:o}})}var Jte={kernelName:Jo,backendName:"wasm",kernelFunc:lw};function Qte(e){let{attrs:{shape:t,value:n,dtype:a},backend:r}=e,s=r.makeOutput(t,a);return r.typedArrayFromHeap(s).fill(n),s}var Zte={kernelName:lc,backendName:"wasm",kernelFunc:Qte},IS;function ene(e){IS=e.wasm.cwrap(Zo,null,["number","number","number","number","number","number"])}function tne(e){let{inputs:t,backend:n}=e,{image:a}=t,r=n.makeOutput(a.shape,a.dtype),s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,[o,l,u,c]=a.shape;return IS(s,o,l,u,c,i),r}var nne={kernelName:Zo,backendName:"wasm",kernelFunc:tne,setupFunc:ene},ane=$n(Gs),rne=!1,sne=yn(Hs,rne),NS;function ine(e){NS=e.wasm.cwrap(js,null,["number","number","number","number","number","number","number"])}function one(e){let{backend:t,inputs:n,attrs:a}=e,{varianceEpsilon:r}=a,{x:s,mean:i,variance:o,offset:l,scale:u}=n,c=t.dataIdMap.get(s.dataId).id,p=t.dataIdMap.get(i.dataId).id,d=t.dataIdMap.get(o.dataId).id,h=l!=null?t.dataIdMap.get(l.dataId).id:0,m=u!=null?t.dataIdMap.get(u.dataId).id:0,f=t.makeOutput(s.shape,s.dtype);if(I.sizeFromShape(s.shape)===0)return f;let g=t.dataIdMap.get(f.dataId).id;return NS(c,p,d,h,m,r,g),f}var lne={kernelName:js,backendName:"wasm",setupFunc:ine,kernelFunc:one},TS;function une(e){TS=e.wasm.cwrap(Ni,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function cne(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dataFormat:p,dimRoundingMode:d,activation:h,leakyreluAlpha:m}=n,f=E.computeConv2DInfo(r.shape,s.shape,l,c,u,d),g=Ip[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ee=a.dataIdMap.get(i.dataId);if(ee.shape.length!==1)throw new Error(`FusedConv2D only supports rank-1 bias but got rank ${ee.shape.length}.`);if(ee.shape[0]!==x)throw new Error(`FusedConv2D bias shape (${ee.shape}) does not match the number of output channels (${x})`);v=ee.id}let k=f.filterHeight,w=f.filterWidth,S=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,D=f.padInfo.left,R=f.dilationHeight,L=f.dilationWidth,W=f.strideHeight,U=f.strideWidth,G=f.inChannels,X=f.padInfo.type==="SAME"?1:0,j=f.batchSize,te=f.inHeight,Q=f.inWidth;if(p!=="NHWC")throw new Error(`wasm backend FusedConv2D does not support dataFormat:'${p}'. Please use 'NHWC'.`);let se=a.makeOutput(f.outShape,"float32"),ne=a.dataIdMap.get(se.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return TS(y,j,te,Q,b,k,w,v,S,A,F,D,X,R,L,W,U,G,x,g,ie,m||0,ne),se}var pne={kernelName:Ni,backendName:"wasm",setupFunc:une,kernelFunc:cne},SS;function dne(e){SS=e.wasm.cwrap(Ti,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function hne(e){let{inputs:t,attrs:n,backend:a}=e,{x:r,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dataFormat:p,dimRoundingMode:d,activation:h,leakyreluAlpha:m}=n,f=E.computeConv2DInfo(r.shape,s.shape,l,c,u,d,!0),g=Ip[h];if(g==null)throw new Error(`${h} activation not yet supported for FusedDepthwiseConv2D in the wasm backend.`);let y=a.dataIdMap.get(r.dataId).id,b=a.dataIdMap.get(s.dataId).id,x=f.outChannels,v=0;if(i!=null){let ee=a.dataIdMap.get(i.dataId);if(ee.shape.length!==1)throw new Error(`FusedDepthwiseConv2D only supports rank-1 bias but got rank ${ee.shape.length}.`);if(ee.shape[0]!==x)throw new Error(`FusedDepthwiseConv2D bias shape (${ee.shape}) does not match the number of output channels (${x})`);v=ee.id}let k=f.filterHeight,w=f.filterWidth,S=f.padInfo.top,A=f.padInfo.right,F=f.padInfo.bottom,D=f.padInfo.left,R=f.dilationHeight,L=f.dilationWidth,W=f.strideHeight,U=f.strideWidth,G=f.inChannels,X=f.padInfo.type==="SAME"?1:0,j=f.batchSize,te=f.inHeight,Q=f.inWidth;if(p!=="NHWC")throw new Error(`wasm backend FusedDepthwiseConv2D does not support dataFormat:'${p}'. Please use 'NHWC'.`);let se=a.makeOutput(f.outShape,"float32"),ne=a.dataIdMap.get(se.dataId).id,ie=o==null?0:a.dataIdMap.get(o.dataId).id;return SS(y,j,te,Q,b,k,w,v,S,A,F,D,X,R,L,W,U,G,x,g,ie,m||0,ne),se}var mne={kernelName:Ti,backendName:"wasm",setupFunc:dne,kernelFunc:hne},CS;function fne(e){CS=e.wasm.cwrap(tl,null,["number","number","number","number","number","number","array","number"])}function gne(e){let{backend:t,inputs:n}=e,{params:a,indices:r}=n,[s,i,o,l]=Ay.prepareAndValidate(a,r),u=t.makeOutput(s,a.dtype);if(i===0)return u;let c=r.shape,p=c[c.length-1],d=t.dataIdMap.get(a.dataId).id,h=t.dataIdMap.get(r.dataId).id,m=new Uint8Array(new Int32Array(l).buffer),f=t.dataIdMap.get(u.dataId).id;return CS(d,Hn[a.dtype],h,i,p,o,m,f),u}var yne={kernelName:tl,backendName:"wasm",setupFunc:fne,kernelFunc:gne},AS;function bne(e){AS=e.wasm.cwrap("Gather",null,["number","number","array","number","number","number","array","number"])}function xne(e){let{backend:t,inputs:n,attrs:a}=e,{x:r,indices:s}=n,{axis:i,batchDims:o}=a,l=I.parseAxisParam(i,r.shape)[0],u=E.segment_util.collectGatherOpShapeInfo(r,s,l,o),c=Oa({inputs:{x:r},attrs:{shape:[u.batchSize,u.outerSize,u.dimSize,u.sliceSize]},backend:t}),p=I.sizeFromShape(s.shape),d=Oa({inputs:{x:s},attrs:{shape:[u.batchSize,p/u.batchSize]},backend:t}),h=[u.batchSize,u.outerSize,p/u.batchSize,u.sliceSize],m=t.makeOutput(h,r.dtype);if(I.sizeFromShape(r.shape)===0)return m;let f=c.shape.length-1,g=t.dataIdMap.get(c.dataId).id,y=t.dataIdMap.get(d.dataId).id,b=t.dataIdMap.get(m.dataId).id,x=new Uint8Array(new Int32Array(I.computeStrides(c.shape)).buffer),v=new Uint8Array(new Int32Array(I.computeStrides(h)).buffer);return AS(g,Hn[r.dtype],x,f,y,u.batchSize,v,b),t.disposeData(c.dataId),t.disposeData(d.dataId),m.shape=u.outputShape,m}var vne={kernelName:el,backendName:"wasm",setupFunc:bne,kernelFunc:xne},wne=!1,kne=yn(nl,wne,"bool"),Ine=!1,Nne=yn(qs,Ine,"bool"),FS;function Tne(e){FS=e.wasm.cwrap(Ks,null,["number","number","number"])}function Sne(e){let{inputs:{x:t},attrs:{alpha:n},backend:a}=e,r=a.dataIdMap.get(t.dataId).id,s=a.makeOutput(t.shape,t.dtype);if(I.sizeFromShape(t.shape)!==0){let i=a.dataIdMap.get(s.dataId).id;FS(r,n,i)}return s}var Cne={kernelName:Ks,backendName:"wasm",setupFunc:Tne,kernelFunc:Sne},Ane=!1,Fne=yn(il,Ane,"bool"),_ne=!1,Ene=yn(ol,_ne,"bool"),$ne=$n(Ys),Dne=!1,Mne=yn(ul,Dne,"bool"),_S;function Rne(e){_S=e.wasm.cwrap(Js,null,["number, number, number"])}function Pne(e){let{backend:t,inputs:n,attrs:a}=e,{reductionIndices:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=i,{transposed:u,axes:c,originalAxes:p,inputWasTransposed:d}=Nu(i,r,t);if(d){let b=t.dataIdMap.get(u.dataId).id;l=u,o=b}let h=l.shape.length;E.assertAxesAreInnerMostDims("max",c,h);let[m,f]=E.computeOutAndReduceShapes(l.shape,c),g=I.sizeFromShape(f),y=t.makeOutput(m,i.dtype);if(I.sizeFromShape(l.shape)!==0){let b=t.dataIdMap.get(y.dataId).id;_S(o,g,b)}if(d&&t.disposeData(u.dataId),s){let b=E.expandShapeToKeepDim(y.shape,p);y.shape=b}return y}var One={kernelName:Js,backendName:"wasm",setupFunc:Rne,kernelFunc:Pne},Lne=!1,zne=yn(Qs,Lne),ES;function Wne(e){ES=e.wasm.cwrap(Zs,null,["number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number","number"])}function Bne(e){let{inputs:t,attrs:n,backend:a}=e,r=t.x,s=a.dataIdMap.get(r.dataId).id,{filterSize:i,strides:o,pad:l,dimRoundingMode:u}=n,c=E.computePool2DInfo(r.shape,i,o,1,l,u),p=c.filterHeight,d=c.filterWidth,h=c.padInfo.top,m=c.padInfo.right,f=c.padInfo.bottom,g=c.padInfo.left,y=c.dilationHeight,b=c.dilationWidth,x=c.strideHeight,v=c.strideWidth,k=c.inChannels,w=c.outChannels;if(c.dataFormat!=="channelsLast")throw new Error(`wasm backend does not support dataFormat:'${c.dataFormat}'. Please use 'channelsLast'.`);let S=a.makeOutput(c.outShape,"float32"),A=a.dataIdMap.get(S.dataId).id;return ES(s,r.shape[0],r.shape[1],r.shape[2],p,d,h,m,f,g,y,b,x,v,k,w,A),S}var Vne={kernelName:Zs,backendName:"wasm",setupFunc:Wne,kernelFunc:Bne},$S;function Une(e){$S=e.wasm.cwrap(ei,null,["number, number, number"])}function Gne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=Nu(i,r,t),m=p;if(h){let v=t.dataIdMap.get(c.dataId).id;v!==o&&(u=c,l=v,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("mean",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=u;u.dtype!=="float32"&&(b=sf({backend:t,inputs:{x:u},attrs:{dtype:"float32"}}),l=t.dataIdMap.get(b.dataId).id);let x=t.makeOutput(f,"float32");if(I.sizeFromShape(u.shape)!==0){let v=t.dataIdMap.get(x.dataId).id;$S(l,y,v)}if(h&&t.disposeData(c.dataId),s){let v=E.expandShapeToKeepDim(x.shape,d);x.shape=v}return u.dtype!=="float32"&&t.disposeData(b.dataId),x}var Hne={kernelName:ei,backendName:"wasm",setupFunc:Une,kernelFunc:Gne},DS;function jne(e){DS=e.wasm.cwrap(ti,null,["number, number, number"])}function qne(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=Nu(i,r,t);if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x)}let m=u.shape.length;E.assertAxesAreInnerMostDims("min",p,m);let[f,g]=E.computeOutAndReduceShapes(u.shape,p),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;DS(l,y,x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Xne={kernelName:ti,backendName:"wasm",setupFunc:jne,kernelFunc:qne},Kne=!1,Yne=yn(ni,Kne),Jne=!0,Qne=yn(ai,Jne),Zne=$n(pl);function uw(e,t){let n=new Int32Array(e.wasm.HEAPU8.buffer,t,4),a=n[0],r=n[1],s=n[2],i=n[3];return e.wasm._free(t),{pSelectedIndices:a,selectedSize:r,pSelectedScores:s,pValidOutputs:i}}var MS;function eae(e){MS=e.wasm.cwrap(hl,"number",["number","number","number","number","number"])}function tae(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i}=a,{boxes:o,scores:l}=n,u=t.dataIdMap.get(o.dataId).id,c=t.dataIdMap.get(l.dataId).id,p=MS(u,c,s,r,i),{pSelectedIndices:d,selectedSize:h,pSelectedScores:m,pValidOutputs:f}=uw(t,p);return t.wasm._free(m),t.wasm._free(f),t.makeOutput([h],"int32",d)}var nae={kernelName:hl,backendName:"wasm",setupFunc:eae,kernelFunc:tae},RS;function aae(e){RS=e.wasm.cwrap(ml,"number",["number","number","number","number","number","bool"])}function rae(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,padToMaxOutputSize:o}=a,{boxes:l,scores:u}=n,c=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(u.dataId).id,d=RS(c,p,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=uw(t,d);t.wasm._free(f);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([],"int32",g);return[y,b]}var sae={kernelName:ml,backendName:"wasm",setupFunc:aae,kernelFunc:rae},PS;function iae(e){PS=e.wasm.cwrap(fl,"number",["number","number","number","number","number","number"])}function oae(e){let{backend:t,inputs:n,attrs:a}=e,{iouThreshold:r,maxOutputSize:s,scoreThreshold:i,softNmsSigma:o}=a,{boxes:l,scores:u}=n,c=t.dataIdMap.get(l.dataId).id,p=t.dataIdMap.get(u.dataId).id,d=PS(c,p,s,r,i,o),{pSelectedIndices:h,selectedSize:m,pSelectedScores:f,pValidOutputs:g}=uw(t,d);t.wasm._free(g);let y=t.makeOutput([m],"int32",h),b=t.makeOutput([m],"float32",f);return[y,b]}var lae={kernelName:fl,backendName:"wasm",setupFunc:iae,kernelFunc:oae},uae=!1,cae=yn(dl,uae,"bool"),OS;function pae(e){OS=e.wasm.cwrap(ri,null,["number","number","number","number","number"])}function dae(e){let{inputs:t,backend:n,attrs:a}=e,{indices:r}=t,{depth:s,onValue:i,offValue:o}=a,l=n.makeOutput([...r.shape,s],"int32"),u=n.dataIdMap.get(l.dataId).id,c=n.dataIdMap.get(r.dataId).id;return OS(c,s,i,o,u),l}var hae={kernelName:ri,backendName:"wasm",setupFunc:pae,kernelFunc:dae};function mae(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(1),a}var fae={kernelName:gl,backendName:"wasm",kernelFunc:mae};function gae(e){let{inputs:t,backend:n,attrs:a}=e,{axis:r}=a;if(t.length===1)return lw({inputs:{input:t[0]},backend:n,attrs:{dim:r}});let s=t[0].shape,i=t[0].dtype;t.forEach(c=>{I.assertShapesMatch(s,c.shape,"All tensors passed to stack must have matching shapes"),I.assert(i===c.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(c=>{let p=lw({inputs:{input:c},backend:n,attrs:{dim:r}});return o.push(p),p}),u=gS({inputs:l,backend:n,attrs:{axis:r}});return o.forEach(c=>n.disposeData(c.dataId)),u}var yae={kernelName:yl,backendName:"wasm",kernelFunc:gae},LS;function bae(e){LS=e.wasm.cwrap(si,null,["number","array","number","number","array","array","number","number"])}function xae(e){let{inputs:{x:t},backend:n,attrs:{paddings:a,constantValue:r}}=e,s=a.map((m,f)=>m[0]+t.shape[f]+m[1]),i=n.dataIdMap.get(t.dataId).id,o=n.makeOutput(s,t.dtype),l=n.dataIdMap.get(o.dataId).id,u=new Uint8Array(new Int32Array(t.shape).buffer),c=a.map(m=>m[0]),p=a.map(m=>m[1]),d=new Uint8Array(new Int32Array(c).buffer),h=new Uint8Array(new Int32Array(p).buffer);return LS(i,u,t.shape.length,Hn[t.dtype],d,h,r,l),o}var vae={kernelName:si,backendName:"wasm",kernelFunc:xae,setupFunc:bae},wae=!1,kae=yn(ii,wae),zS;function Iae(e){zS=e.wasm.cwrap(oi,null,["number","number","number"])}function Nae(e){let{inputs:t,backend:n}=e,{x:a,alpha:r}=t,s=n.dataIdMap.get(a.dataId).id,i=n.dataIdMap.get(r.dataId).id,o=n.makeOutput(a.shape,"float32"),l=n.dataIdMap.get(o.dataId).id;return zS(s,i,l),o}var Tae={kernelName:oi,backendName:"wasm",setupFunc:Iae,kernelFunc:Nae},WS;function Sae(e){WS=e.wasm.cwrap(bl,null,["number","number","number","number"])}function Cae(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=Nu(i,r,t),m=p;if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("prod",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;WS(l,y,Hn[b.dtype],x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Aae={kernelName:bl,backendName:"wasm",setupFunc:Sae,kernelFunc:Cae},Fae=e=>{let{backend:t,attrs:n}=e,{start:a,stop:r,step:s,dtype:i}=n,o=Dv(a,r,s,i),l=t.makeOutput([o.length],i);return t.typedArrayFromHeap(l).set(o),l},_ae={kernelName:mc,backendName:"wasm",kernelFunc:Fae},Eae=!0,$ae=yn(Vs,Eae),Dae=$n(li),Mae=$n(ci),BS;function Rae(e){BS=e.wasm.cwrap(ui,null,["number","number","number","number","number","number","number","number","number","number"])}function Pae(e){let{backend:t,inputs:n,attrs:a}=e,{images:r}=n,{alignCorners:s,halfPixelCenters:i,size:o}=a,[l,u]=o,[c,p,d,h]=r.shape,m=[c,l,u,h],f=t.dataIdMap.get(r.dataId),g;f.dtype!=="float32"&&(g=sf({backend:t,inputs:{x:r},attrs:{dtype:"float32"}}),f=t.dataIdMap.get(g.dataId));let y=f.id,b=t.makeOutput(m,"float32");if(I.sizeFromShape(r.shape)===0)return b;let x=t.dataIdMap.get(b.dataId).id;return BS(y,c,p,d,h,l,u,s?1:0,i?1:0,x),g!=null&&t.disposeData(g.dataId),b}var Oae={kernelName:ui,backendName:"wasm",setupFunc:Rae,kernelFunc:Pae},VS;function Lae(e){VS=e.wasm.cwrap(pi,null,["number","array","number","array","number","number"])}function zae(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,{dims:s}=a,i=I.parseAxisParam(s,r.shape);if(r.shape.length===0)return af({inputs:{x:r},backend:n});let o=n.makeOutput(r.shape,r.dtype),l=n.dataIdMap.get(r.dataId).id,u=n.dataIdMap.get(o.dataId).id,c=new Uint8Array(new Int32Array(i).buffer),p=new Uint8Array(new Int32Array(r.shape).buffer);VS(l,c,i.length,p,r.shape.length,u);let d=Oa({inputs:{x:o},attrs:{shape:r.shape},backend:n});return n.disposeData(o.dataId),d}var Wae={kernelName:pi,backendName:"wasm",kernelFunc:zae,setupFunc:Lae},US;function Bae(e){US=e.wasm.cwrap(Ml,null,["number","number","number","number","number","number","number","number","array","number","number"])}function Vae(e){let{inputs:t,backend:n,attrs:a}=e,{image:r}=t,{radians:s,fillValue:i,center:o}=a,l=n.makeOutput(r.shape,r.dtype),u=n.dataIdMap.get(r.dataId).id,c=n.dataIdMap.get(l.dataId).id,[p,d,h,m]=r.shape,[f,g]=E.getImageCenter(o,d,h),y=i===0,b=255,x=typeof i=="number"?[i,i,i,y?0:b]:[...i,b],v=new Uint8Array(new Int32Array(x).buffer);return US(u,p,d,h,m,s,f,g,v,x.length,c),l}var Uae={kernelName:Ml,backendName:"wasm",kernelFunc:Vae,setupFunc:Bae},Gae=$n(di),Hae=$n(hi),GS;function jae(e){GS=e.wasm.cwrap(wl,null,["number","number","number","number","number","number","array","number","number"])}function qae(e){let{backend:t,inputs:n,attrs:a}=e,{indices:r,updates:s}=n,{shape:i}=a,o=t.makeOutput(i,s.dtype);if(I.sizeFromShape(i)===0)return o;let{sliceRank:l,numUpdates:u,sliceSize:c,strides:p,outputSize:d}=Fy.calculateShapes(s,r,i),h=t.dataIdMap.get(r.dataId).id,m=t.dataIdMap.get(s.dataId).id,f=new Uint8Array(new Int32Array(p).buffer),g=t.dataIdMap.get(o.dataId).id;return GS(h,m,Hn[s.dtype],l,u,c,f,d,g),o}var Xae={kernelName:wl,backendName:"wasm",setupFunc:jae,kernelFunc:qae},HS;function Kae(e){HS=e.wasm.cwrap("SelectV2",null,["number","number","number","number","number"])}function Yae(e){let{inputs:t,backend:n}=e,{condition:a,t:r,e:s}=t,i=n.dataIdMap.get(a.dataId).id,o=n.dataIdMap.get(r.dataId).id,l=n.dataIdMap.get(s.dataId).id,u=n.makeOutput(r.shape,r.dtype),c=n.dataIdMap.get(u.dataId).id,p=a.shape.length,d=r.shape.length,h=p===0||p>1||d===1?1:I.sizeFromShape(r.shape.slice(1));return HS(i,o,l,h,c),u}var Jae={kernelName:kl,backendName:"wasm",kernelFunc:Yae,setupFunc:Kae},jS;function Qae(e){jS=e.wasm.cwrap(fi,null,["number","number"])}function Zae(e){let{backend:t,inputs:{x:n}}=e,a=t.dataIdMap.get(n.dataId).id,r=t.makeOutput(n.shape,n.dtype),s=t.dataIdMap.get(r.dataId).id;return I.sizeFromShape(r.shape)===0||jS(a,s),r}var ere={kernelName:"Sigmoid",backendName:"wasm",setupFunc:Qae,kernelFunc:Zae},tre=$n(mi);function of(e){let{inputs:{x:t},attrs:{begin:n,size:a},backend:r}=e,[s,i]=dn.parseSliceParams(t,n,a),o=dn.isSliceContinous(t.shape,s,i),l=r.readSync(t.dataId),u=r.makeOutput(i,t.dtype),c=I.computeStrides(t.shape),p=r.dataIdMap.get(u.dataId);if(o){let m=dn.computeFlatOffset(s,c);return t.dtype==="string"?p.stringBytes=l.slice(m,m+I.sizeFromShape(i)):r.typedArrayFromHeap(u).set(l.subarray(m,m+I.sizeFromShape(i))),u}if(t.dtype==="string"){let m=zm(l,s,i,t.shape,t.dtype);return p.stringBytes=m,u}let d=r.typedArrayFromHeap(u),h=t.shape.length;if(h===2)nre(l,c[0],d,s,i);else if(h===3)are(l,c[0],c[1],d,s,i);else if(h===4)rre(l,c[0],c[1],c[2],d,s,i);else{let m=zm(l,s,i,t.shape,t.dtype);d.set(m)}return u}function nre(e,t,n,a,r){let s=0,i=a[0],o=a[1],l=i+r[0];for(let u=i;u{let d=[...c];d[o]=p;let h=of({inputs:{x:r},attrs:{begin:u,size:d},backend:a});return u[o]+=p,h})}var cre={kernelName:Al,backendName:"wasm",kernelFunc:ure},pre=$n(gi),dre=$n(yc),hre=!0,mre=yn(xi,hre),XS;function fre(e){XS=e.wasm.cwrap(Xr,null,["number","number","number"])}function gre(e){let{backend:t,inputs:n,attrs:a}=e,{alpha:r}=a,{x:s}=n,i=t.dataIdMap.get(s.dataId).id,o=t.makeOutput(s.shape,s.dtype),l=t.dataIdMap.get(o.dataId).id;return XS(i,r,l),o}var yre={kernelName:Xr,backendName:"wasm",setupFunc:fre,kernelFunc:gre},KS;function bre(e){KS=e.wasm.cwrap(Fl,null,["number","array","number","array","array","array","array","array","number","number"])}function xre(e){let{backend:t,inputs:n,attrs:a}=e,{x:r}=n,{begin:s,end:i,strides:o}=a;o==null&&(o=new Array(s.length));let{beginMask:l,endMask:u,ellipsisMask:c,newAxisMask:p,shrinkAxisMask:d}=a,h=E.slice_util.maskToAxes(c);if(h.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(c!==0&&p!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(c!==0&&d!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let m=r.shape.length-s.length,f=E.slice_util.maskToAxes(p),g=r.shape.slice();f.forEach(D=>{s[D]=0,i[D]=1,g.splice(D,0,1)});let y=Oa({inputs:{x:r},attrs:{shape:g},backend:t}),{begin:b,end:x,strides:v}=E.slice_util.getNormalizedAxes(y.shape,h,m,s,i,o,l,u,c);s=b,i=x,o=v;let k=E.slice_util.maskToAxes(d);k.forEach(D=>{i[D]=s[D]+1,o[D]=1});let w=E.slice_util.computeOutShape(s,i,o),S=w.filter((D,R)=>k.indexOf(R)===-1);if(o.every(D=>D===1)){let D=of({inputs:{x:y},attrs:{begin:s,size:w},backend:t});t.disposeData(y.dataId);let R=Oa({inputs:{x:D},attrs:{shape:S},backend:t});return t.disposeData(D.dataId),R}let A=t.makeOutput(S,"float32");if(!S.some(D=>D===0)){let D=t.dataIdMap.get(y.dataId).id,R=new Uint8Array(new Int32Array(I.computeStrides(y.shape)).buffer),L=new Uint8Array(new Int32Array(s).buffer),W=new Uint8Array(new Int32Array(i).buffer),U=new Uint8Array(new Int32Array(o).buffer),G=new Uint8Array(new Int32Array(S).buffer),X=new Uint8Array(new Int32Array(I.computeStrides(S)).buffer),j=t.dataIdMap.get(A.dataId).id;KS(D,R,y.shape.length,L,W,U,G,X,S.length,j)}t.disposeData(y.dataId);let F=Oa({inputs:{x:A},attrs:{shape:S},backend:t});return t.disposeData(A.dataId),F}var vre={kernelName:Fl,backendName:"wasm",setupFunc:bre,kernelFunc:xre},wre=!0,kre=yn(vi,wre),YS;function Ire(e){YS=e.wasm.cwrap(yi,null,["number, number, number"])}function Nre(e){let{backend:t,inputs:n,attrs:a}=e,{axis:r,keepDims:s}=a,{x:i}=n,o=t.dataIdMap.get(i.dataId).id,l=o,u=i,{transposed:c,axes:p,originalAxes:d,inputWasTransposed:h}=Nu(i,r,t),m=p;if(h){let x=t.dataIdMap.get(c.dataId).id;x!==o&&(u=c,l=x,m=E.getInnerMostAxes(m.length,u.shape.length))}E.assertAxesAreInnerMostDims("sum",m,u.shape.length);let[f,g]=E.computeOutAndReduceShapes(u.shape,m),y=I.sizeFromShape(g),b=t.makeOutput(f,u.dtype);if(I.sizeFromShape(u.shape)!==0){let x=t.dataIdMap.get(b.dataId).id;YS(l,y,x)}if(h&&t.disposeData(c.dataId),s){let x=E.expandShapeToKeepDim(b.shape,d);b.shape=x}return b}var Tre={kernelName:yi,backendName:"wasm",setupFunc:Ire,kernelFunc:Nre},Sre=$n(wi),JS;function Cre(e){JS=e.wasm.cwrap(qr,null,["number","array","number","array","number","number"])}function Are(e){let{inputs:t,backend:n,attrs:a}=e,{x:r}=t,s=n.dataIdMap.get(r.dataId).id,{reps:i}=a,o=new Array(r.shape.length);for(let d=0;d{let{x:a}=e,{k:r,sorted:s}=n,i=t.dataIdMap.get(a.dataId).id,o=new Uint8Array(new Int32Array(a.shape).buffer),l=a.shape.slice();l[l.length-1]=r;let u=t.makeOutput(l,a.dtype),c=t.dataIdMap.get(u.dataId).id,p=t.makeOutput(l,"int32"),d=t.dataIdMap.get(p.dataId).id;return QS(i,o,a.shape.length,Hn[a.dtype],r,s,c,d),[u,p]},$re={kernelName:El,backendName:"wasm",setupFunc:_re,kernelFunc:Ere};function Dre(e){let{inputs:t,backend:n,attrs:a}=e,{value:r}=t,{axis:s}=a;s<0&&(s+=r.shape.length);let i=r.shape[s],o=r.shape.length,l=new Array(o-1),u=0;for(let h=0;h({dataId:h,dtype:m,shape:l}))}var Mre={kernelName:$l,backendName:"wasm",kernelFunc:Dre};function Rre(e){let{inputs:{x:t},backend:n}=e,a=n.makeOutput(t.shape,t.dtype);return n.typedArrayFromHeap(a).fill(0),a}var Pre={kernelName:Dl,backendName:"wasm",kernelFunc:Rre},Ore=[nte,rte,ote,fte,bte,kte,Ite,Nte,Cte,Ate,Ete,Mte,Rte,Lte,Bte,Gte,qte,Kte,Yte,Jte,Zte,nne,ane,sne,tte,lne,pne,mne,yne,vne,kne,Nne,lte,Cne,Fne,Ene,$ne,Mne,One,zne,Vne,Hne,Xne,Yne,Qne,Zne,nae,sae,lae,cae,hae,fae,yae,vae,kae,Tae,Aae,_ae,$ae,Dae,Mae,xte,Oae,Wae,Uae,Hae,Gae,Xae,Jae,ere,tre,sre,lre,cre,pre,dre,mre,yre,vre,kre,Tre,Sre,Fre,$re,dte,Mre,Pre];for(let e of Ore)vc(e);var cw=Z();cw.registerFlag("WASM_HAS_SIMD_SUPPORT",async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])));cw.registerFlag("WASM_HAS_MULTITHREAD_SUPPORT",async()=>{if(cw.get("IS_NODE"))return!1;try{return new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch(e){return!1}});var ZS=Do(XF()),Lre='var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module).then(function(instance){Module=instance;moduleLoaded()})}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}};if(typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string"){self={location:{href:__filename}};var onmessage=this.onmessage;var nodeWorkerThreads=require("worker_threads");global.Worker=nodeWorkerThreads.Worker;var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",function(data){onmessage({data:data})});var nodeFS=require("fs");var nodeRead=function(filename){return nodeFS.readFileSync(filename,"utf8")};function globalEval(x){global.require=require;global.Module=Module;eval.call(null,x)}importScripts=function(f){globalEval(nodeRead(f))};postMessage=function(msg){parentPort.postMessage(msg)};if(typeof performance==="undefined"){performance={now:function(){return Date.now()}}}}',zre=Do(KF()),eC=class extends Zu{constructor(e){super();this.wasm=e,this.dataIdNextNumber=1,this.wasm.tfjs.init(),this.dataIdMap=new kd(this,Ha())}write(e,t,n){let a={id:this.dataIdNextNumber++};return this.move(a,e,t,n,1),a}numDataIds(){return this.dataIdMap.numDataIds()}async time(e){let t=I.now();return e(),{kernelMs:I.now()-t}}move(e,t,n,a,r){let s=this.dataIdNextNumber++;if(a==="string"){let u=t;this.dataIdMap.set(e,{id:s,stringBytes:u,shape:n,dtype:a,memoryOffset:null,refCount:r});return}let i=I.sizeFromShape(n),o=i*I.bytesPerElement(a),l=this.wasm._malloc(o);this.dataIdMap.set(e,{id:s,memoryOffset:l,shape:n,dtype:a,refCount:r}),this.wasm.tfjs.registerTensor(s,i,l),t!=null&&this.wasm.HEAPU8.set(new Uint8Array(t.buffer,t.byteOffset,o),l)}async read(e){return this.readSync(e)}readSync(e){let{memoryOffset:t,dtype:n,shape:a,stringBytes:r}=this.dataIdMap.get(e);if(n==="string")return r;let s=this.wasm.HEAPU8.slice(t,t+I.sizeFromShape(a)*I.bytesPerElement(n));return Wre(s.buffer,n)}disposeData(e,t=!1){if(this.dataIdMap.has(e)){let n=this.dataIdMap.get(e);if(n.refCount--,!t&&n.refCount>0)return!1;this.wasm._free(n.memoryOffset),this.wasm.tfjs.disposeData(n.id),this.dataIdMap.delete(e)}return!0}refCount(e){return this.dataIdMap.has(e)?this.dataIdMap.get(e).refCount:0}incRef(e){let t=this.dataIdMap.get(e);t!=null&&t.refCount++}floatPrecision(){return 32}getMemoryOffset(e){return this.dataIdMap.get(e).memoryOffset}dispose(){this.wasm.tfjs.dispose(),this.wasm=null}memory(){return{unreliable:!1}}makeOutput(e,t,n){let a;if(n==null)a=this.write(null,e,t);else{let r=this.dataIdNextNumber++;a={id:r},this.dataIdMap.set(a,{id:r,memoryOffset:n,shape:e,dtype:t,refCount:1});let s=I.sizeFromShape(e);this.wasm.tfjs.registerTensor(r,s,n)}return{dataId:a,shape:e,dtype:t}}typedArrayFromHeap({shape:e,dtype:t,dataId:n}){let a=this.wasm.HEAPU8.buffer,{memoryOffset:r}=this.dataIdMap.get(n),s=I.sizeFromShape(e);switch(t){case"float32":return new Float32Array(a,r,s);case"int32":return new Int32Array(a,r,s);case"bool":return new Uint8Array(a,r,s);default:throw new Error(`Unknown dtype ${t}`)}}};function Bre(e){return(t,n)=>(I.fetch(e,{credentials:"same-origin"}).then(a=>{a.ok||t.env.a(`failed to load wasm binary file at '${e}'`),a.arrayBuffer().then(r=>{WebAssembly.instantiate(r,t).then(s=>{n(s.instance)})})}),{})}function tC(e,t,n){if(lf!=null)return lf;let a="tfjs-backend-wasm.wasm";return e&&t?a="tfjs-backend-wasm-threaded-simd.wasm":e&&(a="tfjs-backend-wasm-simd.wasm"),Np!=null&&Np[a]!=null?Np[a]:n+a}async function Vre(){let[e,t]=await Promise.all([Z().getAsync("WASM_HAS_SIMD_SUPPORT"),Z().getAsync("WASM_HAS_MULTITHREAD_SUPPORT")]);return new Promise((n,a)=>{let r={};r.locateFile=(o,l)=>{if(o.endsWith(".worker.js")){let u=Lre,c=new Blob([u],{type:"application/javascript"});return URL.createObjectURL(c)}return o.endsWith(".wasm")?tC(e,t,Tp!=null?Tp:l):l+o},pw&&(r.instantiateWasm=Bre(tC(e,t,Tp!=null?Tp:"")));let s=!1;r.onAbort=()=>{s||Sp||(Sp=!0,a({message:"Make sure the server can serve the `.wasm` file relative to the bundled js file. For more details see https://github.com/tensorflow/tfjs/blob/master/tfjs-backend-wasm/README.md#using-bundlers"}))};let i;t&&e&&lf==null?(r.mainScriptUrlOrBlob=new Blob(["var WasmBackendModuleThreadedSimd = "+ZS.default.toString()],{type:"text/javascript"}),i=(0,ZS.default)(r)):i=(0,zre.default)(r),i.then(o=>{s=!0,Sp=!1;let l=null;o.tfjs={init:o.cwrap("init",null,[]),registerTensor:o.cwrap("register_tensor",null,["number","number","number"]),disposeData:o.cwrap("dispose_data",l,["number"]),dispose:o.cwrap("dispose",l,[])},n({wasm:o})})})}function Wre(e,t){switch(t){case"float32":return new Float32Array(e);case"int32":return new Int32Array(e);case"bool":return new Uint8Array(e);default:throw new Error(`Unknown dtype ${t}`)}}var Ure=["tfjs-backend-wasm.wasm","tfjs-backend-wasm-simd.wasm","tfjs-backend-wasm-threaded-simd.wasm"],lf=null,Tp=null,Np={},Sp=!1,pw=!1;function Gre(e,t=!1){if(Ry("setWasmPath has been deprecated in favor of setWasmPaths and will be removed in a future release."),Sp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPath()` before you call `tf.setBackend()` or `tf.ready()`");lf=e,pw=t}function Hre(e,t=!1){if(Sp)throw new Error("The WASM backend was already initialized. Make sure you call `setWasmPaths()` before you call `tf.setBackend()` or `tf.ready()`");if(typeof e=="string")Tp=e;else{Np=e;let n=Ure.filter(a=>Np[a]==null);if(n.length>0)throw new Error(`There were no entries found for the following binaries: ${n.join(",")}. Please either call setWasmPaths with a map providing a path for each binary, or with a string indicating the directory where all the binaries can be found.`)}pw=t}var jre="3.3.0",qre=2;fh("wasm",async()=>{let{wasm:e}=await Vre();return new eC(e)},qre);var Cw={};Ju(Cw,{AnchorPosition:()=>lr,DrawBox:()=>gf,DrawBoxOptions:()=>Nw,DrawFaceLandmarks:()=>Sw,DrawFaceLandmarksOptions:()=>Tw,DrawTextField:()=>vs,DrawTextFieldOptions:()=>Cp,drawContour:()=>Ar,drawDetections:()=>nse,drawFaceExpressions:()=>ase,drawFaceLandmarks:()=>sse});function Ar(e,t,n=!1){if(e.beginPath(),t.slice(1).forEach(({x:a,y:r},s)=>{let i=t[s];e.moveTo(i.x,i.y),e.lineTo(a,r)}),n){let a=t[t.length-1],r=t[0];if(!a||!r)return;e.moveTo(a.x,a.y),e.lineTo(r.x,r.y)}e.stroke()}var dw={};Ju(dw,{computeReshapedDimensions:()=>fw,getCenterPoint:()=>no,isDimensions:()=>cf,isEven:()=>uf,isFloat:()=>mw,isTensor:()=>eo,isTensor1D:()=>Xre,isTensor2D:()=>hw,isTensor3D:()=>Fr,isTensor4D:()=>ra,isValidNumber:()=>La,isValidProbablitiy:()=>Tu,range:()=>ir,round:()=>to});var cn=class{constructor(t,n){if(!La(t)||!La(n))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:n})}`);this._width=t,this._height=n}get width(){return this._width}get height(){return this._height}reverse(){return new cn(1/this.width,1/this.height)}};function eo(e,t){return e instanceof Fe&&e.shape.length===t}function Xre(e){return eo(e,1)}function hw(e){return eo(e,2)}function Fr(e){return eo(e,3)}function ra(e){return eo(e,4)}function mw(e){return e%1!=0}function uf(e){return e%2==0}function to(e,t=2){let n=10**t;return Math.floor(e*n)/n}function cf(e){return e&&e.width&&e.height}function fw({width:e,height:t},n){let a=n/Math.max(t,e);return new cn(Math.round(e*a),Math.round(t*a))}function no(e){return e.reduce((t,n)=>t.add(n),new De(0,0)).div(new De(e.length,e.length))}function ir(e,t,n){return Array(e).fill(0).map((a,r)=>t+r*n)}function La(e){return!!e&&e!==Infinity&&e!==-Infinity&&!Number.isNaN(e)||e===0}function Tu(e){return La(e)&&e>=0&&e<=1}var De=class{constructor(t,n){this._x=t,this._y=n}get x(){return this._x}get y(){return this._y}add(t){return new De(this.x+t.x,this.y+t.y)}sub(t){return new De(this.x-t.x,this.y-t.y)}mul(t){return new De(this.x*t.x,this.y*t.y)}div(t){return new De(this.x/t.x,this.y/t.y)}abs(){return new De(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new De(Math.floor(this.x),Math.floor(this.y))}};var ot=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(La)}static assertIsValidBox(t,n,a=!1){if(!ot.isRect(t))throw new Error(`${n} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!a&&(t.width<0||t.height<0))throw new Error(`${n} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,n=!0){let a=t||{},r=[a.left,a.top,a.right,a.bottom].every(La),s=[a.x,a.y,a.width,a.height].every(La);if(!s&&!r)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(a)}`);let[i,o,l,u]=s?[a.x,a.y,a.width,a.height]:[a.left,a.top,a.right-a.left,a.bottom-a.top];ot.assertIsValidBox({x:i,y:o,width:l,height:u},"Box.constructor",n),this._x=i,this._y=o,this._width=l,this._height=u}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new De(this.left,this.top)}get topRight(){return new De(this.right,this.top)}get bottomLeft(){return new De(this.left,this.bottom)}get bottomRight(){return new De(this.right,this.bottom)}round(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new ot({x:t,y:n,width:a,height:r})}floor(){let[t,n,a,r]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new ot({x:t,y:n,width:a,height:r})}toSquare(){let{x:t,y:n,width:a,height:r}=this,s=Math.abs(a-r);return an&&(o=-p+n+a,p=n),d>t&&(l=-d+t+r,d=t),u<1&&(l=2-u,u=1),c<1&&(l=2-c,c=1),{dy:i,edy:l,dx:s,edx:o,y:c,ey:d,x:u,ex:p,w:a,h:r}}calibrate(t){return new ot({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var ao=class extends ot{constructor(t,n,a,r,s=!1){super({left:t,top:n,right:a,bottom:r},s)}};var _r=class{constructor(t,n,a,r,s){this._imageDims=new cn(s.width,s.height),this._score=t,this._classScore=n,this._className=a,this._box=new ot(r).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new ot(this._box).rescale(this.imageDims.reverse())}forSize(t,n){return new _r(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:n})}};var ft=class extends _r{constructor(t,n,a){super(t,t,"",n,a)}forSize(t,n){let{score:a,relativeBox:r,imageDims:s}=super.forSize(t,n);return new ft(a,r,s)}};function pf(e,t,n=!0){let a=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),r=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),s=a*r;return n?s/(e.area+t.area-s):s/Math.min(e.area,t.area)}function df(e){let t=e.map(o=>o.x),n=e.map(o=>o.y),a=t.reduce((o,l)=>lloo({score:i,boxIndex:o})).sort((i,o)=>i.score-o.score).map(i=>i.boxIndex),s=[];for(;r.length>0;){let i=r.pop();s.push(i);let o=r,l=[];for(let u=0;ul[c]<=n)}return s}function wa(e,t){return M(()=>{let[n,a,r]=t,s=Cn([...e.shape.slice(0,3),1],n,"float32"),i=Cn([...e.shape.slice(0,3),1],a,"float32"),o=Cn([...e.shape.slice(0,3),1],r,"float32"),l=Je([s,i,o],3);return me(e,l)})}function mf(e,t=!1){return M(()=>{let[n,a]=e.shape.slice(1);if(n===a)return e;let r=Math.abs(n-a),s=Math.round(r*(t?.5:1)),i=n>a?2:1,o=d=>{let h=e.shape.slice();return h[i]=d,Cn(h,0,"float32")},l=o(s),u=r-l.shape[i],p=[t&&u?o(u):null,e,l].filter(d=>!!d).map(d=>ue(d,"float32"));return Je(p,i)})}function nC(e){let t=e.slice();for(let n=t.length-1;n>0;n--){let a=Math.floor(Math.random()*(n+1)),r=t[n];t[n]=t[a],t[a]=r}return t}function Su(e){return 1/(1+Math.exp(-e))}function aC(e){return Math.log(e/(1-e))}var ro=class extends ot{constructor(t,n,a,r,s=!1){super({x:t,y:n,width:a,height:r},s)}};var Kre=.5,Yre=.43,Jre=.45,jn=class{constructor(t,n,a=new De(0,0)){let{width:r,height:s}=n;this._imgDims=new cn(r,s),this._shift=a,this._positions=t.map(i=>i.mul(new De(r,s)).add(a))}get shift(){return new De(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new De(this.imageWidth,this.imageHeight)))}forSize(t,n){return new this.constructor(this.relativePositions,{width:t,height:n})}shiftBy(t,n){return new this.constructor(this.relativePositions,this._imgDims,new De(t,n))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,n={}){if(t){let s=t instanceof ft?t.box.floor():new ot(t);return this.shiftBy(s.x,s.y).align(null,n)}let{useDlibAlignment:a,minBoxPadding:r}={useDlibAlignment:!1,minBoxPadding:.2,...n};return a?this.alignDlib():this.alignMinBbox(r)}alignDlib(){let t=this.getRefPointsForAlignment(),[n,a,r]=t,s=p=>r.sub(p).magnitude(),i=(s(n)+s(a))/2,o=Math.floor(i/Jre),l=no(t),u=Math.floor(Math.max(0,l.x-Kre*o)),c=Math.floor(Math.max(0,l.y-Yre*o));return new ro(u,c,Math.min(o,this.imageWidth+u),Math.min(o,this.imageHeight+c))}alignMinBbox(t){let n=df(this.positions);return n.pad(n.width*t,n.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var gw=class extends jn{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],no([t[3],t[4]])]}};var so=class extends jn{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(no)}};var Cu=class{constructor(t,n){this._label=t,this._distance=n}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${to(this.distance)})`:""}`}};var Au=class extends ot{static assertIsValidLabeledBox(t,n){if(ot.assertIsValidBox(t,n),!La(t.label))throw new Error(`${n} - expected property label (${t.label}) to be a number`)}constructor(t,n){super(t);this._label=n}get label(){return this._label}};var or=class{constructor(t,n){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(n)||n.some(a=>!(a instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=n}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let n=t.descriptors.map(a=>new Float32Array(a));return new or(t.label,n)}};var yw=class extends Au{static assertIsValidPredictedBox(t,n){if(Au.assertIsValidLabeledBox(t,n),!Tu(t.score)||!Tu(t.classScore))throw new Error(`${n} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,n,a,r){super(t,n);this._score=a,this._classScore=r}get score(){return this._score}get classScore(){return this._classScore}};function za(e){return e.detection instanceof ft}function bs(e,t){return{...e,...{detection:t}}}function bw(){let e=window.fetch;if(!e)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:e,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function ff(e){let t="";if(!e)try{e=require("fs")}catch(a){t=a.toString()}return{readFile:e?a=>new Promise((r,s)=>{e.readFile(a,(i,o)=>i?s(i):r(o))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function xw(){let e=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,n=()=>{if(e)return new e;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},a=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},r=global.fetch,s=ff();return{Canvas:e||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:n,createImageElement:a,fetch:r,...s}}function vw(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var ww=hF(sC()),Zt;function ese(){if(!Zt)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return Zt}function kw(e){Zt=e}function Iw(){return vw()?kw(bw()):(0,ww.isNodejs)()?kw(xw()):null}function tse(e){if(Zt||Iw(),!Zt)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=Zt.Canvas,Image:n=Zt.Image}=e;Zt.Canvas=t,Zt.Image=n,Zt.createCanvasElement=e.createCanvasElement||(()=>new t),Zt.createImageElement=e.createImageElement||(()=>new n),Zt.ImageData=e.ImageData||Zt.ImageData,Zt.Video=e.Video||Zt.Video,Zt.fetch=e.fetch||Zt.fetch,Zt.readFile=e.readFile||Zt.readFile}var nt={getEnv:ese,setEnv:kw,initialize:Iw,createBrowserEnv:bw,createFileSystem:ff,createNodejsEnv:xw,monkeyPatch:tse,isBrowser:vw,isNodejs:ww.isNodejs};Iw();function xs(e){return!nt.isNodejs()&&typeof e=="string"?document.getElementById(e):e}function bn(e){let{Canvas:t,CanvasRenderingContext2D:n}=nt.getEnv();if(e instanceof n)return e;let a=xs(e);if(!(a instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let r=a.getContext("2d");if(!r)throw new Error("resolveContext2d - canvas 2d context is null");return r}var lr;(function(e){e.TOP_LEFT="TOP_LEFT",e.TOP_RIGHT="TOP_RIGHT",e.BOTTOM_LEFT="BOTTOM_LEFT",e.BOTTOM_RIGHT="BOTTOM_RIGHT"})(lr||(lr={}));var Cp=class{constructor(t={}){let{anchorPosition:n,backgroundColor:a,fontColor:r,fontSize:s,fontStyle:i,padding:o}=t;this.anchorPosition=n||lr.TOP_LEFT,this.backgroundColor=a||"rgba(0, 0, 0, 0.5)",this.fontColor=r||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=o||4}},vs=class{constructor(t,n,a={}){this.text=typeof t=="string"?[t]:t instanceof vs?t.text:t,this.anchor=n,this.options=new Cp(a)}measureWidth(t){let{padding:n}=this.options;return this.text.map(a=>t.measureText(a).width).reduce((a,r)=>a{let m=l+p.x,f=l+p.y+(h+1)*i;a.fillText(d,m,f)})}};var Nw=class{constructor(t={}){let{boxColor:n,lineWidth:a,label:r,drawLabelOptions:s}=t;this.boxColor=n||"rgba(0, 0, 255, 1)",this.lineWidth=a||2,this.label=r;let i={anchorPosition:lr.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Cp({...i,...s})}},gf=class{constructor(t,n={}){this.box=new ot(t),this.options=new Nw(n)}draw(t){let n=bn(t),{boxColor:a,lineWidth:r}=this.options,{x:s,y:i,width:o,height:l}=this.box;n.strokeStyle=a,n.lineWidth=r,n.strokeRect(s,i,o,l);let{label:u}=this.options;u&&new vs([u],{x:s-r/2,y:i},this.options.drawLabelOptions).draw(t)}};function nse(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof ft?a.score:za(a)?a.detection.score:void 0,s=a instanceof ft?a.box:za(a)?a.detection.box:new ot(a),i=r?`${to(r)}`:void 0;new gf(s,{label:i}).draw(e)})}function Fu(e){let{Image:t,Video:n}=nt.getEnv();return e instanceof t&&e.complete||e instanceof n&&e.readyState>=3}function yf(e){return new Promise((t,n)=>{if(e instanceof nt.getEnv().Canvas||Fu(e))return t(null);function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),n(s))}function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",r),s.currentTarget.removeEventListener("error",a),t(s))}e.addEventListener("load",r),e.addEventListener("error",a)})}function bf(e){return new Promise((t,n)=>{e instanceof Blob||n(new Error("bufferToImage - expected buf to be of type: Blob"));let a=new FileReader;a.onload=()=>{typeof a.result!="string"&&n(new Error("bufferToImage - expected reader.result to be a string, in onload"));let r=nt.getEnv().createImageElement();r.onload=()=>t(r),r.onerror=n,r.src=a.result},a.onerror=n,a.readAsDataURL(e)})}function ws(e){let{Image:t,Video:n}=nt.getEnv();return e instanceof t?new cn(e.naturalWidth,e.naturalHeight):e instanceof n?new cn(e.videoWidth,e.videoHeight):new cn(e.width,e.height)}function ks({width:e,height:t}){let{createCanvasElement:n}=nt.getEnv(),a=n();return a.width=e,a.height=t,a}function _u(e,t){let{ImageData:n}=nt.getEnv();if(!(e instanceof n)&&!Fu(e))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:a,height:r}=t||ws(e),s=ks({width:a,height:r});return e instanceof n?bn(s).putImageData(e,0,0):bn(s).drawImage(e,0,0,a,r),s}async function xf(e,t){let n=t||nt.getEnv().createCanvasElement(),[a,r,s]=e.shape.slice(ra(e)?1:0),i=M(()=>e.as3D(a,r,s).toInt());return await Fi.toPixels(i,n),i.dispose(),n}function Ap(e){let{Image:t,Canvas:n,Video:a}=nt.getEnv();return e instanceof t||e instanceof n||e instanceof a}function vf(e,t,n=!1){let{Image:a,Canvas:r}=nt.getEnv();if(!(e instanceof a||e instanceof r))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return ks({width:1,height:1});let s=ws(e),i=t/Math.max(s.height,s.width),o=i*s.width,l=i*s.height,u=ks({width:t,height:t}),c=e instanceof r?e:_u(e),p=Math.abs(o-l)/2,d=n&&o0&&c.height>0&&bn(u).drawImage(c,d,h,o,l),u}var ur=class{constructor(t,n=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=n,this._batchSize=t.length,t.forEach((a,r)=>{if(Fr(a)){this._imageTensors[r]=a,this._inputDimensions[r]=a.shape;return}if(ra(a)){let i=a.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[r]=a,this._inputDimensions[r]=a.shape.slice(1);return}let s=a instanceof nt.getEnv().Canvas?a:_u(a);this._canvases[r]=s,this._inputDimensions[r]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return ir(this.batchSize,0,1).map((t,n)=>this.getReshapedInputDimensions(n))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let n=this.getInputWidth(t),a=this.getInputHeight(t);return fw({width:n,height:a},this.inputSize)}toBatchTensor(t,n=!0){return this._inputSize=t,M(()=>{let a=ir(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof Fe){let o=ra(i)?i:i.expandDims();return o=mf(o,n),(o.shape[1]!==t||o.shape[2]!==t)&&(o=Ja.resizeBilinear(o,[t,t])),o.as3D(t,t,3)}if(i instanceof nt.getEnv().Canvas)return Fi.fromPixels(vf(i,t,n));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return Dt(a.map(s=>ue(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function mt(e){if(e instanceof ur)return e;let t=Array.isArray(e)?e:[e];if(!t.length)throw new Error("toNetInput - empty array passed as input");let n=r=>Array.isArray(e)?` at input index ${r}:`:"",a=t.map(xs);return a.forEach((r,s)=>{if(!Ap(r)&&!Fr(r)&&!ra(r))throw typeof t[s]=="string"?new Error(`toNetInput -${n(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${n(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(ra(r)){let i=r.shape[0];if(i!==1)throw new Error(`toNetInput -${n(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(a.map(r=>Ap(r)&&yf(r))),new ur(a,Array.isArray(e))}async function io(e,t){let{Canvas:n}=nt.getEnv(),a=e;if(!(e instanceof n)){let i=await mt(e);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let o=i.getInput(0);a=o instanceof n?o:await xf(o)}let r=bn(a);return t.map(i=>i instanceof ft?i.forSize(a.width,a.height).box.floor():i).map(i=>i.clipAtImageBorders(a.width,a.height)).map(({x:i,y:o,width:l,height:u})=>{let c=ks({width:l,height:u});return l>0&&u>0&&bn(c).putImageData(r.getImageData(i,o,l,u),0,0),c})}async function oo(e,t){if(!Fr(e)&&!ra(e))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(ra(e)&&e.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return M(()=>{let[n,a,r]=e.shape.slice(ra(e)?1:0);return t.map(o=>o instanceof ft?o.forSize(a,n).box:o).map(o=>o.clipAtImageBorders(a,n)).map(({x:o,y:l,width:u,height:c})=>Yl(e.as3D(n,a,r),[l,o,0],[c,u,r]))})}async function Is(e,t){let{fetch:n}=nt.getEnv(),a=await n(e,t);if(!(a.status<400))throw new Error(`failed to fetch: (${a.status}) ${a.statusText}, from url: ${a.url}`);return a}async function iC(e){let t=await Is(e),n=await t.blob();if(!n.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${n.type}, for url: ${t.url}`);return bf(n)}async function wf(e){return(await Is(e)).json()}async function oC(e){return new Float32Array(await(await Is(e)).arrayBuffer())}function kf(e,t){let n=`${t}-weights_manifest.json`;if(!e)return{modelBaseUri:"",manifestUri:n};if(e==="/")return{modelBaseUri:"/",manifestUri:`/${n}`};let a=e.startsWith("http://")?"http://":e.startsWith("https://")?"https://":"";e=e.replace(a,"");let r=e.split("/").filter(o=>o),s=e.endsWith(".json")?r[r.length-1]:n,i=a+(e.endsWith(".json")?r.slice(0,r.length-1):r).join("/");return i=e.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function If(e,t){let{manifestUri:n,modelBaseUri:a}=kf(e,t),r=await wf(n);return jt.loadWeights(r,a)}function lC(e,t,n=!1){let{width:a,height:r}=n?ws(t):t;return e.width=a,e.height=r,{width:a,height:r}}var en=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:n,objProp:a}=this.traversePropertyPath(t);return n[a]}reassignParamFromPath(t,n){let{obj:a,objProp:r}=this.traversePropertyPath(t);a[r].dispose(),a[r]=n}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof Kr)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof Kr))}variable(){this.getFrozenParams().forEach(({path:t,tensor:n})=>{this.reassignParamFromPath(t,n.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:n})=>{let a=Jn(n.dataSync());n.dispose(),this.reassignParamFromPath(t,a)})}dispose(t=!0){this.getParamList().forEach(n=>{if(t&&n.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${n.path}`);n.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,n)=>t.concat(n)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let n=await If(t,this.getDefaultModelName());this.loadFromWeightMap(n)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:n}=nt.getEnv(),{manifestUri:a,modelBaseUri:r}=kf(t,this.getDefaultModelName()),s=u=>Promise.all(u.map(c=>n(c).then(p=>p.buffer))),i=jt.weightsLoaderFactory(s),o=JSON.parse((await n(a)).toString()),l=await i(o,r);this.loadFromWeightMap(l)}loadFromWeightMap(t){let{paramMappings:n,params:a}=this.extractParamsFromWeightMap(t);this._paramMappings=n,this._params=a}extractWeights(t){let{paramMappings:n,params:a}=this.extractParams(t);this._paramMappings=n,this._params=a}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let n=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:a,objProp:r}=n;if(!a||!r||!(a[r]instanceof Fe))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:a,objProp:r}}};function Dn(e,t,n){return M(()=>{let a=Pi(e,t.depthwise_filter,t.pointwise_filter,n,"same");return a=J(a,t.bias),a})}function Nf(e,t,n=!1){return M(()=>{let a=qe(n?J(Et(e,t.conv0.filters,[2,2],"same"),t.conv0.bias):Dn(e,t.conv0,[2,2])),r=Dn(a,t.conv1,[1,1]),s=qe(J(a,r)),i=Dn(s,t.conv2,[1,1]);return qe(J(a,J(r,i)))})}function Fp(e,t,n=!1,a=!0){return M(()=>{let r=qe(n?J(Et(e,t.conv0.filters,a?[2,2]:[1,1],"same"),t.conv0.bias):Dn(e,t.conv0,a?[2,2]:[1,1])),s=Dn(r,t.conv1,[1,1]),i=qe(J(r,s)),o=Dn(i,t.conv2,[1,1]),l=qe(J(r,J(s,o))),u=Dn(l,t.conv3,[1,1]);return qe(J(r,J(s,J(o,u))))})}function lo(e,t,n="same",a=!1){return M(()=>{let r=J(Et(e,t.filters,[1,1],n),t.bias);return a?qe(r):r})}function xn(e,t){Object.keys(e).forEach(n=>{t.some(a=>a.originalPath===n)||e[n].dispose()})}function Eu(e,t){return(n,a,r,s)=>{let i=Aa(e(n*a*r*r),[r,r,n,a]),o=Ze(e(a));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:o}}}function Tf(e,t){return(n,a,r)=>{let s=Ca(e(n*a),[n,a]),i=Ze(e(a));return t.push({paramPath:`${r}/weights`},{paramPath:`${r}/bias`}),{weights:s,bias:i}}}var Sf=class{constructor(t,n,a){this.depthwise_filter=t;this.pointwise_filter=n;this.bias=a}};function $u(e,t){return(n,a,r)=>{let s=Aa(e(3*3*n),[3,3,n,1]),i=Aa(e(n*a),[1,1,n,a]),o=Ze(e(a));return t.push({paramPath:`${r}/depthwise_filter`},{paramPath:`${r}/pointwise_filter`},{paramPath:`${r}/bias`}),new Sf(s,i,o)}}function Du(e){return t=>{let n=e(`${t}/depthwise_filter`,4),a=e(`${t}/pointwise_filter`,4),r=e(`${t}/bias`,1);return new Sf(n,a,r)}}function qn(e,t){return(n,a,r)=>{let s=e[n];if(!eo(s,a))throw new Error(`expected weightMap[${n}] to be a Tensor${a}D, instead have ${s}`);return t.push({originalPath:n,paramPath:r||n}),s}}function vn(e){let t=e;function n(r){let s=t.slice(0,r);return t=t.slice(r),s}function a(){return t}return{extractWeights:n,getRemainingWeights:a}}function Cf(e,t){let n=Eu(e,t),a=$u(e,t);function r(i,o,l,u=!1){let c=u?n(i,o,3,`${l}/conv0`):a(i,o,`${l}/conv0`),p=a(o,o,`${l}/conv1`),d=a(o,o,`${l}/conv2`);return{conv0:c,conv1:p,conv2:d}}function s(i,o,l,u=!1){let{conv0:c,conv1:p,conv2:d}=r(i,o,l,u),h=a(o,o,`${l}/conv3`);return{conv0:c,conv1:p,conv2:d,conv3:h}}return{extractDenseBlock3Params:r,extractDenseBlock4Params:s}}function uC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=vn(e),{extractDenseBlock4Params:r}=Cf(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2"),l=r(128,256,"dense3");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o,dense3:l}}}function Af(e){return t=>{let n=e(`${t}/filters`,4),a=e(`${t}/bias`,1);return{filters:n,bias:a}}}function Ff(e,t){let n=qn(e,t),a=Af(n),r=Du(n);function s(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),c=r(`${o}/conv1`),p=r(`${o}/conv2`);return{conv0:u,conv1:c,conv2:p}}function i(o,l=!1){let u=l?a(`${o}/conv0`):r(`${o}/conv0`),c=r(`${o}/conv1`),p=r(`${o}/conv2`),d=r(`${o}/conv3`);return{conv0:u,conv1:c,conv2:p,conv3:d}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function cC(e){let t=[],{extractDenseBlock4Params:n}=Ff(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return xn(e,t),{params:a,paramMappings:t}}var _p=class extends en{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=wa(a,[122.782,117.001,104.298]).div(ce(255)),i=Fp(s,n.dense0,!0);return i=Fp(i,n.dense1),i=Fp(i,n.dense2),i=Fp(i,n.dense3),i=Zn(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return cC(t)}extractParams(t){return uC(t)}};function Ep(e,t){return M(()=>J(ze(e,t.weights),t.bias))}function pC(e,t,n){let a=[],{extractWeights:r,getRemainingWeights:s}=vn(e),o=Tf(r,a)(t,n,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:a,params:{fc:o}}}function dC(e){let t=[],n=qn(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:a("fc")};return xn(e,t),{params:r,paramMappings:t}}function _f(e){let t={},n={};return Object.keys(e).forEach(a=>{let r=a.startsWith("fc")?n:t;r[a]=e[a]}),{featureExtractorMap:t,classifierMap:n}}var $p=class extends en{constructor(t,n){super(t);this._faceFeatureExtractor=n}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:n}=this;if(!n)throw new Error(`${this._name} - load model before inference`);return M(()=>{let a=t instanceof ur?this.faceFeatureExtractor.forwardInput(t):t;return Ep(a.as2D(a.shape[0],-1),n.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:n,paramMappings:a}=this.extractClassifierParams(t);this._params=n,this._paramMappings=a}extractClassifierParams(t){return pC(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:n,classifierMap:a}=_f(t);return this.faceFeatureExtractor.loadFromWeightMap(n),dC(a)}extractParams(t){let n=this.getClassifierChannelsIn(),a=this.getClassifierChannelsOut(),r=a*n+a,s=t.slice(0,t.length-r),i=t.slice(t.length-r);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var Ef=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Er=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Ef.forEach((n,a)=>{this[n]=t[a]})}asSortedArray(){return Ef.map(t=>({expression:t,probability:this[t]})).sort((t,n)=>n.probability-t.probability)}};var Dp=class extends $p{constructor(t=new _p){super("FaceExpressionNet",t)}forwardInput(t){return M(()=>Sa(this.runNet(t)))}async forward(t){return this.forwardInput(await mt(t))}async predictExpressions(t){let n=await mt(t),a=await this.forwardInput(n),r=await Promise.all(ct(a).map(async i=>{let o=await i.data();return i.dispose(),o}));a.dispose();let s=r.map(i=>new Er(i));return n.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function $f(e){return e.expressions instanceof Er}function Mp(e,t){return{...e,...{expressions:t}}}function ase(e,t,n=.1,a){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof Er?s:$f(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let l=i.asSortedArray().filter(p=>p.probability>n),u=za(s)?s.detection.box.bottomLeft:a||new De(0,0);new vs(l.map(p=>`${p.expression} (${to(p.probability)})`),u).draw(e)})}function Ns(e){return za(e)&&e.landmarks instanceof jn&&e.unshiftedLandmarks instanceof jn&&e.alignedRect instanceof ft}function rse(e){let t=(o,l,u,c)=>Math.atan2(c-l,u-o)%Math.PI,n=o=>o*180/Math.PI,a={roll:void 0,pitch:void 0,yaw:void 0};if(!e||!e._positions||e._positions.length!==68)return a;let r=e._positions;a.roll=-t(r[36]._x,r[36]._y,r[45]._x,r[45]._y),a.pitch=t(0,Math.abs(r[0]._x-r[30]._x)/r[30]._x,Math.PI,Math.abs(r[16]._x-r[30]._x)/r[30]._x);let s=r.reduce((o,l)=>oo>l._y?o:l._y,-Infinity);return a.yaw=Math.PI*(e._imgDims._height/(i-s)/1.4-1),a}function uo(e,t){let{box:n}=e.detection,a=t.shiftBy(n.x,n.y),r=a.align(),{imageDims:s}=e.detection,i=new ft(e.detection.score,r.rescale(s.reverse()),s),o=rse(t);return{...e,...{landmarks:a,unshiftedLandmarks:t,alignedRect:i,angle:o}}}var Tw=class{constructor(t={}){let{drawLines:n=!0,drawPoints:a=!0,lineWidth:r,lineColor:s,pointSize:i,pointColor:o}=t;this.drawLines=n,this.drawPoints=a,this.lineWidth=r||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=o||"rgba(255, 0, 255, 1)"}},Sw=class{constructor(t,n={}){this.faceLandmarks=t,this.options=new Tw(n)}draw(t){let n=bn(t),{drawLines:a,drawPoints:r,lineWidth:s,lineColor:i,pointSize:o,pointColor:l}=this.options;if(a&&this.faceLandmarks instanceof so&&(n.strokeStyle=i,n.lineWidth=s,Ar(n,this.faceLandmarks.getJawOutline()),Ar(n,this.faceLandmarks.getLeftEyeBrow()),Ar(n,this.faceLandmarks.getRightEyeBrow()),Ar(n,this.faceLandmarks.getNose()),Ar(n,this.faceLandmarks.getLeftEye(),!0),Ar(n,this.faceLandmarks.getRightEye(),!0),Ar(n,this.faceLandmarks.getMouth(),!0)),r){n.strokeStyle=l,n.fillStyle=l;let u=c=>{n.beginPath(),n.arc(c.x,c.y,o,0,2*Math.PI),n.fill()};this.faceLandmarks.positions.forEach(u)}}};function sse(e,t){(Array.isArray(t)?t:[t]).forEach(a=>{let r=a instanceof jn?a:Ns(a)?a.landmarks:void 0;if(!r)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new Sw(r).draw(e)})}var hC="1.1.2";function ise(e,t){let n=Eu(e,t),a=$u(e,t);function r(i,o,l){let u=a(i,o,`${l}/separable_conv0`),c=a(o,o,`${l}/separable_conv1`),p=n(i,o,1,`${l}/expansion_conv`);return{separable_conv0:u,separable_conv1:c,expansion_conv:p}}function s(i,o){let l=a(i,i,`${o}/separable_conv0`),u=a(i,i,`${o}/separable_conv1`),c=a(i,i,`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:c}}return{extractConvParams:n,extractSeparableConvParams:a,extractReductionBlockParams:r,extractMainBlockParams:s}}function mC(e,t){let n=[],{extractWeights:a,getRemainingWeights:r}=vn(e),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:o,extractMainBlockParams:l}=ise(a,n),u=s(3,32,3,"entry_flow/conv_in"),c=o(32,64,"entry_flow/reduction_block_0"),p=o(64,128,"entry_flow/reduction_block_1"),d={conv_in:u,reduction_block_0:c,reduction_block_1:p},h={};ir(t,0,1).forEach(y=>{h[`main_block_${y}`]=l(128,`middle_flow/main_block_${y}`)});let m=o(128,256,"exit_flow/reduction_block"),f=i(256,512,"exit_flow/separable_conv"),g={reduction_block:m,separable_conv:f};if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:n,params:{entry_flow:d,middle_flow:h,exit_flow:g}}}function ose(e,t){let n=qn(e,t),a=Af(n),r=Du(n);function s(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),c=a(`${o}/expansion_conv`);return{separable_conv0:l,separable_conv1:u,expansion_conv:c}}function i(o){let l=r(`${o}/separable_conv0`),u=r(`${o}/separable_conv1`),c=r(`${o}/separable_conv2`);return{separable_conv0:l,separable_conv1:u,separable_conv2:c}}return{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}}function fC(e,t){let n=[],{extractConvParams:a,extractSeparableConvParams:r,extractReductionBlockParams:s,extractMainBlockParams:i}=ose(e,n),o=a("entry_flow/conv_in"),l=s("entry_flow/reduction_block_0"),u=s("entry_flow/reduction_block_1"),c={conv_in:o,reduction_block_0:l,reduction_block_1:u},p={};ir(t,0,1).forEach(f=>{p[`main_block_${f}`]=i(`middle_flow/main_block_${f}`)});let d=s("exit_flow/reduction_block"),h=r("exit_flow/separable_conv"),m={reduction_block:d,separable_conv:h};return xn(e,n),{params:{entry_flow:c,middle_flow:p,exit_flow:m},paramMappings:n}}function gC(e,t,n){return J(Et(e,t.filters,n,"same"),t.bias)}function Aw(e,t,n=!0){let a=n?qe(e):e;return a=Dn(a,t.separable_conv0,[1,1]),a=Dn(qe(a),t.separable_conv1,[1,1]),a=$t(a,[3,3],[2,2],"same"),a=J(a,gC(e,t.expansion_conv,[2,2])),a}function lse(e,t){let n=Dn(qe(e),t.separable_conv0,[1,1]);return n=Dn(qe(n),t.separable_conv1,[1,1]),n=Dn(qe(n),t.separable_conv2,[1,1]),n=J(n,e),n}var Fw=class extends en{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyXception - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=wa(a,[122.782,117.001,104.298]).div(ce(256)),i=qe(gC(s,n.entry_flow.conv_in,[2,2]));return i=Aw(i,n.entry_flow.reduction_block_0,!1),i=Aw(i,n.entry_flow.reduction_block_1),ir(this._numMainBlocks,0,1).forEach(o=>{i=lse(i,n.middle_flow[`main_block_${o}`])}),i=Aw(i,n.exit_flow.reduction_block),i=qe(Dn(i,n.exit_flow.separable_conv,[1,1])),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return fC(t,this._numMainBlocks)}extractParams(t){return mC(t,this._numMainBlocks)}};function yC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=vn(e),r=Tf(n,t),s=r(512,1,"fc/age"),i=r(512,2,"fc/gender");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function bC(e){let t=[],n=qn(e,t);function a(s){let i=n(`${s}/weights`,2),o=n(`${s}/bias`,1);return{weights:i,bias:o}}let r={fc:{age:a("fc/age"),gender:a("fc/gender")}};return xn(e,t),{params:r,paramMappings:t}}var cr;(function(e){e.FEMALE="female",e.MALE="male"})(cr||(cr={}));var Rp=class extends en{constructor(t=new Fw(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:n}=this;if(!n)throw new Error(`${this._name} - load model before inference`);return M(()=>{let a=t instanceof ur?this.faceFeatureExtractor.forwardInput(t):t,r=Zn(a,[7,7],[2,2],"valid").as2D(a.shape[0],-1),s=Ep(r,n.fc.age).as1D(),i=Ep(r,n.fc.gender);return{age:s,gender:i}})}forwardInput(t){return M(()=>{let{age:n,gender:a}=this.runNet(t);return{age:n,gender:Sa(a)}})}async forward(t){return this.forwardInput(await mt(t))}async predictAgeAndGender(t){let n=await mt(t),a=await this.forwardInput(n),r=ct(a.age),s=ct(a.gender),i=r.map((l,u)=>({ageTensor:l,genderTensor:s[u]})),o=await Promise.all(i.map(async({ageTensor:l,genderTensor:u})=>{let c=(await l.data())[0],p=(await u.data())[0],d=p>.5,h=d?cr.MALE:cr.FEMALE,m=d?p:1-p;return l.dispose(),u.dispose(),{age:c,gender:h,genderProbability:m}}));return a.age.dispose(),a.gender.dispose(),n.isBatchInput?o:o[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:n,paramMappings:a}=this.extractClassifierParams(t);this._params=n,this._paramMappings=a}extractClassifierParams(t){return yC(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:n,classifierMap:a}=_f(t);return this.faceFeatureExtractor.loadFromWeightMap(n),bC(a)}extractParams(t){let n=512*1+1+(512*2+2),a=t.slice(0,t.length-n),r=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(r)}};var Pp=class extends $p{postProcess(t,n,a){let r=a.map(({width:i,height:o})=>{let l=n/Math.max(o,i);return{width:i*l,height:o*l}}),s=r.length;return M(()=>{let i=(p,d)=>Dt([Cn([68],p,"float32"),Cn([68],d,"float32")],1).as2D(1,136).as1D(),o=(p,d)=>{let{width:h,height:m}=r[p];return d(h,m)?Math.abs(h-m)/2:0},l=p=>o(p,(d,h)=>do(p,(d,h)=>hi(l(d),u(d))))).div(Dt(Array.from(Array(s),(p,d)=>i(r[d].width,r[d].height))))})}forwardInput(t){return M(()=>{let n=this.runNet(t);return this.postProcess(n,t.inputSize,t.inputDimensions.map(([a,r])=>({height:a,width:r})))})}async forward(t){return this.forwardInput(await mt(t))}async detectLandmarks(t){let n=await mt(t),a=M(()=>ct(this.forwardInput(n))),r=await Promise.all(a.map(async(s,i)=>{let o=Array.from(await s.data()),l=o.filter((c,p)=>uf(p)),u=o.filter((c,p)=>!uf(p));return new so(Array(68).fill(0).map((c,p)=>new De(l[p],u[p])),{height:n.getInputHeight(i),width:n.getInputWidth(i)})}));return a.forEach(s=>s.dispose()),n.isBatchInput?r:r[0]}getClassifierChannelsOut(){return 136}};var co=class extends Pp{constructor(t=new _p){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function xC(e){let t=[],{extractDenseBlock3Params:n}=Ff(e,t),a={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2")};return xn(e,t),{params:a,paramMappings:t}}function vC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=vn(e),{extractDenseBlock3Params:r}=Cf(n,t),s=r(3,32,"dense0",!0),i=r(32,64,"dense1"),o=r(64,128,"dense2");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:o}}}var _w=class extends en{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("TinyFaceFeatureExtractor - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(112,!0),"float32"),s=wa(a,[122.782,117.001,104.298]).div(ce(255)),i=Nf(s,n.dense0,!0);return i=Nf(i,n.dense1),i=Nf(i,n.dense2),i=Zn(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await mt(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return xC(t)}extractParams(t){return vC(t)}};var Op=class extends Pp{constructor(t=new _w){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var Ew=class extends co{};function wC(e,t){return J(B(e,t.weights),t.biases)}function $w(e,t,n,a,r="same"){let{filters:s,bias:i}=t.conv,o=Et(e,s,n,r);return o=J(o,i),o=wC(o,t.scale),a?qe(o):o}function kC(e,t){return $w(e,t,[1,1],!0)}function Dw(e,t){return $w(e,t,[1,1],!1)}function Df(e,t){return $w(e,t,[2,2],!0,"valid")}function use(e,t){function n(o,l,u){let c=e(o),p=c.length/(l*u*u);if(mw(p))throw new Error(`depth has to be an integer: ${p}, weights.length: ${c.length}, numFilters: ${l}, filterSize: ${u}`);return M(()=>Ve(Aa(c,[l,p,u,u]),[2,3,1,0]))}function a(o,l,u,c){let p=n(o,l,u),d=Ze(e(l));return t.push({paramPath:`${c}/filters`},{paramPath:`${c}/bias`}),{filters:p,bias:d}}function r(o,l){let u=Ze(e(o)),c=Ze(e(o));return t.push({paramPath:`${l}/weights`},{paramPath:`${l}/biases`}),{weights:u,biases:c}}function s(o,l,u,c){let p=a(o,l,u,`${c}/conv`),d=r(l,`${c}/scale`);return{conv:p,scale:d}}function i(o,l,u,c,p=!1){let d=s((p?.5:1)*o,l,u,`${c}/conv1`),h=s(o,l,u,`${c}/conv2`);return{conv1:d,conv2:h}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function IC(e){let{extractWeights:t,getRemainingWeights:n}=vn(e),a=[],{extractConvLayerParams:r,extractResidualLayerParams:s}=use(t,a),i=r(4704,32,7,"conv32_down"),o=s(9216,32,3,"conv32_1"),l=s(9216,32,3,"conv32_2"),u=s(9216,32,3,"conv32_3"),c=s(36864,64,3,"conv64_down",!0),p=s(36864,64,3,"conv64_1"),d=s(36864,64,3,"conv64_2"),h=s(36864,64,3,"conv64_3"),m=s(147456,128,3,"conv128_down",!0),f=s(147456,128,3,"conv128_1"),g=s(147456,128,3,"conv128_2"),y=s(589824,256,3,"conv256_down",!0),b=s(589824,256,3,"conv256_1"),x=s(589824,256,3,"conv256_2"),v=s(589824,256,3,"conv256_down_out"),k=M(()=>Ve(Ca(t(256*128),[128,256]),[1,0]));if(a.push({paramPath:"fc"}),n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{params:{conv32_down:i,conv32_1:o,conv32_2:l,conv32_3:u,conv64_down:c,conv64_1:p,conv64_2:d,conv64_3:h,conv128_down:m,conv128_1:f,conv128_2:g,conv256_down:y,conv256_1:b,conv256_2:x,conv256_down_out:v,fc:k},paramMappings:a}}function cse(e,t){let n=qn(e,t);function a(i){let o=n(`${i}/scale/weights`,1),l=n(`${i}/scale/biases`,1);return{weights:o,biases:l}}function r(i){let o=n(`${i}/conv/filters`,4),l=n(`${i}/conv/bias`,1),u=a(i);return{conv:{filters:o,bias:l},scale:u}}function s(i){return{conv1:r(`${i}/conv1`),conv2:r(`${i}/conv2`)}}return{extractConvLayerParams:r,extractResidualLayerParams:s}}function NC(e){let t=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=cse(e,t),r=n("conv32_down"),s=a("conv32_1"),i=a("conv32_2"),o=a("conv32_3"),l=a("conv64_down"),u=a("conv64_1"),c=a("conv64_2"),p=a("conv64_3"),d=a("conv128_down"),h=a("conv128_1"),m=a("conv128_2"),f=a("conv256_down"),g=a("conv256_1"),y=a("conv256_2"),b=a("conv256_down_out"),{fc:x}=e;if(t.push({originalPath:"fc",paramPath:"fc"}),!hw(x))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${x}`);let v={conv32_down:r,conv32_1:s,conv32_2:i,conv32_3:o,conv64_down:l,conv64_1:u,conv64_2:c,conv64_3:p,conv128_down:d,conv128_1:h,conv128_2:m,conv256_down:f,conv256_1:g,conv256_2:y,conv256_down_out:b,fc:x};return xn(e,t),{params:v,paramMappings:t}}function Wa(e,t){let n=kC(e,t.conv1);return n=Dw(n,t.conv2),n=J(n,e),n=qe(n),n}function Lp(e,t){let n=Df(e,t.conv1);n=Dw(n,t.conv2);let a=Zn(e,2,2,"valid"),r=vt(a.shape),s=a.shape[3]!==n.shape[3];if(a.shape[1]!==n.shape[1]||a.shape[2]!==n.shape[2]){let o=[...n.shape];o[1]=1;let l=vt(o);n=Je([n,l],1);let u=[...n.shape];u[2]=1;let c=vt(u);n=Je([n,c],2)}return a=s?Je([a,r],3):a,n=J(a,n),n=qe(n),n}var po=class extends en{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("FaceRecognitionNet - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(150,!0),"float32"),s=wa(a,[122.782,117.001,104.298]).div(ce(256)),i=Df(s,n.conv32_down);i=$t(i,3,2,"valid"),i=Wa(i,n.conv32_1),i=Wa(i,n.conv32_2),i=Wa(i,n.conv32_3),i=Lp(i,n.conv64_down),i=Wa(i,n.conv64_1),i=Wa(i,n.conv64_2),i=Wa(i,n.conv64_3),i=Lp(i,n.conv128_down),i=Wa(i,n.conv128_1),i=Wa(i,n.conv128_2),i=Lp(i,n.conv256_down),i=Wa(i,n.conv256_1),i=Wa(i,n.conv256_2),i=Lp(i,n.conv256_down_out);let o=i.mean([1,2]);return ze(o,n.fc)})}async forward(t){return this.forwardInput(await mt(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)==null?void 0:s.some(i=>i<=0))return new Float32Array(128);let n=await mt(t),a=M(()=>ct(this.forwardInput(n))),r=await Promise.all(a.map(i=>i.data()));return a.forEach(i=>i.dispose()),n.isBatchInput?r:r[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return NC(t)}extractParams(t){return IC(t)}};function TC(e){let t=new po;return t.extractWeights(e),t}function zp(e,t){return{...e,...{descriptor:t}}}function SC(e){return typeof e.age=="number"}function Wp(e,t){return{...e,...{age:t}}}function CC(e){return(e.gender===cr.MALE||e.gender===cr.FEMALE)&&Tu(e.genderProbability)}function Bp(e,t,n){return{...e,...{gender:t,genderProbability:n}}}function pse(e,t){function n(l,u){let c=Aa(e(3*3*l),[3,3,l,1]),p=Ze(e(l)),d=Ze(e(l)),h=Ze(e(l)),m=Ze(e(l));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/batch_norm_scale`},{paramPath:`${u}/batch_norm_offset`},{paramPath:`${u}/batch_norm_mean`},{paramPath:`${u}/batch_norm_variance`}),{filters:c,batch_norm_scale:p,batch_norm_offset:d,batch_norm_mean:h,batch_norm_variance:m}}function a(l,u,c,p,d){let h=Aa(e(l*u*c*c),[c,c,l,u]),m=Ze(e(u));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/${d?"batch_norm_offset":"bias"}`}),{filters:h,bias:m}}function r(l,u,c,p){let{filters:d,bias:h}=a(l,u,c,p,!0);return{filters:d,batch_norm_offset:h}}function s(l,u,c){let p=n(l,`${c}/depthwise_conv`),d=r(l,u,1,`${c}/pointwise_conv`);return{depthwise_conv:p,pointwise_conv:d}}function i(){let l=r(3,32,3,"mobilenetv1/conv_0"),u=s(32,64,"mobilenetv1/conv_1"),c=s(64,128,"mobilenetv1/conv_2"),p=s(128,128,"mobilenetv1/conv_3"),d=s(128,256,"mobilenetv1/conv_4"),h=s(256,256,"mobilenetv1/conv_5"),m=s(256,512,"mobilenetv1/conv_6"),f=s(512,512,"mobilenetv1/conv_7"),g=s(512,512,"mobilenetv1/conv_8"),y=s(512,512,"mobilenetv1/conv_9"),b=s(512,512,"mobilenetv1/conv_10"),x=s(512,512,"mobilenetv1/conv_11"),v=s(512,1024,"mobilenetv1/conv_12"),k=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:l,conv_1:u,conv_2:c,conv_3:p,conv_4:d,conv_5:h,conv_6:m,conv_7:f,conv_8:g,conv_9:y,conv_10:b,conv_11:x,conv_12:v,conv_13:k}}function o(){let l=r(1024,256,1,"prediction_layer/conv_0"),u=r(256,512,3,"prediction_layer/conv_1"),c=r(512,128,1,"prediction_layer/conv_2"),p=r(128,256,3,"prediction_layer/conv_3"),d=r(256,128,1,"prediction_layer/conv_4"),h=r(128,256,3,"prediction_layer/conv_5"),m=r(256,64,1,"prediction_layer/conv_6"),f=r(64,128,3,"prediction_layer/conv_7"),g=a(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=a(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),b=a(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),x=a(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),v=a(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),k=a(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),w=a(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),S=a(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),A=a(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),F=a(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),D=a(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),R=a(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:l,conv_1:u,conv_2:c,conv_3:p,conv_4:d,conv_5:h,conv_6:m,conv_7:f,box_predictor_0:{box_encoding_predictor:g,class_predictor:y},box_predictor_1:{box_encoding_predictor:b,class_predictor:x},box_predictor_2:{box_encoding_predictor:v,class_predictor:k},box_predictor_3:{box_encoding_predictor:w,class_predictor:S},box_predictor_4:{box_encoding_predictor:A,class_predictor:F},box_predictor_5:{box_encoding_predictor:D,class_predictor:R}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:o}}function AC(e){let t=[],{extractWeights:n,getRemainingWeights:a}=vn(e),{extractMobilenetV1Params:r,extractPredictionLayerParams:s}=pse(n,t),i=r(),o=s(),u={extra_dim:dh(n(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:{mobilenetv1:i,prediction_layer:o,output_layer:u},paramMappings:t}}function dse(e,t){let n=qn(e,t);function a(u,c,p){let d=n(`${u}/Conv2d_${c}_pointwise/weights`,4,`${p}/filters`),h=n(`${u}/Conv2d_${c}_pointwise/convolution_bn_offset`,1,`${p}/batch_norm_offset`);return{filters:d,batch_norm_offset:h}}function r(u){let c=`mobilenetv1/conv_${u}`,p=`MobilenetV1/Conv2d_${u}_depthwise`,d=`${c}/depthwise_conv`,h=`${c}/pointwise_conv`,m=n(`${p}/depthwise_weights`,4,`${d}/filters`),f=n(`${p}/BatchNorm/gamma`,1,`${d}/batch_norm_scale`),g=n(`${p}/BatchNorm/beta`,1,`${d}/batch_norm_offset`),y=n(`${p}/BatchNorm/moving_mean`,1,`${d}/batch_norm_mean`),b=n(`${p}/BatchNorm/moving_variance`,1,`${d}/batch_norm_variance`);return{depthwise_conv:{filters:m,batch_norm_scale:f,batch_norm_offset:g,batch_norm_mean:y,batch_norm_variance:b},pointwise_conv:a("MobilenetV1",u,h)}}function s(){return{conv_0:a("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:r(1),conv_2:r(2),conv_3:r(3),conv_4:r(4),conv_5:r(5),conv_6:r(6),conv_7:r(7),conv_8:r(8),conv_9:r(9),conv_10:r(10),conv_11:r(11),conv_12:r(12),conv_13:r(13)}}function i(u,c){let p=n(`${u}/weights`,4,`${c}/filters`),d=n(`${u}/biases`,1,`${c}/bias`);return{filters:p,bias:d}}function o(u){let c=i(`Prediction/BoxPredictor_${u}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${u}/box_encoding_predictor`),p=i(`Prediction/BoxPredictor_${u}/ClassPredictor`,`prediction_layer/box_predictor_${u}/class_predictor`);return{box_encoding_predictor:c,class_predictor:p}}function l(){return{conv_0:a("Prediction",0,"prediction_layer/conv_0"),conv_1:a("Prediction",1,"prediction_layer/conv_1"),conv_2:a("Prediction",2,"prediction_layer/conv_2"),conv_3:a("Prediction",3,"prediction_layer/conv_3"),conv_4:a("Prediction",4,"prediction_layer/conv_4"),conv_5:a("Prediction",5,"prediction_layer/conv_5"),conv_6:a("Prediction",6,"prediction_layer/conv_6"),conv_7:a("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:o(0),box_predictor_1:o(1),box_predictor_2:o(2),box_predictor_3:o(3),box_predictor_4:o(4),box_predictor_5:o(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:l}}function FC(e){let t=[],{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=dse(e,t),r=e["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Fr(r))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${r}`);let s={mobilenetv1:n(),prediction_layer:a(),output_layer:{extra_dim:r}};return xn(e,t),{params:s,paramMappings:t}}function ka(e,t,n){return M(()=>{let a=Et(e,t.filters,n,"same");return a=J(a,t.batch_norm_offset),Xt(a,0,6)})}var hse=.0010000000474974513;function mse(e,t,n){return M(()=>{let a=ns(e,t.filters,n,"same");return a=br(a,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,hse),Xt(a,0,6)})}function fse(e){return[2,4,6,12].some(t=>t===e)?[2,2]:[1,1]}function _C(e,t){return M(()=>{let n,a=ka(e,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let o=i+1,l=fse(o);a=mse(a,s.depthwise_conv,l),a=ka(a,s.pointwise_conv,[1,1]),o===11&&(n=a)}),n===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:a,conv11:n}})}function gse(e,t,n){let a=e.arraySync(),r=Math.min(a[t][0],a[t][2]),s=Math.min(a[t][1],a[t][3]),i=Math.max(a[t][0],a[t][2]),o=Math.max(a[t][1],a[t][3]),l=Math.min(a[n][0],a[n][2]),u=Math.min(a[n][1],a[n][3]),c=Math.max(a[n][0],a[n][2]),p=Math.max(a[n][1],a[n][3]),d=(i-r)*(o-s),h=(c-l)*(p-u);if(d<=0||h<=0)return 0;let m=Math.max(r,l),f=Math.max(s,u),g=Math.min(i,c),y=Math.min(o,p),b=Math.max(g-m,0)*Math.max(y-f,0);return b/(d+h-b)}function EC(e,t,n,a,r){let s=e.shape[0],i=Math.min(n,s),o=t.map((c,p)=>({score:c,boxIndex:p})).filter(c=>c.score>r).sort((c,p)=>p.score-c.score),l=c=>c<=a?1:0,u=[];return o.forEach(c=>{if(u.length>=i)return;let p=c.score;for(let d=u.length-1;d>=0;--d){let h=gse(e,c.boxIndex,u[d]);if(h!==0&&(c.score*=l(h),c.score<=r))break}p===c.score&&u.push(c.boxIndex)}),u}function yse(e){let t=ct(Ve(e,[1,0])),n=[me(t[2],t[0]),me(t[3],t[1])],a=[J(t[0],xe(n[0],ce(2))),J(t[1],xe(n[1],ce(2)))];return{sizes:n,centers:a}}function bse(e,t){let{sizes:n,centers:a}=yse(e),r=ct(Ve(t,[1,0])),s=xe(B(hn(xe(r[2],ce(5))),n[0]),ce(2)),i=J(B(xe(r[0],ce(10)),n[0]),a[0]),o=xe(B(hn(xe(r[3],ce(5))),n[1]),ce(2)),l=J(B(xe(r[1],ce(10)),n[1]),a[1]);return Ve(Dt([me(i,s),me(l,o),J(i,s),J(l,o)]),[1,0])}function $C(e,t,n){return M(()=>{let a=e.shape[0],r=bse(H(qa(n.extra_dim,[a,1,1]),[-1,4]),H(e,[-1,4]));r=H(r,[a,r.shape[0]/a,4]);let s=da(Be(t,[0,0,1],[-1,-1,-1])),i=Be(s,[0,0,0],[-1,-1,1]);i=H(i,[a,i.shape[1]]);let o=ct(r),l=ct(i);return{boxes:o,scores:l}})}function ho(e,t){return M(()=>{let n=e.shape[0],a=H(lo(e,t.box_encoding_predictor),[n,-1,1,4]),r=H(lo(e,t.class_predictor),[n,-1,3]);return{boxPredictionEncoding:a,classPrediction:r}})}function DC(e,t,n){return M(()=>{let a=ka(e,n.conv_0,[1,1]),r=ka(a,n.conv_1,[2,2]),s=ka(r,n.conv_2,[1,1]),i=ka(s,n.conv_3,[2,2]),o=ka(i,n.conv_4,[1,1]),l=ka(o,n.conv_5,[2,2]),u=ka(l,n.conv_6,[1,1]),c=ka(u,n.conv_7,[2,2]),p=ho(t,n.box_predictor_0),d=ho(e,n.box_predictor_1),h=ho(r,n.box_predictor_2),m=ho(i,n.box_predictor_3),f=ho(l,n.box_predictor_4),g=ho(c,n.box_predictor_5),y=Je([p.boxPredictionEncoding,d.boxPredictionEncoding,h.boxPredictionEncoding,m.boxPredictionEncoding,f.boxPredictionEncoding,g.boxPredictionEncoding],1),b=Je([p.classPrediction,d.classPrediction,h.classPrediction,m.classPrediction,f.classPrediction,g.classPrediction],1);return{boxPredictions:y,classPredictions:b}})}var sa=class{constructor({minConfidence:t,maxResults:n}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=n||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Ts=class extends en{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:n}=this;if(!n)throw new Error("SsdMobilenetv1 - load model before inference");return M(()=>{let a=ue(t.toBatchTensor(512,!1),"float32"),r=me(B(a,ce(.007843137718737125)),ce(1)),s=_C(r,n.mobilenetv1),{boxPredictions:i,classPredictions:o}=DC(s.out,s.conv11,n.prediction_layer);return $C(i,o,n.output_layer)})}async forward(t){return this.forwardInput(await mt(t))}async locateFaces(t,n={}){let{maxResults:a,minConfidence:r}=new sa(n),s=await mt(t),{boxes:i,scores:o}=this.forwardInput(s),l=i[0],u=o[0];for(let x=1;x{let[v,k]=[Math.max(0,y[x][0]),Math.min(1,y[x][2])].map(A=>A*g),[w,S]=[Math.max(0,y[x][1]),Math.min(1,y[x][3])].map(A=>A*f);return new ft(c[x],new ro(w,v,S-w,k-v),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return l.dispose(),u.dispose(),b}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return FC(t)}extractParams(t){return AC(t)}};function Mw(e){let t=new Ts;return t.extractWeights(e),t}function MC(e){return Mw(e)}var Rw=class extends Ts{};var RC=.4,PC=[new De(.738768,.874946),new De(2.42204,2.65704),new De(4.30971,7.04493),new De(10.246,4.59428),new De(12.6868,11.8741)],OC=[new De(1.603231,2.094468),new De(6.041143,7.080126),new De(2.882459,3.518061),new De(4.266906,5.178857),new De(9.041765,10.66308)],LC=[117.001,114.697,97.404],zC="tiny_yolov2_model",WC="tiny_yolov2_separable_conv_model";var Mf=e=>typeof e=="number";function Rf(e){if(!e)throw new Error(`invalid config: ${e}`);if(typeof e.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${e.withSeparableConvs}`);if(!Mf(e.iouThreshold)||e.iouThreshold<0||e.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${e.iouThreshold}`);if(!Array.isArray(e.classes)||!e.classes.length||!e.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(e.classes)}`);if(!Array.isArray(e.anchors)||!e.anchors.length||!e.anchors.map(t=>t||{}).every(t=>Mf(t.x)&&Mf(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(e.anchors)}`);if(e.meanRgb&&(!Array.isArray(e.meanRgb)||e.meanRgb.length!==3||!e.meanRgb.every(Mf)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(e.meanRgb)}`)}function Mu(e){return M(()=>{let t=B(e,ce(.10000000149011612));return J(qe(me(e,t)),t)})}function $r(e,t){return M(()=>{let n=ta(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Et(n,t.conv.filters,[1,1],"valid"),n=me(n,t.bn.sub),n=B(n,t.bn.truediv),n=J(n,t.conv.bias),Mu(n)})}function Dr(e,t){return M(()=>{let n=ta(e,[[0,0],[1,1],[1,1],[0,0]]);return n=Pi(n,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),n=J(n,t.bias),Mu(n)})}function xse(e,t){let n=Eu(e,t);function a(i,o){let l=Ze(e(i)),u=Ze(e(i));return t.push({paramPath:`${o}/sub`},{paramPath:`${o}/truediv`}),{sub:l,truediv:u}}function r(i,o,l){let u=n(i,o,3,`${l}/conv`),c=a(o,`${l}/bn`);return{conv:u,bn:c}}let s=$u(e,t);return{extractConvParams:n,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}}function BC(e,t,n,a){let{extractWeights:r,getRemainingWeights:s}=vn(e),i=[],{extractConvParams:o,extractConvWithBatchNormParams:l,extractSeparableConvParams:u}=xse(r,i),c;if(t.withSeparableConvs){let[p,d,h,m,f,g,y,b,x]=a,v=t.isFirstLayerConv2d?o(p,d,3,"conv0"):u(p,d,"conv0"),k=u(d,h,"conv1"),w=u(h,m,"conv2"),S=u(m,f,"conv3"),A=u(f,g,"conv4"),F=u(g,y,"conv5"),D=b?u(y,b,"conv6"):void 0,R=x?u(b,x,"conv7"):void 0,L=o(x||b||y,5*n,1,"conv8");c={conv0:v,conv1:k,conv2:w,conv3:S,conv4:A,conv5:F,conv6:D,conv7:R,conv8:L}}else{let[p,d,h,m,f,g,y,b,x]=a,v=l(p,d,"conv0"),k=l(d,h,"conv1"),w=l(h,m,"conv2"),S=l(m,f,"conv3"),A=l(f,g,"conv4"),F=l(g,y,"conv5"),D=l(y,b,"conv6"),R=l(b,x,"conv7"),L=o(x,5*n,1,"conv8");c={conv0:v,conv1:k,conv2:w,conv3:S,conv4:A,conv5:F,conv6:D,conv7:R,conv8:L}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:c,paramMappings:i}}function vse(e,t){let n=qn(e,t);function a(o){let l=n(`${o}/sub`,1),u=n(`${o}/truediv`,1);return{sub:l,truediv:u}}function r(o){let l=n(`${o}/filters`,4),u=n(`${o}/bias`,1);return{filters:l,bias:u}}function s(o){let l=r(`${o}/conv`),u=a(`${o}/bn`);return{conv:l,bn:u}}let i=Du(n);return{extractConvParams:r,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function VC(e,t){let n=[],{extractConvParams:a,extractConvWithBatchNormParams:r,extractSeparableConvParams:s}=vse(e,n),i;if(t.withSeparableConvs){let o=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?a("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:o>7?s("conv6"):void 0,conv7:o>8?s("conv7"):void 0,conv8:a("conv8")}}else i={conv0:r("conv0"),conv1:r("conv1"),conv2:r("conv2"),conv3:r("conv3"),conv4:r("conv4"),conv5:r("conv5"),conv6:r("conv6"),conv7:r("conv7"),conv8:a("conv8")};return xn(e,n),{params:i,paramMappings:n}}var Ba=class{constructor({inputSize:t,scoreThreshold:n}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=n||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var Pw=class extends en{constructor(t){super("TinyYolov2");Rf(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,n){let a=$r(t,n.conv0);return a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv1),a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv2),a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv3),a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv4),a=$t(a,[2,2],[2,2],"same"),a=$r(a,n.conv5),a=$t(a,[2,2],[1,1],"same"),a=$r(a,n.conv6),a=$r(a,n.conv7),lo(a,n.conv8,"valid",!1)}runMobilenet(t,n){let a=this.config.isFirstLayerConv2d?Mu(lo(t,n.conv0,"valid",!1)):Dr(t,n.conv0);return a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv1),a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv2),a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv3),a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv4),a=$t(a,[2,2],[2,2],"same"),a=Dr(a,n.conv5),a=$t(a,[2,2],[1,1],"same"),a=n.conv6?Dr(a,n.conv6):a,a=n.conv7?Dr(a,n.conv7):a,lo(a,n.conv8,"valid",!1)}forwardInput(t,n){let{params:a}=this;if(!a)throw new Error("TinyYolov2 - load model before inference");return M(()=>{let r=ue(t.toBatchTensor(n,!1),"float32");return r=this.config.meanRgb?wa(r,this.config.meanRgb):r,r=r.div(ce(256)),this.config.withSeparableConvs?this.runMobilenet(r,a):this.runTinyYolov2(r,a)})}async forward(t,n){return this.forwardInput(await mt(t),n)}async detect(t,n={}){let{inputSize:a,scoreThreshold:r}=new Ba(n),s=await mt(t),i=await this.forwardInput(s,a),o=M(()=>ct(i)[0].expandDims()),l={width:s.getInputWidth(0),height:s.getInputHeight(0)},u=await this.extractBoxes(o,s.getReshapedInputDimensions(0),r);i.dispose(),o.dispose();let c=u.map(g=>g.box),p=u.map(g=>g.score),d=u.map(g=>g.classScore),h=u.map(g=>this.config.classes[g.label]);return hf(c.map(g=>g.rescale(a)),p,this.config.iouThreshold,!0).map(g=>new _r(p[g],d[g],h[g],c[g],l))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return VC(t,this.config)}extractParams(t){let n=this.config.filterSizes||Pw.DEFAULT_FILTER_SIZES,a=n?n.length:void 0;if(a!==7&&a!==8&&a!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${a} filterSizes in config`);return BC(t,this.config,this.boxEncodingSize,n)}async extractBoxes(t,n,a){let{width:r,height:s}=n,i=Math.max(r,s),o=i/r,l=i/s,u=t.shape[1],c=this.config.anchors.length,[p,d,h]=M(()=>{let y=t.reshape([u,u,c,this.boxEncodingSize]),b=y.slice([0,0,0,0],[u,u,c,4]),x=y.slice([0,0,0,4],[u,u,c,1]),v=this.withClassScores?Sa(y.slice([0,0,0,5],[u,u,c,this.config.classes.length]),3):ce(0);return[b,x,v]}),m=[],f=await d.array(),g=await p.array();for(let y=0;ya){let k=(b+Su(g[y][b][x][0]))/u*o,w=(y+Su(g[y][b][x][1]))/u*l,S=Math.exp(g[y][b][x][2])*this.config.anchors[x].x/u*o,A=Math.exp(g[y][b][x][3])*this.config.anchors[x].y/u*l,F=k-S/2,D=w-A/2,R={row:y,col:b,anchor:x},{classScore:L,label:W}=this.withClassScores?await this.extractPredictedClass(h,R):{classScore:1,label:0};m.push({box:new ao(F,D,F+S,D+A),score:v,classScore:v*L,label:W,...R})}}return p.dispose(),d.dispose(),h.dispose(),m}async extractPredictedClass(t,n){let{row:a,col:r,anchor:s}=n,i=await t.array();return Array(this.config.classes.length).fill(0).map((o,l)=>i[a][r][s][l]).map((o,l)=>({classScore:o,label:l})).reduce((o,l)=>o.classScore>l.classScore?o:l)}},Ru=Pw;Ru.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var mo=class extends Ru{constructor(t=!0){let n={withSeparableConvs:t,iouThreshold:RC,classes:["face"],...t?{anchors:OC,meanRgb:LC}:{anchors:PC,withClassScores:!0}};super(n)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new ft(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?WC:zC}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function UC(e,t=!0){let n=new mo(t);return n.extractWeights(e),n}var Vp=class extends Ba{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var ia=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function fo(e,t,n,a,r=({alignedRect:s})=>s){let s=e.map(l=>Ns(l)?r(l):l.detection),i=a||(t instanceof Fe?await oo(t,s):await io(t,s)),o=await n(i);return i.forEach(l=>l instanceof Fe&&l.dispose()),o}async function Pu(e,t,n,a,r){return fo([e],t,async s=>n(s[0]),a,r)}var GC=.4,HC=[new De(1.603231,2.094468),new De(6.041143,7.080126),new De(2.882459,3.518061),new De(4.266906,5.178857),new De(9.041765,10.66308)],jC=[117.001,114.697,97.404];var go=class extends Ru{constructor(){let t={withSeparableConvs:!0,iouThreshold:GC,classes:["face"],anchors:HC,meanRgb:jC,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,n){return(await this.detect(t,n)).map(r=>new ft(r.score,r.relativeBox,{width:r.imageWidth,height:r.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var Qe={ssdMobilenetv1:new Ts,tinyFaceDetector:new go,tinyYolov2:new mo,faceLandmark68Net:new co,faceLandmark68TinyNet:new Op,faceRecognitionNet:new po,faceExpressionNet:new Dp,ageGenderNet:new Rp},Ow=(e,t)=>Qe.ssdMobilenetv1.locateFaces(e,t),qC=(e,t)=>Qe.tinyFaceDetector.locateFaces(e,t),XC=(e,t)=>Qe.tinyYolov2.locateFaces(e,t),Lw=e=>Qe.faceLandmark68Net.detectLandmarks(e),KC=e=>Qe.faceLandmark68TinyNet.detectLandmarks(e),YC=e=>Qe.faceRecognitionNet.computeFaceDescriptor(e),JC=e=>Qe.faceExpressionNet.predictExpressions(e),QC=e=>Qe.ageGenderNet.predictAgeAndGender(e),zw=e=>Qe.ssdMobilenetv1.load(e),ZC=e=>Qe.tinyFaceDetector.load(e),eA=e=>Qe.tinyYolov2.load(e),tA=e=>Qe.faceLandmark68Net.load(e),nA=e=>Qe.faceLandmark68TinyNet.load(e),aA=e=>Qe.faceRecognitionNet.load(e),rA=e=>Qe.faceExpressionNet.load(e),sA=e=>Qe.ageGenderNet.load(e),iA=zw,oA=Ow,lA=Lw;var Ww=class extends ia{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.extractedFaces=a}},zu=class extends Ww{async run(){let t=await this.parentTask,n=await fo(t,this.input,async a=>Promise.all(a.map(r=>Qe.faceExpressionNet.predictExpressions(r))),this.extractedFaces);return t.map((a,r)=>Mp(a,n[r]))}withAgeAndGender(){return new Ou(this,this.input)}},Wu=class extends Ww{async run(){let t=await this.parentTask;if(!t)return;let n=await Pu(t,this.input,a=>Qe.faceExpressionNet.predictExpressions(a),this.extractedFaces);return Mp(t,n)}withAgeAndGender(){return new Lu(this,this.input)}},xo=class extends zu{withAgeAndGender(){return new yo(this,this.input)}withFaceDescriptors(){return new Mr(this,this.input)}},vo=class extends Wu{withAgeAndGender(){return new bo(this,this.input)}withFaceDescriptor(){return new Rr(this,this.input)}};var Bw=class extends ia{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.extractedFaces=a}},Ou=class extends Bw{async run(){let t=await this.parentTask,n=await fo(t,this.input,async a=>Promise.all(a.map(r=>Qe.ageGenderNet.predictAgeAndGender(r))),this.extractedFaces);return t.map((a,r)=>{let{age:s,gender:i,genderProbability:o}=n[r];return Wp(Bp(a,i,o),s)})}withFaceExpressions(){return new zu(this,this.input)}},Lu=class extends Bw{async run(){let t=await this.parentTask;if(!t)return;let{age:n,gender:a,genderProbability:r}=await Pu(t,this.input,s=>Qe.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return Wp(Bp(t,a,r),n)}withFaceExpressions(){return new Wu(this,this.input)}},yo=class extends Ou{withFaceExpressions(){return new xo(this,this.input)}withFaceDescriptors(){return new Mr(this,this.input)}},bo=class extends Lu{withFaceExpressions(){return new vo(this,this.input)}withFaceDescriptor(){return new Rr(this,this.input)}};var Up=class extends ia{constructor(t,n){super();this.parentTask=t;this.input=n}},Mr=class extends Up{async run(){let t=await this.parentTask;return(await fo(t,this.input,a=>Promise.all(a.map(r=>Qe.faceRecognitionNet.computeFaceDescriptor(r))),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}))).map((a,r)=>zp(t[r],a))}withFaceExpressions(){return new xo(this,this.input)}withAgeAndGender(){return new yo(this,this.input)}},Rr=class extends Up{async run(){let t=await this.parentTask;if(!t)return;let n=await Pu(t,this.input,a=>Qe.faceRecognitionNet.computeFaceDescriptor(a),null,a=>a.landmarks.align(null,{useDlibAlignment:!0}));return zp(t,n)}withFaceExpressions(){return new vo(this,this.input)}withAgeAndGender(){return new bo(this,this.input)}};var Gp=class extends ia{constructor(t,n,a){super();this.parentTask=t;this.input=n;this.useTinyLandmarkNet=a}get landmarkNet(){return this.useTinyLandmarkNet?Qe.faceLandmark68TinyNet:Qe.faceLandmark68Net}},Hp=class extends Gp{async run(){let t=await this.parentTask,n=t.map(s=>s.detection),a=this.input instanceof Fe?await oo(this.input,n):await io(this.input,n),r=await Promise.all(a.map(s=>this.landmarkNet.detectLandmarks(s)));return a.forEach(s=>s instanceof Fe&&s.dispose()),t.map((s,i)=>uo(s,r[i]))}withFaceExpressions(){return new xo(this,this.input)}withAgeAndGender(){return new yo(this,this.input)}withFaceDescriptors(){return new Mr(this,this.input)}},jp=class extends Gp{async run(){let t=await this.parentTask;if(!t)return;let{detection:n}=t,a=this.input instanceof Fe?await oo(this.input,[n]):await io(this.input,[n]),r=await this.landmarkNet.detectLandmarks(a[0]);return a.forEach(s=>s instanceof Fe&&s.dispose()),uo(t,r)}withFaceExpressions(){return new vo(this,this.input)}withAgeAndGender(){return new bo(this,this.input)}withFaceDescriptor(){return new Rr(this,this.input)}};var qp=class extends ia{constructor(t,n=new sa){super();this.input=t;this.options=n}},Bu=class extends qp{async run(){let{input:t,options:n}=this,a;if(n instanceof Vp)a=Qe.tinyFaceDetector.locateFaces(t,n);else if(n instanceof sa)a=Qe.ssdMobilenetv1.locateFaces(t,n);else if(n instanceof Ba)a=Qe.tinyYolov2.locateFaces(t,n);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return a}runAndExtendWithFaceDetections(){return new Promise(async t=>{let n=await this.run();t(n.map(a=>bs({},a)))})}withFaceLandmarks(t=!1){return new Hp(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new zu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Ou(this.runAndExtendWithFaceDetections(),this.input)}},Xp=class extends qp{async run(){let t=await new Bu(this.input,this.options),n=t[0];return t.forEach(a=>{a.score>n.score&&(n=a)}),n}runAndExtendWithFaceDetection(){return new Promise(async t=>{let n=await this.run();t(n?bs({},n):void 0)})}withFaceLandmarks(t=!1){return new jp(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Wu(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Lu(this.runAndExtendWithFaceDetection(),this.input)}};function uA(e,t=new sa){return new Xp(e,t)}function Kp(e,t=new sa){return new Bu(e,t)}async function Vw(e,t){return Kp(e,new sa(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function cA(e,t={}){return Kp(e,new Ba(t)).withFaceLandmarks().withFaceDescriptors()}var pA=Vw;function Pf(e,t){if(e.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let n=Array.from(e),a=Array.from(t);return Math.sqrt(n.map((r,s)=>r-a[s]).reduce((r,s)=>r+s**2,0))}var Yp=class{constructor(t,n=.6){this._distanceThreshold=n;let a=Array.isArray(t)?t:[t];if(!a.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let r=1,s=()=>`person ${r++}`;this._labeledDescriptors=a.map(i=>{if(i instanceof or)return i;if(i instanceof Float32Array)return new or(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new or(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,n){return n.map(a=>Pf(a,t)).reduce((a,r)=>a+r,0)/(n.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:n,label:a})=>new Cu(a,this.computeMeanDistance(t,n))).reduce((n,a)=>n.distancet.toJSON())}}static fromJSON(t){let n=t.labeledDescriptors.map(a=>or.fromJSON(a));return new Yp(n,t.distanceThreshold)}};function dA(e){let t=new go;return t.extractWeights(e),t}function Uw(e,t){let{width:n,height:a}=new cn(t.width,t.height);if(n<=0||a<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:n,height:a})}`);if(Array.isArray(e))return e.map(r=>Uw(r,{width:n,height:a}));if(Ns(e)){let r=e.detection.forSize(n,a),s=e.unshiftedLandmarks.forSize(r.box.width,r.box.height);return uo(bs(e,r),s)}return za(e)?bs(e,e.detection.forSize(n,a)):e instanceof jn||e instanceof ft?e.forSize(n,a):e}var kse=typeof process!="undefined",Ise=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",hA={faceapi:hC,node:kse,browser:Ise};return wse;})(); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/face-api.node-cpu.js b/dist/face-api.node-cpu.js index 1ef22ed..a3ee201 100644 --- a/dist/face-api.node-cpu.js +++ b/dist/face-api.node-cpu.js @@ -5,5 +5,5 @@ author: ' */ -var Vn=Object.create,sr=Object.defineProperty,Un=Object.getPrototypeOf,Xn=Object.prototype.hasOwnProperty,Jn=Object.getOwnPropertyNames,qn=Object.getOwnPropertyDescriptor;var jr=o=>sr(o,"__esModule",{value:!0});var Do=(o,t)=>()=>(t||(t={exports:{}},o(t.exports,t)),t.exports),ir=(o,t)=>{for(var e in t)sr(o,e,{get:t[e],enumerable:!0})},Zn=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Jn(t))!Xn.call(o,r)&&r!=="default"&&sr(o,r,{get:()=>t[r],enumerable:!(e=qn(t,r))||e.enumerable});return o},b=o=>Zn(jr(sr(o!=null?Vn(Un(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);var g=Do(Hr=>{var Kn=Object.create,Yr=Object.defineProperty,Qn=Object.getPrototypeOf,ta=Object.prototype.hasOwnProperty,ea=Object.getOwnPropertyNames,ra=Object.getOwnPropertyDescriptor,Eo=o=>Yr(o,"__esModule",{value:!0}),Mo=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ea(t))!ta.call(o,r)&&r!=="default"&&Yr(o,r,{get:()=>t[r],enumerable:!(e=ra(t,r))||e.enumerable});return o},oa=o=>Mo(Eo(Yr(o!=null?Kn(Qn(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);Eo(Hr);Mo(Hr,oa(require("@tensorflow/tfjs")))});var ko=Do((ca,Lo)=>{jr(ca);ir(ca,{isNodejs:()=>ma});function ma(){return typeof global=="object"&&!0&&typeof Lo!="undefined"&&typeof process!="undefined"&&!!process.version}});jr(exports);ir(exports,{AgeGenderNet:()=>je,BoundingBox:()=>Ut,Box:()=>D,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>Pt,ComputeFaceDescriptorsTaskBase:()=>Ze,ComputeSingleFaceDescriptorTask:()=>Dt,DetectAllFaceLandmarksTask:()=>tr,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Qe,DetectFacesTaskBase:()=>rr,DetectSingleFaceLandmarksTask:()=>er,DetectSingleFaceTask:()=>or,Dimensions:()=>A,FACE_EXPRESSION_LABELS:()=>Sr,FaceDetection:()=>M,FaceDetectionNet:()=>fo,FaceExpressionNet:()=>$e,FaceExpressions:()=>Ft,FaceLandmark68Net:()=>te,FaceLandmark68TinyNet:()=>Ye,FaceLandmarkNet:()=>mo,FaceLandmarks:()=>j,FaceLandmarks5:()=>Xr,FaceLandmarks68:()=>Jt,FaceMatch:()=>le,FaceMatcher:()=>ar,FaceRecognitionNet:()=>ee,Gender:()=>ht,LabeledBox:()=>fe,LabeledFaceDescriptors:()=>ut,NetInput:()=>ft,NeuralNetwork:()=>S,ObjectDetection:()=>vt,Point:()=>h,PredictedBox:()=>Jr,Rect:()=>Xt,SsdMobilenetv1:()=>Ht,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ae,TinyFaceDetectorOptions:()=>qe,TinyYolov2:()=>oe,TinyYolov2Options:()=>ct,allFaces:()=>Hn,allFacesSsdMobilenetv1:()=>_o,allFacesTinyYolov2:()=>jn,awaitMediaLoaded:()=>xr,bufferToImage:()=>br,computeFaceDescriptor:()=>En,createCanvas:()=>At,createCanvasFromMedia:()=>xe,createFaceDetectionNet:()=>dn,createFaceRecognitionNet:()=>en,createSsdMobilenetv1:()=>lo,createTinyFaceDetector:()=>Yn,createTinyYolov2:()=>yn,detectAllFaces:()=>nr,detectFaceLandmarks:()=>vo,detectFaceLandmarksTiny:()=>Dn,detectLandmarks:()=>$n,detectSingleFace:()=>On,draw:()=>ao,env:()=>P,euclideanDistance:()=>Or,extendWithAge:()=>Ve,extendWithFaceDescriptor:()=>ze,extendWithFaceDetection:()=>It,extendWithFaceExpressions:()=>Oe,extendWithFaceLandmarks:()=>Qt,extendWithGender:()=>Ue,extractFaceTensors:()=>Zt,extractFaces:()=>qt,fetchImage:()=>So,fetchJson:()=>Tr,fetchNetWeights:()=>Ao,fetchOrThrow:()=>Wt,getContext2dOrThrow:()=>W,getMediaDimensions:()=>St,imageTensorToCanvas:()=>vr,imageToSquare:()=>yr,inverseSigmoid:()=>Io,iou:()=>pr,isMediaElement:()=>ke,isMediaLoaded:()=>he,isWithAge:()=>rn,isWithFaceDetection:()=>nt,isWithFaceExpressions:()=>Ar,isWithFaceLandmarks:()=>$t,isWithGender:()=>on,loadAgeGenderModel:()=>Wn,loadFaceDetectionModel:()=>Bn,loadFaceExpressionModel:()=>An,loadFaceLandmarkModel:()=>Ln,loadFaceLandmarkTinyModel:()=>kn,loadFaceRecognitionModel:()=>Sn,loadSsdMobilenetv1Model:()=>yo,loadTinyFaceDetectorModel:()=>Nn,loadTinyYolov2Model:()=>In,loadWeightMap:()=>wr,locateFaces:()=>Rn,matchDimensions:()=>Bo,minBbox:()=>dr,nets:()=>_,nonMaxSuppression:()=>ur,normalize:()=>Z,padToSquare:()=>lr,predictAgeAndGender:()=>Cn,recognizeFaceExpressions:()=>Mn,resizeResults:()=>wo,resolveInput:()=>Lt,shuffleArray:()=>No,sigmoid:()=>ue,ssdMobilenetv1:()=>go,tf:()=>Gn,tinyFaceDetector:()=>wn,tinyYolov2:()=>Pn,toNetInput:()=>E,utils:()=>Gr,validateConfig:()=>$r,version:()=>zn});var Gn=b(g());var ao={};ir(ao,{AnchorPosition:()=>lt,DrawBox:()=>hr,DrawBoxOptions:()=>ro,DrawFaceLandmarks:()=>no,DrawFaceLandmarksOptions:()=>oo,DrawTextField:()=>kt,DrawTextFieldOptions:()=>Le,drawContour:()=>bt,drawDetections:()=>ua,drawFaceExpressions:()=>la,drawFaceLandmarks:()=>ha});function bt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var Gr={};ir(Gr,{computeReshapedDimensions:()=>Ur,getCenterPoint:()=>Vt,isDimensions:()=>mr,isEven:()=>cr,isFloat:()=>Vr,isTensor:()=>Gt,isTensor1D:()=>na,isTensor2D:()=>zr,isTensor3D:()=>gt,isTensor4D:()=>V,isValidNumber:()=>ot,isValidProbablitiy:()=>de,range:()=>pt,round:()=>zt});var Co=b(g());var A=class{constructor(t,e){if(!ot(t)||!ot(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new A(1/this.width,1/this.height)}};function Gt(o,t){return o instanceof Co.Tensor&&o.shape.length===t}function na(o){return Gt(o,1)}function zr(o){return Gt(o,2)}function gt(o){return Gt(o,3)}function V(o){return Gt(o,4)}function Vr(o){return o%1!=0}function cr(o){return o%2==0}function zt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function mr(o){return o&&o.width&&o.height}function Ur({width:o,height:t},e){let r=e/Math.max(t,o);return new A(Math.round(o*r),Math.round(t*r))}function Vt(o){return o.reduce((t,e)=>t.add(e),new h(0,0)).div(new h(o.length,o.length))}function pt(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function ot(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function de(o){return ot(o)&&o>=0&&o<=1}var h=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new h(this.x+t.x,this.y+t.y)}sub(t){return new h(this.x-t.x,this.y-t.y)}mul(t){return new h(this.x*t.x,this.y*t.y)}div(t){return new h(this.x/t.x,this.y/t.y)}abs(){return new h(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new h(Math.floor(this.x),Math.floor(this.y))}};var D=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(ot)}static assertIsValidBox(t,e,r=!1){if(!D.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(ot),a=[r.x,r.y,r.width,r.height].every(ot);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];D.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new h(this.left,this.top)}get topRight(){return new h(this.right,this.top)}get bottomLeft(){return new h(this.left,this.bottom)}get bottomRight(){return new h(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new D({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new D({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-d+e+r,d=e),u>t&&(c=-u+t+n,u=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:u,x:m,ex:d,w:r,h:n}}calibrate(t){return new D({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Ut=class extends D{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var vt=class{constructor(t,e,r,n,a){this._imageDims=new A(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new D(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new D(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new vt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends vt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function pr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function dr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var dt=b(g());function Z(o,t){return dt.tidy(()=>{let[e,r,n]=t,a=dt.fill([...o.shape.slice(0,3),1],e,"float32"),s=dt.fill([...o.shape.slice(0,3),1],r,"float32"),i=dt.fill([...o.shape.slice(0,3),1],n,"float32"),c=dt.concat([a,s,i],3);return dt.sub(o,c)})}var Nt=b(g());function lr(o,t=!1){return Nt.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=u=>{let l=o.shape.slice();return l[s]=u,Nt.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],d=[t&&m?i(m):null,o,c].filter(u=>!!u).map(u=>Nt.cast(u,"float32"));return Nt.concat(d,s)})}function No(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function ue(o){return 1/(1+Math.exp(-o))}function Io(o){return Math.log(o/(1-o))}var Xt=class extends D{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var aa=.5,sa=.43,ia=.45,j=class{constructor(t,e,r=new h(0,0)){let{width:n,height:a}=e;this._imgDims=new A(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new h(n,a)).add(r))}get shift(){return new h(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new h(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new h(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new D(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=d=>n.sub(d).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/ia),c=Vt(t),m=Math.floor(Math.max(0,c.x-aa*i)),p=Math.floor(Math.max(0,c.y-sa*i));return new Xt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=dr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Xr=class extends j{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Vt([t[3],t[4]])]}};var Jt=class extends j{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Vt)}};var le=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${zt(this.distance)})`:""}`}};var fe=class extends D{static assertIsValidLabeledBox(t,e){if(D.assertIsValidBox(t,e),!ot(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t);this._label=e}get label(){return this._label}};var ut=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new ut(t.label,e)}};var Jr=class extends fe{static assertIsValidPredictedBox(t,e){if(fe.assertIsValidLabeledBox(t,e),!de(t.score)||!de(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,n){super(t,e);this._score=r,this._classScore=n}get score(){return this._score}get classScore(){return this._classScore}};function nt(o){return o.detection instanceof M}function It(o,t){return{...o,...{detection:t}}}function qr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function fr(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Zr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch,a=fr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:n,...a}}function Kr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var Qr=b(ko()),k;function pa(){if(!k)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return k}function to(o){k=o}function eo(){return Kr()?to(qr()):(0,Qr.isNodejs)()?to(Zr()):null}function da(o){if(k||eo(),!k)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=k.Canvas,Image:e=k.Image}=o;k.Canvas=t,k.Image=e,k.createCanvasElement=o.createCanvasElement||(()=>new t),k.createImageElement=o.createImageElement||(()=>new e),k.ImageData=o.ImageData||k.ImageData,k.Video=o.Video||k.Video,k.fetch=o.fetch||k.fetch,k.readFile=o.readFile||k.readFile}var P={getEnv:pa,setEnv:to,initialize:eo,createBrowserEnv:qr,createFileSystem:fr,createNodejsEnv:Zr,monkeyPatch:da,isBrowser:Kr,isNodejs:Qr.isNodejs};eo();function Lt(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function W(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Lt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var lt;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(lt||(lt={}));var Le=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||lt.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},kt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof kt?t.text:t,this.anchor=e,this.options=new Le(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let v=c+d.x,w=c+d.y+(l+1)*s;r.fillText(u,v,w)})}};var ro=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:lt.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Le({...s,...a})}},hr=class{constructor(t,e={}){this.box=new D(t),this.options=new ro(e)}draw(t){let e=W(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new kt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function ua(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:nt(r)?r.detection.score:void 0,a=r instanceof M?r.box:nt(r)?r.detection.box:new D(r),s=n?`${zt(n)}`:void 0;new hr(a,{label:s}).draw(o)})}var Te=b(g());function he(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function xr(o){return new Promise((t,e)=>{if(o instanceof P.getEnv().Canvas||he(o))return t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function br(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function St(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new A(o.naturalWidth,o.naturalHeight):o instanceof e?new A(o.videoWidth,o.videoHeight):new A(o.width,o.height)}function At({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function xe(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!he(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||St(o),a=At({width:r,height:n});return o instanceof e?W(a).putImageData(o,0,0):W(a).drawImage(o,0,0,r,n),a}var gr=b(g());async function vr(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(V(o)?1:0),s=gr.tidy(()=>o.as3D(r,n,a).toInt());return await gr.browser.toPixels(s,e),s.dispose(),e}function ke(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var K=b(g());function yr(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return At({width:1,height:1});let a=St(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=At({width:t,height:t}),p=o instanceof n?o:xe(o),d=Math.abs(i-c)/2,u=e&&i0&&p.height>0&&W(m).drawImage(p,u,l,i,c),m}var ft=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(gt(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(V(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:xe(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return pt(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Ur({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,K.tidy(()=>{let r=pt(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof K.Tensor){let i=V(s)?s:s.expandDims();return i=lr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=K.image.resizeBilinear(i,[t,t])),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return K.browser.fromPixels(yr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return K.stack(r.map(a=>K.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function E(o){if(o instanceof ft)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Lt);return r.forEach((n,a)=>{if(!ke(n)&&!gt(n)&&!V(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(V(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ke(n)&&xr(n))),new ft(r,Array.isArray(o))}async function qt(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await E(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await vr(i)}let n=W(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=At({width:c,height:m});return c>0&&m>0&&W(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var Fr=b(g());async function Zt(o,t){if(!gt(o)&&!V(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(V(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return Fr.tidy(()=>{let[e,r,n]=o.shape.slice(V(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).map(({x:i,y:c,width:m,height:p})=>Fr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function Wt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function So(o){let t=await Wt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return br(e)}async function Tr(o){return(await Wt(o)).json()}async function Ao(o){return new Float32Array(await(await Wt(o)).arrayBuffer())}var Wo=b(g());function _r(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function wr(o,t){let{manifestUri:e,modelBaseUri:r}=_r(o,t),n=await Tr(e);return Wo.io.loadWeights(n,r)}function Bo(o,t,e=!1){let{width:r,height:n}=e?St(t):t;return o.width=r,o.height=n,{width:r,height:n}}var Rt=b(g());var yt=b(g());var S=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof yt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof yt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=yt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await wr(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=_r(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(d=>d.buffer))),s=yt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof yt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var C=b(g());var be=b(g());function O(o,t,e){return be.tidy(()=>{let r=be.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=be.add(r,t.bias),r})}function Pr(o,t,e=!1){return C.tidy(()=>{let r=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):O(o,t.conv0,[2,2])),n=O(r,t.conv1,[1,1]),a=C.relu(C.add(r,n)),s=O(a,t.conv2,[1,1]);return C.relu(C.add(r,C.add(n,s)))})}function Se(o,t,e=!1,r=!0){return C.tidy(()=>{let n=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):O(o,t.conv0,r?[2,2]:[1,1])),a=O(n,t.conv1,[1,1]),s=C.relu(C.add(n,a)),i=O(s,t.conv2,[1,1]),c=C.relu(C.add(n,C.add(a,i))),m=O(c,t.conv3,[1,1]);return C.relu(C.add(n,C.add(a,C.add(i,m))))})}var Bt=b(g());function Kt(o,t,e="same",r=!1){return Bt.tidy(()=>{let n=Bt.add(Bt.conv2d(o,t.filters,[1,1],e),t.bias);return r?Bt.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var Dr=b(g());function ge(o,t){return(e,r,n,a)=>{let s=Dr.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Dr.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var Er=b(g());function Mr(o,t){return(e,r,n)=>{let a=Er.tensor2d(o(e*r),[e,r]),s=Er.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Ae=b(g());var Cr=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ve(o,t){return(e,r,n)=>{let a=Ae.tensor4d(o(3*3*e),[3,3,e,1]),s=Ae.tensor4d(o(e*r),[1,1,e,r]),i=Ae.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Cr(a,s,i)}}function ye(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Cr(e,r,n)}}function H(o,t){return(e,r,n)=>{let a=o[e];if(!Gt(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function Nr(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),d=r(i,i,`${c}/conv1`),u=r(i,i,`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function a(s,i,c,m=!1){let{conv0:p,conv1:d,conv2:u}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function Ir(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function Lr(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:d}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`),u=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:d,conv3:u}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function $o(o){let t=[],{extractDenseBlock4Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var We=class extends S{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return Rt.tidy(()=>{let r=Rt.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Rt.scalar(255)),s=Se(a,e.dense0,!0);return s=Se(s,e.dense1),s=Se(s,e.dense2),s=Se(s,e.dense3),s=Rt.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return $o(t)}extractParams(t){return Ro(t)}};var Ho=b(g());var Fe=b(g());function Be(o,t){return Fe.tidy(()=>Fe.add(Fe.matMul(o,t.weights),t.bias))}function Oo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=Mr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function jo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function kr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Re=class extends S{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return Ho.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t;return Be(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Oo(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),jo(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,a=t.slice(0,t.length-n),s=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Sr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Ft=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Sr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Sr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var $e=class extends Re{constructor(t=new We){super("FaceExpressionNet",t)}forwardInput(t){return Te.tidy(()=>Te.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await E(t))}async predictExpressions(t){let e=await E(t),r=await this.forwardInput(e),n=await Promise.all(Te.unstack(r).map(async s=>{let i=await s.data();return s.dispose(),i}));r.dispose();let a=n.map(s=>new Ft(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Ar(o){return o.expressions instanceof Ft}function Oe(o,t){return{...o,...{expressions:t}}}function la(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof Ft?a:Ar(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(d=>d.probability>e),m=nt(a)?a.detection.box.bottomLeft:r||new h(0,0);new kt(c.map(d=>`${d.expression} (${zt(d.probability)})`),m).draw(o)})}function $t(o){return nt(o)&&o.landmarks instanceof j&&o.unshiftedLandmarks instanceof j&&o.alignedRect instanceof M}function fa(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function Qt(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=fa(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var oo=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},no=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new oo(e)}draw(t){let e=W(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Jt&&(e.strokeStyle=s,e.lineWidth=a,bt(e,this.faceLandmarks.getJawOutline()),bt(e,this.faceLandmarks.getLeftEyeBrow()),bt(e,this.faceLandmarks.getRightEyeBrow()),bt(e,this.faceLandmarks.getNose()),bt(e,this.faceLandmarks.getLeftEye(),!0),bt(e,this.faceLandmarks.getRightEye(),!0),bt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function ha(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof j?r:$t(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new no(n).draw(o)})}var Yo="1.1.1";var xt=b(g());var I=b(g());function xa(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Go(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=xa(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),d=i(64,128,"entry_flow/reduction_block_1"),u={conv_in:m,reduction_block_0:p,reduction_block_1:d},l={};pt(t,0,1).forEach(y=>{l[`main_block_${y}`]=c(128,`middle_flow/main_block_${y}`)});let v=i(128,256,"exit_flow/reduction_block"),w=s(256,512,"exit_flow/separable_conv"),x={reduction_block:v,separable_conv:w};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:u,middle_flow:l,exit_flow:x}}}function ba(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function zo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=ba(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},d={};pt(t,0,1).forEach(w=>{d[`main_block_${w}`]=s(`middle_flow/main_block_${w}`)});let u=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),v={reduction_block:u,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:d,exit_flow:v},paramMappings:e}}function Vo(o,t,e){return I.add(I.conv2d(o,t.filters,e,"same"),t.bias)}function so(o,t,e=!0){let r=e?I.relu(o):o;return r=O(r,t.separable_conv0,[1,1]),r=O(I.relu(r),t.separable_conv1,[1,1]),r=I.maxPool(r,[3,3],[2,2],"same"),r=I.add(r,Vo(o,t.expansion_conv,[2,2])),r}function ga(o,t){let e=O(I.relu(o),t.separable_conv0,[1,1]);return e=O(I.relu(e),t.separable_conv1,[1,1]),e=O(I.relu(e),t.separable_conv2,[1,1]),e=I.add(e,o),e}var io=class extends S{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return I.tidy(()=>{let r=I.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(I.scalar(256)),s=I.relu(Vo(a,e.entry_flow.conv_in,[2,2]));return s=so(s,e.entry_flow.reduction_block_0,!1),s=so(s,e.entry_flow.reduction_block_1),pt(this._numMainBlocks,0,1).forEach(i=>{s=ga(s,e.middle_flow[`main_block_${i}`])}),s=so(s,e.exit_flow.reduction_block),s=I.relu(O(s,e.exit_flow.separable_conv,[1,1])),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return zo(t,this._numMainBlocks)}extractParams(t){return Go(t,this._numMainBlocks)}};function Uo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=Mr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function Xo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var ht;(function(o){o.FEMALE="female",o.MALE="male"})(ht||(ht={}));var je=class extends S{constructor(t=new io(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return xt.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t,n=xt.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),a=Be(n,e.fc.age).as1D(),s=Be(n,e.fc.gender);return{age:a,gender:s}})}forwardInput(t){return xt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:xt.softmax(r)}})}async forward(t){return this.forwardInput(await E(t))}async predictAgeAndGender(t){let e=await E(t),r=await this.forwardInput(e),n=xt.unstack(r.age),a=xt.unstack(r.gender),s=n.map((c,m)=>({ageTensor:c,genderTensor:a[m]})),i=await Promise.all(s.map(async({ageTensor:c,genderTensor:m})=>{let p=(await c.data())[0],d=(await m.data())[0],u=d>.5,l=u?ht.MALE:ht.FEMALE,v=u?d:1-d;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:v}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?i:i[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Uo(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Xo(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),n=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var Y=b(g());var He=class extends Re{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return Y.tidy(()=>{let s=(d,u)=>Y.stack([Y.fill([68],d,"float32"),Y.fill([68],u,"float32")],1).as2D(1,136).as1D(),i=(d,u)=>{let{width:l,height:v}=n[d];return u(l,v)?Math.abs(l-v)/2:0},c=d=>i(d,(u,l)=>ui(d,(u,l)=>ls(c(u),m(u))))).div(Y.stack(Array.from(Array(a),(d,u)=>s(n[u].width,n[u].height))))})}forwardInput(t){return Y.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await E(t))}async detectLandmarks(t){let e=await E(t),r=Y.tidy(()=>Y.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(await a.data()),c=i.filter((p,d)=>cr(d)),m=i.filter((p,d)=>!cr(d));return new Jt(Array(68).fill(0).map((p,d)=>new h(c[d],m[d])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var te=class extends He{constructor(t=new We){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var Ot=b(g());function Jo(o){let t=[],{extractDenseBlock3Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function qo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var co=class extends S{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Ot.tidy(()=>{let r=Ot.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Ot.scalar(255)),s=Pr(a,e.dense0,!0);return s=Pr(s,e.dense1),s=Pr(s,e.dense2),s=Ot.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Jo(t)}extractParams(t){return qo(t)}};var Ye=class extends He{constructor(t=new co){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var mo=class extends te{};var U=b(g());var _e=b(g());var Wr=b(g());function Zo(o,t){return Wr.add(Wr.mul(o,t.weights),t.biases)}function po(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=_e.conv2d(o,a,e,n);return i=_e.add(i,s),i=Zo(i,t.scale),r?_e.relu(i):i}function Ko(o,t){return po(o,t,[1,1],!0)}function uo(o,t){return po(o,t,[1,1],!1)}function Br(o,t){return po(o,t,[2,2],!0,"valid")}var G=b(g());function va(o,t){function e(i,c,m){let p=o(i),d=p.length/(c*m*m);if(Vr(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return G.tidy(()=>G.transpose(G.tensor4d(p,[c,d,m,m]),[2,3,1,0]))}function r(i,c,m,p){let d=e(i,c,m),u=G.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:u}}function n(i,c){let m=G.tensor1d(o(i)),p=G.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let d=r(i,c,m,`${p}/conv`),u=n(c,`${p}/scale`);return{conv:d,scale:u}}function s(i,c,m,p,d=!1){let u=a((d?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:u,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Qo(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=va(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),d=a(36864,64,3,"conv64_1"),u=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),v=a(147456,128,3,"conv128_down",!0),w=a(147456,128,3,"conv128_1"),x=a(147456,128,3,"conv128_2"),y=a(589824,256,3,"conv256_down",!0),T=a(589824,256,3,"conv256_1"),F=a(589824,256,3,"conv256_2"),L=a(589824,256,3,"conv256_down_out"),z=G.tidy(()=>G.transpose(G.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:d,conv64_2:u,conv64_3:l,conv128_down:v,conv128_1:w,conv128_2:x,conv256_down:y,conv256_1:T,conv256_2:F,conv256_down_out:L,fc:z},paramMappings:r}}function ya(o,t){let e=H(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function tn(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=ya(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),d=r("conv64_3"),u=r("conv128_down"),l=r("conv128_1"),v=r("conv128_2"),w=r("conv256_down"),x=r("conv256_1"),y=r("conv256_2"),T=r("conv256_down_out"),{fc:F}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!zr(F))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${F}`);let L={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:d,conv128_down:u,conv128_1:l,conv128_2:v,conv256_down:w,conv256_1:x,conv256_2:y,conv256_down_out:T,fc:F};return B(o,t),{params:L,paramMappings:t}}var $=b(g());function at(o,t){let e=Ko(o,t.conv1);return e=uo(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ge(o,t){let e=Br(o,t.conv1);e=uo(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var ee=class extends S{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return U.tidy(()=>{let r=U.cast(t.toBatchTensor(150,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(U.scalar(256)),s=Br(a,e.conv32_down);s=U.maxPool(s,3,2,"valid"),s=at(s,e.conv32_1),s=at(s,e.conv32_2),s=at(s,e.conv32_3),s=Ge(s,e.conv64_down),s=at(s,e.conv64_1),s=at(s,e.conv64_2),s=at(s,e.conv64_3),s=Ge(s,e.conv128_down),s=at(s,e.conv128_1),s=at(s,e.conv128_2),s=Ge(s,e.conv256_down),s=at(s,e.conv256_1),s=at(s,e.conv256_2),s=Ge(s,e.conv256_down_out);let i=s.mean([1,2]);return U.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await E(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)==null?void 0:a.some(s=>s<=0))return new Float32Array(128);let e=await E(t),r=U.tidy(()=>U.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return tn(t)}extractParams(t){return Qo(t)}};function en(o){let t=new ee;return t.extractWeights(o),t}function ze(o,t){return{...o,...{descriptor:t}}}function rn(o){return typeof o.age=="number"}function Ve(o,t){return{...o,...{age:t}}}function on(o){return(o.gender===ht.MALE||o.gender===ht.FEMALE)&&de(o.genderProbability)}function Ue(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var it=b(g());var st=b(g());function Fa(o,t){function e(c,m){let p=st.tensor4d(o(3*3*c),[3,3,c,1]),d=st.tensor1d(o(c)),u=st.tensor1d(o(c)),l=st.tensor1d(o(c)),v=st.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:u,batch_norm_mean:l,batch_norm_variance:v}}function r(c,m,p,d,u){let l=st.tensor4d(o(c*m*p*p),[p,p,c,m]),v=st.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${u?"batch_norm_offset":"bias"}`}),{filters:l,bias:v}}function n(c,m,p,d){let{filters:u,bias:l}=r(c,m,p,d,!0);return{filters:u,batch_norm_offset:l}}function a(c,m,p){let d=e(c,`${p}/depthwise_conv`),u=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:u}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),d=a(128,128,"mobilenetv1/conv_3"),u=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),v=a(256,512,"mobilenetv1/conv_6"),w=a(512,512,"mobilenetv1/conv_7"),x=a(512,512,"mobilenetv1/conv_8"),y=a(512,512,"mobilenetv1/conv_9"),T=a(512,512,"mobilenetv1/conv_10"),F=a(512,512,"mobilenetv1/conv_11"),L=a(512,1024,"mobilenetv1/conv_12"),z=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,conv_8:x,conv_9:y,conv_10:T,conv_11:F,conv_12:L,conv_13:z}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),d=n(128,256,3,"prediction_layer/conv_3"),u=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),v=n(256,64,1,"prediction_layer/conv_6"),w=n(64,128,3,"prediction_layer/conv_7"),x=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),T=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),F=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),L=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),z=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),mt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Et=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Mt=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Ct=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,box_predictor_0:{box_encoding_predictor:x,class_predictor:y},box_predictor_1:{box_encoding_predictor:T,class_predictor:F},box_predictor_2:{box_encoding_predictor:L,class_predictor:z},box_predictor_3:{box_encoding_predictor:rt,class_predictor:mt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Et},box_predictor_5:{box_encoding_predictor:Mt,class_predictor:Ct}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function nn(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Fa(e,t),s=n(),i=a(),m={extra_dim:st.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Ta(o,t){let e=H(o,t);function r(m,p,d){let u=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:u,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,d=`MobilenetV1/Conv2d_${m}_depthwise`,u=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,v=e(`${d}/depthwise_weights`,4,`${u}/filters`),w=e(`${d}/BatchNorm/gamma`,1,`${u}/batch_norm_scale`),x=e(`${d}/BatchNorm/beta`,1,`${u}/batch_norm_offset`),y=e(`${d}/BatchNorm/moving_mean`,1,`${u}/batch_norm_mean`),T=e(`${d}/BatchNorm/moving_variance`,1,`${u}/batch_norm_variance`);return{depthwise_conv:{filters:v,batch_norm_scale:w,batch_norm_offset:x,batch_norm_mean:y,batch_norm_variance:T},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let d=e(`${m}/weights`,4,`${p}/filters`),u=e(`${m}/biases`,1,`${p}/bias`);return{filters:d,bias:u}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),d=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function an(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Ta(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!gt(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var Tt=b(g());var jt=b(g());function Q(o,t,e){return jt.tidy(()=>{let r=jt.conv2d(o,t.filters,e,"same");return r=jt.add(r,t.batch_norm_offset),jt.clipByValue(r,0,6)})}var _a=.0010000000474974513;function wa(o,t,e){return Tt.tidy(()=>{let r=Tt.depthwiseConv2d(o,t.filters,e,"same");return r=Tt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,_a),Tt.clipByValue(r,0,6)})}function Pa(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function sn(o,t){return Tt.tidy(()=>{let e,r=Q(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=Pa(i);r=wa(r,a.depthwise_conv,c),r=Q(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function Da(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),d=Math.max(r[e][1],r[e][3]),u=(s-n)*(i-a),l=(p-c)*(d-m);if(u<=0||l<=0)return 0;let v=Math.max(n,c),w=Math.max(a,m),x=Math.min(s,p),y=Math.min(i,d),T=Math.max(x-v,0)*Math.max(y-w,0);return T/(u+l-T)}function cn(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>n).sort((p,d)=>d.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let d=p.score;for(let u=m.length-1;u>=0;--u){let l=Da(o,p.boxIndex,m[u]);if(l!==0&&(p.score*=c(l),p.score<=n))break}d===p.score&&m.push(p.boxIndex)}),m}var f=b(g());function Ea(o){let t=f.unstack(f.transpose(o,[1,0])),e=[f.sub(t[2],t[0]),f.sub(t[3],t[1])],r=[f.add(t[0],f.div(e[0],f.scalar(2))),f.add(t[1],f.div(e[1],f.scalar(2)))];return{sizes:e,centers:r}}function Ma(o,t){let{sizes:e,centers:r}=Ea(o),n=f.unstack(f.transpose(t,[1,0])),a=f.div(f.mul(f.exp(f.div(n[2],f.scalar(5))),e[0]),f.scalar(2)),s=f.add(f.mul(f.div(n[0],f.scalar(10)),e[0]),r[0]),i=f.div(f.mul(f.exp(f.div(n[3],f.scalar(5))),e[1]),f.scalar(2)),c=f.add(f.mul(f.div(n[1],f.scalar(10)),e[1]),r[1]);return f.transpose(f.stack([f.sub(s,a),f.sub(c,i),f.add(s,a),f.add(c,i)]),[1,0])}function mn(o,t,e){return f.tidy(()=>{let r=o.shape[0],n=Ma(f.reshape(f.tile(e.extra_dim,[r,1,1]),[-1,4]),f.reshape(o,[-1,4]));n=f.reshape(n,[r,n.shape[0]/r,4]);let a=f.sigmoid(f.slice(t,[0,0,1],[-1,-1,-1])),s=f.slice(a,[0,0,0],[-1,-1,1]);s=f.reshape(s,[r,s.shape[1]]);let i=f.unstack(n),c=f.unstack(s);return{boxes:i,scores:c}})}var Je=b(g());var Xe=b(g());function re(o,t){return Xe.tidy(()=>{let e=o.shape[0],r=Xe.reshape(Kt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Xe.reshape(Kt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function pn(o,t,e){return Je.tidy(()=>{let r=Q(o,e.conv_0,[1,1]),n=Q(r,e.conv_1,[2,2]),a=Q(n,e.conv_2,[1,1]),s=Q(a,e.conv_3,[2,2]),i=Q(s,e.conv_4,[1,1]),c=Q(i,e.conv_5,[2,2]),m=Q(c,e.conv_6,[1,1]),p=Q(m,e.conv_7,[2,2]),d=re(t,e.box_predictor_0),u=re(o,e.box_predictor_1),l=re(n,e.box_predictor_2),v=re(s,e.box_predictor_3),w=re(c,e.box_predictor_4),x=re(p,e.box_predictor_5),y=Je.concat([d.boxPredictionEncoding,u.boxPredictionEncoding,l.boxPredictionEncoding,v.boxPredictionEncoding,w.boxPredictionEncoding,x.boxPredictionEncoding],1),T=Je.concat([d.classPrediction,u.classPrediction,l.classPrediction,v.classPrediction,w.classPrediction,x.classPrediction],1);return{boxPredictions:y,classPredictions:T}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Ht=class extends S{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return it.tidy(()=>{let r=it.cast(t.toBatchTensor(512,!1),"float32"),n=it.sub(it.mul(r,it.scalar(.007843137718737125)),it.scalar(1)),a=sn(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=pn(a.out,a.conv11,e.prediction_layer);return mn(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await E(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await E(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let F=1;F{let[L,z]=[Math.max(0,y[F][0]),Math.min(1,y[F][2])].map(q=>q*x),[rt,mt]=[Math.max(0,y[F][1]),Math.min(1,y[F][3])].map(q=>q*w);return new M(p[F],new Xt(rt,L,mt-rt,z-L),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),T}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return an(t)}extractParams(t){return nn(t)}};function lo(o){let t=new Ht;return t.extractWeights(o),t}function dn(o){return lo(o)}var fo=class extends Ht{};var un=.4,ln=[new h(.738768,.874946),new h(2.42204,2.65704),new h(4.30971,7.04493),new h(10.246,4.59428),new h(12.6868,11.8741)],fn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],hn=[117.001,114.697,97.404],xn="tiny_yolov2_model",bn="tiny_yolov2_separable_conv_model";var N=b(g());var Rr=o=>typeof o=="number";function $r(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Rr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Rr(t.x)&&Rr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Rr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var et=b(g());var tt=b(g());function we(o){return tt.tidy(()=>{let t=tt.mul(o,tt.scalar(.10000000149011612));return tt.add(tt.relu(tt.sub(o,t)),t)})}function _t(o,t){return et.tidy(()=>{let e=et.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=et.conv2d(e,t.conv.filters,[1,1],"valid"),e=et.sub(e,t.bn.sub),e=et.mul(e,t.bn.truediv),e=et.add(e,t.conv.bias),we(e)})}var Yt=b(g());function wt(o,t){return Yt.tidy(()=>{let e=Yt.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Yt.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=Yt.add(e,t.bias),we(e)})}var ho=b(g());function Ca(o,t){let e=ge(o,t);function r(s,i){let c=ho.tensor1d(o(s)),m=ho.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ve(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function gn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=Ca(n,s),p;if(t.withSeparableConvs){let[d,u,l,v,w,x,y,T,F]=r,L=t.isFirstLayerConv2d?i(d,u,3,"conv0"):m(d,u,"conv0"),z=m(u,l,"conv1"),rt=m(l,v,"conv2"),mt=m(v,w,"conv3"),q=m(w,x,"conv4"),Et=m(x,y,"conv5"),Mt=T?m(y,T,"conv6"):void 0,Ct=F?m(T,F,"conv7"):void 0,pe=i(F||T||y,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}else{let[d,u,l,v,w,x,y,T,F]=r,L=c(d,u,"conv0"),z=c(u,l,"conv1"),rt=c(l,v,"conv2"),mt=c(v,w,"conv3"),q=c(w,x,"conv4"),Et=c(x,y,"conv5"),Mt=c(y,T,"conv6"),Ct=c(T,F,"conv7"),pe=i(F,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function Na(o,t){let e=H(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=ye(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function vn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=Na(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var ct=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var xo=class extends S{constructor(t){super("TinyYolov2");$r(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=_t(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=_t(r,e.conv6),r=_t(r,e.conv7),Kt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?we(Kt(t,e.conv0,"valid",!1)):wt(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?wt(r,e.conv6):r,r=e.conv7?wt(r,e.conv7):r,Kt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let n=N.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?Z(n,this.config.meanRgb):n,n=n.div(N.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(n,r):this.runTinyYolov2(n,r)})}async forward(t,e){return this.forwardInput(await E(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:n}=new ct(e),a=await E(t),s=await this.forwardInput(a,r),i=N.tidy(()=>N.unstack(s)[0].expandDims()),c={width:a.getInputWidth(0),height:a.getInputHeight(0)},m=await this.extractBoxes(i,a.getReshapedInputDimensions(0),n);s.dispose(),i.dispose();let p=m.map(x=>x.box),d=m.map(x=>x.score),u=m.map(x=>x.classScore),l=m.map(x=>this.config.classes[x.label]);return ur(p.map(x=>x.rescale(r)),d,this.config.iouThreshold,!0).map(x=>new vt(d[x],u[x],l[x],p[x],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return vn(t,this.config)}extractParams(t){let e=this.config.filterSizes||xo.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return gn(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:n,height:a}=e,s=Math.max(n,a),i=s/n,c=s/a,m=t.shape[1],p=this.config.anchors.length,[d,u,l]=N.tidy(()=>{let y=t.reshape([m,m,p,this.boxEncodingSize]),T=y.slice([0,0,0,0],[m,m,p,4]),F=y.slice([0,0,0,4],[m,m,p,1]),L=this.withClassScores?N.softmax(y.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):N.scalar(0);return[T,F,L]}),v=[],w=await u.array(),x=await d.array();for(let y=0;yr){let z=(T+ue(x[y][T][F][0]))/m*i,rt=(y+ue(x[y][T][F][1]))/m*c,mt=Math.exp(x[y][T][F][2])*this.config.anchors[F].x/m*i,q=Math.exp(x[y][T][F][3])*this.config.anchors[F].y/m*c,Et=z-mt/2,Mt=rt-q/2,Ct={row:y,col:T,anchor:F},{classScore:pe,label:Po}=this.withClassScores?await this.extractPredictedClass(l,Ct):{classScore:1,label:0};v.push({box:new Ut(Et,Mt,Et+mt,Mt+q),score:L,classScore:L*pe,label:Po,...Ct})}}return d.dispose(),u.dispose(),l.dispose(),v}async extractPredictedClass(t,e){let{row:r,col:n,anchor:a}=e,s=await t.array();return Array(this.config.classes.length).fill(0).map((i,c)=>s[r][n][a][c]).map((i,c)=>({classScore:i,label:c})).reduce((i,c)=>i.classScore>c.classScore?i:c)}},Pe=xo;Pe.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var oe=class extends Pe{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:un,classes:["face"],...t?{anchors:fn,meanRgb:hn}:{anchors:ln,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?bn:xn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function yn(o,t=!0){let e=new oe(t);return e.extractWeights(o),e}var qe=class extends ct{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Ke=b(g());var bo=b(g());async function ne(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>$t(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await Zt(t,a):await qt(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function De(o,t,e,r,n){return ne([o],t,async a=>e(a[0]),r,n)}var Fn=.4,Tn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],_n=[117.001,114.697,97.404];var ae=class extends Pe{constructor(){let t={withSeparableConvs:!0,iouThreshold:Fn,classes:["face"],anchors:Tn,meanRgb:_n,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var _={ssdMobilenetv1:new Ht,tinyFaceDetector:new ae,tinyYolov2:new oe,faceLandmark68Net:new te,faceLandmark68TinyNet:new Ye,faceRecognitionNet:new ee,faceExpressionNet:new $e,ageGenderNet:new je},go=(o,t)=>_.ssdMobilenetv1.locateFaces(o,t),wn=(o,t)=>_.tinyFaceDetector.locateFaces(o,t),Pn=(o,t)=>_.tinyYolov2.locateFaces(o,t),vo=o=>_.faceLandmark68Net.detectLandmarks(o),Dn=o=>_.faceLandmark68TinyNet.detectLandmarks(o),En=o=>_.faceRecognitionNet.computeFaceDescriptor(o),Mn=o=>_.faceExpressionNet.predictExpressions(o),Cn=o=>_.ageGenderNet.predictAgeAndGender(o),yo=o=>_.ssdMobilenetv1.load(o),Nn=o=>_.tinyFaceDetector.load(o),In=o=>_.tinyYolov2.load(o),Ln=o=>_.faceLandmark68Net.load(o),kn=o=>_.faceLandmark68TinyNet.load(o),Sn=o=>_.faceRecognitionNet.load(o),An=o=>_.faceExpressionNet.load(o),Wn=o=>_.ageGenderNet.load(o),Bn=yo,Rn=go,$n=vo;var Fo=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ce=class extends Fo{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>Oe(r,e[n]))}withAgeAndGender(){return new Ee(this,this.input)}},Ne=class extends Fo{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceExpressionNet.predictExpressions(r),this.extractedFaces);return Oe(t,e)}withAgeAndGender(){return new Me(this,this.input)}},ce=class extends Ce{withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},me=class extends Ne{withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var To=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ee=class extends To{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Ve(Ue(r,s,i),a)})}withFaceExpressions(){return new Ce(this,this.input)}},Me=class extends To{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await De(t,this.input,a=>_.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Ve(Ue(t,r,n),e)}withFaceExpressions(){return new Ne(this,this.input)}},se=class extends Ee{withFaceExpressions(){return new ce(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},ie=class extends Me{withFaceExpressions(){return new me(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var Ze=class extends J{constructor(t,e){super();this.parentTask=t;this.input=e}},Pt=class extends Ze{async run(){let t=await this.parentTask;return(await ne(t,this.input,r=>Promise.all(r.map(n=>_.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>ze(t[n],r))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}},Dt=class extends Ze{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return ze(t,e)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}};var Qe=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?_.faceLandmark68TinyNet:_.faceLandmark68Net}},tr=class extends Qe{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof Ke.Tensor?await Zt(this.input,e):await qt(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),t.map((a,s)=>Qt(a,n[s]))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},er=class extends Qe{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Ke.Tensor?await Zt(this.input,[e]):await qt(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),Qt(t,n)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var rr=class extends J{constructor(t,e=new X){super();this.input=t;this.options=e}},Ie=class extends rr{async run(){let{input:t,options:e}=this,r;if(e instanceof qe)r=_.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=_.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ct)r=_.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>It({},r)))})}withFaceLandmarks(t=!1){return new tr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Ce(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Ee(this.runAndExtendWithFaceDetections(),this.input)}},or=class extends rr{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?It({},e):void 0)})}withFaceLandmarks(t=!1){return new er(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Ne(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Me(this.runAndExtendWithFaceDetection(),this.input)}};function On(o,t=new X){return new or(o,t)}function nr(o,t=new X){return new Ie(o,t)}async function _o(o,t){return nr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function jn(o,t={}){return nr(o,new ct(t)).withFaceLandmarks().withFaceDescriptors()}var Hn=_o;function Or(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var ar=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof ut)return s;if(s instanceof Float32Array)return new ut(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new ut(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>Or(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new le(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>ut.fromJSON(r));return new ar(e,t.distanceThreshold)}};function Yn(o){let t=new ae;return t.extractWeights(o),t}function wo(o,t){let{width:e,height:r}=new A(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>wo(n,{width:e,height:r}));if($t(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return Qt(It(o,n),a)}return nt(o)?It(o,o.detection.forSize(e,r)):o instanceof j||o instanceof M?o.forSize(e,r):o}var Ia=typeof process!="undefined",La=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",zn={faceapi:Yo,node:Ia,browser:La};0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); +var Vn=Object.create,sr=Object.defineProperty,Un=Object.getPrototypeOf,Xn=Object.prototype.hasOwnProperty,Jn=Object.getOwnPropertyNames,qn=Object.getOwnPropertyDescriptor;var jr=o=>sr(o,"__esModule",{value:!0});var Do=(o,t)=>()=>(t||(t={exports:{}},o(t.exports,t)),t.exports),ir=(o,t)=>{for(var e in t)sr(o,e,{get:t[e],enumerable:!0})},Zn=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Jn(t))!Xn.call(o,r)&&r!=="default"&&sr(o,r,{get:()=>t[r],enumerable:!(e=qn(t,r))||e.enumerable});return o},b=o=>Zn(jr(sr(o!=null?Vn(Un(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);var g=Do(Hr=>{var Kn=Object.create,Yr=Object.defineProperty,Qn=Object.getPrototypeOf,ta=Object.prototype.hasOwnProperty,ea=Object.getOwnPropertyNames,ra=Object.getOwnPropertyDescriptor,Eo=o=>Yr(o,"__esModule",{value:!0}),Mo=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ea(t))!ta.call(o,r)&&r!=="default"&&Yr(o,r,{get:()=>t[r],enumerable:!(e=ra(t,r))||e.enumerable});return o},oa=o=>Mo(Eo(Yr(o!=null?Kn(Qn(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);Eo(Hr);Mo(Hr,oa(require("@tensorflow/tfjs")))});var ko=Do((ca,Lo)=>{jr(ca);ir(ca,{isNodejs:()=>ma});function ma(){return typeof global=="object"&&!0&&typeof Lo!="undefined"&&typeof process!="undefined"&&!!process.version}});jr(exports);ir(exports,{AgeGenderNet:()=>je,BoundingBox:()=>Ut,Box:()=>D,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>Pt,ComputeFaceDescriptorsTaskBase:()=>Ze,ComputeSingleFaceDescriptorTask:()=>Dt,DetectAllFaceLandmarksTask:()=>tr,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Qe,DetectFacesTaskBase:()=>rr,DetectSingleFaceLandmarksTask:()=>er,DetectSingleFaceTask:()=>or,Dimensions:()=>A,FACE_EXPRESSION_LABELS:()=>Sr,FaceDetection:()=>M,FaceDetectionNet:()=>fo,FaceExpressionNet:()=>$e,FaceExpressions:()=>Ft,FaceLandmark68Net:()=>te,FaceLandmark68TinyNet:()=>Ye,FaceLandmarkNet:()=>mo,FaceLandmarks:()=>j,FaceLandmarks5:()=>Xr,FaceLandmarks68:()=>Jt,FaceMatch:()=>le,FaceMatcher:()=>ar,FaceRecognitionNet:()=>ee,Gender:()=>ht,LabeledBox:()=>fe,LabeledFaceDescriptors:()=>ut,NetInput:()=>ft,NeuralNetwork:()=>S,ObjectDetection:()=>vt,Point:()=>h,PredictedBox:()=>Jr,Rect:()=>Xt,SsdMobilenetv1:()=>Ht,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ae,TinyFaceDetectorOptions:()=>qe,TinyYolov2:()=>oe,TinyYolov2Options:()=>ct,allFaces:()=>Hn,allFacesSsdMobilenetv1:()=>_o,allFacesTinyYolov2:()=>jn,awaitMediaLoaded:()=>xr,bufferToImage:()=>br,computeFaceDescriptor:()=>En,createCanvas:()=>At,createCanvasFromMedia:()=>xe,createFaceDetectionNet:()=>dn,createFaceRecognitionNet:()=>en,createSsdMobilenetv1:()=>lo,createTinyFaceDetector:()=>Yn,createTinyYolov2:()=>yn,detectAllFaces:()=>nr,detectFaceLandmarks:()=>vo,detectFaceLandmarksTiny:()=>Dn,detectLandmarks:()=>$n,detectSingleFace:()=>On,draw:()=>ao,env:()=>P,euclideanDistance:()=>Or,extendWithAge:()=>Ve,extendWithFaceDescriptor:()=>ze,extendWithFaceDetection:()=>It,extendWithFaceExpressions:()=>Oe,extendWithFaceLandmarks:()=>Qt,extendWithGender:()=>Ue,extractFaceTensors:()=>Zt,extractFaces:()=>qt,fetchImage:()=>So,fetchJson:()=>Tr,fetchNetWeights:()=>Ao,fetchOrThrow:()=>Wt,getContext2dOrThrow:()=>W,getMediaDimensions:()=>St,imageTensorToCanvas:()=>vr,imageToSquare:()=>yr,inverseSigmoid:()=>Io,iou:()=>pr,isMediaElement:()=>ke,isMediaLoaded:()=>he,isWithAge:()=>rn,isWithFaceDetection:()=>nt,isWithFaceExpressions:()=>Ar,isWithFaceLandmarks:()=>$t,isWithGender:()=>on,loadAgeGenderModel:()=>Wn,loadFaceDetectionModel:()=>Bn,loadFaceExpressionModel:()=>An,loadFaceLandmarkModel:()=>Ln,loadFaceLandmarkTinyModel:()=>kn,loadFaceRecognitionModel:()=>Sn,loadSsdMobilenetv1Model:()=>yo,loadTinyFaceDetectorModel:()=>Nn,loadTinyYolov2Model:()=>In,loadWeightMap:()=>wr,locateFaces:()=>Rn,matchDimensions:()=>Bo,minBbox:()=>dr,nets:()=>_,nonMaxSuppression:()=>ur,normalize:()=>Z,padToSquare:()=>lr,predictAgeAndGender:()=>Cn,recognizeFaceExpressions:()=>Mn,resizeResults:()=>wo,resolveInput:()=>Lt,shuffleArray:()=>No,sigmoid:()=>ue,ssdMobilenetv1:()=>go,tf:()=>Gn,tinyFaceDetector:()=>wn,tinyYolov2:()=>Pn,toNetInput:()=>E,utils:()=>Gr,validateConfig:()=>$r,version:()=>zn});var Gn=b(g());var ao={};ir(ao,{AnchorPosition:()=>lt,DrawBox:()=>hr,DrawBoxOptions:()=>ro,DrawFaceLandmarks:()=>no,DrawFaceLandmarksOptions:()=>oo,DrawTextField:()=>kt,DrawTextFieldOptions:()=>Le,drawContour:()=>bt,drawDetections:()=>ua,drawFaceExpressions:()=>la,drawFaceLandmarks:()=>ha});function bt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var Gr={};ir(Gr,{computeReshapedDimensions:()=>Ur,getCenterPoint:()=>Vt,isDimensions:()=>mr,isEven:()=>cr,isFloat:()=>Vr,isTensor:()=>Gt,isTensor1D:()=>na,isTensor2D:()=>zr,isTensor3D:()=>gt,isTensor4D:()=>V,isValidNumber:()=>ot,isValidProbablitiy:()=>de,range:()=>pt,round:()=>zt});var Co=b(g());var A=class{constructor(t,e){if(!ot(t)||!ot(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new A(1/this.width,1/this.height)}};function Gt(o,t){return o instanceof Co.Tensor&&o.shape.length===t}function na(o){return Gt(o,1)}function zr(o){return Gt(o,2)}function gt(o){return Gt(o,3)}function V(o){return Gt(o,4)}function Vr(o){return o%1!=0}function cr(o){return o%2==0}function zt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function mr(o){return o&&o.width&&o.height}function Ur({width:o,height:t},e){let r=e/Math.max(t,o);return new A(Math.round(o*r),Math.round(t*r))}function Vt(o){return o.reduce((t,e)=>t.add(e),new h(0,0)).div(new h(o.length,o.length))}function pt(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function ot(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function de(o){return ot(o)&&o>=0&&o<=1}var h=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new h(this.x+t.x,this.y+t.y)}sub(t){return new h(this.x-t.x,this.y-t.y)}mul(t){return new h(this.x*t.x,this.y*t.y)}div(t){return new h(this.x/t.x,this.y/t.y)}abs(){return new h(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new h(Math.floor(this.x),Math.floor(this.y))}};var D=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(ot)}static assertIsValidBox(t,e,r=!1){if(!D.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(ot),a=[r.x,r.y,r.width,r.height].every(ot);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];D.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new h(this.left,this.top)}get topRight(){return new h(this.right,this.top)}get bottomLeft(){return new h(this.left,this.bottom)}get bottomRight(){return new h(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new D({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new D({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-d+e+r,d=e),u>t&&(c=-u+t+n,u=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:u,x:m,ex:d,w:r,h:n}}calibrate(t){return new D({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Ut=class extends D{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var vt=class{constructor(t,e,r,n,a){this._imageDims=new A(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new D(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new D(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new vt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends vt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function pr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function dr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var dt=b(g());function Z(o,t){return dt.tidy(()=>{let[e,r,n]=t,a=dt.fill([...o.shape.slice(0,3),1],e,"float32"),s=dt.fill([...o.shape.slice(0,3),1],r,"float32"),i=dt.fill([...o.shape.slice(0,3),1],n,"float32"),c=dt.concat([a,s,i],3);return dt.sub(o,c)})}var Nt=b(g());function lr(o,t=!1){return Nt.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=u=>{let l=o.shape.slice();return l[s]=u,Nt.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],d=[t&&m?i(m):null,o,c].filter(u=>!!u).map(u=>Nt.cast(u,"float32"));return Nt.concat(d,s)})}function No(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function ue(o){return 1/(1+Math.exp(-o))}function Io(o){return Math.log(o/(1-o))}var Xt=class extends D{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var aa=.5,sa=.43,ia=.45,j=class{constructor(t,e,r=new h(0,0)){let{width:n,height:a}=e;this._imgDims=new A(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new h(n,a)).add(r))}get shift(){return new h(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new h(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new h(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new D(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=d=>n.sub(d).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/ia),c=Vt(t),m=Math.floor(Math.max(0,c.x-aa*i)),p=Math.floor(Math.max(0,c.y-sa*i));return new Xt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=dr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Xr=class extends j{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Vt([t[3],t[4]])]}};var Jt=class extends j{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Vt)}};var le=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${zt(this.distance)})`:""}`}};var fe=class extends D{static assertIsValidLabeledBox(t,e){if(D.assertIsValidBox(t,e),!ot(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t);this._label=e}get label(){return this._label}};var ut=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new ut(t.label,e)}};var Jr=class extends fe{static assertIsValidPredictedBox(t,e){if(fe.assertIsValidLabeledBox(t,e),!de(t.score)||!de(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,n){super(t,e);this._score=r,this._classScore=n}get score(){return this._score}get classScore(){return this._classScore}};function nt(o){return o.detection instanceof M}function It(o,t){return{...o,...{detection:t}}}function qr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function fr(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Zr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch,a=fr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:n,...a}}function Kr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var Qr=b(ko()),k;function pa(){if(!k)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return k}function to(o){k=o}function eo(){return Kr()?to(qr()):(0,Qr.isNodejs)()?to(Zr()):null}function da(o){if(k||eo(),!k)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=k.Canvas,Image:e=k.Image}=o;k.Canvas=t,k.Image=e,k.createCanvasElement=o.createCanvasElement||(()=>new t),k.createImageElement=o.createImageElement||(()=>new e),k.ImageData=o.ImageData||k.ImageData,k.Video=o.Video||k.Video,k.fetch=o.fetch||k.fetch,k.readFile=o.readFile||k.readFile}var P={getEnv:pa,setEnv:to,initialize:eo,createBrowserEnv:qr,createFileSystem:fr,createNodejsEnv:Zr,monkeyPatch:da,isBrowser:Kr,isNodejs:Qr.isNodejs};eo();function Lt(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function W(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Lt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var lt;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(lt||(lt={}));var Le=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||lt.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},kt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof kt?t.text:t,this.anchor=e,this.options=new Le(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let v=c+d.x,w=c+d.y+(l+1)*s;r.fillText(u,v,w)})}};var ro=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:lt.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Le({...s,...a})}},hr=class{constructor(t,e={}){this.box=new D(t),this.options=new ro(e)}draw(t){let e=W(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new kt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function ua(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:nt(r)?r.detection.score:void 0,a=r instanceof M?r.box:nt(r)?r.detection.box:new D(r),s=n?`${zt(n)}`:void 0;new hr(a,{label:s}).draw(o)})}var Te=b(g());function he(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function xr(o){return new Promise((t,e)=>{if(o instanceof P.getEnv().Canvas||he(o))return t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function br(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function St(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new A(o.naturalWidth,o.naturalHeight):o instanceof e?new A(o.videoWidth,o.videoHeight):new A(o.width,o.height)}function At({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function xe(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!he(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||St(o),a=At({width:r,height:n});return o instanceof e?W(a).putImageData(o,0,0):W(a).drawImage(o,0,0,r,n),a}var gr=b(g());async function vr(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(V(o)?1:0),s=gr.tidy(()=>o.as3D(r,n,a).toInt());return await gr.browser.toPixels(s,e),s.dispose(),e}function ke(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var K=b(g());function yr(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return At({width:1,height:1});let a=St(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=At({width:t,height:t}),p=o instanceof n?o:xe(o),d=Math.abs(i-c)/2,u=e&&i0&&p.height>0&&W(m).drawImage(p,u,l,i,c),m}var ft=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(gt(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(V(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:xe(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return pt(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Ur({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,K.tidy(()=>{let r=pt(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof K.Tensor){let i=V(s)?s:s.expandDims();return i=lr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=K.image.resizeBilinear(i,[t,t])),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return K.browser.fromPixels(yr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return K.stack(r.map(a=>K.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function E(o){if(o instanceof ft)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Lt);return r.forEach((n,a)=>{if(!ke(n)&&!gt(n)&&!V(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(V(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ke(n)&&xr(n))),new ft(r,Array.isArray(o))}async function qt(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await E(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await vr(i)}let n=W(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=At({width:c,height:m});return c>0&&m>0&&W(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var Fr=b(g());async function Zt(o,t){if(!gt(o)&&!V(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(V(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return Fr.tidy(()=>{let[e,r,n]=o.shape.slice(V(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).map(({x:i,y:c,width:m,height:p})=>Fr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function Wt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function So(o){let t=await Wt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return br(e)}async function Tr(o){return(await Wt(o)).json()}async function Ao(o){return new Float32Array(await(await Wt(o)).arrayBuffer())}var Wo=b(g());function _r(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function wr(o,t){let{manifestUri:e,modelBaseUri:r}=_r(o,t),n=await Tr(e);return Wo.io.loadWeights(n,r)}function Bo(o,t,e=!1){let{width:r,height:n}=e?St(t):t;return o.width=r,o.height=n,{width:r,height:n}}var Rt=b(g());var yt=b(g());var S=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof yt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof yt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=yt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await wr(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=_r(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(d=>d.buffer))),s=yt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof yt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var C=b(g());var be=b(g());function O(o,t,e){return be.tidy(()=>{let r=be.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=be.add(r,t.bias),r})}function Pr(o,t,e=!1){return C.tidy(()=>{let r=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):O(o,t.conv0,[2,2])),n=O(r,t.conv1,[1,1]),a=C.relu(C.add(r,n)),s=O(a,t.conv2,[1,1]);return C.relu(C.add(r,C.add(n,s)))})}function Se(o,t,e=!1,r=!0){return C.tidy(()=>{let n=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):O(o,t.conv0,r?[2,2]:[1,1])),a=O(n,t.conv1,[1,1]),s=C.relu(C.add(n,a)),i=O(s,t.conv2,[1,1]),c=C.relu(C.add(n,C.add(a,i))),m=O(c,t.conv3,[1,1]);return C.relu(C.add(n,C.add(a,C.add(i,m))))})}var Bt=b(g());function Kt(o,t,e="same",r=!1){return Bt.tidy(()=>{let n=Bt.add(Bt.conv2d(o,t.filters,[1,1],e),t.bias);return r?Bt.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var Dr=b(g());function ge(o,t){return(e,r,n,a)=>{let s=Dr.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Dr.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var Er=b(g());function Mr(o,t){return(e,r,n)=>{let a=Er.tensor2d(o(e*r),[e,r]),s=Er.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Ae=b(g());var Cr=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ve(o,t){return(e,r,n)=>{let a=Ae.tensor4d(o(3*3*e),[3,3,e,1]),s=Ae.tensor4d(o(e*r),[1,1,e,r]),i=Ae.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Cr(a,s,i)}}function ye(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Cr(e,r,n)}}function H(o,t){return(e,r,n)=>{let a=o[e];if(!Gt(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function Nr(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),d=r(i,i,`${c}/conv1`),u=r(i,i,`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function a(s,i,c,m=!1){let{conv0:p,conv1:d,conv2:u}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function Ir(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function Lr(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:d}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`),u=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:d,conv3:u}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function $o(o){let t=[],{extractDenseBlock4Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var We=class extends S{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return Rt.tidy(()=>{let r=Rt.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Rt.scalar(255)),s=Se(a,e.dense0,!0);return s=Se(s,e.dense1),s=Se(s,e.dense2),s=Se(s,e.dense3),s=Rt.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return $o(t)}extractParams(t){return Ro(t)}};var Ho=b(g());var Fe=b(g());function Be(o,t){return Fe.tidy(()=>Fe.add(Fe.matMul(o,t.weights),t.bias))}function Oo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=Mr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function jo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function kr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Re=class extends S{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return Ho.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t;return Be(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Oo(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),jo(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,a=t.slice(0,t.length-n),s=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Sr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Ft=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Sr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Sr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var $e=class extends Re{constructor(t=new We){super("FaceExpressionNet",t)}forwardInput(t){return Te.tidy(()=>Te.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await E(t))}async predictExpressions(t){let e=await E(t),r=await this.forwardInput(e),n=await Promise.all(Te.unstack(r).map(async s=>{let i=await s.data();return s.dispose(),i}));r.dispose();let a=n.map(s=>new Ft(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Ar(o){return o.expressions instanceof Ft}function Oe(o,t){return{...o,...{expressions:t}}}function la(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof Ft?a:Ar(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(d=>d.probability>e),m=nt(a)?a.detection.box.bottomLeft:r||new h(0,0);new kt(c.map(d=>`${d.expression} (${zt(d.probability)})`),m).draw(o)})}function $t(o){return nt(o)&&o.landmarks instanceof j&&o.unshiftedLandmarks instanceof j&&o.alignedRect instanceof M}function fa(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function Qt(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=fa(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var oo=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},no=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new oo(e)}draw(t){let e=W(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Jt&&(e.strokeStyle=s,e.lineWidth=a,bt(e,this.faceLandmarks.getJawOutline()),bt(e,this.faceLandmarks.getLeftEyeBrow()),bt(e,this.faceLandmarks.getRightEyeBrow()),bt(e,this.faceLandmarks.getNose()),bt(e,this.faceLandmarks.getLeftEye(),!0),bt(e,this.faceLandmarks.getRightEye(),!0),bt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function ha(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof j?r:$t(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new no(n).draw(o)})}var Yo="1.1.2";var xt=b(g());var I=b(g());function xa(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Go(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=xa(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),d=i(64,128,"entry_flow/reduction_block_1"),u={conv_in:m,reduction_block_0:p,reduction_block_1:d},l={};pt(t,0,1).forEach(y=>{l[`main_block_${y}`]=c(128,`middle_flow/main_block_${y}`)});let v=i(128,256,"exit_flow/reduction_block"),w=s(256,512,"exit_flow/separable_conv"),x={reduction_block:v,separable_conv:w};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:u,middle_flow:l,exit_flow:x}}}function ba(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function zo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=ba(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},d={};pt(t,0,1).forEach(w=>{d[`main_block_${w}`]=s(`middle_flow/main_block_${w}`)});let u=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),v={reduction_block:u,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:d,exit_flow:v},paramMappings:e}}function Vo(o,t,e){return I.add(I.conv2d(o,t.filters,e,"same"),t.bias)}function so(o,t,e=!0){let r=e?I.relu(o):o;return r=O(r,t.separable_conv0,[1,1]),r=O(I.relu(r),t.separable_conv1,[1,1]),r=I.maxPool(r,[3,3],[2,2],"same"),r=I.add(r,Vo(o,t.expansion_conv,[2,2])),r}function ga(o,t){let e=O(I.relu(o),t.separable_conv0,[1,1]);return e=O(I.relu(e),t.separable_conv1,[1,1]),e=O(I.relu(e),t.separable_conv2,[1,1]),e=I.add(e,o),e}var io=class extends S{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return I.tidy(()=>{let r=I.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(I.scalar(256)),s=I.relu(Vo(a,e.entry_flow.conv_in,[2,2]));return s=so(s,e.entry_flow.reduction_block_0,!1),s=so(s,e.entry_flow.reduction_block_1),pt(this._numMainBlocks,0,1).forEach(i=>{s=ga(s,e.middle_flow[`main_block_${i}`])}),s=so(s,e.exit_flow.reduction_block),s=I.relu(O(s,e.exit_flow.separable_conv,[1,1])),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return zo(t,this._numMainBlocks)}extractParams(t){return Go(t,this._numMainBlocks)}};function Uo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=Mr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function Xo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var ht;(function(o){o.FEMALE="female",o.MALE="male"})(ht||(ht={}));var je=class extends S{constructor(t=new io(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return xt.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t,n=xt.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),a=Be(n,e.fc.age).as1D(),s=Be(n,e.fc.gender);return{age:a,gender:s}})}forwardInput(t){return xt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:xt.softmax(r)}})}async forward(t){return this.forwardInput(await E(t))}async predictAgeAndGender(t){let e=await E(t),r=await this.forwardInput(e),n=xt.unstack(r.age),a=xt.unstack(r.gender),s=n.map((c,m)=>({ageTensor:c,genderTensor:a[m]})),i=await Promise.all(s.map(async({ageTensor:c,genderTensor:m})=>{let p=(await c.data())[0],d=(await m.data())[0],u=d>.5,l=u?ht.MALE:ht.FEMALE,v=u?d:1-d;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:v}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?i:i[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Uo(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Xo(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),n=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var Y=b(g());var He=class extends Re{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return Y.tidy(()=>{let s=(d,u)=>Y.stack([Y.fill([68],d,"float32"),Y.fill([68],u,"float32")],1).as2D(1,136).as1D(),i=(d,u)=>{let{width:l,height:v}=n[d];return u(l,v)?Math.abs(l-v)/2:0},c=d=>i(d,(u,l)=>ui(d,(u,l)=>ls(c(u),m(u))))).div(Y.stack(Array.from(Array(a),(d,u)=>s(n[u].width,n[u].height))))})}forwardInput(t){return Y.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await E(t))}async detectLandmarks(t){let e=await E(t),r=Y.tidy(()=>Y.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(await a.data()),c=i.filter((p,d)=>cr(d)),m=i.filter((p,d)=>!cr(d));return new Jt(Array(68).fill(0).map((p,d)=>new h(c[d],m[d])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var te=class extends He{constructor(t=new We){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var Ot=b(g());function Jo(o){let t=[],{extractDenseBlock3Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function qo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var co=class extends S{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Ot.tidy(()=>{let r=Ot.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Ot.scalar(255)),s=Pr(a,e.dense0,!0);return s=Pr(s,e.dense1),s=Pr(s,e.dense2),s=Ot.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Jo(t)}extractParams(t){return qo(t)}};var Ye=class extends He{constructor(t=new co){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var mo=class extends te{};var U=b(g());var _e=b(g());var Wr=b(g());function Zo(o,t){return Wr.add(Wr.mul(o,t.weights),t.biases)}function po(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=_e.conv2d(o,a,e,n);return i=_e.add(i,s),i=Zo(i,t.scale),r?_e.relu(i):i}function Ko(o,t){return po(o,t,[1,1],!0)}function uo(o,t){return po(o,t,[1,1],!1)}function Br(o,t){return po(o,t,[2,2],!0,"valid")}var G=b(g());function va(o,t){function e(i,c,m){let p=o(i),d=p.length/(c*m*m);if(Vr(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return G.tidy(()=>G.transpose(G.tensor4d(p,[c,d,m,m]),[2,3,1,0]))}function r(i,c,m,p){let d=e(i,c,m),u=G.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:u}}function n(i,c){let m=G.tensor1d(o(i)),p=G.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let d=r(i,c,m,`${p}/conv`),u=n(c,`${p}/scale`);return{conv:d,scale:u}}function s(i,c,m,p,d=!1){let u=a((d?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:u,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Qo(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=va(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),d=a(36864,64,3,"conv64_1"),u=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),v=a(147456,128,3,"conv128_down",!0),w=a(147456,128,3,"conv128_1"),x=a(147456,128,3,"conv128_2"),y=a(589824,256,3,"conv256_down",!0),T=a(589824,256,3,"conv256_1"),F=a(589824,256,3,"conv256_2"),L=a(589824,256,3,"conv256_down_out"),z=G.tidy(()=>G.transpose(G.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:d,conv64_2:u,conv64_3:l,conv128_down:v,conv128_1:w,conv128_2:x,conv256_down:y,conv256_1:T,conv256_2:F,conv256_down_out:L,fc:z},paramMappings:r}}function ya(o,t){let e=H(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function tn(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=ya(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),d=r("conv64_3"),u=r("conv128_down"),l=r("conv128_1"),v=r("conv128_2"),w=r("conv256_down"),x=r("conv256_1"),y=r("conv256_2"),T=r("conv256_down_out"),{fc:F}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!zr(F))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${F}`);let L={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:d,conv128_down:u,conv128_1:l,conv128_2:v,conv256_down:w,conv256_1:x,conv256_2:y,conv256_down_out:T,fc:F};return B(o,t),{params:L,paramMappings:t}}var $=b(g());function at(o,t){let e=Ko(o,t.conv1);return e=uo(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ge(o,t){let e=Br(o,t.conv1);e=uo(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var ee=class extends S{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return U.tidy(()=>{let r=U.cast(t.toBatchTensor(150,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(U.scalar(256)),s=Br(a,e.conv32_down);s=U.maxPool(s,3,2,"valid"),s=at(s,e.conv32_1),s=at(s,e.conv32_2),s=at(s,e.conv32_3),s=Ge(s,e.conv64_down),s=at(s,e.conv64_1),s=at(s,e.conv64_2),s=at(s,e.conv64_3),s=Ge(s,e.conv128_down),s=at(s,e.conv128_1),s=at(s,e.conv128_2),s=Ge(s,e.conv256_down),s=at(s,e.conv256_1),s=at(s,e.conv256_2),s=Ge(s,e.conv256_down_out);let i=s.mean([1,2]);return U.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await E(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)==null?void 0:a.some(s=>s<=0))return new Float32Array(128);let e=await E(t),r=U.tidy(()=>U.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return tn(t)}extractParams(t){return Qo(t)}};function en(o){let t=new ee;return t.extractWeights(o),t}function ze(o,t){return{...o,...{descriptor:t}}}function rn(o){return typeof o.age=="number"}function Ve(o,t){return{...o,...{age:t}}}function on(o){return(o.gender===ht.MALE||o.gender===ht.FEMALE)&&de(o.genderProbability)}function Ue(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var it=b(g());var st=b(g());function Fa(o,t){function e(c,m){let p=st.tensor4d(o(3*3*c),[3,3,c,1]),d=st.tensor1d(o(c)),u=st.tensor1d(o(c)),l=st.tensor1d(o(c)),v=st.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:u,batch_norm_mean:l,batch_norm_variance:v}}function r(c,m,p,d,u){let l=st.tensor4d(o(c*m*p*p),[p,p,c,m]),v=st.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${u?"batch_norm_offset":"bias"}`}),{filters:l,bias:v}}function n(c,m,p,d){let{filters:u,bias:l}=r(c,m,p,d,!0);return{filters:u,batch_norm_offset:l}}function a(c,m,p){let d=e(c,`${p}/depthwise_conv`),u=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:u}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),d=a(128,128,"mobilenetv1/conv_3"),u=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),v=a(256,512,"mobilenetv1/conv_6"),w=a(512,512,"mobilenetv1/conv_7"),x=a(512,512,"mobilenetv1/conv_8"),y=a(512,512,"mobilenetv1/conv_9"),T=a(512,512,"mobilenetv1/conv_10"),F=a(512,512,"mobilenetv1/conv_11"),L=a(512,1024,"mobilenetv1/conv_12"),z=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,conv_8:x,conv_9:y,conv_10:T,conv_11:F,conv_12:L,conv_13:z}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),d=n(128,256,3,"prediction_layer/conv_3"),u=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),v=n(256,64,1,"prediction_layer/conv_6"),w=n(64,128,3,"prediction_layer/conv_7"),x=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),T=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),F=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),L=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),z=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),mt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Et=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Mt=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Ct=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,box_predictor_0:{box_encoding_predictor:x,class_predictor:y},box_predictor_1:{box_encoding_predictor:T,class_predictor:F},box_predictor_2:{box_encoding_predictor:L,class_predictor:z},box_predictor_3:{box_encoding_predictor:rt,class_predictor:mt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Et},box_predictor_5:{box_encoding_predictor:Mt,class_predictor:Ct}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function nn(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Fa(e,t),s=n(),i=a(),m={extra_dim:st.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Ta(o,t){let e=H(o,t);function r(m,p,d){let u=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:u,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,d=`MobilenetV1/Conv2d_${m}_depthwise`,u=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,v=e(`${d}/depthwise_weights`,4,`${u}/filters`),w=e(`${d}/BatchNorm/gamma`,1,`${u}/batch_norm_scale`),x=e(`${d}/BatchNorm/beta`,1,`${u}/batch_norm_offset`),y=e(`${d}/BatchNorm/moving_mean`,1,`${u}/batch_norm_mean`),T=e(`${d}/BatchNorm/moving_variance`,1,`${u}/batch_norm_variance`);return{depthwise_conv:{filters:v,batch_norm_scale:w,batch_norm_offset:x,batch_norm_mean:y,batch_norm_variance:T},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let d=e(`${m}/weights`,4,`${p}/filters`),u=e(`${m}/biases`,1,`${p}/bias`);return{filters:d,bias:u}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),d=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function an(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Ta(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!gt(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var Tt=b(g());var jt=b(g());function Q(o,t,e){return jt.tidy(()=>{let r=jt.conv2d(o,t.filters,e,"same");return r=jt.add(r,t.batch_norm_offset),jt.clipByValue(r,0,6)})}var _a=.0010000000474974513;function wa(o,t,e){return Tt.tidy(()=>{let r=Tt.depthwiseConv2d(o,t.filters,e,"same");return r=Tt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,_a),Tt.clipByValue(r,0,6)})}function Pa(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function sn(o,t){return Tt.tidy(()=>{let e,r=Q(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=Pa(i);r=wa(r,a.depthwise_conv,c),r=Q(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function Da(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),d=Math.max(r[e][1],r[e][3]),u=(s-n)*(i-a),l=(p-c)*(d-m);if(u<=0||l<=0)return 0;let v=Math.max(n,c),w=Math.max(a,m),x=Math.min(s,p),y=Math.min(i,d),T=Math.max(x-v,0)*Math.max(y-w,0);return T/(u+l-T)}function cn(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>n).sort((p,d)=>d.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let d=p.score;for(let u=m.length-1;u>=0;--u){let l=Da(o,p.boxIndex,m[u]);if(l!==0&&(p.score*=c(l),p.score<=n))break}d===p.score&&m.push(p.boxIndex)}),m}var f=b(g());function Ea(o){let t=f.unstack(f.transpose(o,[1,0])),e=[f.sub(t[2],t[0]),f.sub(t[3],t[1])],r=[f.add(t[0],f.div(e[0],f.scalar(2))),f.add(t[1],f.div(e[1],f.scalar(2)))];return{sizes:e,centers:r}}function Ma(o,t){let{sizes:e,centers:r}=Ea(o),n=f.unstack(f.transpose(t,[1,0])),a=f.div(f.mul(f.exp(f.div(n[2],f.scalar(5))),e[0]),f.scalar(2)),s=f.add(f.mul(f.div(n[0],f.scalar(10)),e[0]),r[0]),i=f.div(f.mul(f.exp(f.div(n[3],f.scalar(5))),e[1]),f.scalar(2)),c=f.add(f.mul(f.div(n[1],f.scalar(10)),e[1]),r[1]);return f.transpose(f.stack([f.sub(s,a),f.sub(c,i),f.add(s,a),f.add(c,i)]),[1,0])}function mn(o,t,e){return f.tidy(()=>{let r=o.shape[0],n=Ma(f.reshape(f.tile(e.extra_dim,[r,1,1]),[-1,4]),f.reshape(o,[-1,4]));n=f.reshape(n,[r,n.shape[0]/r,4]);let a=f.sigmoid(f.slice(t,[0,0,1],[-1,-1,-1])),s=f.slice(a,[0,0,0],[-1,-1,1]);s=f.reshape(s,[r,s.shape[1]]);let i=f.unstack(n),c=f.unstack(s);return{boxes:i,scores:c}})}var Je=b(g());var Xe=b(g());function re(o,t){return Xe.tidy(()=>{let e=o.shape[0],r=Xe.reshape(Kt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Xe.reshape(Kt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function pn(o,t,e){return Je.tidy(()=>{let r=Q(o,e.conv_0,[1,1]),n=Q(r,e.conv_1,[2,2]),a=Q(n,e.conv_2,[1,1]),s=Q(a,e.conv_3,[2,2]),i=Q(s,e.conv_4,[1,1]),c=Q(i,e.conv_5,[2,2]),m=Q(c,e.conv_6,[1,1]),p=Q(m,e.conv_7,[2,2]),d=re(t,e.box_predictor_0),u=re(o,e.box_predictor_1),l=re(n,e.box_predictor_2),v=re(s,e.box_predictor_3),w=re(c,e.box_predictor_4),x=re(p,e.box_predictor_5),y=Je.concat([d.boxPredictionEncoding,u.boxPredictionEncoding,l.boxPredictionEncoding,v.boxPredictionEncoding,w.boxPredictionEncoding,x.boxPredictionEncoding],1),T=Je.concat([d.classPrediction,u.classPrediction,l.classPrediction,v.classPrediction,w.classPrediction,x.classPrediction],1);return{boxPredictions:y,classPredictions:T}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Ht=class extends S{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return it.tidy(()=>{let r=it.cast(t.toBatchTensor(512,!1),"float32"),n=it.sub(it.mul(r,it.scalar(.007843137718737125)),it.scalar(1)),a=sn(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=pn(a.out,a.conv11,e.prediction_layer);return mn(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await E(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await E(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let F=1;F{let[L,z]=[Math.max(0,y[F][0]),Math.min(1,y[F][2])].map(q=>q*x),[rt,mt]=[Math.max(0,y[F][1]),Math.min(1,y[F][3])].map(q=>q*w);return new M(p[F],new Xt(rt,L,mt-rt,z-L),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),T}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return an(t)}extractParams(t){return nn(t)}};function lo(o){let t=new Ht;return t.extractWeights(o),t}function dn(o){return lo(o)}var fo=class extends Ht{};var un=.4,ln=[new h(.738768,.874946),new h(2.42204,2.65704),new h(4.30971,7.04493),new h(10.246,4.59428),new h(12.6868,11.8741)],fn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],hn=[117.001,114.697,97.404],xn="tiny_yolov2_model",bn="tiny_yolov2_separable_conv_model";var N=b(g());var Rr=o=>typeof o=="number";function $r(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Rr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Rr(t.x)&&Rr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Rr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var et=b(g());var tt=b(g());function we(o){return tt.tidy(()=>{let t=tt.mul(o,tt.scalar(.10000000149011612));return tt.add(tt.relu(tt.sub(o,t)),t)})}function _t(o,t){return et.tidy(()=>{let e=et.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=et.conv2d(e,t.conv.filters,[1,1],"valid"),e=et.sub(e,t.bn.sub),e=et.mul(e,t.bn.truediv),e=et.add(e,t.conv.bias),we(e)})}var Yt=b(g());function wt(o,t){return Yt.tidy(()=>{let e=Yt.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Yt.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=Yt.add(e,t.bias),we(e)})}var ho=b(g());function Ca(o,t){let e=ge(o,t);function r(s,i){let c=ho.tensor1d(o(s)),m=ho.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ve(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function gn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=Ca(n,s),p;if(t.withSeparableConvs){let[d,u,l,v,w,x,y,T,F]=r,L=t.isFirstLayerConv2d?i(d,u,3,"conv0"):m(d,u,"conv0"),z=m(u,l,"conv1"),rt=m(l,v,"conv2"),mt=m(v,w,"conv3"),q=m(w,x,"conv4"),Et=m(x,y,"conv5"),Mt=T?m(y,T,"conv6"):void 0,Ct=F?m(T,F,"conv7"):void 0,pe=i(F||T||y,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}else{let[d,u,l,v,w,x,y,T,F]=r,L=c(d,u,"conv0"),z=c(u,l,"conv1"),rt=c(l,v,"conv2"),mt=c(v,w,"conv3"),q=c(w,x,"conv4"),Et=c(x,y,"conv5"),Mt=c(y,T,"conv6"),Ct=c(T,F,"conv7"),pe=i(F,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function Na(o,t){let e=H(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=ye(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function vn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=Na(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var ct=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var xo=class extends S{constructor(t){super("TinyYolov2");$r(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=_t(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=_t(r,e.conv6),r=_t(r,e.conv7),Kt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?we(Kt(t,e.conv0,"valid",!1)):wt(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?wt(r,e.conv6):r,r=e.conv7?wt(r,e.conv7):r,Kt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let n=N.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?Z(n,this.config.meanRgb):n,n=n.div(N.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(n,r):this.runTinyYolov2(n,r)})}async forward(t,e){return this.forwardInput(await E(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:n}=new ct(e),a=await E(t),s=await this.forwardInput(a,r),i=N.tidy(()=>N.unstack(s)[0].expandDims()),c={width:a.getInputWidth(0),height:a.getInputHeight(0)},m=await this.extractBoxes(i,a.getReshapedInputDimensions(0),n);s.dispose(),i.dispose();let p=m.map(x=>x.box),d=m.map(x=>x.score),u=m.map(x=>x.classScore),l=m.map(x=>this.config.classes[x.label]);return ur(p.map(x=>x.rescale(r)),d,this.config.iouThreshold,!0).map(x=>new vt(d[x],u[x],l[x],p[x],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return vn(t,this.config)}extractParams(t){let e=this.config.filterSizes||xo.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return gn(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:n,height:a}=e,s=Math.max(n,a),i=s/n,c=s/a,m=t.shape[1],p=this.config.anchors.length,[d,u,l]=N.tidy(()=>{let y=t.reshape([m,m,p,this.boxEncodingSize]),T=y.slice([0,0,0,0],[m,m,p,4]),F=y.slice([0,0,0,4],[m,m,p,1]),L=this.withClassScores?N.softmax(y.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):N.scalar(0);return[T,F,L]}),v=[],w=await u.array(),x=await d.array();for(let y=0;yr){let z=(T+ue(x[y][T][F][0]))/m*i,rt=(y+ue(x[y][T][F][1]))/m*c,mt=Math.exp(x[y][T][F][2])*this.config.anchors[F].x/m*i,q=Math.exp(x[y][T][F][3])*this.config.anchors[F].y/m*c,Et=z-mt/2,Mt=rt-q/2,Ct={row:y,col:T,anchor:F},{classScore:pe,label:Po}=this.withClassScores?await this.extractPredictedClass(l,Ct):{classScore:1,label:0};v.push({box:new Ut(Et,Mt,Et+mt,Mt+q),score:L,classScore:L*pe,label:Po,...Ct})}}return d.dispose(),u.dispose(),l.dispose(),v}async extractPredictedClass(t,e){let{row:r,col:n,anchor:a}=e,s=await t.array();return Array(this.config.classes.length).fill(0).map((i,c)=>s[r][n][a][c]).map((i,c)=>({classScore:i,label:c})).reduce((i,c)=>i.classScore>c.classScore?i:c)}},Pe=xo;Pe.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var oe=class extends Pe{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:un,classes:["face"],...t?{anchors:fn,meanRgb:hn}:{anchors:ln,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?bn:xn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function yn(o,t=!0){let e=new oe(t);return e.extractWeights(o),e}var qe=class extends ct{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Ke=b(g());var bo=b(g());async function ne(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>$t(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await Zt(t,a):await qt(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function De(o,t,e,r,n){return ne([o],t,async a=>e(a[0]),r,n)}var Fn=.4,Tn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],_n=[117.001,114.697,97.404];var ae=class extends Pe{constructor(){let t={withSeparableConvs:!0,iouThreshold:Fn,classes:["face"],anchors:Tn,meanRgb:_n,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var _={ssdMobilenetv1:new Ht,tinyFaceDetector:new ae,tinyYolov2:new oe,faceLandmark68Net:new te,faceLandmark68TinyNet:new Ye,faceRecognitionNet:new ee,faceExpressionNet:new $e,ageGenderNet:new je},go=(o,t)=>_.ssdMobilenetv1.locateFaces(o,t),wn=(o,t)=>_.tinyFaceDetector.locateFaces(o,t),Pn=(o,t)=>_.tinyYolov2.locateFaces(o,t),vo=o=>_.faceLandmark68Net.detectLandmarks(o),Dn=o=>_.faceLandmark68TinyNet.detectLandmarks(o),En=o=>_.faceRecognitionNet.computeFaceDescriptor(o),Mn=o=>_.faceExpressionNet.predictExpressions(o),Cn=o=>_.ageGenderNet.predictAgeAndGender(o),yo=o=>_.ssdMobilenetv1.load(o),Nn=o=>_.tinyFaceDetector.load(o),In=o=>_.tinyYolov2.load(o),Ln=o=>_.faceLandmark68Net.load(o),kn=o=>_.faceLandmark68TinyNet.load(o),Sn=o=>_.faceRecognitionNet.load(o),An=o=>_.faceExpressionNet.load(o),Wn=o=>_.ageGenderNet.load(o),Bn=yo,Rn=go,$n=vo;var Fo=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ce=class extends Fo{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>Oe(r,e[n]))}withAgeAndGender(){return new Ee(this,this.input)}},Ne=class extends Fo{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceExpressionNet.predictExpressions(r),this.extractedFaces);return Oe(t,e)}withAgeAndGender(){return new Me(this,this.input)}},ce=class extends Ce{withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},me=class extends Ne{withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var To=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ee=class extends To{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Ve(Ue(r,s,i),a)})}withFaceExpressions(){return new Ce(this,this.input)}},Me=class extends To{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await De(t,this.input,a=>_.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Ve(Ue(t,r,n),e)}withFaceExpressions(){return new Ne(this,this.input)}},se=class extends Ee{withFaceExpressions(){return new ce(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},ie=class extends Me{withFaceExpressions(){return new me(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var Ze=class extends J{constructor(t,e){super();this.parentTask=t;this.input=e}},Pt=class extends Ze{async run(){let t=await this.parentTask;return(await ne(t,this.input,r=>Promise.all(r.map(n=>_.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>ze(t[n],r))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}},Dt=class extends Ze{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return ze(t,e)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}};var Qe=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?_.faceLandmark68TinyNet:_.faceLandmark68Net}},tr=class extends Qe{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof Ke.Tensor?await Zt(this.input,e):await qt(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),t.map((a,s)=>Qt(a,n[s]))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},er=class extends Qe{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Ke.Tensor?await Zt(this.input,[e]):await qt(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),Qt(t,n)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var rr=class extends J{constructor(t,e=new X){super();this.input=t;this.options=e}},Ie=class extends rr{async run(){let{input:t,options:e}=this,r;if(e instanceof qe)r=_.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=_.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ct)r=_.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>It({},r)))})}withFaceLandmarks(t=!1){return new tr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Ce(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Ee(this.runAndExtendWithFaceDetections(),this.input)}},or=class extends rr{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?It({},e):void 0)})}withFaceLandmarks(t=!1){return new er(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Ne(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Me(this.runAndExtendWithFaceDetection(),this.input)}};function On(o,t=new X){return new or(o,t)}function nr(o,t=new X){return new Ie(o,t)}async function _o(o,t){return nr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function jn(o,t={}){return nr(o,new ct(t)).withFaceLandmarks().withFaceDescriptors()}var Hn=_o;function Or(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var ar=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof ut)return s;if(s instanceof Float32Array)return new ut(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new ut(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>Or(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new le(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>ut.fromJSON(r));return new ar(e,t.distanceThreshold)}};function Yn(o){let t=new ae;return t.extractWeights(o),t}function wo(o,t){let{width:e,height:r}=new A(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>wo(n,{width:e,height:r}));if($t(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return Qt(It(o,n),a)}return nt(o)?It(o,o.detection.forSize(e,r)):o instanceof j||o instanceof M?o.forSize(e,r):o}var Ia=typeof process!="undefined",La=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",zn={faceapi:Yo,node:Ia,browser:La};0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); //# sourceMappingURL=face-api.node-cpu.js.map diff --git a/dist/face-api.node-gpu.js b/dist/face-api.node-gpu.js index ac61654..0a80959 100644 --- a/dist/face-api.node-gpu.js +++ b/dist/face-api.node-gpu.js @@ -5,5 +5,5 @@ author: ' */ -var Vn=Object.create,sr=Object.defineProperty,Un=Object.getPrototypeOf,Xn=Object.prototype.hasOwnProperty,Jn=Object.getOwnPropertyNames,qn=Object.getOwnPropertyDescriptor;var jr=o=>sr(o,"__esModule",{value:!0});var Do=(o,t)=>()=>(t||(t={exports:{}},o(t.exports,t)),t.exports),ir=(o,t)=>{for(var e in t)sr(o,e,{get:t[e],enumerable:!0})},Zn=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Jn(t))!Xn.call(o,r)&&r!=="default"&&sr(o,r,{get:()=>t[r],enumerable:!(e=qn(t,r))||e.enumerable});return o},b=o=>Zn(jr(sr(o!=null?Vn(Un(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);var g=Do(Hr=>{var Kn=Object.create,Yr=Object.defineProperty,Qn=Object.getPrototypeOf,ta=Object.prototype.hasOwnProperty,ea=Object.getOwnPropertyNames,ra=Object.getOwnPropertyDescriptor,Eo=o=>Yr(o,"__esModule",{value:!0}),Mo=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ea(t))!ta.call(o,r)&&r!=="default"&&Yr(o,r,{get:()=>t[r],enumerable:!(e=ra(t,r))||e.enumerable});return o},oa=o=>Mo(Eo(Yr(o!=null?Kn(Qn(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);Eo(Hr);Mo(Hr,oa(require("@tensorflow/tfjs-node-gpu")))});var ko=Do((ca,Lo)=>{jr(ca);ir(ca,{isNodejs:()=>ma});function ma(){return typeof global=="object"&&!0&&typeof Lo!="undefined"&&typeof process!="undefined"&&!!process.version}});jr(exports);ir(exports,{AgeGenderNet:()=>je,BoundingBox:()=>Ut,Box:()=>D,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>Pt,ComputeFaceDescriptorsTaskBase:()=>Ze,ComputeSingleFaceDescriptorTask:()=>Dt,DetectAllFaceLandmarksTask:()=>tr,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Qe,DetectFacesTaskBase:()=>rr,DetectSingleFaceLandmarksTask:()=>er,DetectSingleFaceTask:()=>or,Dimensions:()=>A,FACE_EXPRESSION_LABELS:()=>Sr,FaceDetection:()=>M,FaceDetectionNet:()=>fo,FaceExpressionNet:()=>$e,FaceExpressions:()=>Ft,FaceLandmark68Net:()=>te,FaceLandmark68TinyNet:()=>Ye,FaceLandmarkNet:()=>mo,FaceLandmarks:()=>j,FaceLandmarks5:()=>Xr,FaceLandmarks68:()=>Jt,FaceMatch:()=>le,FaceMatcher:()=>ar,FaceRecognitionNet:()=>ee,Gender:()=>ht,LabeledBox:()=>fe,LabeledFaceDescriptors:()=>ut,NetInput:()=>ft,NeuralNetwork:()=>S,ObjectDetection:()=>vt,Point:()=>h,PredictedBox:()=>Jr,Rect:()=>Xt,SsdMobilenetv1:()=>Ht,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ae,TinyFaceDetectorOptions:()=>qe,TinyYolov2:()=>oe,TinyYolov2Options:()=>ct,allFaces:()=>Hn,allFacesSsdMobilenetv1:()=>_o,allFacesTinyYolov2:()=>jn,awaitMediaLoaded:()=>xr,bufferToImage:()=>br,computeFaceDescriptor:()=>En,createCanvas:()=>At,createCanvasFromMedia:()=>xe,createFaceDetectionNet:()=>dn,createFaceRecognitionNet:()=>en,createSsdMobilenetv1:()=>lo,createTinyFaceDetector:()=>Yn,createTinyYolov2:()=>yn,detectAllFaces:()=>nr,detectFaceLandmarks:()=>vo,detectFaceLandmarksTiny:()=>Dn,detectLandmarks:()=>$n,detectSingleFace:()=>On,draw:()=>ao,env:()=>P,euclideanDistance:()=>Or,extendWithAge:()=>Ve,extendWithFaceDescriptor:()=>ze,extendWithFaceDetection:()=>It,extendWithFaceExpressions:()=>Oe,extendWithFaceLandmarks:()=>Qt,extendWithGender:()=>Ue,extractFaceTensors:()=>Zt,extractFaces:()=>qt,fetchImage:()=>So,fetchJson:()=>Tr,fetchNetWeights:()=>Ao,fetchOrThrow:()=>Wt,getContext2dOrThrow:()=>W,getMediaDimensions:()=>St,imageTensorToCanvas:()=>vr,imageToSquare:()=>yr,inverseSigmoid:()=>Io,iou:()=>pr,isMediaElement:()=>ke,isMediaLoaded:()=>he,isWithAge:()=>rn,isWithFaceDetection:()=>nt,isWithFaceExpressions:()=>Ar,isWithFaceLandmarks:()=>$t,isWithGender:()=>on,loadAgeGenderModel:()=>Wn,loadFaceDetectionModel:()=>Bn,loadFaceExpressionModel:()=>An,loadFaceLandmarkModel:()=>Ln,loadFaceLandmarkTinyModel:()=>kn,loadFaceRecognitionModel:()=>Sn,loadSsdMobilenetv1Model:()=>yo,loadTinyFaceDetectorModel:()=>Nn,loadTinyYolov2Model:()=>In,loadWeightMap:()=>wr,locateFaces:()=>Rn,matchDimensions:()=>Bo,minBbox:()=>dr,nets:()=>_,nonMaxSuppression:()=>ur,normalize:()=>Z,padToSquare:()=>lr,predictAgeAndGender:()=>Cn,recognizeFaceExpressions:()=>Mn,resizeResults:()=>wo,resolveInput:()=>Lt,shuffleArray:()=>No,sigmoid:()=>ue,ssdMobilenetv1:()=>go,tf:()=>Gn,tinyFaceDetector:()=>wn,tinyYolov2:()=>Pn,toNetInput:()=>E,utils:()=>Gr,validateConfig:()=>$r,version:()=>zn});var Gn=b(g());var ao={};ir(ao,{AnchorPosition:()=>lt,DrawBox:()=>hr,DrawBoxOptions:()=>ro,DrawFaceLandmarks:()=>no,DrawFaceLandmarksOptions:()=>oo,DrawTextField:()=>kt,DrawTextFieldOptions:()=>Le,drawContour:()=>bt,drawDetections:()=>ua,drawFaceExpressions:()=>la,drawFaceLandmarks:()=>ha});function bt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var Gr={};ir(Gr,{computeReshapedDimensions:()=>Ur,getCenterPoint:()=>Vt,isDimensions:()=>mr,isEven:()=>cr,isFloat:()=>Vr,isTensor:()=>Gt,isTensor1D:()=>na,isTensor2D:()=>zr,isTensor3D:()=>gt,isTensor4D:()=>V,isValidNumber:()=>ot,isValidProbablitiy:()=>de,range:()=>pt,round:()=>zt});var Co=b(g());var A=class{constructor(t,e){if(!ot(t)||!ot(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new A(1/this.width,1/this.height)}};function Gt(o,t){return o instanceof Co.Tensor&&o.shape.length===t}function na(o){return Gt(o,1)}function zr(o){return Gt(o,2)}function gt(o){return Gt(o,3)}function V(o){return Gt(o,4)}function Vr(o){return o%1!=0}function cr(o){return o%2==0}function zt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function mr(o){return o&&o.width&&o.height}function Ur({width:o,height:t},e){let r=e/Math.max(t,o);return new A(Math.round(o*r),Math.round(t*r))}function Vt(o){return o.reduce((t,e)=>t.add(e),new h(0,0)).div(new h(o.length,o.length))}function pt(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function ot(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function de(o){return ot(o)&&o>=0&&o<=1}var h=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new h(this.x+t.x,this.y+t.y)}sub(t){return new h(this.x-t.x,this.y-t.y)}mul(t){return new h(this.x*t.x,this.y*t.y)}div(t){return new h(this.x/t.x,this.y/t.y)}abs(){return new h(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new h(Math.floor(this.x),Math.floor(this.y))}};var D=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(ot)}static assertIsValidBox(t,e,r=!1){if(!D.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(ot),a=[r.x,r.y,r.width,r.height].every(ot);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];D.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new h(this.left,this.top)}get topRight(){return new h(this.right,this.top)}get bottomLeft(){return new h(this.left,this.bottom)}get bottomRight(){return new h(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new D({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new D({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-d+e+r,d=e),u>t&&(c=-u+t+n,u=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:u,x:m,ex:d,w:r,h:n}}calibrate(t){return new D({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Ut=class extends D{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var vt=class{constructor(t,e,r,n,a){this._imageDims=new A(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new D(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new D(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new vt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends vt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function pr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function dr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var dt=b(g());function Z(o,t){return dt.tidy(()=>{let[e,r,n]=t,a=dt.fill([...o.shape.slice(0,3),1],e,"float32"),s=dt.fill([...o.shape.slice(0,3),1],r,"float32"),i=dt.fill([...o.shape.slice(0,3),1],n,"float32"),c=dt.concat([a,s,i],3);return dt.sub(o,c)})}var Nt=b(g());function lr(o,t=!1){return Nt.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=u=>{let l=o.shape.slice();return l[s]=u,Nt.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],d=[t&&m?i(m):null,o,c].filter(u=>!!u).map(u=>Nt.cast(u,"float32"));return Nt.concat(d,s)})}function No(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function ue(o){return 1/(1+Math.exp(-o))}function Io(o){return Math.log(o/(1-o))}var Xt=class extends D{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var aa=.5,sa=.43,ia=.45,j=class{constructor(t,e,r=new h(0,0)){let{width:n,height:a}=e;this._imgDims=new A(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new h(n,a)).add(r))}get shift(){return new h(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new h(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new h(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new D(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=d=>n.sub(d).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/ia),c=Vt(t),m=Math.floor(Math.max(0,c.x-aa*i)),p=Math.floor(Math.max(0,c.y-sa*i));return new Xt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=dr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Xr=class extends j{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Vt([t[3],t[4]])]}};var Jt=class extends j{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Vt)}};var le=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${zt(this.distance)})`:""}`}};var fe=class extends D{static assertIsValidLabeledBox(t,e){if(D.assertIsValidBox(t,e),!ot(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t);this._label=e}get label(){return this._label}};var ut=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new ut(t.label,e)}};var Jr=class extends fe{static assertIsValidPredictedBox(t,e){if(fe.assertIsValidLabeledBox(t,e),!de(t.score)||!de(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,n){super(t,e);this._score=r,this._classScore=n}get score(){return this._score}get classScore(){return this._classScore}};function nt(o){return o.detection instanceof M}function It(o,t){return{...o,...{detection:t}}}function qr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function fr(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Zr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch,a=fr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:n,...a}}function Kr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var Qr=b(ko()),k;function pa(){if(!k)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return k}function to(o){k=o}function eo(){return Kr()?to(qr()):(0,Qr.isNodejs)()?to(Zr()):null}function da(o){if(k||eo(),!k)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=k.Canvas,Image:e=k.Image}=o;k.Canvas=t,k.Image=e,k.createCanvasElement=o.createCanvasElement||(()=>new t),k.createImageElement=o.createImageElement||(()=>new e),k.ImageData=o.ImageData||k.ImageData,k.Video=o.Video||k.Video,k.fetch=o.fetch||k.fetch,k.readFile=o.readFile||k.readFile}var P={getEnv:pa,setEnv:to,initialize:eo,createBrowserEnv:qr,createFileSystem:fr,createNodejsEnv:Zr,monkeyPatch:da,isBrowser:Kr,isNodejs:Qr.isNodejs};eo();function Lt(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function W(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Lt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var lt;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(lt||(lt={}));var Le=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||lt.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},kt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof kt?t.text:t,this.anchor=e,this.options=new Le(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let v=c+d.x,w=c+d.y+(l+1)*s;r.fillText(u,v,w)})}};var ro=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:lt.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Le({...s,...a})}},hr=class{constructor(t,e={}){this.box=new D(t),this.options=new ro(e)}draw(t){let e=W(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new kt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function ua(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:nt(r)?r.detection.score:void 0,a=r instanceof M?r.box:nt(r)?r.detection.box:new D(r),s=n?`${zt(n)}`:void 0;new hr(a,{label:s}).draw(o)})}var Te=b(g());function he(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function xr(o){return new Promise((t,e)=>{if(o instanceof P.getEnv().Canvas||he(o))return t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function br(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function St(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new A(o.naturalWidth,o.naturalHeight):o instanceof e?new A(o.videoWidth,o.videoHeight):new A(o.width,o.height)}function At({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function xe(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!he(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||St(o),a=At({width:r,height:n});return o instanceof e?W(a).putImageData(o,0,0):W(a).drawImage(o,0,0,r,n),a}var gr=b(g());async function vr(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(V(o)?1:0),s=gr.tidy(()=>o.as3D(r,n,a).toInt());return await gr.browser.toPixels(s,e),s.dispose(),e}function ke(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var K=b(g());function yr(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return At({width:1,height:1});let a=St(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=At({width:t,height:t}),p=o instanceof n?o:xe(o),d=Math.abs(i-c)/2,u=e&&i0&&p.height>0&&W(m).drawImage(p,u,l,i,c),m}var ft=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(gt(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(V(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:xe(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return pt(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Ur({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,K.tidy(()=>{let r=pt(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof K.Tensor){let i=V(s)?s:s.expandDims();return i=lr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=K.image.resizeBilinear(i,[t,t])),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return K.browser.fromPixels(yr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return K.stack(r.map(a=>K.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function E(o){if(o instanceof ft)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Lt);return r.forEach((n,a)=>{if(!ke(n)&&!gt(n)&&!V(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(V(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ke(n)&&xr(n))),new ft(r,Array.isArray(o))}async function qt(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await E(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await vr(i)}let n=W(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=At({width:c,height:m});return c>0&&m>0&&W(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var Fr=b(g());async function Zt(o,t){if(!gt(o)&&!V(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(V(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return Fr.tidy(()=>{let[e,r,n]=o.shape.slice(V(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).map(({x:i,y:c,width:m,height:p})=>Fr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function Wt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function So(o){let t=await Wt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return br(e)}async function Tr(o){return(await Wt(o)).json()}async function Ao(o){return new Float32Array(await(await Wt(o)).arrayBuffer())}var Wo=b(g());function _r(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function wr(o,t){let{manifestUri:e,modelBaseUri:r}=_r(o,t),n=await Tr(e);return Wo.io.loadWeights(n,r)}function Bo(o,t,e=!1){let{width:r,height:n}=e?St(t):t;return o.width=r,o.height=n,{width:r,height:n}}var Rt=b(g());var yt=b(g());var S=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof yt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof yt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=yt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await wr(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=_r(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(d=>d.buffer))),s=yt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof yt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var C=b(g());var be=b(g());function O(o,t,e){return be.tidy(()=>{let r=be.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=be.add(r,t.bias),r})}function Pr(o,t,e=!1){return C.tidy(()=>{let r=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):O(o,t.conv0,[2,2])),n=O(r,t.conv1,[1,1]),a=C.relu(C.add(r,n)),s=O(a,t.conv2,[1,1]);return C.relu(C.add(r,C.add(n,s)))})}function Se(o,t,e=!1,r=!0){return C.tidy(()=>{let n=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):O(o,t.conv0,r?[2,2]:[1,1])),a=O(n,t.conv1,[1,1]),s=C.relu(C.add(n,a)),i=O(s,t.conv2,[1,1]),c=C.relu(C.add(n,C.add(a,i))),m=O(c,t.conv3,[1,1]);return C.relu(C.add(n,C.add(a,C.add(i,m))))})}var Bt=b(g());function Kt(o,t,e="same",r=!1){return Bt.tidy(()=>{let n=Bt.add(Bt.conv2d(o,t.filters,[1,1],e),t.bias);return r?Bt.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var Dr=b(g());function ge(o,t){return(e,r,n,a)=>{let s=Dr.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Dr.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var Er=b(g());function Mr(o,t){return(e,r,n)=>{let a=Er.tensor2d(o(e*r),[e,r]),s=Er.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Ae=b(g());var Cr=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ve(o,t){return(e,r,n)=>{let a=Ae.tensor4d(o(3*3*e),[3,3,e,1]),s=Ae.tensor4d(o(e*r),[1,1,e,r]),i=Ae.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Cr(a,s,i)}}function ye(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Cr(e,r,n)}}function H(o,t){return(e,r,n)=>{let a=o[e];if(!Gt(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function Nr(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),d=r(i,i,`${c}/conv1`),u=r(i,i,`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function a(s,i,c,m=!1){let{conv0:p,conv1:d,conv2:u}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function Ir(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function Lr(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:d}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`),u=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:d,conv3:u}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function $o(o){let t=[],{extractDenseBlock4Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var We=class extends S{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return Rt.tidy(()=>{let r=Rt.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Rt.scalar(255)),s=Se(a,e.dense0,!0);return s=Se(s,e.dense1),s=Se(s,e.dense2),s=Se(s,e.dense3),s=Rt.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return $o(t)}extractParams(t){return Ro(t)}};var Ho=b(g());var Fe=b(g());function Be(o,t){return Fe.tidy(()=>Fe.add(Fe.matMul(o,t.weights),t.bias))}function Oo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=Mr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function jo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function kr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Re=class extends S{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return Ho.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t;return Be(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Oo(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),jo(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,a=t.slice(0,t.length-n),s=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Sr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Ft=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Sr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Sr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var $e=class extends Re{constructor(t=new We){super("FaceExpressionNet",t)}forwardInput(t){return Te.tidy(()=>Te.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await E(t))}async predictExpressions(t){let e=await E(t),r=await this.forwardInput(e),n=await Promise.all(Te.unstack(r).map(async s=>{let i=await s.data();return s.dispose(),i}));r.dispose();let a=n.map(s=>new Ft(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Ar(o){return o.expressions instanceof Ft}function Oe(o,t){return{...o,...{expressions:t}}}function la(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof Ft?a:Ar(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(d=>d.probability>e),m=nt(a)?a.detection.box.bottomLeft:r||new h(0,0);new kt(c.map(d=>`${d.expression} (${zt(d.probability)})`),m).draw(o)})}function $t(o){return nt(o)&&o.landmarks instanceof j&&o.unshiftedLandmarks instanceof j&&o.alignedRect instanceof M}function fa(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function Qt(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=fa(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var oo=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},no=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new oo(e)}draw(t){let e=W(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Jt&&(e.strokeStyle=s,e.lineWidth=a,bt(e,this.faceLandmarks.getJawOutline()),bt(e,this.faceLandmarks.getLeftEyeBrow()),bt(e,this.faceLandmarks.getRightEyeBrow()),bt(e,this.faceLandmarks.getNose()),bt(e,this.faceLandmarks.getLeftEye(),!0),bt(e,this.faceLandmarks.getRightEye(),!0),bt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function ha(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof j?r:$t(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new no(n).draw(o)})}var Yo="1.1.1";var xt=b(g());var I=b(g());function xa(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Go(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=xa(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),d=i(64,128,"entry_flow/reduction_block_1"),u={conv_in:m,reduction_block_0:p,reduction_block_1:d},l={};pt(t,0,1).forEach(y=>{l[`main_block_${y}`]=c(128,`middle_flow/main_block_${y}`)});let v=i(128,256,"exit_flow/reduction_block"),w=s(256,512,"exit_flow/separable_conv"),x={reduction_block:v,separable_conv:w};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:u,middle_flow:l,exit_flow:x}}}function ba(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function zo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=ba(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},d={};pt(t,0,1).forEach(w=>{d[`main_block_${w}`]=s(`middle_flow/main_block_${w}`)});let u=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),v={reduction_block:u,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:d,exit_flow:v},paramMappings:e}}function Vo(o,t,e){return I.add(I.conv2d(o,t.filters,e,"same"),t.bias)}function so(o,t,e=!0){let r=e?I.relu(o):o;return r=O(r,t.separable_conv0,[1,1]),r=O(I.relu(r),t.separable_conv1,[1,1]),r=I.maxPool(r,[3,3],[2,2],"same"),r=I.add(r,Vo(o,t.expansion_conv,[2,2])),r}function ga(o,t){let e=O(I.relu(o),t.separable_conv0,[1,1]);return e=O(I.relu(e),t.separable_conv1,[1,1]),e=O(I.relu(e),t.separable_conv2,[1,1]),e=I.add(e,o),e}var io=class extends S{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return I.tidy(()=>{let r=I.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(I.scalar(256)),s=I.relu(Vo(a,e.entry_flow.conv_in,[2,2]));return s=so(s,e.entry_flow.reduction_block_0,!1),s=so(s,e.entry_flow.reduction_block_1),pt(this._numMainBlocks,0,1).forEach(i=>{s=ga(s,e.middle_flow[`main_block_${i}`])}),s=so(s,e.exit_flow.reduction_block),s=I.relu(O(s,e.exit_flow.separable_conv,[1,1])),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return zo(t,this._numMainBlocks)}extractParams(t){return Go(t,this._numMainBlocks)}};function Uo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=Mr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function Xo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var ht;(function(o){o.FEMALE="female",o.MALE="male"})(ht||(ht={}));var je=class extends S{constructor(t=new io(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return xt.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t,n=xt.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),a=Be(n,e.fc.age).as1D(),s=Be(n,e.fc.gender);return{age:a,gender:s}})}forwardInput(t){return xt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:xt.softmax(r)}})}async forward(t){return this.forwardInput(await E(t))}async predictAgeAndGender(t){let e=await E(t),r=await this.forwardInput(e),n=xt.unstack(r.age),a=xt.unstack(r.gender),s=n.map((c,m)=>({ageTensor:c,genderTensor:a[m]})),i=await Promise.all(s.map(async({ageTensor:c,genderTensor:m})=>{let p=(await c.data())[0],d=(await m.data())[0],u=d>.5,l=u?ht.MALE:ht.FEMALE,v=u?d:1-d;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:v}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?i:i[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Uo(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Xo(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),n=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var Y=b(g());var He=class extends Re{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return Y.tidy(()=>{let s=(d,u)=>Y.stack([Y.fill([68],d,"float32"),Y.fill([68],u,"float32")],1).as2D(1,136).as1D(),i=(d,u)=>{let{width:l,height:v}=n[d];return u(l,v)?Math.abs(l-v)/2:0},c=d=>i(d,(u,l)=>ui(d,(u,l)=>ls(c(u),m(u))))).div(Y.stack(Array.from(Array(a),(d,u)=>s(n[u].width,n[u].height))))})}forwardInput(t){return Y.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await E(t))}async detectLandmarks(t){let e=await E(t),r=Y.tidy(()=>Y.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(await a.data()),c=i.filter((p,d)=>cr(d)),m=i.filter((p,d)=>!cr(d));return new Jt(Array(68).fill(0).map((p,d)=>new h(c[d],m[d])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var te=class extends He{constructor(t=new We){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var Ot=b(g());function Jo(o){let t=[],{extractDenseBlock3Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function qo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var co=class extends S{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Ot.tidy(()=>{let r=Ot.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Ot.scalar(255)),s=Pr(a,e.dense0,!0);return s=Pr(s,e.dense1),s=Pr(s,e.dense2),s=Ot.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Jo(t)}extractParams(t){return qo(t)}};var Ye=class extends He{constructor(t=new co){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var mo=class extends te{};var U=b(g());var _e=b(g());var Wr=b(g());function Zo(o,t){return Wr.add(Wr.mul(o,t.weights),t.biases)}function po(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=_e.conv2d(o,a,e,n);return i=_e.add(i,s),i=Zo(i,t.scale),r?_e.relu(i):i}function Ko(o,t){return po(o,t,[1,1],!0)}function uo(o,t){return po(o,t,[1,1],!1)}function Br(o,t){return po(o,t,[2,2],!0,"valid")}var G=b(g());function va(o,t){function e(i,c,m){let p=o(i),d=p.length/(c*m*m);if(Vr(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return G.tidy(()=>G.transpose(G.tensor4d(p,[c,d,m,m]),[2,3,1,0]))}function r(i,c,m,p){let d=e(i,c,m),u=G.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:u}}function n(i,c){let m=G.tensor1d(o(i)),p=G.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let d=r(i,c,m,`${p}/conv`),u=n(c,`${p}/scale`);return{conv:d,scale:u}}function s(i,c,m,p,d=!1){let u=a((d?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:u,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Qo(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=va(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),d=a(36864,64,3,"conv64_1"),u=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),v=a(147456,128,3,"conv128_down",!0),w=a(147456,128,3,"conv128_1"),x=a(147456,128,3,"conv128_2"),y=a(589824,256,3,"conv256_down",!0),T=a(589824,256,3,"conv256_1"),F=a(589824,256,3,"conv256_2"),L=a(589824,256,3,"conv256_down_out"),z=G.tidy(()=>G.transpose(G.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:d,conv64_2:u,conv64_3:l,conv128_down:v,conv128_1:w,conv128_2:x,conv256_down:y,conv256_1:T,conv256_2:F,conv256_down_out:L,fc:z},paramMappings:r}}function ya(o,t){let e=H(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function tn(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=ya(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),d=r("conv64_3"),u=r("conv128_down"),l=r("conv128_1"),v=r("conv128_2"),w=r("conv256_down"),x=r("conv256_1"),y=r("conv256_2"),T=r("conv256_down_out"),{fc:F}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!zr(F))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${F}`);let L={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:d,conv128_down:u,conv128_1:l,conv128_2:v,conv256_down:w,conv256_1:x,conv256_2:y,conv256_down_out:T,fc:F};return B(o,t),{params:L,paramMappings:t}}var $=b(g());function at(o,t){let e=Ko(o,t.conv1);return e=uo(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ge(o,t){let e=Br(o,t.conv1);e=uo(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var ee=class extends S{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return U.tidy(()=>{let r=U.cast(t.toBatchTensor(150,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(U.scalar(256)),s=Br(a,e.conv32_down);s=U.maxPool(s,3,2,"valid"),s=at(s,e.conv32_1),s=at(s,e.conv32_2),s=at(s,e.conv32_3),s=Ge(s,e.conv64_down),s=at(s,e.conv64_1),s=at(s,e.conv64_2),s=at(s,e.conv64_3),s=Ge(s,e.conv128_down),s=at(s,e.conv128_1),s=at(s,e.conv128_2),s=Ge(s,e.conv256_down),s=at(s,e.conv256_1),s=at(s,e.conv256_2),s=Ge(s,e.conv256_down_out);let i=s.mean([1,2]);return U.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await E(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)==null?void 0:a.some(s=>s<=0))return new Float32Array(128);let e=await E(t),r=U.tidy(()=>U.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return tn(t)}extractParams(t){return Qo(t)}};function en(o){let t=new ee;return t.extractWeights(o),t}function ze(o,t){return{...o,...{descriptor:t}}}function rn(o){return typeof o.age=="number"}function Ve(o,t){return{...o,...{age:t}}}function on(o){return(o.gender===ht.MALE||o.gender===ht.FEMALE)&&de(o.genderProbability)}function Ue(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var it=b(g());var st=b(g());function Fa(o,t){function e(c,m){let p=st.tensor4d(o(3*3*c),[3,3,c,1]),d=st.tensor1d(o(c)),u=st.tensor1d(o(c)),l=st.tensor1d(o(c)),v=st.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:u,batch_norm_mean:l,batch_norm_variance:v}}function r(c,m,p,d,u){let l=st.tensor4d(o(c*m*p*p),[p,p,c,m]),v=st.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${u?"batch_norm_offset":"bias"}`}),{filters:l,bias:v}}function n(c,m,p,d){let{filters:u,bias:l}=r(c,m,p,d,!0);return{filters:u,batch_norm_offset:l}}function a(c,m,p){let d=e(c,`${p}/depthwise_conv`),u=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:u}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),d=a(128,128,"mobilenetv1/conv_3"),u=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),v=a(256,512,"mobilenetv1/conv_6"),w=a(512,512,"mobilenetv1/conv_7"),x=a(512,512,"mobilenetv1/conv_8"),y=a(512,512,"mobilenetv1/conv_9"),T=a(512,512,"mobilenetv1/conv_10"),F=a(512,512,"mobilenetv1/conv_11"),L=a(512,1024,"mobilenetv1/conv_12"),z=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,conv_8:x,conv_9:y,conv_10:T,conv_11:F,conv_12:L,conv_13:z}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),d=n(128,256,3,"prediction_layer/conv_3"),u=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),v=n(256,64,1,"prediction_layer/conv_6"),w=n(64,128,3,"prediction_layer/conv_7"),x=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),T=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),F=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),L=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),z=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),mt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Et=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Mt=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Ct=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,box_predictor_0:{box_encoding_predictor:x,class_predictor:y},box_predictor_1:{box_encoding_predictor:T,class_predictor:F},box_predictor_2:{box_encoding_predictor:L,class_predictor:z},box_predictor_3:{box_encoding_predictor:rt,class_predictor:mt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Et},box_predictor_5:{box_encoding_predictor:Mt,class_predictor:Ct}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function nn(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Fa(e,t),s=n(),i=a(),m={extra_dim:st.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Ta(o,t){let e=H(o,t);function r(m,p,d){let u=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:u,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,d=`MobilenetV1/Conv2d_${m}_depthwise`,u=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,v=e(`${d}/depthwise_weights`,4,`${u}/filters`),w=e(`${d}/BatchNorm/gamma`,1,`${u}/batch_norm_scale`),x=e(`${d}/BatchNorm/beta`,1,`${u}/batch_norm_offset`),y=e(`${d}/BatchNorm/moving_mean`,1,`${u}/batch_norm_mean`),T=e(`${d}/BatchNorm/moving_variance`,1,`${u}/batch_norm_variance`);return{depthwise_conv:{filters:v,batch_norm_scale:w,batch_norm_offset:x,batch_norm_mean:y,batch_norm_variance:T},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let d=e(`${m}/weights`,4,`${p}/filters`),u=e(`${m}/biases`,1,`${p}/bias`);return{filters:d,bias:u}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),d=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function an(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Ta(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!gt(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var Tt=b(g());var jt=b(g());function Q(o,t,e){return jt.tidy(()=>{let r=jt.conv2d(o,t.filters,e,"same");return r=jt.add(r,t.batch_norm_offset),jt.clipByValue(r,0,6)})}var _a=.0010000000474974513;function wa(o,t,e){return Tt.tidy(()=>{let r=Tt.depthwiseConv2d(o,t.filters,e,"same");return r=Tt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,_a),Tt.clipByValue(r,0,6)})}function Pa(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function sn(o,t){return Tt.tidy(()=>{let e,r=Q(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=Pa(i);r=wa(r,a.depthwise_conv,c),r=Q(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function Da(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),d=Math.max(r[e][1],r[e][3]),u=(s-n)*(i-a),l=(p-c)*(d-m);if(u<=0||l<=0)return 0;let v=Math.max(n,c),w=Math.max(a,m),x=Math.min(s,p),y=Math.min(i,d),T=Math.max(x-v,0)*Math.max(y-w,0);return T/(u+l-T)}function cn(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>n).sort((p,d)=>d.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let d=p.score;for(let u=m.length-1;u>=0;--u){let l=Da(o,p.boxIndex,m[u]);if(l!==0&&(p.score*=c(l),p.score<=n))break}d===p.score&&m.push(p.boxIndex)}),m}var f=b(g());function Ea(o){let t=f.unstack(f.transpose(o,[1,0])),e=[f.sub(t[2],t[0]),f.sub(t[3],t[1])],r=[f.add(t[0],f.div(e[0],f.scalar(2))),f.add(t[1],f.div(e[1],f.scalar(2)))];return{sizes:e,centers:r}}function Ma(o,t){let{sizes:e,centers:r}=Ea(o),n=f.unstack(f.transpose(t,[1,0])),a=f.div(f.mul(f.exp(f.div(n[2],f.scalar(5))),e[0]),f.scalar(2)),s=f.add(f.mul(f.div(n[0],f.scalar(10)),e[0]),r[0]),i=f.div(f.mul(f.exp(f.div(n[3],f.scalar(5))),e[1]),f.scalar(2)),c=f.add(f.mul(f.div(n[1],f.scalar(10)),e[1]),r[1]);return f.transpose(f.stack([f.sub(s,a),f.sub(c,i),f.add(s,a),f.add(c,i)]),[1,0])}function mn(o,t,e){return f.tidy(()=>{let r=o.shape[0],n=Ma(f.reshape(f.tile(e.extra_dim,[r,1,1]),[-1,4]),f.reshape(o,[-1,4]));n=f.reshape(n,[r,n.shape[0]/r,4]);let a=f.sigmoid(f.slice(t,[0,0,1],[-1,-1,-1])),s=f.slice(a,[0,0,0],[-1,-1,1]);s=f.reshape(s,[r,s.shape[1]]);let i=f.unstack(n),c=f.unstack(s);return{boxes:i,scores:c}})}var Je=b(g());var Xe=b(g());function re(o,t){return Xe.tidy(()=>{let e=o.shape[0],r=Xe.reshape(Kt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Xe.reshape(Kt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function pn(o,t,e){return Je.tidy(()=>{let r=Q(o,e.conv_0,[1,1]),n=Q(r,e.conv_1,[2,2]),a=Q(n,e.conv_2,[1,1]),s=Q(a,e.conv_3,[2,2]),i=Q(s,e.conv_4,[1,1]),c=Q(i,e.conv_5,[2,2]),m=Q(c,e.conv_6,[1,1]),p=Q(m,e.conv_7,[2,2]),d=re(t,e.box_predictor_0),u=re(o,e.box_predictor_1),l=re(n,e.box_predictor_2),v=re(s,e.box_predictor_3),w=re(c,e.box_predictor_4),x=re(p,e.box_predictor_5),y=Je.concat([d.boxPredictionEncoding,u.boxPredictionEncoding,l.boxPredictionEncoding,v.boxPredictionEncoding,w.boxPredictionEncoding,x.boxPredictionEncoding],1),T=Je.concat([d.classPrediction,u.classPrediction,l.classPrediction,v.classPrediction,w.classPrediction,x.classPrediction],1);return{boxPredictions:y,classPredictions:T}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Ht=class extends S{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return it.tidy(()=>{let r=it.cast(t.toBatchTensor(512,!1),"float32"),n=it.sub(it.mul(r,it.scalar(.007843137718737125)),it.scalar(1)),a=sn(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=pn(a.out,a.conv11,e.prediction_layer);return mn(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await E(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await E(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let F=1;F{let[L,z]=[Math.max(0,y[F][0]),Math.min(1,y[F][2])].map(q=>q*x),[rt,mt]=[Math.max(0,y[F][1]),Math.min(1,y[F][3])].map(q=>q*w);return new M(p[F],new Xt(rt,L,mt-rt,z-L),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),T}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return an(t)}extractParams(t){return nn(t)}};function lo(o){let t=new Ht;return t.extractWeights(o),t}function dn(o){return lo(o)}var fo=class extends Ht{};var un=.4,ln=[new h(.738768,.874946),new h(2.42204,2.65704),new h(4.30971,7.04493),new h(10.246,4.59428),new h(12.6868,11.8741)],fn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],hn=[117.001,114.697,97.404],xn="tiny_yolov2_model",bn="tiny_yolov2_separable_conv_model";var N=b(g());var Rr=o=>typeof o=="number";function $r(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Rr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Rr(t.x)&&Rr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Rr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var et=b(g());var tt=b(g());function we(o){return tt.tidy(()=>{let t=tt.mul(o,tt.scalar(.10000000149011612));return tt.add(tt.relu(tt.sub(o,t)),t)})}function _t(o,t){return et.tidy(()=>{let e=et.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=et.conv2d(e,t.conv.filters,[1,1],"valid"),e=et.sub(e,t.bn.sub),e=et.mul(e,t.bn.truediv),e=et.add(e,t.conv.bias),we(e)})}var Yt=b(g());function wt(o,t){return Yt.tidy(()=>{let e=Yt.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Yt.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=Yt.add(e,t.bias),we(e)})}var ho=b(g());function Ca(o,t){let e=ge(o,t);function r(s,i){let c=ho.tensor1d(o(s)),m=ho.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ve(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function gn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=Ca(n,s),p;if(t.withSeparableConvs){let[d,u,l,v,w,x,y,T,F]=r,L=t.isFirstLayerConv2d?i(d,u,3,"conv0"):m(d,u,"conv0"),z=m(u,l,"conv1"),rt=m(l,v,"conv2"),mt=m(v,w,"conv3"),q=m(w,x,"conv4"),Et=m(x,y,"conv5"),Mt=T?m(y,T,"conv6"):void 0,Ct=F?m(T,F,"conv7"):void 0,pe=i(F||T||y,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}else{let[d,u,l,v,w,x,y,T,F]=r,L=c(d,u,"conv0"),z=c(u,l,"conv1"),rt=c(l,v,"conv2"),mt=c(v,w,"conv3"),q=c(w,x,"conv4"),Et=c(x,y,"conv5"),Mt=c(y,T,"conv6"),Ct=c(T,F,"conv7"),pe=i(F,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function Na(o,t){let e=H(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=ye(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function vn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=Na(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var ct=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var xo=class extends S{constructor(t){super("TinyYolov2");$r(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=_t(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=_t(r,e.conv6),r=_t(r,e.conv7),Kt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?we(Kt(t,e.conv0,"valid",!1)):wt(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?wt(r,e.conv6):r,r=e.conv7?wt(r,e.conv7):r,Kt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let n=N.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?Z(n,this.config.meanRgb):n,n=n.div(N.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(n,r):this.runTinyYolov2(n,r)})}async forward(t,e){return this.forwardInput(await E(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:n}=new ct(e),a=await E(t),s=await this.forwardInput(a,r),i=N.tidy(()=>N.unstack(s)[0].expandDims()),c={width:a.getInputWidth(0),height:a.getInputHeight(0)},m=await this.extractBoxes(i,a.getReshapedInputDimensions(0),n);s.dispose(),i.dispose();let p=m.map(x=>x.box),d=m.map(x=>x.score),u=m.map(x=>x.classScore),l=m.map(x=>this.config.classes[x.label]);return ur(p.map(x=>x.rescale(r)),d,this.config.iouThreshold,!0).map(x=>new vt(d[x],u[x],l[x],p[x],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return vn(t,this.config)}extractParams(t){let e=this.config.filterSizes||xo.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return gn(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:n,height:a}=e,s=Math.max(n,a),i=s/n,c=s/a,m=t.shape[1],p=this.config.anchors.length,[d,u,l]=N.tidy(()=>{let y=t.reshape([m,m,p,this.boxEncodingSize]),T=y.slice([0,0,0,0],[m,m,p,4]),F=y.slice([0,0,0,4],[m,m,p,1]),L=this.withClassScores?N.softmax(y.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):N.scalar(0);return[T,F,L]}),v=[],w=await u.array(),x=await d.array();for(let y=0;yr){let z=(T+ue(x[y][T][F][0]))/m*i,rt=(y+ue(x[y][T][F][1]))/m*c,mt=Math.exp(x[y][T][F][2])*this.config.anchors[F].x/m*i,q=Math.exp(x[y][T][F][3])*this.config.anchors[F].y/m*c,Et=z-mt/2,Mt=rt-q/2,Ct={row:y,col:T,anchor:F},{classScore:pe,label:Po}=this.withClassScores?await this.extractPredictedClass(l,Ct):{classScore:1,label:0};v.push({box:new Ut(Et,Mt,Et+mt,Mt+q),score:L,classScore:L*pe,label:Po,...Ct})}}return d.dispose(),u.dispose(),l.dispose(),v}async extractPredictedClass(t,e){let{row:r,col:n,anchor:a}=e,s=await t.array();return Array(this.config.classes.length).fill(0).map((i,c)=>s[r][n][a][c]).map((i,c)=>({classScore:i,label:c})).reduce((i,c)=>i.classScore>c.classScore?i:c)}},Pe=xo;Pe.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var oe=class extends Pe{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:un,classes:["face"],...t?{anchors:fn,meanRgb:hn}:{anchors:ln,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?bn:xn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function yn(o,t=!0){let e=new oe(t);return e.extractWeights(o),e}var qe=class extends ct{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Ke=b(g());var bo=b(g());async function ne(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>$t(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await Zt(t,a):await qt(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function De(o,t,e,r,n){return ne([o],t,async a=>e(a[0]),r,n)}var Fn=.4,Tn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],_n=[117.001,114.697,97.404];var ae=class extends Pe{constructor(){let t={withSeparableConvs:!0,iouThreshold:Fn,classes:["face"],anchors:Tn,meanRgb:_n,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var _={ssdMobilenetv1:new Ht,tinyFaceDetector:new ae,tinyYolov2:new oe,faceLandmark68Net:new te,faceLandmark68TinyNet:new Ye,faceRecognitionNet:new ee,faceExpressionNet:new $e,ageGenderNet:new je},go=(o,t)=>_.ssdMobilenetv1.locateFaces(o,t),wn=(o,t)=>_.tinyFaceDetector.locateFaces(o,t),Pn=(o,t)=>_.tinyYolov2.locateFaces(o,t),vo=o=>_.faceLandmark68Net.detectLandmarks(o),Dn=o=>_.faceLandmark68TinyNet.detectLandmarks(o),En=o=>_.faceRecognitionNet.computeFaceDescriptor(o),Mn=o=>_.faceExpressionNet.predictExpressions(o),Cn=o=>_.ageGenderNet.predictAgeAndGender(o),yo=o=>_.ssdMobilenetv1.load(o),Nn=o=>_.tinyFaceDetector.load(o),In=o=>_.tinyYolov2.load(o),Ln=o=>_.faceLandmark68Net.load(o),kn=o=>_.faceLandmark68TinyNet.load(o),Sn=o=>_.faceRecognitionNet.load(o),An=o=>_.faceExpressionNet.load(o),Wn=o=>_.ageGenderNet.load(o),Bn=yo,Rn=go,$n=vo;var Fo=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ce=class extends Fo{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>Oe(r,e[n]))}withAgeAndGender(){return new Ee(this,this.input)}},Ne=class extends Fo{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceExpressionNet.predictExpressions(r),this.extractedFaces);return Oe(t,e)}withAgeAndGender(){return new Me(this,this.input)}},ce=class extends Ce{withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},me=class extends Ne{withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var To=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ee=class extends To{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Ve(Ue(r,s,i),a)})}withFaceExpressions(){return new Ce(this,this.input)}},Me=class extends To{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await De(t,this.input,a=>_.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Ve(Ue(t,r,n),e)}withFaceExpressions(){return new Ne(this,this.input)}},se=class extends Ee{withFaceExpressions(){return new ce(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},ie=class extends Me{withFaceExpressions(){return new me(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var Ze=class extends J{constructor(t,e){super();this.parentTask=t;this.input=e}},Pt=class extends Ze{async run(){let t=await this.parentTask;return(await ne(t,this.input,r=>Promise.all(r.map(n=>_.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>ze(t[n],r))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}},Dt=class extends Ze{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return ze(t,e)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}};var Qe=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?_.faceLandmark68TinyNet:_.faceLandmark68Net}},tr=class extends Qe{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof Ke.Tensor?await Zt(this.input,e):await qt(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),t.map((a,s)=>Qt(a,n[s]))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},er=class extends Qe{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Ke.Tensor?await Zt(this.input,[e]):await qt(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),Qt(t,n)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var rr=class extends J{constructor(t,e=new X){super();this.input=t;this.options=e}},Ie=class extends rr{async run(){let{input:t,options:e}=this,r;if(e instanceof qe)r=_.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=_.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ct)r=_.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>It({},r)))})}withFaceLandmarks(t=!1){return new tr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Ce(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Ee(this.runAndExtendWithFaceDetections(),this.input)}},or=class extends rr{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?It({},e):void 0)})}withFaceLandmarks(t=!1){return new er(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Ne(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Me(this.runAndExtendWithFaceDetection(),this.input)}};function On(o,t=new X){return new or(o,t)}function nr(o,t=new X){return new Ie(o,t)}async function _o(o,t){return nr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function jn(o,t={}){return nr(o,new ct(t)).withFaceLandmarks().withFaceDescriptors()}var Hn=_o;function Or(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var ar=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof ut)return s;if(s instanceof Float32Array)return new ut(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new ut(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>Or(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new le(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>ut.fromJSON(r));return new ar(e,t.distanceThreshold)}};function Yn(o){let t=new ae;return t.extractWeights(o),t}function wo(o,t){let{width:e,height:r}=new A(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>wo(n,{width:e,height:r}));if($t(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return Qt(It(o,n),a)}return nt(o)?It(o,o.detection.forSize(e,r)):o instanceof j||o instanceof M?o.forSize(e,r):o}var Ia=typeof process!="undefined",La=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",zn={faceapi:Yo,node:Ia,browser:La};0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); +var Vn=Object.create,sr=Object.defineProperty,Un=Object.getPrototypeOf,Xn=Object.prototype.hasOwnProperty,Jn=Object.getOwnPropertyNames,qn=Object.getOwnPropertyDescriptor;var jr=o=>sr(o,"__esModule",{value:!0});var Do=(o,t)=>()=>(t||(t={exports:{}},o(t.exports,t)),t.exports),ir=(o,t)=>{for(var e in t)sr(o,e,{get:t[e],enumerable:!0})},Zn=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Jn(t))!Xn.call(o,r)&&r!=="default"&&sr(o,r,{get:()=>t[r],enumerable:!(e=qn(t,r))||e.enumerable});return o},b=o=>Zn(jr(sr(o!=null?Vn(Un(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);var g=Do(Hr=>{var Kn=Object.create,Yr=Object.defineProperty,Qn=Object.getPrototypeOf,ta=Object.prototype.hasOwnProperty,ea=Object.getOwnPropertyNames,ra=Object.getOwnPropertyDescriptor,Eo=o=>Yr(o,"__esModule",{value:!0}),Mo=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ea(t))!ta.call(o,r)&&r!=="default"&&Yr(o,r,{get:()=>t[r],enumerable:!(e=ra(t,r))||e.enumerable});return o},oa=o=>Mo(Eo(Yr(o!=null?Kn(Qn(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);Eo(Hr);Mo(Hr,oa(require("@tensorflow/tfjs-node-gpu")))});var ko=Do((ca,Lo)=>{jr(ca);ir(ca,{isNodejs:()=>ma});function ma(){return typeof global=="object"&&!0&&typeof Lo!="undefined"&&typeof process!="undefined"&&!!process.version}});jr(exports);ir(exports,{AgeGenderNet:()=>je,BoundingBox:()=>Ut,Box:()=>D,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>Pt,ComputeFaceDescriptorsTaskBase:()=>Ze,ComputeSingleFaceDescriptorTask:()=>Dt,DetectAllFaceLandmarksTask:()=>tr,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Qe,DetectFacesTaskBase:()=>rr,DetectSingleFaceLandmarksTask:()=>er,DetectSingleFaceTask:()=>or,Dimensions:()=>A,FACE_EXPRESSION_LABELS:()=>Sr,FaceDetection:()=>M,FaceDetectionNet:()=>fo,FaceExpressionNet:()=>$e,FaceExpressions:()=>Ft,FaceLandmark68Net:()=>te,FaceLandmark68TinyNet:()=>Ye,FaceLandmarkNet:()=>mo,FaceLandmarks:()=>j,FaceLandmarks5:()=>Xr,FaceLandmarks68:()=>Jt,FaceMatch:()=>le,FaceMatcher:()=>ar,FaceRecognitionNet:()=>ee,Gender:()=>ht,LabeledBox:()=>fe,LabeledFaceDescriptors:()=>ut,NetInput:()=>ft,NeuralNetwork:()=>S,ObjectDetection:()=>vt,Point:()=>h,PredictedBox:()=>Jr,Rect:()=>Xt,SsdMobilenetv1:()=>Ht,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ae,TinyFaceDetectorOptions:()=>qe,TinyYolov2:()=>oe,TinyYolov2Options:()=>ct,allFaces:()=>Hn,allFacesSsdMobilenetv1:()=>_o,allFacesTinyYolov2:()=>jn,awaitMediaLoaded:()=>xr,bufferToImage:()=>br,computeFaceDescriptor:()=>En,createCanvas:()=>At,createCanvasFromMedia:()=>xe,createFaceDetectionNet:()=>dn,createFaceRecognitionNet:()=>en,createSsdMobilenetv1:()=>lo,createTinyFaceDetector:()=>Yn,createTinyYolov2:()=>yn,detectAllFaces:()=>nr,detectFaceLandmarks:()=>vo,detectFaceLandmarksTiny:()=>Dn,detectLandmarks:()=>$n,detectSingleFace:()=>On,draw:()=>ao,env:()=>P,euclideanDistance:()=>Or,extendWithAge:()=>Ve,extendWithFaceDescriptor:()=>ze,extendWithFaceDetection:()=>It,extendWithFaceExpressions:()=>Oe,extendWithFaceLandmarks:()=>Qt,extendWithGender:()=>Ue,extractFaceTensors:()=>Zt,extractFaces:()=>qt,fetchImage:()=>So,fetchJson:()=>Tr,fetchNetWeights:()=>Ao,fetchOrThrow:()=>Wt,getContext2dOrThrow:()=>W,getMediaDimensions:()=>St,imageTensorToCanvas:()=>vr,imageToSquare:()=>yr,inverseSigmoid:()=>Io,iou:()=>pr,isMediaElement:()=>ke,isMediaLoaded:()=>he,isWithAge:()=>rn,isWithFaceDetection:()=>nt,isWithFaceExpressions:()=>Ar,isWithFaceLandmarks:()=>$t,isWithGender:()=>on,loadAgeGenderModel:()=>Wn,loadFaceDetectionModel:()=>Bn,loadFaceExpressionModel:()=>An,loadFaceLandmarkModel:()=>Ln,loadFaceLandmarkTinyModel:()=>kn,loadFaceRecognitionModel:()=>Sn,loadSsdMobilenetv1Model:()=>yo,loadTinyFaceDetectorModel:()=>Nn,loadTinyYolov2Model:()=>In,loadWeightMap:()=>wr,locateFaces:()=>Rn,matchDimensions:()=>Bo,minBbox:()=>dr,nets:()=>_,nonMaxSuppression:()=>ur,normalize:()=>Z,padToSquare:()=>lr,predictAgeAndGender:()=>Cn,recognizeFaceExpressions:()=>Mn,resizeResults:()=>wo,resolveInput:()=>Lt,shuffleArray:()=>No,sigmoid:()=>ue,ssdMobilenetv1:()=>go,tf:()=>Gn,tinyFaceDetector:()=>wn,tinyYolov2:()=>Pn,toNetInput:()=>E,utils:()=>Gr,validateConfig:()=>$r,version:()=>zn});var Gn=b(g());var ao={};ir(ao,{AnchorPosition:()=>lt,DrawBox:()=>hr,DrawBoxOptions:()=>ro,DrawFaceLandmarks:()=>no,DrawFaceLandmarksOptions:()=>oo,DrawTextField:()=>kt,DrawTextFieldOptions:()=>Le,drawContour:()=>bt,drawDetections:()=>ua,drawFaceExpressions:()=>la,drawFaceLandmarks:()=>ha});function bt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var Gr={};ir(Gr,{computeReshapedDimensions:()=>Ur,getCenterPoint:()=>Vt,isDimensions:()=>mr,isEven:()=>cr,isFloat:()=>Vr,isTensor:()=>Gt,isTensor1D:()=>na,isTensor2D:()=>zr,isTensor3D:()=>gt,isTensor4D:()=>V,isValidNumber:()=>ot,isValidProbablitiy:()=>de,range:()=>pt,round:()=>zt});var Co=b(g());var A=class{constructor(t,e){if(!ot(t)||!ot(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new A(1/this.width,1/this.height)}};function Gt(o,t){return o instanceof Co.Tensor&&o.shape.length===t}function na(o){return Gt(o,1)}function zr(o){return Gt(o,2)}function gt(o){return Gt(o,3)}function V(o){return Gt(o,4)}function Vr(o){return o%1!=0}function cr(o){return o%2==0}function zt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function mr(o){return o&&o.width&&o.height}function Ur({width:o,height:t},e){let r=e/Math.max(t,o);return new A(Math.round(o*r),Math.round(t*r))}function Vt(o){return o.reduce((t,e)=>t.add(e),new h(0,0)).div(new h(o.length,o.length))}function pt(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function ot(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function de(o){return ot(o)&&o>=0&&o<=1}var h=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new h(this.x+t.x,this.y+t.y)}sub(t){return new h(this.x-t.x,this.y-t.y)}mul(t){return new h(this.x*t.x,this.y*t.y)}div(t){return new h(this.x/t.x,this.y/t.y)}abs(){return new h(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new h(Math.floor(this.x),Math.floor(this.y))}};var D=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(ot)}static assertIsValidBox(t,e,r=!1){if(!D.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(ot),a=[r.x,r.y,r.width,r.height].every(ot);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];D.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new h(this.left,this.top)}get topRight(){return new h(this.right,this.top)}get bottomLeft(){return new h(this.left,this.bottom)}get bottomRight(){return new h(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new D({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new D({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-d+e+r,d=e),u>t&&(c=-u+t+n,u=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:u,x:m,ex:d,w:r,h:n}}calibrate(t){return new D({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Ut=class extends D{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var vt=class{constructor(t,e,r,n,a){this._imageDims=new A(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new D(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new D(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new vt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends vt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function pr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function dr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var dt=b(g());function Z(o,t){return dt.tidy(()=>{let[e,r,n]=t,a=dt.fill([...o.shape.slice(0,3),1],e,"float32"),s=dt.fill([...o.shape.slice(0,3),1],r,"float32"),i=dt.fill([...o.shape.slice(0,3),1],n,"float32"),c=dt.concat([a,s,i],3);return dt.sub(o,c)})}var Nt=b(g());function lr(o,t=!1){return Nt.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=u=>{let l=o.shape.slice();return l[s]=u,Nt.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],d=[t&&m?i(m):null,o,c].filter(u=>!!u).map(u=>Nt.cast(u,"float32"));return Nt.concat(d,s)})}function No(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function ue(o){return 1/(1+Math.exp(-o))}function Io(o){return Math.log(o/(1-o))}var Xt=class extends D{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var aa=.5,sa=.43,ia=.45,j=class{constructor(t,e,r=new h(0,0)){let{width:n,height:a}=e;this._imgDims=new A(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new h(n,a)).add(r))}get shift(){return new h(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new h(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new h(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new D(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=d=>n.sub(d).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/ia),c=Vt(t),m=Math.floor(Math.max(0,c.x-aa*i)),p=Math.floor(Math.max(0,c.y-sa*i));return new Xt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=dr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Xr=class extends j{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Vt([t[3],t[4]])]}};var Jt=class extends j{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Vt)}};var le=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${zt(this.distance)})`:""}`}};var fe=class extends D{static assertIsValidLabeledBox(t,e){if(D.assertIsValidBox(t,e),!ot(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t);this._label=e}get label(){return this._label}};var ut=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new ut(t.label,e)}};var Jr=class extends fe{static assertIsValidPredictedBox(t,e){if(fe.assertIsValidLabeledBox(t,e),!de(t.score)||!de(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,n){super(t,e);this._score=r,this._classScore=n}get score(){return this._score}get classScore(){return this._classScore}};function nt(o){return o.detection instanceof M}function It(o,t){return{...o,...{detection:t}}}function qr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function fr(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Zr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch,a=fr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:n,...a}}function Kr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var Qr=b(ko()),k;function pa(){if(!k)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return k}function to(o){k=o}function eo(){return Kr()?to(qr()):(0,Qr.isNodejs)()?to(Zr()):null}function da(o){if(k||eo(),!k)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=k.Canvas,Image:e=k.Image}=o;k.Canvas=t,k.Image=e,k.createCanvasElement=o.createCanvasElement||(()=>new t),k.createImageElement=o.createImageElement||(()=>new e),k.ImageData=o.ImageData||k.ImageData,k.Video=o.Video||k.Video,k.fetch=o.fetch||k.fetch,k.readFile=o.readFile||k.readFile}var P={getEnv:pa,setEnv:to,initialize:eo,createBrowserEnv:qr,createFileSystem:fr,createNodejsEnv:Zr,monkeyPatch:da,isBrowser:Kr,isNodejs:Qr.isNodejs};eo();function Lt(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function W(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Lt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var lt;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(lt||(lt={}));var Le=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||lt.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},kt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof kt?t.text:t,this.anchor=e,this.options=new Le(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let v=c+d.x,w=c+d.y+(l+1)*s;r.fillText(u,v,w)})}};var ro=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:lt.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Le({...s,...a})}},hr=class{constructor(t,e={}){this.box=new D(t),this.options=new ro(e)}draw(t){let e=W(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new kt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function ua(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:nt(r)?r.detection.score:void 0,a=r instanceof M?r.box:nt(r)?r.detection.box:new D(r),s=n?`${zt(n)}`:void 0;new hr(a,{label:s}).draw(o)})}var Te=b(g());function he(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function xr(o){return new Promise((t,e)=>{if(o instanceof P.getEnv().Canvas||he(o))return t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function br(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function St(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new A(o.naturalWidth,o.naturalHeight):o instanceof e?new A(o.videoWidth,o.videoHeight):new A(o.width,o.height)}function At({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function xe(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!he(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||St(o),a=At({width:r,height:n});return o instanceof e?W(a).putImageData(o,0,0):W(a).drawImage(o,0,0,r,n),a}var gr=b(g());async function vr(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(V(o)?1:0),s=gr.tidy(()=>o.as3D(r,n,a).toInt());return await gr.browser.toPixels(s,e),s.dispose(),e}function ke(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var K=b(g());function yr(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return At({width:1,height:1});let a=St(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=At({width:t,height:t}),p=o instanceof n?o:xe(o),d=Math.abs(i-c)/2,u=e&&i0&&p.height>0&&W(m).drawImage(p,u,l,i,c),m}var ft=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(gt(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(V(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:xe(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return pt(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Ur({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,K.tidy(()=>{let r=pt(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof K.Tensor){let i=V(s)?s:s.expandDims();return i=lr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=K.image.resizeBilinear(i,[t,t])),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return K.browser.fromPixels(yr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return K.stack(r.map(a=>K.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function E(o){if(o instanceof ft)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Lt);return r.forEach((n,a)=>{if(!ke(n)&&!gt(n)&&!V(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(V(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ke(n)&&xr(n))),new ft(r,Array.isArray(o))}async function qt(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await E(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await vr(i)}let n=W(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=At({width:c,height:m});return c>0&&m>0&&W(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var Fr=b(g());async function Zt(o,t){if(!gt(o)&&!V(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(V(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return Fr.tidy(()=>{let[e,r,n]=o.shape.slice(V(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).map(({x:i,y:c,width:m,height:p})=>Fr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function Wt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function So(o){let t=await Wt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return br(e)}async function Tr(o){return(await Wt(o)).json()}async function Ao(o){return new Float32Array(await(await Wt(o)).arrayBuffer())}var Wo=b(g());function _r(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function wr(o,t){let{manifestUri:e,modelBaseUri:r}=_r(o,t),n=await Tr(e);return Wo.io.loadWeights(n,r)}function Bo(o,t,e=!1){let{width:r,height:n}=e?St(t):t;return o.width=r,o.height=n,{width:r,height:n}}var Rt=b(g());var yt=b(g());var S=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof yt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof yt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=yt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await wr(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=_r(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(d=>d.buffer))),s=yt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof yt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var C=b(g());var be=b(g());function O(o,t,e){return be.tidy(()=>{let r=be.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=be.add(r,t.bias),r})}function Pr(o,t,e=!1){return C.tidy(()=>{let r=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):O(o,t.conv0,[2,2])),n=O(r,t.conv1,[1,1]),a=C.relu(C.add(r,n)),s=O(a,t.conv2,[1,1]);return C.relu(C.add(r,C.add(n,s)))})}function Se(o,t,e=!1,r=!0){return C.tidy(()=>{let n=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):O(o,t.conv0,r?[2,2]:[1,1])),a=O(n,t.conv1,[1,1]),s=C.relu(C.add(n,a)),i=O(s,t.conv2,[1,1]),c=C.relu(C.add(n,C.add(a,i))),m=O(c,t.conv3,[1,1]);return C.relu(C.add(n,C.add(a,C.add(i,m))))})}var Bt=b(g());function Kt(o,t,e="same",r=!1){return Bt.tidy(()=>{let n=Bt.add(Bt.conv2d(o,t.filters,[1,1],e),t.bias);return r?Bt.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var Dr=b(g());function ge(o,t){return(e,r,n,a)=>{let s=Dr.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Dr.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var Er=b(g());function Mr(o,t){return(e,r,n)=>{let a=Er.tensor2d(o(e*r),[e,r]),s=Er.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Ae=b(g());var Cr=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ve(o,t){return(e,r,n)=>{let a=Ae.tensor4d(o(3*3*e),[3,3,e,1]),s=Ae.tensor4d(o(e*r),[1,1,e,r]),i=Ae.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Cr(a,s,i)}}function ye(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Cr(e,r,n)}}function H(o,t){return(e,r,n)=>{let a=o[e];if(!Gt(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function Nr(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),d=r(i,i,`${c}/conv1`),u=r(i,i,`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function a(s,i,c,m=!1){let{conv0:p,conv1:d,conv2:u}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function Ir(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function Lr(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:d}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`),u=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:d,conv3:u}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function $o(o){let t=[],{extractDenseBlock4Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var We=class extends S{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return Rt.tidy(()=>{let r=Rt.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Rt.scalar(255)),s=Se(a,e.dense0,!0);return s=Se(s,e.dense1),s=Se(s,e.dense2),s=Se(s,e.dense3),s=Rt.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return $o(t)}extractParams(t){return Ro(t)}};var Ho=b(g());var Fe=b(g());function Be(o,t){return Fe.tidy(()=>Fe.add(Fe.matMul(o,t.weights),t.bias))}function Oo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=Mr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function jo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function kr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Re=class extends S{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return Ho.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t;return Be(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Oo(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),jo(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,a=t.slice(0,t.length-n),s=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Sr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Ft=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Sr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Sr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var $e=class extends Re{constructor(t=new We){super("FaceExpressionNet",t)}forwardInput(t){return Te.tidy(()=>Te.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await E(t))}async predictExpressions(t){let e=await E(t),r=await this.forwardInput(e),n=await Promise.all(Te.unstack(r).map(async s=>{let i=await s.data();return s.dispose(),i}));r.dispose();let a=n.map(s=>new Ft(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Ar(o){return o.expressions instanceof Ft}function Oe(o,t){return{...o,...{expressions:t}}}function la(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof Ft?a:Ar(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(d=>d.probability>e),m=nt(a)?a.detection.box.bottomLeft:r||new h(0,0);new kt(c.map(d=>`${d.expression} (${zt(d.probability)})`),m).draw(o)})}function $t(o){return nt(o)&&o.landmarks instanceof j&&o.unshiftedLandmarks instanceof j&&o.alignedRect instanceof M}function fa(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function Qt(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=fa(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var oo=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},no=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new oo(e)}draw(t){let e=W(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Jt&&(e.strokeStyle=s,e.lineWidth=a,bt(e,this.faceLandmarks.getJawOutline()),bt(e,this.faceLandmarks.getLeftEyeBrow()),bt(e,this.faceLandmarks.getRightEyeBrow()),bt(e,this.faceLandmarks.getNose()),bt(e,this.faceLandmarks.getLeftEye(),!0),bt(e,this.faceLandmarks.getRightEye(),!0),bt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function ha(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof j?r:$t(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new no(n).draw(o)})}var Yo="1.1.2";var xt=b(g());var I=b(g());function xa(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Go(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=xa(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),d=i(64,128,"entry_flow/reduction_block_1"),u={conv_in:m,reduction_block_0:p,reduction_block_1:d},l={};pt(t,0,1).forEach(y=>{l[`main_block_${y}`]=c(128,`middle_flow/main_block_${y}`)});let v=i(128,256,"exit_flow/reduction_block"),w=s(256,512,"exit_flow/separable_conv"),x={reduction_block:v,separable_conv:w};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:u,middle_flow:l,exit_flow:x}}}function ba(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function zo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=ba(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},d={};pt(t,0,1).forEach(w=>{d[`main_block_${w}`]=s(`middle_flow/main_block_${w}`)});let u=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),v={reduction_block:u,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:d,exit_flow:v},paramMappings:e}}function Vo(o,t,e){return I.add(I.conv2d(o,t.filters,e,"same"),t.bias)}function so(o,t,e=!0){let r=e?I.relu(o):o;return r=O(r,t.separable_conv0,[1,1]),r=O(I.relu(r),t.separable_conv1,[1,1]),r=I.maxPool(r,[3,3],[2,2],"same"),r=I.add(r,Vo(o,t.expansion_conv,[2,2])),r}function ga(o,t){let e=O(I.relu(o),t.separable_conv0,[1,1]);return e=O(I.relu(e),t.separable_conv1,[1,1]),e=O(I.relu(e),t.separable_conv2,[1,1]),e=I.add(e,o),e}var io=class extends S{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return I.tidy(()=>{let r=I.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(I.scalar(256)),s=I.relu(Vo(a,e.entry_flow.conv_in,[2,2]));return s=so(s,e.entry_flow.reduction_block_0,!1),s=so(s,e.entry_flow.reduction_block_1),pt(this._numMainBlocks,0,1).forEach(i=>{s=ga(s,e.middle_flow[`main_block_${i}`])}),s=so(s,e.exit_flow.reduction_block),s=I.relu(O(s,e.exit_flow.separable_conv,[1,1])),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return zo(t,this._numMainBlocks)}extractParams(t){return Go(t,this._numMainBlocks)}};function Uo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=Mr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function Xo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var ht;(function(o){o.FEMALE="female",o.MALE="male"})(ht||(ht={}));var je=class extends S{constructor(t=new io(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return xt.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t,n=xt.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),a=Be(n,e.fc.age).as1D(),s=Be(n,e.fc.gender);return{age:a,gender:s}})}forwardInput(t){return xt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:xt.softmax(r)}})}async forward(t){return this.forwardInput(await E(t))}async predictAgeAndGender(t){let e=await E(t),r=await this.forwardInput(e),n=xt.unstack(r.age),a=xt.unstack(r.gender),s=n.map((c,m)=>({ageTensor:c,genderTensor:a[m]})),i=await Promise.all(s.map(async({ageTensor:c,genderTensor:m})=>{let p=(await c.data())[0],d=(await m.data())[0],u=d>.5,l=u?ht.MALE:ht.FEMALE,v=u?d:1-d;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:v}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?i:i[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Uo(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Xo(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),n=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var Y=b(g());var He=class extends Re{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return Y.tidy(()=>{let s=(d,u)=>Y.stack([Y.fill([68],d,"float32"),Y.fill([68],u,"float32")],1).as2D(1,136).as1D(),i=(d,u)=>{let{width:l,height:v}=n[d];return u(l,v)?Math.abs(l-v)/2:0},c=d=>i(d,(u,l)=>ui(d,(u,l)=>ls(c(u),m(u))))).div(Y.stack(Array.from(Array(a),(d,u)=>s(n[u].width,n[u].height))))})}forwardInput(t){return Y.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await E(t))}async detectLandmarks(t){let e=await E(t),r=Y.tidy(()=>Y.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(await a.data()),c=i.filter((p,d)=>cr(d)),m=i.filter((p,d)=>!cr(d));return new Jt(Array(68).fill(0).map((p,d)=>new h(c[d],m[d])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var te=class extends He{constructor(t=new We){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var Ot=b(g());function Jo(o){let t=[],{extractDenseBlock3Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function qo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var co=class extends S{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Ot.tidy(()=>{let r=Ot.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Ot.scalar(255)),s=Pr(a,e.dense0,!0);return s=Pr(s,e.dense1),s=Pr(s,e.dense2),s=Ot.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Jo(t)}extractParams(t){return qo(t)}};var Ye=class extends He{constructor(t=new co){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var mo=class extends te{};var U=b(g());var _e=b(g());var Wr=b(g());function Zo(o,t){return Wr.add(Wr.mul(o,t.weights),t.biases)}function po(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=_e.conv2d(o,a,e,n);return i=_e.add(i,s),i=Zo(i,t.scale),r?_e.relu(i):i}function Ko(o,t){return po(o,t,[1,1],!0)}function uo(o,t){return po(o,t,[1,1],!1)}function Br(o,t){return po(o,t,[2,2],!0,"valid")}var G=b(g());function va(o,t){function e(i,c,m){let p=o(i),d=p.length/(c*m*m);if(Vr(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return G.tidy(()=>G.transpose(G.tensor4d(p,[c,d,m,m]),[2,3,1,0]))}function r(i,c,m,p){let d=e(i,c,m),u=G.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:u}}function n(i,c){let m=G.tensor1d(o(i)),p=G.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let d=r(i,c,m,`${p}/conv`),u=n(c,`${p}/scale`);return{conv:d,scale:u}}function s(i,c,m,p,d=!1){let u=a((d?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:u,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Qo(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=va(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),d=a(36864,64,3,"conv64_1"),u=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),v=a(147456,128,3,"conv128_down",!0),w=a(147456,128,3,"conv128_1"),x=a(147456,128,3,"conv128_2"),y=a(589824,256,3,"conv256_down",!0),T=a(589824,256,3,"conv256_1"),F=a(589824,256,3,"conv256_2"),L=a(589824,256,3,"conv256_down_out"),z=G.tidy(()=>G.transpose(G.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:d,conv64_2:u,conv64_3:l,conv128_down:v,conv128_1:w,conv128_2:x,conv256_down:y,conv256_1:T,conv256_2:F,conv256_down_out:L,fc:z},paramMappings:r}}function ya(o,t){let e=H(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function tn(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=ya(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),d=r("conv64_3"),u=r("conv128_down"),l=r("conv128_1"),v=r("conv128_2"),w=r("conv256_down"),x=r("conv256_1"),y=r("conv256_2"),T=r("conv256_down_out"),{fc:F}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!zr(F))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${F}`);let L={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:d,conv128_down:u,conv128_1:l,conv128_2:v,conv256_down:w,conv256_1:x,conv256_2:y,conv256_down_out:T,fc:F};return B(o,t),{params:L,paramMappings:t}}var $=b(g());function at(o,t){let e=Ko(o,t.conv1);return e=uo(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ge(o,t){let e=Br(o,t.conv1);e=uo(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var ee=class extends S{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return U.tidy(()=>{let r=U.cast(t.toBatchTensor(150,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(U.scalar(256)),s=Br(a,e.conv32_down);s=U.maxPool(s,3,2,"valid"),s=at(s,e.conv32_1),s=at(s,e.conv32_2),s=at(s,e.conv32_3),s=Ge(s,e.conv64_down),s=at(s,e.conv64_1),s=at(s,e.conv64_2),s=at(s,e.conv64_3),s=Ge(s,e.conv128_down),s=at(s,e.conv128_1),s=at(s,e.conv128_2),s=Ge(s,e.conv256_down),s=at(s,e.conv256_1),s=at(s,e.conv256_2),s=Ge(s,e.conv256_down_out);let i=s.mean([1,2]);return U.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await E(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)==null?void 0:a.some(s=>s<=0))return new Float32Array(128);let e=await E(t),r=U.tidy(()=>U.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return tn(t)}extractParams(t){return Qo(t)}};function en(o){let t=new ee;return t.extractWeights(o),t}function ze(o,t){return{...o,...{descriptor:t}}}function rn(o){return typeof o.age=="number"}function Ve(o,t){return{...o,...{age:t}}}function on(o){return(o.gender===ht.MALE||o.gender===ht.FEMALE)&&de(o.genderProbability)}function Ue(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var it=b(g());var st=b(g());function Fa(o,t){function e(c,m){let p=st.tensor4d(o(3*3*c),[3,3,c,1]),d=st.tensor1d(o(c)),u=st.tensor1d(o(c)),l=st.tensor1d(o(c)),v=st.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:u,batch_norm_mean:l,batch_norm_variance:v}}function r(c,m,p,d,u){let l=st.tensor4d(o(c*m*p*p),[p,p,c,m]),v=st.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${u?"batch_norm_offset":"bias"}`}),{filters:l,bias:v}}function n(c,m,p,d){let{filters:u,bias:l}=r(c,m,p,d,!0);return{filters:u,batch_norm_offset:l}}function a(c,m,p){let d=e(c,`${p}/depthwise_conv`),u=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:u}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),d=a(128,128,"mobilenetv1/conv_3"),u=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),v=a(256,512,"mobilenetv1/conv_6"),w=a(512,512,"mobilenetv1/conv_7"),x=a(512,512,"mobilenetv1/conv_8"),y=a(512,512,"mobilenetv1/conv_9"),T=a(512,512,"mobilenetv1/conv_10"),F=a(512,512,"mobilenetv1/conv_11"),L=a(512,1024,"mobilenetv1/conv_12"),z=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,conv_8:x,conv_9:y,conv_10:T,conv_11:F,conv_12:L,conv_13:z}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),d=n(128,256,3,"prediction_layer/conv_3"),u=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),v=n(256,64,1,"prediction_layer/conv_6"),w=n(64,128,3,"prediction_layer/conv_7"),x=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),T=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),F=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),L=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),z=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),mt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Et=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Mt=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Ct=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,box_predictor_0:{box_encoding_predictor:x,class_predictor:y},box_predictor_1:{box_encoding_predictor:T,class_predictor:F},box_predictor_2:{box_encoding_predictor:L,class_predictor:z},box_predictor_3:{box_encoding_predictor:rt,class_predictor:mt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Et},box_predictor_5:{box_encoding_predictor:Mt,class_predictor:Ct}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function nn(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Fa(e,t),s=n(),i=a(),m={extra_dim:st.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Ta(o,t){let e=H(o,t);function r(m,p,d){let u=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:u,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,d=`MobilenetV1/Conv2d_${m}_depthwise`,u=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,v=e(`${d}/depthwise_weights`,4,`${u}/filters`),w=e(`${d}/BatchNorm/gamma`,1,`${u}/batch_norm_scale`),x=e(`${d}/BatchNorm/beta`,1,`${u}/batch_norm_offset`),y=e(`${d}/BatchNorm/moving_mean`,1,`${u}/batch_norm_mean`),T=e(`${d}/BatchNorm/moving_variance`,1,`${u}/batch_norm_variance`);return{depthwise_conv:{filters:v,batch_norm_scale:w,batch_norm_offset:x,batch_norm_mean:y,batch_norm_variance:T},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let d=e(`${m}/weights`,4,`${p}/filters`),u=e(`${m}/biases`,1,`${p}/bias`);return{filters:d,bias:u}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),d=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function an(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Ta(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!gt(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var Tt=b(g());var jt=b(g());function Q(o,t,e){return jt.tidy(()=>{let r=jt.conv2d(o,t.filters,e,"same");return r=jt.add(r,t.batch_norm_offset),jt.clipByValue(r,0,6)})}var _a=.0010000000474974513;function wa(o,t,e){return Tt.tidy(()=>{let r=Tt.depthwiseConv2d(o,t.filters,e,"same");return r=Tt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,_a),Tt.clipByValue(r,0,6)})}function Pa(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function sn(o,t){return Tt.tidy(()=>{let e,r=Q(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=Pa(i);r=wa(r,a.depthwise_conv,c),r=Q(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function Da(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),d=Math.max(r[e][1],r[e][3]),u=(s-n)*(i-a),l=(p-c)*(d-m);if(u<=0||l<=0)return 0;let v=Math.max(n,c),w=Math.max(a,m),x=Math.min(s,p),y=Math.min(i,d),T=Math.max(x-v,0)*Math.max(y-w,0);return T/(u+l-T)}function cn(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>n).sort((p,d)=>d.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let d=p.score;for(let u=m.length-1;u>=0;--u){let l=Da(o,p.boxIndex,m[u]);if(l!==0&&(p.score*=c(l),p.score<=n))break}d===p.score&&m.push(p.boxIndex)}),m}var f=b(g());function Ea(o){let t=f.unstack(f.transpose(o,[1,0])),e=[f.sub(t[2],t[0]),f.sub(t[3],t[1])],r=[f.add(t[0],f.div(e[0],f.scalar(2))),f.add(t[1],f.div(e[1],f.scalar(2)))];return{sizes:e,centers:r}}function Ma(o,t){let{sizes:e,centers:r}=Ea(o),n=f.unstack(f.transpose(t,[1,0])),a=f.div(f.mul(f.exp(f.div(n[2],f.scalar(5))),e[0]),f.scalar(2)),s=f.add(f.mul(f.div(n[0],f.scalar(10)),e[0]),r[0]),i=f.div(f.mul(f.exp(f.div(n[3],f.scalar(5))),e[1]),f.scalar(2)),c=f.add(f.mul(f.div(n[1],f.scalar(10)),e[1]),r[1]);return f.transpose(f.stack([f.sub(s,a),f.sub(c,i),f.add(s,a),f.add(c,i)]),[1,0])}function mn(o,t,e){return f.tidy(()=>{let r=o.shape[0],n=Ma(f.reshape(f.tile(e.extra_dim,[r,1,1]),[-1,4]),f.reshape(o,[-1,4]));n=f.reshape(n,[r,n.shape[0]/r,4]);let a=f.sigmoid(f.slice(t,[0,0,1],[-1,-1,-1])),s=f.slice(a,[0,0,0],[-1,-1,1]);s=f.reshape(s,[r,s.shape[1]]);let i=f.unstack(n),c=f.unstack(s);return{boxes:i,scores:c}})}var Je=b(g());var Xe=b(g());function re(o,t){return Xe.tidy(()=>{let e=o.shape[0],r=Xe.reshape(Kt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Xe.reshape(Kt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function pn(o,t,e){return Je.tidy(()=>{let r=Q(o,e.conv_0,[1,1]),n=Q(r,e.conv_1,[2,2]),a=Q(n,e.conv_2,[1,1]),s=Q(a,e.conv_3,[2,2]),i=Q(s,e.conv_4,[1,1]),c=Q(i,e.conv_5,[2,2]),m=Q(c,e.conv_6,[1,1]),p=Q(m,e.conv_7,[2,2]),d=re(t,e.box_predictor_0),u=re(o,e.box_predictor_1),l=re(n,e.box_predictor_2),v=re(s,e.box_predictor_3),w=re(c,e.box_predictor_4),x=re(p,e.box_predictor_5),y=Je.concat([d.boxPredictionEncoding,u.boxPredictionEncoding,l.boxPredictionEncoding,v.boxPredictionEncoding,w.boxPredictionEncoding,x.boxPredictionEncoding],1),T=Je.concat([d.classPrediction,u.classPrediction,l.classPrediction,v.classPrediction,w.classPrediction,x.classPrediction],1);return{boxPredictions:y,classPredictions:T}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Ht=class extends S{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return it.tidy(()=>{let r=it.cast(t.toBatchTensor(512,!1),"float32"),n=it.sub(it.mul(r,it.scalar(.007843137718737125)),it.scalar(1)),a=sn(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=pn(a.out,a.conv11,e.prediction_layer);return mn(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await E(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await E(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let F=1;F{let[L,z]=[Math.max(0,y[F][0]),Math.min(1,y[F][2])].map(q=>q*x),[rt,mt]=[Math.max(0,y[F][1]),Math.min(1,y[F][3])].map(q=>q*w);return new M(p[F],new Xt(rt,L,mt-rt,z-L),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),T}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return an(t)}extractParams(t){return nn(t)}};function lo(o){let t=new Ht;return t.extractWeights(o),t}function dn(o){return lo(o)}var fo=class extends Ht{};var un=.4,ln=[new h(.738768,.874946),new h(2.42204,2.65704),new h(4.30971,7.04493),new h(10.246,4.59428),new h(12.6868,11.8741)],fn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],hn=[117.001,114.697,97.404],xn="tiny_yolov2_model",bn="tiny_yolov2_separable_conv_model";var N=b(g());var Rr=o=>typeof o=="number";function $r(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Rr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Rr(t.x)&&Rr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Rr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var et=b(g());var tt=b(g());function we(o){return tt.tidy(()=>{let t=tt.mul(o,tt.scalar(.10000000149011612));return tt.add(tt.relu(tt.sub(o,t)),t)})}function _t(o,t){return et.tidy(()=>{let e=et.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=et.conv2d(e,t.conv.filters,[1,1],"valid"),e=et.sub(e,t.bn.sub),e=et.mul(e,t.bn.truediv),e=et.add(e,t.conv.bias),we(e)})}var Yt=b(g());function wt(o,t){return Yt.tidy(()=>{let e=Yt.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Yt.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=Yt.add(e,t.bias),we(e)})}var ho=b(g());function Ca(o,t){let e=ge(o,t);function r(s,i){let c=ho.tensor1d(o(s)),m=ho.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ve(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function gn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=Ca(n,s),p;if(t.withSeparableConvs){let[d,u,l,v,w,x,y,T,F]=r,L=t.isFirstLayerConv2d?i(d,u,3,"conv0"):m(d,u,"conv0"),z=m(u,l,"conv1"),rt=m(l,v,"conv2"),mt=m(v,w,"conv3"),q=m(w,x,"conv4"),Et=m(x,y,"conv5"),Mt=T?m(y,T,"conv6"):void 0,Ct=F?m(T,F,"conv7"):void 0,pe=i(F||T||y,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}else{let[d,u,l,v,w,x,y,T,F]=r,L=c(d,u,"conv0"),z=c(u,l,"conv1"),rt=c(l,v,"conv2"),mt=c(v,w,"conv3"),q=c(w,x,"conv4"),Et=c(x,y,"conv5"),Mt=c(y,T,"conv6"),Ct=c(T,F,"conv7"),pe=i(F,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function Na(o,t){let e=H(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=ye(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function vn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=Na(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var ct=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var xo=class extends S{constructor(t){super("TinyYolov2");$r(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=_t(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=_t(r,e.conv6),r=_t(r,e.conv7),Kt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?we(Kt(t,e.conv0,"valid",!1)):wt(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?wt(r,e.conv6):r,r=e.conv7?wt(r,e.conv7):r,Kt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let n=N.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?Z(n,this.config.meanRgb):n,n=n.div(N.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(n,r):this.runTinyYolov2(n,r)})}async forward(t,e){return this.forwardInput(await E(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:n}=new ct(e),a=await E(t),s=await this.forwardInput(a,r),i=N.tidy(()=>N.unstack(s)[0].expandDims()),c={width:a.getInputWidth(0),height:a.getInputHeight(0)},m=await this.extractBoxes(i,a.getReshapedInputDimensions(0),n);s.dispose(),i.dispose();let p=m.map(x=>x.box),d=m.map(x=>x.score),u=m.map(x=>x.classScore),l=m.map(x=>this.config.classes[x.label]);return ur(p.map(x=>x.rescale(r)),d,this.config.iouThreshold,!0).map(x=>new vt(d[x],u[x],l[x],p[x],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return vn(t,this.config)}extractParams(t){let e=this.config.filterSizes||xo.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return gn(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:n,height:a}=e,s=Math.max(n,a),i=s/n,c=s/a,m=t.shape[1],p=this.config.anchors.length,[d,u,l]=N.tidy(()=>{let y=t.reshape([m,m,p,this.boxEncodingSize]),T=y.slice([0,0,0,0],[m,m,p,4]),F=y.slice([0,0,0,4],[m,m,p,1]),L=this.withClassScores?N.softmax(y.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):N.scalar(0);return[T,F,L]}),v=[],w=await u.array(),x=await d.array();for(let y=0;yr){let z=(T+ue(x[y][T][F][0]))/m*i,rt=(y+ue(x[y][T][F][1]))/m*c,mt=Math.exp(x[y][T][F][2])*this.config.anchors[F].x/m*i,q=Math.exp(x[y][T][F][3])*this.config.anchors[F].y/m*c,Et=z-mt/2,Mt=rt-q/2,Ct={row:y,col:T,anchor:F},{classScore:pe,label:Po}=this.withClassScores?await this.extractPredictedClass(l,Ct):{classScore:1,label:0};v.push({box:new Ut(Et,Mt,Et+mt,Mt+q),score:L,classScore:L*pe,label:Po,...Ct})}}return d.dispose(),u.dispose(),l.dispose(),v}async extractPredictedClass(t,e){let{row:r,col:n,anchor:a}=e,s=await t.array();return Array(this.config.classes.length).fill(0).map((i,c)=>s[r][n][a][c]).map((i,c)=>({classScore:i,label:c})).reduce((i,c)=>i.classScore>c.classScore?i:c)}},Pe=xo;Pe.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var oe=class extends Pe{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:un,classes:["face"],...t?{anchors:fn,meanRgb:hn}:{anchors:ln,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?bn:xn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function yn(o,t=!0){let e=new oe(t);return e.extractWeights(o),e}var qe=class extends ct{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Ke=b(g());var bo=b(g());async function ne(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>$t(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await Zt(t,a):await qt(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function De(o,t,e,r,n){return ne([o],t,async a=>e(a[0]),r,n)}var Fn=.4,Tn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],_n=[117.001,114.697,97.404];var ae=class extends Pe{constructor(){let t={withSeparableConvs:!0,iouThreshold:Fn,classes:["face"],anchors:Tn,meanRgb:_n,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var _={ssdMobilenetv1:new Ht,tinyFaceDetector:new ae,tinyYolov2:new oe,faceLandmark68Net:new te,faceLandmark68TinyNet:new Ye,faceRecognitionNet:new ee,faceExpressionNet:new $e,ageGenderNet:new je},go=(o,t)=>_.ssdMobilenetv1.locateFaces(o,t),wn=(o,t)=>_.tinyFaceDetector.locateFaces(o,t),Pn=(o,t)=>_.tinyYolov2.locateFaces(o,t),vo=o=>_.faceLandmark68Net.detectLandmarks(o),Dn=o=>_.faceLandmark68TinyNet.detectLandmarks(o),En=o=>_.faceRecognitionNet.computeFaceDescriptor(o),Mn=o=>_.faceExpressionNet.predictExpressions(o),Cn=o=>_.ageGenderNet.predictAgeAndGender(o),yo=o=>_.ssdMobilenetv1.load(o),Nn=o=>_.tinyFaceDetector.load(o),In=o=>_.tinyYolov2.load(o),Ln=o=>_.faceLandmark68Net.load(o),kn=o=>_.faceLandmark68TinyNet.load(o),Sn=o=>_.faceRecognitionNet.load(o),An=o=>_.faceExpressionNet.load(o),Wn=o=>_.ageGenderNet.load(o),Bn=yo,Rn=go,$n=vo;var Fo=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ce=class extends Fo{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>Oe(r,e[n]))}withAgeAndGender(){return new Ee(this,this.input)}},Ne=class extends Fo{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceExpressionNet.predictExpressions(r),this.extractedFaces);return Oe(t,e)}withAgeAndGender(){return new Me(this,this.input)}},ce=class extends Ce{withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},me=class extends Ne{withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var To=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ee=class extends To{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Ve(Ue(r,s,i),a)})}withFaceExpressions(){return new Ce(this,this.input)}},Me=class extends To{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await De(t,this.input,a=>_.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Ve(Ue(t,r,n),e)}withFaceExpressions(){return new Ne(this,this.input)}},se=class extends Ee{withFaceExpressions(){return new ce(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},ie=class extends Me{withFaceExpressions(){return new me(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var Ze=class extends J{constructor(t,e){super();this.parentTask=t;this.input=e}},Pt=class extends Ze{async run(){let t=await this.parentTask;return(await ne(t,this.input,r=>Promise.all(r.map(n=>_.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>ze(t[n],r))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}},Dt=class extends Ze{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return ze(t,e)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}};var Qe=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?_.faceLandmark68TinyNet:_.faceLandmark68Net}},tr=class extends Qe{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof Ke.Tensor?await Zt(this.input,e):await qt(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),t.map((a,s)=>Qt(a,n[s]))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},er=class extends Qe{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Ke.Tensor?await Zt(this.input,[e]):await qt(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),Qt(t,n)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var rr=class extends J{constructor(t,e=new X){super();this.input=t;this.options=e}},Ie=class extends rr{async run(){let{input:t,options:e}=this,r;if(e instanceof qe)r=_.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=_.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ct)r=_.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>It({},r)))})}withFaceLandmarks(t=!1){return new tr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Ce(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Ee(this.runAndExtendWithFaceDetections(),this.input)}},or=class extends rr{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?It({},e):void 0)})}withFaceLandmarks(t=!1){return new er(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Ne(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Me(this.runAndExtendWithFaceDetection(),this.input)}};function On(o,t=new X){return new or(o,t)}function nr(o,t=new X){return new Ie(o,t)}async function _o(o,t){return nr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function jn(o,t={}){return nr(o,new ct(t)).withFaceLandmarks().withFaceDescriptors()}var Hn=_o;function Or(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var ar=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof ut)return s;if(s instanceof Float32Array)return new ut(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new ut(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>Or(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new le(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>ut.fromJSON(r));return new ar(e,t.distanceThreshold)}};function Yn(o){let t=new ae;return t.extractWeights(o),t}function wo(o,t){let{width:e,height:r}=new A(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>wo(n,{width:e,height:r}));if($t(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return Qt(It(o,n),a)}return nt(o)?It(o,o.detection.forSize(e,r)):o instanceof j||o instanceof M?o.forSize(e,r):o}var Ia=typeof process!="undefined",La=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",zn={faceapi:Yo,node:Ia,browser:La};0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); //# sourceMappingURL=face-api.node-gpu.js.map diff --git a/dist/face-api.node.js b/dist/face-api.node.js index 058938f..17127eb 100644 --- a/dist/face-api.node.js +++ b/dist/face-api.node.js @@ -5,5 +5,5 @@ author: ' */ -var Vn=Object.create,sr=Object.defineProperty,Un=Object.getPrototypeOf,Xn=Object.prototype.hasOwnProperty,Jn=Object.getOwnPropertyNames,qn=Object.getOwnPropertyDescriptor;var jr=o=>sr(o,"__esModule",{value:!0});var Do=(o,t)=>()=>(t||(t={exports:{}},o(t.exports,t)),t.exports),ir=(o,t)=>{for(var e in t)sr(o,e,{get:t[e],enumerable:!0})},Zn=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Jn(t))!Xn.call(o,r)&&r!=="default"&&sr(o,r,{get:()=>t[r],enumerable:!(e=qn(t,r))||e.enumerable});return o},b=o=>Zn(jr(sr(o!=null?Vn(Un(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);var g=Do(Hr=>{var Kn=Object.create,Yr=Object.defineProperty,Qn=Object.getPrototypeOf,ta=Object.prototype.hasOwnProperty,ea=Object.getOwnPropertyNames,ra=Object.getOwnPropertyDescriptor,Eo=o=>Yr(o,"__esModule",{value:!0}),Mo=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ea(t))!ta.call(o,r)&&r!=="default"&&Yr(o,r,{get:()=>t[r],enumerable:!(e=ra(t,r))||e.enumerable});return o},oa=o=>Mo(Eo(Yr(o!=null?Kn(Qn(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);Eo(Hr);Mo(Hr,oa(require("@tensorflow/tfjs-node")))});var ko=Do((ca,Lo)=>{jr(ca);ir(ca,{isNodejs:()=>ma});function ma(){return typeof global=="object"&&!0&&typeof Lo!="undefined"&&typeof process!="undefined"&&!!process.version}});jr(exports);ir(exports,{AgeGenderNet:()=>je,BoundingBox:()=>Ut,Box:()=>D,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>Pt,ComputeFaceDescriptorsTaskBase:()=>Ze,ComputeSingleFaceDescriptorTask:()=>Dt,DetectAllFaceLandmarksTask:()=>tr,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Qe,DetectFacesTaskBase:()=>rr,DetectSingleFaceLandmarksTask:()=>er,DetectSingleFaceTask:()=>or,Dimensions:()=>A,FACE_EXPRESSION_LABELS:()=>Sr,FaceDetection:()=>M,FaceDetectionNet:()=>fo,FaceExpressionNet:()=>$e,FaceExpressions:()=>Ft,FaceLandmark68Net:()=>te,FaceLandmark68TinyNet:()=>Ye,FaceLandmarkNet:()=>mo,FaceLandmarks:()=>j,FaceLandmarks5:()=>Xr,FaceLandmarks68:()=>Jt,FaceMatch:()=>le,FaceMatcher:()=>ar,FaceRecognitionNet:()=>ee,Gender:()=>ht,LabeledBox:()=>fe,LabeledFaceDescriptors:()=>ut,NetInput:()=>ft,NeuralNetwork:()=>S,ObjectDetection:()=>vt,Point:()=>h,PredictedBox:()=>Jr,Rect:()=>Xt,SsdMobilenetv1:()=>Ht,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ae,TinyFaceDetectorOptions:()=>qe,TinyYolov2:()=>oe,TinyYolov2Options:()=>ct,allFaces:()=>Hn,allFacesSsdMobilenetv1:()=>_o,allFacesTinyYolov2:()=>jn,awaitMediaLoaded:()=>xr,bufferToImage:()=>br,computeFaceDescriptor:()=>En,createCanvas:()=>At,createCanvasFromMedia:()=>xe,createFaceDetectionNet:()=>dn,createFaceRecognitionNet:()=>en,createSsdMobilenetv1:()=>lo,createTinyFaceDetector:()=>Yn,createTinyYolov2:()=>yn,detectAllFaces:()=>nr,detectFaceLandmarks:()=>vo,detectFaceLandmarksTiny:()=>Dn,detectLandmarks:()=>$n,detectSingleFace:()=>On,draw:()=>ao,env:()=>P,euclideanDistance:()=>Or,extendWithAge:()=>Ve,extendWithFaceDescriptor:()=>ze,extendWithFaceDetection:()=>It,extendWithFaceExpressions:()=>Oe,extendWithFaceLandmarks:()=>Qt,extendWithGender:()=>Ue,extractFaceTensors:()=>Zt,extractFaces:()=>qt,fetchImage:()=>So,fetchJson:()=>Tr,fetchNetWeights:()=>Ao,fetchOrThrow:()=>Wt,getContext2dOrThrow:()=>W,getMediaDimensions:()=>St,imageTensorToCanvas:()=>vr,imageToSquare:()=>yr,inverseSigmoid:()=>Io,iou:()=>pr,isMediaElement:()=>ke,isMediaLoaded:()=>he,isWithAge:()=>rn,isWithFaceDetection:()=>nt,isWithFaceExpressions:()=>Ar,isWithFaceLandmarks:()=>$t,isWithGender:()=>on,loadAgeGenderModel:()=>Wn,loadFaceDetectionModel:()=>Bn,loadFaceExpressionModel:()=>An,loadFaceLandmarkModel:()=>Ln,loadFaceLandmarkTinyModel:()=>kn,loadFaceRecognitionModel:()=>Sn,loadSsdMobilenetv1Model:()=>yo,loadTinyFaceDetectorModel:()=>Nn,loadTinyYolov2Model:()=>In,loadWeightMap:()=>wr,locateFaces:()=>Rn,matchDimensions:()=>Bo,minBbox:()=>dr,nets:()=>_,nonMaxSuppression:()=>ur,normalize:()=>Z,padToSquare:()=>lr,predictAgeAndGender:()=>Cn,recognizeFaceExpressions:()=>Mn,resizeResults:()=>wo,resolveInput:()=>Lt,shuffleArray:()=>No,sigmoid:()=>ue,ssdMobilenetv1:()=>go,tf:()=>Gn,tinyFaceDetector:()=>wn,tinyYolov2:()=>Pn,toNetInput:()=>E,utils:()=>Gr,validateConfig:()=>$r,version:()=>zn});var Gn=b(g());var ao={};ir(ao,{AnchorPosition:()=>lt,DrawBox:()=>hr,DrawBoxOptions:()=>ro,DrawFaceLandmarks:()=>no,DrawFaceLandmarksOptions:()=>oo,DrawTextField:()=>kt,DrawTextFieldOptions:()=>Le,drawContour:()=>bt,drawDetections:()=>ua,drawFaceExpressions:()=>la,drawFaceLandmarks:()=>ha});function bt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var Gr={};ir(Gr,{computeReshapedDimensions:()=>Ur,getCenterPoint:()=>Vt,isDimensions:()=>mr,isEven:()=>cr,isFloat:()=>Vr,isTensor:()=>Gt,isTensor1D:()=>na,isTensor2D:()=>zr,isTensor3D:()=>gt,isTensor4D:()=>V,isValidNumber:()=>ot,isValidProbablitiy:()=>de,range:()=>pt,round:()=>zt});var Co=b(g());var A=class{constructor(t,e){if(!ot(t)||!ot(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new A(1/this.width,1/this.height)}};function Gt(o,t){return o instanceof Co.Tensor&&o.shape.length===t}function na(o){return Gt(o,1)}function zr(o){return Gt(o,2)}function gt(o){return Gt(o,3)}function V(o){return Gt(o,4)}function Vr(o){return o%1!=0}function cr(o){return o%2==0}function zt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function mr(o){return o&&o.width&&o.height}function Ur({width:o,height:t},e){let r=e/Math.max(t,o);return new A(Math.round(o*r),Math.round(t*r))}function Vt(o){return o.reduce((t,e)=>t.add(e),new h(0,0)).div(new h(o.length,o.length))}function pt(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function ot(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function de(o){return ot(o)&&o>=0&&o<=1}var h=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new h(this.x+t.x,this.y+t.y)}sub(t){return new h(this.x-t.x,this.y-t.y)}mul(t){return new h(this.x*t.x,this.y*t.y)}div(t){return new h(this.x/t.x,this.y/t.y)}abs(){return new h(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new h(Math.floor(this.x),Math.floor(this.y))}};var D=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(ot)}static assertIsValidBox(t,e,r=!1){if(!D.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(ot),a=[r.x,r.y,r.width,r.height].every(ot);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];D.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new h(this.left,this.top)}get topRight(){return new h(this.right,this.top)}get bottomLeft(){return new h(this.left,this.bottom)}get bottomRight(){return new h(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new D({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new D({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-d+e+r,d=e),u>t&&(c=-u+t+n,u=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:u,x:m,ex:d,w:r,h:n}}calibrate(t){return new D({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Ut=class extends D{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var vt=class{constructor(t,e,r,n,a){this._imageDims=new A(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new D(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new D(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new vt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends vt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function pr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function dr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var dt=b(g());function Z(o,t){return dt.tidy(()=>{let[e,r,n]=t,a=dt.fill([...o.shape.slice(0,3),1],e,"float32"),s=dt.fill([...o.shape.slice(0,3),1],r,"float32"),i=dt.fill([...o.shape.slice(0,3),1],n,"float32"),c=dt.concat([a,s,i],3);return dt.sub(o,c)})}var Nt=b(g());function lr(o,t=!1){return Nt.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=u=>{let l=o.shape.slice();return l[s]=u,Nt.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],d=[t&&m?i(m):null,o,c].filter(u=>!!u).map(u=>Nt.cast(u,"float32"));return Nt.concat(d,s)})}function No(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function ue(o){return 1/(1+Math.exp(-o))}function Io(o){return Math.log(o/(1-o))}var Xt=class extends D{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var aa=.5,sa=.43,ia=.45,j=class{constructor(t,e,r=new h(0,0)){let{width:n,height:a}=e;this._imgDims=new A(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new h(n,a)).add(r))}get shift(){return new h(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new h(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new h(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new D(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=d=>n.sub(d).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/ia),c=Vt(t),m=Math.floor(Math.max(0,c.x-aa*i)),p=Math.floor(Math.max(0,c.y-sa*i));return new Xt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=dr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Xr=class extends j{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Vt([t[3],t[4]])]}};var Jt=class extends j{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Vt)}};var le=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${zt(this.distance)})`:""}`}};var fe=class extends D{static assertIsValidLabeledBox(t,e){if(D.assertIsValidBox(t,e),!ot(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t);this._label=e}get label(){return this._label}};var ut=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new ut(t.label,e)}};var Jr=class extends fe{static assertIsValidPredictedBox(t,e){if(fe.assertIsValidLabeledBox(t,e),!de(t.score)||!de(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,n){super(t,e);this._score=r,this._classScore=n}get score(){return this._score}get classScore(){return this._classScore}};function nt(o){return o.detection instanceof M}function It(o,t){return{...o,...{detection:t}}}function qr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function fr(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Zr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch,a=fr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:n,...a}}function Kr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var Qr=b(ko()),k;function pa(){if(!k)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return k}function to(o){k=o}function eo(){return Kr()?to(qr()):(0,Qr.isNodejs)()?to(Zr()):null}function da(o){if(k||eo(),!k)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=k.Canvas,Image:e=k.Image}=o;k.Canvas=t,k.Image=e,k.createCanvasElement=o.createCanvasElement||(()=>new t),k.createImageElement=o.createImageElement||(()=>new e),k.ImageData=o.ImageData||k.ImageData,k.Video=o.Video||k.Video,k.fetch=o.fetch||k.fetch,k.readFile=o.readFile||k.readFile}var P={getEnv:pa,setEnv:to,initialize:eo,createBrowserEnv:qr,createFileSystem:fr,createNodejsEnv:Zr,monkeyPatch:da,isBrowser:Kr,isNodejs:Qr.isNodejs};eo();function Lt(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function W(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Lt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var lt;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(lt||(lt={}));var Le=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||lt.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},kt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof kt?t.text:t,this.anchor=e,this.options=new Le(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let v=c+d.x,w=c+d.y+(l+1)*s;r.fillText(u,v,w)})}};var ro=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:lt.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Le({...s,...a})}},hr=class{constructor(t,e={}){this.box=new D(t),this.options=new ro(e)}draw(t){let e=W(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new kt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function ua(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:nt(r)?r.detection.score:void 0,a=r instanceof M?r.box:nt(r)?r.detection.box:new D(r),s=n?`${zt(n)}`:void 0;new hr(a,{label:s}).draw(o)})}var Te=b(g());function he(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function xr(o){return new Promise((t,e)=>{if(o instanceof P.getEnv().Canvas||he(o))return t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function br(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function St(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new A(o.naturalWidth,o.naturalHeight):o instanceof e?new A(o.videoWidth,o.videoHeight):new A(o.width,o.height)}function At({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function xe(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!he(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||St(o),a=At({width:r,height:n});return o instanceof e?W(a).putImageData(o,0,0):W(a).drawImage(o,0,0,r,n),a}var gr=b(g());async function vr(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(V(o)?1:0),s=gr.tidy(()=>o.as3D(r,n,a).toInt());return await gr.browser.toPixels(s,e),s.dispose(),e}function ke(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var K=b(g());function yr(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return At({width:1,height:1});let a=St(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=At({width:t,height:t}),p=o instanceof n?o:xe(o),d=Math.abs(i-c)/2,u=e&&i0&&p.height>0&&W(m).drawImage(p,u,l,i,c),m}var ft=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(gt(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(V(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:xe(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return pt(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Ur({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,K.tidy(()=>{let r=pt(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof K.Tensor){let i=V(s)?s:s.expandDims();return i=lr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=K.image.resizeBilinear(i,[t,t])),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return K.browser.fromPixels(yr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return K.stack(r.map(a=>K.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function E(o){if(o instanceof ft)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Lt);return r.forEach((n,a)=>{if(!ke(n)&&!gt(n)&&!V(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(V(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ke(n)&&xr(n))),new ft(r,Array.isArray(o))}async function qt(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await E(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await vr(i)}let n=W(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=At({width:c,height:m});return c>0&&m>0&&W(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var Fr=b(g());async function Zt(o,t){if(!gt(o)&&!V(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(V(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return Fr.tidy(()=>{let[e,r,n]=o.shape.slice(V(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).map(({x:i,y:c,width:m,height:p})=>Fr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function Wt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function So(o){let t=await Wt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return br(e)}async function Tr(o){return(await Wt(o)).json()}async function Ao(o){return new Float32Array(await(await Wt(o)).arrayBuffer())}var Wo=b(g());function _r(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function wr(o,t){let{manifestUri:e,modelBaseUri:r}=_r(o,t),n=await Tr(e);return Wo.io.loadWeights(n,r)}function Bo(o,t,e=!1){let{width:r,height:n}=e?St(t):t;return o.width=r,o.height=n,{width:r,height:n}}var Rt=b(g());var yt=b(g());var S=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof yt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof yt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=yt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await wr(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=_r(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(d=>d.buffer))),s=yt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof yt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var C=b(g());var be=b(g());function O(o,t,e){return be.tidy(()=>{let r=be.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=be.add(r,t.bias),r})}function Pr(o,t,e=!1){return C.tidy(()=>{let r=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):O(o,t.conv0,[2,2])),n=O(r,t.conv1,[1,1]),a=C.relu(C.add(r,n)),s=O(a,t.conv2,[1,1]);return C.relu(C.add(r,C.add(n,s)))})}function Se(o,t,e=!1,r=!0){return C.tidy(()=>{let n=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):O(o,t.conv0,r?[2,2]:[1,1])),a=O(n,t.conv1,[1,1]),s=C.relu(C.add(n,a)),i=O(s,t.conv2,[1,1]),c=C.relu(C.add(n,C.add(a,i))),m=O(c,t.conv3,[1,1]);return C.relu(C.add(n,C.add(a,C.add(i,m))))})}var Bt=b(g());function Kt(o,t,e="same",r=!1){return Bt.tidy(()=>{let n=Bt.add(Bt.conv2d(o,t.filters,[1,1],e),t.bias);return r?Bt.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var Dr=b(g());function ge(o,t){return(e,r,n,a)=>{let s=Dr.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Dr.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var Er=b(g());function Mr(o,t){return(e,r,n)=>{let a=Er.tensor2d(o(e*r),[e,r]),s=Er.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Ae=b(g());var Cr=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ve(o,t){return(e,r,n)=>{let a=Ae.tensor4d(o(3*3*e),[3,3,e,1]),s=Ae.tensor4d(o(e*r),[1,1,e,r]),i=Ae.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Cr(a,s,i)}}function ye(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Cr(e,r,n)}}function H(o,t){return(e,r,n)=>{let a=o[e];if(!Gt(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function Nr(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),d=r(i,i,`${c}/conv1`),u=r(i,i,`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function a(s,i,c,m=!1){let{conv0:p,conv1:d,conv2:u}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function Ir(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function Lr(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:d}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`),u=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:d,conv3:u}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function $o(o){let t=[],{extractDenseBlock4Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var We=class extends S{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return Rt.tidy(()=>{let r=Rt.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Rt.scalar(255)),s=Se(a,e.dense0,!0);return s=Se(s,e.dense1),s=Se(s,e.dense2),s=Se(s,e.dense3),s=Rt.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return $o(t)}extractParams(t){return Ro(t)}};var Ho=b(g());var Fe=b(g());function Be(o,t){return Fe.tidy(()=>Fe.add(Fe.matMul(o,t.weights),t.bias))}function Oo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=Mr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function jo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function kr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Re=class extends S{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return Ho.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t;return Be(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Oo(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),jo(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,a=t.slice(0,t.length-n),s=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Sr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Ft=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Sr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Sr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var $e=class extends Re{constructor(t=new We){super("FaceExpressionNet",t)}forwardInput(t){return Te.tidy(()=>Te.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await E(t))}async predictExpressions(t){let e=await E(t),r=await this.forwardInput(e),n=await Promise.all(Te.unstack(r).map(async s=>{let i=await s.data();return s.dispose(),i}));r.dispose();let a=n.map(s=>new Ft(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Ar(o){return o.expressions instanceof Ft}function Oe(o,t){return{...o,...{expressions:t}}}function la(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof Ft?a:Ar(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(d=>d.probability>e),m=nt(a)?a.detection.box.bottomLeft:r||new h(0,0);new kt(c.map(d=>`${d.expression} (${zt(d.probability)})`),m).draw(o)})}function $t(o){return nt(o)&&o.landmarks instanceof j&&o.unshiftedLandmarks instanceof j&&o.alignedRect instanceof M}function fa(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function Qt(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=fa(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var oo=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},no=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new oo(e)}draw(t){let e=W(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Jt&&(e.strokeStyle=s,e.lineWidth=a,bt(e,this.faceLandmarks.getJawOutline()),bt(e,this.faceLandmarks.getLeftEyeBrow()),bt(e,this.faceLandmarks.getRightEyeBrow()),bt(e,this.faceLandmarks.getNose()),bt(e,this.faceLandmarks.getLeftEye(),!0),bt(e,this.faceLandmarks.getRightEye(),!0),bt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function ha(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof j?r:$t(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new no(n).draw(o)})}var Yo="1.1.1";var xt=b(g());var I=b(g());function xa(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Go(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=xa(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),d=i(64,128,"entry_flow/reduction_block_1"),u={conv_in:m,reduction_block_0:p,reduction_block_1:d},l={};pt(t,0,1).forEach(y=>{l[`main_block_${y}`]=c(128,`middle_flow/main_block_${y}`)});let v=i(128,256,"exit_flow/reduction_block"),w=s(256,512,"exit_flow/separable_conv"),x={reduction_block:v,separable_conv:w};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:u,middle_flow:l,exit_flow:x}}}function ba(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function zo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=ba(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},d={};pt(t,0,1).forEach(w=>{d[`main_block_${w}`]=s(`middle_flow/main_block_${w}`)});let u=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),v={reduction_block:u,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:d,exit_flow:v},paramMappings:e}}function Vo(o,t,e){return I.add(I.conv2d(o,t.filters,e,"same"),t.bias)}function so(o,t,e=!0){let r=e?I.relu(o):o;return r=O(r,t.separable_conv0,[1,1]),r=O(I.relu(r),t.separable_conv1,[1,1]),r=I.maxPool(r,[3,3],[2,2],"same"),r=I.add(r,Vo(o,t.expansion_conv,[2,2])),r}function ga(o,t){let e=O(I.relu(o),t.separable_conv0,[1,1]);return e=O(I.relu(e),t.separable_conv1,[1,1]),e=O(I.relu(e),t.separable_conv2,[1,1]),e=I.add(e,o),e}var io=class extends S{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return I.tidy(()=>{let r=I.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(I.scalar(256)),s=I.relu(Vo(a,e.entry_flow.conv_in,[2,2]));return s=so(s,e.entry_flow.reduction_block_0,!1),s=so(s,e.entry_flow.reduction_block_1),pt(this._numMainBlocks,0,1).forEach(i=>{s=ga(s,e.middle_flow[`main_block_${i}`])}),s=so(s,e.exit_flow.reduction_block),s=I.relu(O(s,e.exit_flow.separable_conv,[1,1])),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return zo(t,this._numMainBlocks)}extractParams(t){return Go(t,this._numMainBlocks)}};function Uo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=Mr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function Xo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var ht;(function(o){o.FEMALE="female",o.MALE="male"})(ht||(ht={}));var je=class extends S{constructor(t=new io(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return xt.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t,n=xt.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),a=Be(n,e.fc.age).as1D(),s=Be(n,e.fc.gender);return{age:a,gender:s}})}forwardInput(t){return xt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:xt.softmax(r)}})}async forward(t){return this.forwardInput(await E(t))}async predictAgeAndGender(t){let e=await E(t),r=await this.forwardInput(e),n=xt.unstack(r.age),a=xt.unstack(r.gender),s=n.map((c,m)=>({ageTensor:c,genderTensor:a[m]})),i=await Promise.all(s.map(async({ageTensor:c,genderTensor:m})=>{let p=(await c.data())[0],d=(await m.data())[0],u=d>.5,l=u?ht.MALE:ht.FEMALE,v=u?d:1-d;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:v}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?i:i[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Uo(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Xo(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),n=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var Y=b(g());var He=class extends Re{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return Y.tidy(()=>{let s=(d,u)=>Y.stack([Y.fill([68],d,"float32"),Y.fill([68],u,"float32")],1).as2D(1,136).as1D(),i=(d,u)=>{let{width:l,height:v}=n[d];return u(l,v)?Math.abs(l-v)/2:0},c=d=>i(d,(u,l)=>ui(d,(u,l)=>ls(c(u),m(u))))).div(Y.stack(Array.from(Array(a),(d,u)=>s(n[u].width,n[u].height))))})}forwardInput(t){return Y.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await E(t))}async detectLandmarks(t){let e=await E(t),r=Y.tidy(()=>Y.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(await a.data()),c=i.filter((p,d)=>cr(d)),m=i.filter((p,d)=>!cr(d));return new Jt(Array(68).fill(0).map((p,d)=>new h(c[d],m[d])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var te=class extends He{constructor(t=new We){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var Ot=b(g());function Jo(o){let t=[],{extractDenseBlock3Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function qo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var co=class extends S{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Ot.tidy(()=>{let r=Ot.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Ot.scalar(255)),s=Pr(a,e.dense0,!0);return s=Pr(s,e.dense1),s=Pr(s,e.dense2),s=Ot.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Jo(t)}extractParams(t){return qo(t)}};var Ye=class extends He{constructor(t=new co){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var mo=class extends te{};var U=b(g());var _e=b(g());var Wr=b(g());function Zo(o,t){return Wr.add(Wr.mul(o,t.weights),t.biases)}function po(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=_e.conv2d(o,a,e,n);return i=_e.add(i,s),i=Zo(i,t.scale),r?_e.relu(i):i}function Ko(o,t){return po(o,t,[1,1],!0)}function uo(o,t){return po(o,t,[1,1],!1)}function Br(o,t){return po(o,t,[2,2],!0,"valid")}var G=b(g());function va(o,t){function e(i,c,m){let p=o(i),d=p.length/(c*m*m);if(Vr(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return G.tidy(()=>G.transpose(G.tensor4d(p,[c,d,m,m]),[2,3,1,0]))}function r(i,c,m,p){let d=e(i,c,m),u=G.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:u}}function n(i,c){let m=G.tensor1d(o(i)),p=G.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let d=r(i,c,m,`${p}/conv`),u=n(c,`${p}/scale`);return{conv:d,scale:u}}function s(i,c,m,p,d=!1){let u=a((d?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:u,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Qo(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=va(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),d=a(36864,64,3,"conv64_1"),u=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),v=a(147456,128,3,"conv128_down",!0),w=a(147456,128,3,"conv128_1"),x=a(147456,128,3,"conv128_2"),y=a(589824,256,3,"conv256_down",!0),T=a(589824,256,3,"conv256_1"),F=a(589824,256,3,"conv256_2"),L=a(589824,256,3,"conv256_down_out"),z=G.tidy(()=>G.transpose(G.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:d,conv64_2:u,conv64_3:l,conv128_down:v,conv128_1:w,conv128_2:x,conv256_down:y,conv256_1:T,conv256_2:F,conv256_down_out:L,fc:z},paramMappings:r}}function ya(o,t){let e=H(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function tn(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=ya(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),d=r("conv64_3"),u=r("conv128_down"),l=r("conv128_1"),v=r("conv128_2"),w=r("conv256_down"),x=r("conv256_1"),y=r("conv256_2"),T=r("conv256_down_out"),{fc:F}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!zr(F))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${F}`);let L={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:d,conv128_down:u,conv128_1:l,conv128_2:v,conv256_down:w,conv256_1:x,conv256_2:y,conv256_down_out:T,fc:F};return B(o,t),{params:L,paramMappings:t}}var $=b(g());function at(o,t){let e=Ko(o,t.conv1);return e=uo(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ge(o,t){let e=Br(o,t.conv1);e=uo(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var ee=class extends S{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return U.tidy(()=>{let r=U.cast(t.toBatchTensor(150,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(U.scalar(256)),s=Br(a,e.conv32_down);s=U.maxPool(s,3,2,"valid"),s=at(s,e.conv32_1),s=at(s,e.conv32_2),s=at(s,e.conv32_3),s=Ge(s,e.conv64_down),s=at(s,e.conv64_1),s=at(s,e.conv64_2),s=at(s,e.conv64_3),s=Ge(s,e.conv128_down),s=at(s,e.conv128_1),s=at(s,e.conv128_2),s=Ge(s,e.conv256_down),s=at(s,e.conv256_1),s=at(s,e.conv256_2),s=Ge(s,e.conv256_down_out);let i=s.mean([1,2]);return U.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await E(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)==null?void 0:a.some(s=>s<=0))return new Float32Array(128);let e=await E(t),r=U.tidy(()=>U.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return tn(t)}extractParams(t){return Qo(t)}};function en(o){let t=new ee;return t.extractWeights(o),t}function ze(o,t){return{...o,...{descriptor:t}}}function rn(o){return typeof o.age=="number"}function Ve(o,t){return{...o,...{age:t}}}function on(o){return(o.gender===ht.MALE||o.gender===ht.FEMALE)&&de(o.genderProbability)}function Ue(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var it=b(g());var st=b(g());function Fa(o,t){function e(c,m){let p=st.tensor4d(o(3*3*c),[3,3,c,1]),d=st.tensor1d(o(c)),u=st.tensor1d(o(c)),l=st.tensor1d(o(c)),v=st.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:u,batch_norm_mean:l,batch_norm_variance:v}}function r(c,m,p,d,u){let l=st.tensor4d(o(c*m*p*p),[p,p,c,m]),v=st.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${u?"batch_norm_offset":"bias"}`}),{filters:l,bias:v}}function n(c,m,p,d){let{filters:u,bias:l}=r(c,m,p,d,!0);return{filters:u,batch_norm_offset:l}}function a(c,m,p){let d=e(c,`${p}/depthwise_conv`),u=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:u}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),d=a(128,128,"mobilenetv1/conv_3"),u=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),v=a(256,512,"mobilenetv1/conv_6"),w=a(512,512,"mobilenetv1/conv_7"),x=a(512,512,"mobilenetv1/conv_8"),y=a(512,512,"mobilenetv1/conv_9"),T=a(512,512,"mobilenetv1/conv_10"),F=a(512,512,"mobilenetv1/conv_11"),L=a(512,1024,"mobilenetv1/conv_12"),z=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,conv_8:x,conv_9:y,conv_10:T,conv_11:F,conv_12:L,conv_13:z}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),d=n(128,256,3,"prediction_layer/conv_3"),u=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),v=n(256,64,1,"prediction_layer/conv_6"),w=n(64,128,3,"prediction_layer/conv_7"),x=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),T=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),F=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),L=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),z=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),mt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Et=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Mt=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Ct=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,box_predictor_0:{box_encoding_predictor:x,class_predictor:y},box_predictor_1:{box_encoding_predictor:T,class_predictor:F},box_predictor_2:{box_encoding_predictor:L,class_predictor:z},box_predictor_3:{box_encoding_predictor:rt,class_predictor:mt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Et},box_predictor_5:{box_encoding_predictor:Mt,class_predictor:Ct}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function nn(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Fa(e,t),s=n(),i=a(),m={extra_dim:st.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Ta(o,t){let e=H(o,t);function r(m,p,d){let u=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:u,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,d=`MobilenetV1/Conv2d_${m}_depthwise`,u=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,v=e(`${d}/depthwise_weights`,4,`${u}/filters`),w=e(`${d}/BatchNorm/gamma`,1,`${u}/batch_norm_scale`),x=e(`${d}/BatchNorm/beta`,1,`${u}/batch_norm_offset`),y=e(`${d}/BatchNorm/moving_mean`,1,`${u}/batch_norm_mean`),T=e(`${d}/BatchNorm/moving_variance`,1,`${u}/batch_norm_variance`);return{depthwise_conv:{filters:v,batch_norm_scale:w,batch_norm_offset:x,batch_norm_mean:y,batch_norm_variance:T},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let d=e(`${m}/weights`,4,`${p}/filters`),u=e(`${m}/biases`,1,`${p}/bias`);return{filters:d,bias:u}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),d=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function an(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Ta(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!gt(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var Tt=b(g());var jt=b(g());function Q(o,t,e){return jt.tidy(()=>{let r=jt.conv2d(o,t.filters,e,"same");return r=jt.add(r,t.batch_norm_offset),jt.clipByValue(r,0,6)})}var _a=.0010000000474974513;function wa(o,t,e){return Tt.tidy(()=>{let r=Tt.depthwiseConv2d(o,t.filters,e,"same");return r=Tt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,_a),Tt.clipByValue(r,0,6)})}function Pa(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function sn(o,t){return Tt.tidy(()=>{let e,r=Q(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=Pa(i);r=wa(r,a.depthwise_conv,c),r=Q(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function Da(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),d=Math.max(r[e][1],r[e][3]),u=(s-n)*(i-a),l=(p-c)*(d-m);if(u<=0||l<=0)return 0;let v=Math.max(n,c),w=Math.max(a,m),x=Math.min(s,p),y=Math.min(i,d),T=Math.max(x-v,0)*Math.max(y-w,0);return T/(u+l-T)}function cn(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>n).sort((p,d)=>d.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let d=p.score;for(let u=m.length-1;u>=0;--u){let l=Da(o,p.boxIndex,m[u]);if(l!==0&&(p.score*=c(l),p.score<=n))break}d===p.score&&m.push(p.boxIndex)}),m}var f=b(g());function Ea(o){let t=f.unstack(f.transpose(o,[1,0])),e=[f.sub(t[2],t[0]),f.sub(t[3],t[1])],r=[f.add(t[0],f.div(e[0],f.scalar(2))),f.add(t[1],f.div(e[1],f.scalar(2)))];return{sizes:e,centers:r}}function Ma(o,t){let{sizes:e,centers:r}=Ea(o),n=f.unstack(f.transpose(t,[1,0])),a=f.div(f.mul(f.exp(f.div(n[2],f.scalar(5))),e[0]),f.scalar(2)),s=f.add(f.mul(f.div(n[0],f.scalar(10)),e[0]),r[0]),i=f.div(f.mul(f.exp(f.div(n[3],f.scalar(5))),e[1]),f.scalar(2)),c=f.add(f.mul(f.div(n[1],f.scalar(10)),e[1]),r[1]);return f.transpose(f.stack([f.sub(s,a),f.sub(c,i),f.add(s,a),f.add(c,i)]),[1,0])}function mn(o,t,e){return f.tidy(()=>{let r=o.shape[0],n=Ma(f.reshape(f.tile(e.extra_dim,[r,1,1]),[-1,4]),f.reshape(o,[-1,4]));n=f.reshape(n,[r,n.shape[0]/r,4]);let a=f.sigmoid(f.slice(t,[0,0,1],[-1,-1,-1])),s=f.slice(a,[0,0,0],[-1,-1,1]);s=f.reshape(s,[r,s.shape[1]]);let i=f.unstack(n),c=f.unstack(s);return{boxes:i,scores:c}})}var Je=b(g());var Xe=b(g());function re(o,t){return Xe.tidy(()=>{let e=o.shape[0],r=Xe.reshape(Kt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Xe.reshape(Kt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function pn(o,t,e){return Je.tidy(()=>{let r=Q(o,e.conv_0,[1,1]),n=Q(r,e.conv_1,[2,2]),a=Q(n,e.conv_2,[1,1]),s=Q(a,e.conv_3,[2,2]),i=Q(s,e.conv_4,[1,1]),c=Q(i,e.conv_5,[2,2]),m=Q(c,e.conv_6,[1,1]),p=Q(m,e.conv_7,[2,2]),d=re(t,e.box_predictor_0),u=re(o,e.box_predictor_1),l=re(n,e.box_predictor_2),v=re(s,e.box_predictor_3),w=re(c,e.box_predictor_4),x=re(p,e.box_predictor_5),y=Je.concat([d.boxPredictionEncoding,u.boxPredictionEncoding,l.boxPredictionEncoding,v.boxPredictionEncoding,w.boxPredictionEncoding,x.boxPredictionEncoding],1),T=Je.concat([d.classPrediction,u.classPrediction,l.classPrediction,v.classPrediction,w.classPrediction,x.classPrediction],1);return{boxPredictions:y,classPredictions:T}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Ht=class extends S{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return it.tidy(()=>{let r=it.cast(t.toBatchTensor(512,!1),"float32"),n=it.sub(it.mul(r,it.scalar(.007843137718737125)),it.scalar(1)),a=sn(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=pn(a.out,a.conv11,e.prediction_layer);return mn(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await E(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await E(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let F=1;F{let[L,z]=[Math.max(0,y[F][0]),Math.min(1,y[F][2])].map(q=>q*x),[rt,mt]=[Math.max(0,y[F][1]),Math.min(1,y[F][3])].map(q=>q*w);return new M(p[F],new Xt(rt,L,mt-rt,z-L),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),T}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return an(t)}extractParams(t){return nn(t)}};function lo(o){let t=new Ht;return t.extractWeights(o),t}function dn(o){return lo(o)}var fo=class extends Ht{};var un=.4,ln=[new h(.738768,.874946),new h(2.42204,2.65704),new h(4.30971,7.04493),new h(10.246,4.59428),new h(12.6868,11.8741)],fn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],hn=[117.001,114.697,97.404],xn="tiny_yolov2_model",bn="tiny_yolov2_separable_conv_model";var N=b(g());var Rr=o=>typeof o=="number";function $r(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Rr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Rr(t.x)&&Rr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Rr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var et=b(g());var tt=b(g());function we(o){return tt.tidy(()=>{let t=tt.mul(o,tt.scalar(.10000000149011612));return tt.add(tt.relu(tt.sub(o,t)),t)})}function _t(o,t){return et.tidy(()=>{let e=et.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=et.conv2d(e,t.conv.filters,[1,1],"valid"),e=et.sub(e,t.bn.sub),e=et.mul(e,t.bn.truediv),e=et.add(e,t.conv.bias),we(e)})}var Yt=b(g());function wt(o,t){return Yt.tidy(()=>{let e=Yt.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Yt.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=Yt.add(e,t.bias),we(e)})}var ho=b(g());function Ca(o,t){let e=ge(o,t);function r(s,i){let c=ho.tensor1d(o(s)),m=ho.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ve(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function gn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=Ca(n,s),p;if(t.withSeparableConvs){let[d,u,l,v,w,x,y,T,F]=r,L=t.isFirstLayerConv2d?i(d,u,3,"conv0"):m(d,u,"conv0"),z=m(u,l,"conv1"),rt=m(l,v,"conv2"),mt=m(v,w,"conv3"),q=m(w,x,"conv4"),Et=m(x,y,"conv5"),Mt=T?m(y,T,"conv6"):void 0,Ct=F?m(T,F,"conv7"):void 0,pe=i(F||T||y,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}else{let[d,u,l,v,w,x,y,T,F]=r,L=c(d,u,"conv0"),z=c(u,l,"conv1"),rt=c(l,v,"conv2"),mt=c(v,w,"conv3"),q=c(w,x,"conv4"),Et=c(x,y,"conv5"),Mt=c(y,T,"conv6"),Ct=c(T,F,"conv7"),pe=i(F,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function Na(o,t){let e=H(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=ye(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function vn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=Na(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var ct=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var xo=class extends S{constructor(t){super("TinyYolov2");$r(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=_t(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=_t(r,e.conv6),r=_t(r,e.conv7),Kt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?we(Kt(t,e.conv0,"valid",!1)):wt(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?wt(r,e.conv6):r,r=e.conv7?wt(r,e.conv7):r,Kt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let n=N.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?Z(n,this.config.meanRgb):n,n=n.div(N.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(n,r):this.runTinyYolov2(n,r)})}async forward(t,e){return this.forwardInput(await E(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:n}=new ct(e),a=await E(t),s=await this.forwardInput(a,r),i=N.tidy(()=>N.unstack(s)[0].expandDims()),c={width:a.getInputWidth(0),height:a.getInputHeight(0)},m=await this.extractBoxes(i,a.getReshapedInputDimensions(0),n);s.dispose(),i.dispose();let p=m.map(x=>x.box),d=m.map(x=>x.score),u=m.map(x=>x.classScore),l=m.map(x=>this.config.classes[x.label]);return ur(p.map(x=>x.rescale(r)),d,this.config.iouThreshold,!0).map(x=>new vt(d[x],u[x],l[x],p[x],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return vn(t,this.config)}extractParams(t){let e=this.config.filterSizes||xo.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return gn(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:n,height:a}=e,s=Math.max(n,a),i=s/n,c=s/a,m=t.shape[1],p=this.config.anchors.length,[d,u,l]=N.tidy(()=>{let y=t.reshape([m,m,p,this.boxEncodingSize]),T=y.slice([0,0,0,0],[m,m,p,4]),F=y.slice([0,0,0,4],[m,m,p,1]),L=this.withClassScores?N.softmax(y.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):N.scalar(0);return[T,F,L]}),v=[],w=await u.array(),x=await d.array();for(let y=0;yr){let z=(T+ue(x[y][T][F][0]))/m*i,rt=(y+ue(x[y][T][F][1]))/m*c,mt=Math.exp(x[y][T][F][2])*this.config.anchors[F].x/m*i,q=Math.exp(x[y][T][F][3])*this.config.anchors[F].y/m*c,Et=z-mt/2,Mt=rt-q/2,Ct={row:y,col:T,anchor:F},{classScore:pe,label:Po}=this.withClassScores?await this.extractPredictedClass(l,Ct):{classScore:1,label:0};v.push({box:new Ut(Et,Mt,Et+mt,Mt+q),score:L,classScore:L*pe,label:Po,...Ct})}}return d.dispose(),u.dispose(),l.dispose(),v}async extractPredictedClass(t,e){let{row:r,col:n,anchor:a}=e,s=await t.array();return Array(this.config.classes.length).fill(0).map((i,c)=>s[r][n][a][c]).map((i,c)=>({classScore:i,label:c})).reduce((i,c)=>i.classScore>c.classScore?i:c)}},Pe=xo;Pe.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var oe=class extends Pe{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:un,classes:["face"],...t?{anchors:fn,meanRgb:hn}:{anchors:ln,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?bn:xn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function yn(o,t=!0){let e=new oe(t);return e.extractWeights(o),e}var qe=class extends ct{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Ke=b(g());var bo=b(g());async function ne(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>$t(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await Zt(t,a):await qt(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function De(o,t,e,r,n){return ne([o],t,async a=>e(a[0]),r,n)}var Fn=.4,Tn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],_n=[117.001,114.697,97.404];var ae=class extends Pe{constructor(){let t={withSeparableConvs:!0,iouThreshold:Fn,classes:["face"],anchors:Tn,meanRgb:_n,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var _={ssdMobilenetv1:new Ht,tinyFaceDetector:new ae,tinyYolov2:new oe,faceLandmark68Net:new te,faceLandmark68TinyNet:new Ye,faceRecognitionNet:new ee,faceExpressionNet:new $e,ageGenderNet:new je},go=(o,t)=>_.ssdMobilenetv1.locateFaces(o,t),wn=(o,t)=>_.tinyFaceDetector.locateFaces(o,t),Pn=(o,t)=>_.tinyYolov2.locateFaces(o,t),vo=o=>_.faceLandmark68Net.detectLandmarks(o),Dn=o=>_.faceLandmark68TinyNet.detectLandmarks(o),En=o=>_.faceRecognitionNet.computeFaceDescriptor(o),Mn=o=>_.faceExpressionNet.predictExpressions(o),Cn=o=>_.ageGenderNet.predictAgeAndGender(o),yo=o=>_.ssdMobilenetv1.load(o),Nn=o=>_.tinyFaceDetector.load(o),In=o=>_.tinyYolov2.load(o),Ln=o=>_.faceLandmark68Net.load(o),kn=o=>_.faceLandmark68TinyNet.load(o),Sn=o=>_.faceRecognitionNet.load(o),An=o=>_.faceExpressionNet.load(o),Wn=o=>_.ageGenderNet.load(o),Bn=yo,Rn=go,$n=vo;var Fo=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ce=class extends Fo{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>Oe(r,e[n]))}withAgeAndGender(){return new Ee(this,this.input)}},Ne=class extends Fo{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceExpressionNet.predictExpressions(r),this.extractedFaces);return Oe(t,e)}withAgeAndGender(){return new Me(this,this.input)}},ce=class extends Ce{withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},me=class extends Ne{withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var To=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ee=class extends To{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Ve(Ue(r,s,i),a)})}withFaceExpressions(){return new Ce(this,this.input)}},Me=class extends To{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await De(t,this.input,a=>_.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Ve(Ue(t,r,n),e)}withFaceExpressions(){return new Ne(this,this.input)}},se=class extends Ee{withFaceExpressions(){return new ce(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},ie=class extends Me{withFaceExpressions(){return new me(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var Ze=class extends J{constructor(t,e){super();this.parentTask=t;this.input=e}},Pt=class extends Ze{async run(){let t=await this.parentTask;return(await ne(t,this.input,r=>Promise.all(r.map(n=>_.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>ze(t[n],r))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}},Dt=class extends Ze{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return ze(t,e)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}};var Qe=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?_.faceLandmark68TinyNet:_.faceLandmark68Net}},tr=class extends Qe{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof Ke.Tensor?await Zt(this.input,e):await qt(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),t.map((a,s)=>Qt(a,n[s]))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},er=class extends Qe{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Ke.Tensor?await Zt(this.input,[e]):await qt(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),Qt(t,n)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var rr=class extends J{constructor(t,e=new X){super();this.input=t;this.options=e}},Ie=class extends rr{async run(){let{input:t,options:e}=this,r;if(e instanceof qe)r=_.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=_.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ct)r=_.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>It({},r)))})}withFaceLandmarks(t=!1){return new tr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Ce(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Ee(this.runAndExtendWithFaceDetections(),this.input)}},or=class extends rr{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?It({},e):void 0)})}withFaceLandmarks(t=!1){return new er(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Ne(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Me(this.runAndExtendWithFaceDetection(),this.input)}};function On(o,t=new X){return new or(o,t)}function nr(o,t=new X){return new Ie(o,t)}async function _o(o,t){return nr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function jn(o,t={}){return nr(o,new ct(t)).withFaceLandmarks().withFaceDescriptors()}var Hn=_o;function Or(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var ar=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof ut)return s;if(s instanceof Float32Array)return new ut(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new ut(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>Or(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new le(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>ut.fromJSON(r));return new ar(e,t.distanceThreshold)}};function Yn(o){let t=new ae;return t.extractWeights(o),t}function wo(o,t){let{width:e,height:r}=new A(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>wo(n,{width:e,height:r}));if($t(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return Qt(It(o,n),a)}return nt(o)?It(o,o.detection.forSize(e,r)):o instanceof j||o instanceof M?o.forSize(e,r):o}var Ia=typeof process!="undefined",La=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",zn={faceapi:Yo,node:Ia,browser:La};0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); +var Vn=Object.create,sr=Object.defineProperty,Un=Object.getPrototypeOf,Xn=Object.prototype.hasOwnProperty,Jn=Object.getOwnPropertyNames,qn=Object.getOwnPropertyDescriptor;var jr=o=>sr(o,"__esModule",{value:!0});var Do=(o,t)=>()=>(t||(t={exports:{}},o(t.exports,t)),t.exports),ir=(o,t)=>{for(var e in t)sr(o,e,{get:t[e],enumerable:!0})},Zn=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Jn(t))!Xn.call(o,r)&&r!=="default"&&sr(o,r,{get:()=>t[r],enumerable:!(e=qn(t,r))||e.enumerable});return o},b=o=>Zn(jr(sr(o!=null?Vn(Un(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);var g=Do(Hr=>{var Kn=Object.create,Yr=Object.defineProperty,Qn=Object.getPrototypeOf,ta=Object.prototype.hasOwnProperty,ea=Object.getOwnPropertyNames,ra=Object.getOwnPropertyDescriptor,Eo=o=>Yr(o,"__esModule",{value:!0}),Mo=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ea(t))!ta.call(o,r)&&r!=="default"&&Yr(o,r,{get:()=>t[r],enumerable:!(e=ra(t,r))||e.enumerable});return o},oa=o=>Mo(Eo(Yr(o!=null?Kn(Qn(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);Eo(Hr);Mo(Hr,oa(require("@tensorflow/tfjs-node")))});var ko=Do((ca,Lo)=>{jr(ca);ir(ca,{isNodejs:()=>ma});function ma(){return typeof global=="object"&&!0&&typeof Lo!="undefined"&&typeof process!="undefined"&&!!process.version}});jr(exports);ir(exports,{AgeGenderNet:()=>je,BoundingBox:()=>Ut,Box:()=>D,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>Pt,ComputeFaceDescriptorsTaskBase:()=>Ze,ComputeSingleFaceDescriptorTask:()=>Dt,DetectAllFaceLandmarksTask:()=>tr,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Qe,DetectFacesTaskBase:()=>rr,DetectSingleFaceLandmarksTask:()=>er,DetectSingleFaceTask:()=>or,Dimensions:()=>A,FACE_EXPRESSION_LABELS:()=>Sr,FaceDetection:()=>M,FaceDetectionNet:()=>fo,FaceExpressionNet:()=>$e,FaceExpressions:()=>Ft,FaceLandmark68Net:()=>te,FaceLandmark68TinyNet:()=>Ye,FaceLandmarkNet:()=>mo,FaceLandmarks:()=>j,FaceLandmarks5:()=>Xr,FaceLandmarks68:()=>Jt,FaceMatch:()=>le,FaceMatcher:()=>ar,FaceRecognitionNet:()=>ee,Gender:()=>ht,LabeledBox:()=>fe,LabeledFaceDescriptors:()=>ut,NetInput:()=>ft,NeuralNetwork:()=>S,ObjectDetection:()=>vt,Point:()=>h,PredictedBox:()=>Jr,Rect:()=>Xt,SsdMobilenetv1:()=>Ht,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>ae,TinyFaceDetectorOptions:()=>qe,TinyYolov2:()=>oe,TinyYolov2Options:()=>ct,allFaces:()=>Hn,allFacesSsdMobilenetv1:()=>_o,allFacesTinyYolov2:()=>jn,awaitMediaLoaded:()=>xr,bufferToImage:()=>br,computeFaceDescriptor:()=>En,createCanvas:()=>At,createCanvasFromMedia:()=>xe,createFaceDetectionNet:()=>dn,createFaceRecognitionNet:()=>en,createSsdMobilenetv1:()=>lo,createTinyFaceDetector:()=>Yn,createTinyYolov2:()=>yn,detectAllFaces:()=>nr,detectFaceLandmarks:()=>vo,detectFaceLandmarksTiny:()=>Dn,detectLandmarks:()=>$n,detectSingleFace:()=>On,draw:()=>ao,env:()=>P,euclideanDistance:()=>Or,extendWithAge:()=>Ve,extendWithFaceDescriptor:()=>ze,extendWithFaceDetection:()=>It,extendWithFaceExpressions:()=>Oe,extendWithFaceLandmarks:()=>Qt,extendWithGender:()=>Ue,extractFaceTensors:()=>Zt,extractFaces:()=>qt,fetchImage:()=>So,fetchJson:()=>Tr,fetchNetWeights:()=>Ao,fetchOrThrow:()=>Wt,getContext2dOrThrow:()=>W,getMediaDimensions:()=>St,imageTensorToCanvas:()=>vr,imageToSquare:()=>yr,inverseSigmoid:()=>Io,iou:()=>pr,isMediaElement:()=>ke,isMediaLoaded:()=>he,isWithAge:()=>rn,isWithFaceDetection:()=>nt,isWithFaceExpressions:()=>Ar,isWithFaceLandmarks:()=>$t,isWithGender:()=>on,loadAgeGenderModel:()=>Wn,loadFaceDetectionModel:()=>Bn,loadFaceExpressionModel:()=>An,loadFaceLandmarkModel:()=>Ln,loadFaceLandmarkTinyModel:()=>kn,loadFaceRecognitionModel:()=>Sn,loadSsdMobilenetv1Model:()=>yo,loadTinyFaceDetectorModel:()=>Nn,loadTinyYolov2Model:()=>In,loadWeightMap:()=>wr,locateFaces:()=>Rn,matchDimensions:()=>Bo,minBbox:()=>dr,nets:()=>_,nonMaxSuppression:()=>ur,normalize:()=>Z,padToSquare:()=>lr,predictAgeAndGender:()=>Cn,recognizeFaceExpressions:()=>Mn,resizeResults:()=>wo,resolveInput:()=>Lt,shuffleArray:()=>No,sigmoid:()=>ue,ssdMobilenetv1:()=>go,tf:()=>Gn,tinyFaceDetector:()=>wn,tinyYolov2:()=>Pn,toNetInput:()=>E,utils:()=>Gr,validateConfig:()=>$r,version:()=>zn});var Gn=b(g());var ao={};ir(ao,{AnchorPosition:()=>lt,DrawBox:()=>hr,DrawBoxOptions:()=>ro,DrawFaceLandmarks:()=>no,DrawFaceLandmarksOptions:()=>oo,DrawTextField:()=>kt,DrawTextFieldOptions:()=>Le,drawContour:()=>bt,drawDetections:()=>ua,drawFaceExpressions:()=>la,drawFaceLandmarks:()=>ha});function bt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var Gr={};ir(Gr,{computeReshapedDimensions:()=>Ur,getCenterPoint:()=>Vt,isDimensions:()=>mr,isEven:()=>cr,isFloat:()=>Vr,isTensor:()=>Gt,isTensor1D:()=>na,isTensor2D:()=>zr,isTensor3D:()=>gt,isTensor4D:()=>V,isValidNumber:()=>ot,isValidProbablitiy:()=>de,range:()=>pt,round:()=>zt});var Co=b(g());var A=class{constructor(t,e){if(!ot(t)||!ot(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new A(1/this.width,1/this.height)}};function Gt(o,t){return o instanceof Co.Tensor&&o.shape.length===t}function na(o){return Gt(o,1)}function zr(o){return Gt(o,2)}function gt(o){return Gt(o,3)}function V(o){return Gt(o,4)}function Vr(o){return o%1!=0}function cr(o){return o%2==0}function zt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function mr(o){return o&&o.width&&o.height}function Ur({width:o,height:t},e){let r=e/Math.max(t,o);return new A(Math.round(o*r),Math.round(t*r))}function Vt(o){return o.reduce((t,e)=>t.add(e),new h(0,0)).div(new h(o.length,o.length))}function pt(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function ot(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function de(o){return ot(o)&&o>=0&&o<=1}var h=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new h(this.x+t.x,this.y+t.y)}sub(t){return new h(this.x-t.x,this.y-t.y)}mul(t){return new h(this.x*t.x,this.y*t.y)}div(t){return new h(this.x/t.x,this.y/t.y)}abs(){return new h(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new h(Math.floor(this.x),Math.floor(this.y))}};var D=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(ot)}static assertIsValidBox(t,e,r=!1){if(!D.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(ot),a=[r.x,r.y,r.width,r.height].every(ot);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];D.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new h(this.left,this.top)}get topRight(){return new h(this.right,this.top)}get bottomLeft(){return new h(this.left,this.bottom)}get bottomRight(){return new h(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new D({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new D({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return re&&(i=-d+e+r,d=e),u>t&&(c=-u+t+n,u=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:u,x:m,ex:d,w:r,h:n}}calibrate(t){return new D({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Ut=class extends D{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var vt=class{constructor(t,e,r,n,a){this._imageDims=new A(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new D(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new D(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new vt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends vt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function pr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function dr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>ccii({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;mc[p]<=e)}return a}var dt=b(g());function Z(o,t){return dt.tidy(()=>{let[e,r,n]=t,a=dt.fill([...o.shape.slice(0,3),1],e,"float32"),s=dt.fill([...o.shape.slice(0,3),1],r,"float32"),i=dt.fill([...o.shape.slice(0,3),1],n,"float32"),c=dt.concat([a,s,i],3);return dt.sub(o,c)})}var Nt=b(g());function lr(o,t=!1){return Nt.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=u=>{let l=o.shape.slice();return l[s]=u,Nt.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],d=[t&&m?i(m):null,o,c].filter(u=>!!u).map(u=>Nt.cast(u,"float32"));return Nt.concat(d,s)})}function No(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function ue(o){return 1/(1+Math.exp(-o))}function Io(o){return Math.log(o/(1-o))}var Xt=class extends D{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var aa=.5,sa=.43,ia=.45,j=class{constructor(t,e,r=new h(0,0)){let{width:n,height:a}=e;this._imgDims=new A(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new h(n,a)).add(r))}get shift(){return new h(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new h(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new h(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new D(t);return this.shiftBy(a.x,a.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,a=d=>n.sub(d).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/ia),c=Vt(t),m=Math.floor(Math.max(0,c.x-aa*i)),p=Math.floor(Math.max(0,c.y-sa*i));return new Xt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=dr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var Xr=class extends j{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Vt([t[3],t[4]])]}};var Jt=class extends j{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(Vt)}};var le=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${zt(this.distance)})`:""}`}};var fe=class extends D{static assertIsValidLabeledBox(t,e){if(D.assertIsValidBox(t,e),!ot(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t);this._label=e}get label(){return this._label}};var ut=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new ut(t.label,e)}};var Jr=class extends fe{static assertIsValidPredictedBox(t,e){if(fe.assertIsValidLabeledBox(t,e),!de(t.score)||!de(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,n){super(t,e);this._score=r,this._classScore=n}get score(){return this._score}get classScore(){return this._classScore}};function nt(o){return o.detection instanceof M}function It(o,t){return{...o,...{detection:t}}}function qr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function fr(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Zr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch,a=fr();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:n,...a}}function Kr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var Qr=b(ko()),k;function pa(){if(!k)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return k}function to(o){k=o}function eo(){return Kr()?to(qr()):(0,Qr.isNodejs)()?to(Zr()):null}function da(o){if(k||eo(),!k)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=k.Canvas,Image:e=k.Image}=o;k.Canvas=t,k.Image=e,k.createCanvasElement=o.createCanvasElement||(()=>new t),k.createImageElement=o.createImageElement||(()=>new e),k.ImageData=o.ImageData||k.ImageData,k.Video=o.Video||k.Video,k.fetch=o.fetch||k.fetch,k.readFile=o.readFile||k.readFile}var P={getEnv:pa,setEnv:to,initialize:eo,createBrowserEnv:qr,createFileSystem:fr,createNodejsEnv:Zr,monkeyPatch:da,isBrowser:Kr,isNodejs:Qr.isNodejs};eo();function Lt(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function W(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Lt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var lt;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(lt||(lt={}));var Le=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||lt.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},kt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof kt?t.text:t,this.anchor=e,this.options=new Le(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r{let v=c+d.x,w=c+d.y+(l+1)*s;r.fillText(u,v,w)})}};var ro=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:lt.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Le({...s,...a})}},hr=class{constructor(t,e={}){this.box=new D(t),this.options=new ro(e)}draw(t){let e=W(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new kt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function ua(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:nt(r)?r.detection.score:void 0,a=r instanceof M?r.box:nt(r)?r.detection.box:new D(r),s=n?`${zt(n)}`:void 0;new hr(a,{label:s}).draw(o)})}var Te=b(g());function he(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function xr(o){return new Promise((t,e)=>{if(o instanceof P.getEnv().Canvas||he(o))return t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function br(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function St(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new A(o.naturalWidth,o.naturalHeight):o instanceof e?new A(o.videoWidth,o.videoHeight):new A(o.width,o.height)}function At({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function xe(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!he(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||St(o),a=At({width:r,height:n});return o instanceof e?W(a).putImageData(o,0,0):W(a).drawImage(o,0,0,r,n),a}var gr=b(g());async function vr(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(V(o)?1:0),s=gr.tidy(()=>o.as3D(r,n,a).toInt());return await gr.browser.toPixels(s,e),s.dispose(),e}function ke(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var K=b(g());function yr(o,t,e=!1){let{Image:r,Canvas:n}=P.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return At({width:1,height:1});let a=St(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=At({width:t,height:t}),p=o instanceof n?o:xe(o),d=Math.abs(i-c)/2,u=e&&i0&&p.height>0&&W(m).drawImage(p,u,l,i,c),m}var ft=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(gt(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(V(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof P.getEnv().Canvas?r:xe(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return pt(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Ur({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,K.tidy(()=>{let r=pt(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof K.Tensor){let i=V(s)?s:s.expandDims();return i=lr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=K.image.resizeBilinear(i,[t,t])),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return K.browser.fromPixels(yr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return K.stack(r.map(a=>K.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function E(o){if(o instanceof ft)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Lt);return r.forEach((n,a)=>{if(!ke(n)&&!gt(n)&&!V(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(V(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>ke(n)&&xr(n))),new ft(r,Array.isArray(o))}async function qt(o,t){let{Canvas:e}=P.getEnv(),r=o;if(!(o instanceof e)){let s=await E(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await vr(i)}let n=W(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=At({width:c,height:m});return c>0&&m>0&&W(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var Fr=b(g());async function Zt(o,t){if(!gt(o)&&!V(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(V(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return Fr.tidy(()=>{let[e,r,n]=o.shape.slice(V(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).map(({x:i,y:c,width:m,height:p})=>Fr.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function Wt(o,t){let{fetch:e}=P.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function So(o){let t=await Wt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return br(e)}async function Tr(o){return(await Wt(o)).json()}async function Ao(o){return new Float32Array(await(await Wt(o)).arrayBuffer())}var Wo=b(g());function _r(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function wr(o,t){let{manifestUri:e,modelBaseUri:r}=_r(o,t),n=await Tr(e);return Wo.io.loadWeights(n,r)}function Bo(o,t,e=!1){let{width:r,height:n}=e?St(t):t;return o.width=r,o.height=n,{width:r,height:n}}var Rt=b(g());var yt=b(g());var S=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof yt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof yt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=yt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await wr(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=_r(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(d=>d.buffer))),s=yt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof yt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var C=b(g());var be=b(g());function O(o,t,e){return be.tidy(()=>{let r=be.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=be.add(r,t.bias),r})}function Pr(o,t,e=!1){return C.tidy(()=>{let r=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):O(o,t.conv0,[2,2])),n=O(r,t.conv1,[1,1]),a=C.relu(C.add(r,n)),s=O(a,t.conv2,[1,1]);return C.relu(C.add(r,C.add(n,s)))})}function Se(o,t,e=!1,r=!0){return C.tidy(()=>{let n=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):O(o,t.conv0,r?[2,2]:[1,1])),a=O(n,t.conv1,[1,1]),s=C.relu(C.add(n,a)),i=O(s,t.conv2,[1,1]),c=C.relu(C.add(n,C.add(a,i))),m=O(c,t.conv3,[1,1]);return C.relu(C.add(n,C.add(a,C.add(i,m))))})}var Bt=b(g());function Kt(o,t,e="same",r=!1){return Bt.tidy(()=>{let n=Bt.add(Bt.conv2d(o,t.filters,[1,1],e),t.bias);return r?Bt.relu(n):n})}function B(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var Dr=b(g());function ge(o,t){return(e,r,n,a)=>{let s=Dr.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Dr.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var Er=b(g());function Mr(o,t){return(e,r,n)=>{let a=Er.tensor2d(o(e*r),[e,r]),s=Er.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Ae=b(g());var Cr=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ve(o,t){return(e,r,n)=>{let a=Ae.tensor4d(o(3*3*e),[3,3,e,1]),s=Ae.tensor4d(o(e*r),[1,1,e,r]),i=Ae.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Cr(a,s,i)}}function ye(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Cr(e,r,n)}}function H(o,t){return(e,r,n)=>{let a=o[e];if(!Gt(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function R(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function Nr(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),d=r(i,i,`${c}/conv1`),u=r(i,i,`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function a(s,i,c,m=!1){let{conv0:p,conv1:d,conv2:u}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock4Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i,dense3:c}}}function Ir(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function Lr(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:d}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`),u=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:d,conv3:u}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function $o(o){let t=[],{extractDenseBlock4Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return B(o,t),{params:r,paramMappings:t}}var We=class extends S{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return Rt.tidy(()=>{let r=Rt.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Rt.scalar(255)),s=Se(a,e.dense0,!0);return s=Se(s,e.dense1),s=Se(s,e.dense2),s=Se(s,e.dense3),s=Rt.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return $o(t)}extractParams(t){return Ro(t)}};var Ho=b(g());var Fe=b(g());function Be(o,t){return Fe.tidy(()=>Fe.add(Fe.matMul(o,t.weights),t.bias))}function Oo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=R(o),i=Mr(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function jo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return B(o,t),{params:n,paramMappings:t}}function kr(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Re=class extends S{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return Ho.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t;return Be(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Oo(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),jo(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,a=t.slice(0,t.length-n),s=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Sr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Ft=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Sr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Sr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var $e=class extends Re{constructor(t=new We){super("FaceExpressionNet",t)}forwardInput(t){return Te.tidy(()=>Te.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await E(t))}async predictExpressions(t){let e=await E(t),r=await this.forwardInput(e),n=await Promise.all(Te.unstack(r).map(async s=>{let i=await s.data();return s.dispose(),i}));r.dispose();let a=n.map(s=>new Ft(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Ar(o){return o.expressions instanceof Ft}function Oe(o,t){return{...o,...{expressions:t}}}function la(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof Ft?a:Ar(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(d=>d.probability>e),m=nt(a)?a.detection.box.bottomLeft:r||new h(0,0);new kt(c.map(d=>`${d.expression} (${zt(d.probability)})`),m).draw(o)})}function $t(o){return nt(o)&&o.landmarks instanceof j&&o.unshiftedLandmarks instanceof j&&o.alignedRect instanceof M}function fa(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>ii>c._y?i:c._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function Qt(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=fa(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var oo=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},no=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new oo(e)}draw(t){let e=W(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Jt&&(e.strokeStyle=s,e.lineWidth=a,bt(e,this.faceLandmarks.getJawOutline()),bt(e,this.faceLandmarks.getLeftEyeBrow()),bt(e,this.faceLandmarks.getRightEyeBrow()),bt(e,this.faceLandmarks.getNose()),bt(e,this.faceLandmarks.getLeftEye(),!0),bt(e,this.faceLandmarks.getRightEye(),!0),bt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function ha(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof j?r:$t(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new no(n).draw(o)})}var Yo="1.1.2";var xt=b(g());var I=b(g());function xa(o,t){let e=ge(o,t),r=ve(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Go(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=R(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=xa(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),d=i(64,128,"entry_flow/reduction_block_1"),u={conv_in:m,reduction_block_0:p,reduction_block_1:d},l={};pt(t,0,1).forEach(y=>{l[`main_block_${y}`]=c(128,`middle_flow/main_block_${y}`)});let v=i(128,256,"exit_flow/reduction_block"),w=s(256,512,"exit_flow/separable_conv"),x={reduction_block:v,separable_conv:w};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:u,middle_flow:l,exit_flow:x}}}function ba(o,t){let e=H(o,t),r=Ir(e),n=ye(e);function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}}function zo(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=ba(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},d={};pt(t,0,1).forEach(w=>{d[`main_block_${w}`]=s(`middle_flow/main_block_${w}`)});let u=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),v={reduction_block:u,separable_conv:l};return B(o,e),{params:{entry_flow:p,middle_flow:d,exit_flow:v},paramMappings:e}}function Vo(o,t,e){return I.add(I.conv2d(o,t.filters,e,"same"),t.bias)}function so(o,t,e=!0){let r=e?I.relu(o):o;return r=O(r,t.separable_conv0,[1,1]),r=O(I.relu(r),t.separable_conv1,[1,1]),r=I.maxPool(r,[3,3],[2,2],"same"),r=I.add(r,Vo(o,t.expansion_conv,[2,2])),r}function ga(o,t){let e=O(I.relu(o),t.separable_conv0,[1,1]);return e=O(I.relu(e),t.separable_conv1,[1,1]),e=O(I.relu(e),t.separable_conv2,[1,1]),e=I.add(e,o),e}var io=class extends S{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return I.tidy(()=>{let r=I.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(I.scalar(256)),s=I.relu(Vo(a,e.entry_flow.conv_in,[2,2]));return s=so(s,e.entry_flow.reduction_block_0,!1),s=so(s,e.entry_flow.reduction_block_1),pt(this._numMainBlocks,0,1).forEach(i=>{s=ga(s,e.middle_flow[`main_block_${i}`])}),s=so(s,e.exit_flow.reduction_block),s=I.relu(O(s,e.exit_flow.separable_conv,[1,1])),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return zo(t,this._numMainBlocks)}extractParams(t){return Go(t,this._numMainBlocks)}};function Uo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),n=Mr(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function Xo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return B(o,t),{params:n,paramMappings:t}}var ht;(function(o){o.FEMALE="female",o.MALE="male"})(ht||(ht={}));var je=class extends S{constructor(t=new io(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return xt.tidy(()=>{let r=t instanceof ft?this.faceFeatureExtractor.forwardInput(t):t,n=xt.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),a=Be(n,e.fc.age).as1D(),s=Be(n,e.fc.gender);return{age:a,gender:s}})}forwardInput(t){return xt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:xt.softmax(r)}})}async forward(t){return this.forwardInput(await E(t))}async predictAgeAndGender(t){let e=await E(t),r=await this.forwardInput(e),n=xt.unstack(r.age),a=xt.unstack(r.gender),s=n.map((c,m)=>({ageTensor:c,genderTensor:a[m]})),i=await Promise.all(s.map(async({ageTensor:c,genderTensor:m})=>{let p=(await c.data())[0],d=(await m.data())[0],u=d>.5,l=u?ht.MALE:ht.FEMALE,v=u?d:1-d;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:v}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?i:i[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Uo(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=kr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Xo(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),n=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var Y=b(g());var He=class extends Re{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return Y.tidy(()=>{let s=(d,u)=>Y.stack([Y.fill([68],d,"float32"),Y.fill([68],u,"float32")],1).as2D(1,136).as1D(),i=(d,u)=>{let{width:l,height:v}=n[d];return u(l,v)?Math.abs(l-v)/2:0},c=d=>i(d,(u,l)=>ui(d,(u,l)=>ls(c(u),m(u))))).div(Y.stack(Array.from(Array(a),(d,u)=>s(n[u].width,n[u].height))))})}forwardInput(t){return Y.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await E(t))}async detectLandmarks(t){let e=await E(t),r=Y.tidy(()=>Y.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(await a.data()),c=i.filter((p,d)=>cr(d)),m=i.filter((p,d)=>!cr(d));return new Jt(Array(68).fill(0).map((p,d)=>new h(c[d],m[d])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var te=class extends He{constructor(t=new We){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var Ot=b(g());function Jo(o){let t=[],{extractDenseBlock3Params:e}=Lr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return B(o,t),{params:r,paramMappings:t}}function qo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractDenseBlock3Params:n}=Nr(e,t),a=n(3,32,"dense0",!0),s=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:a,dense1:s,dense2:i}}}var co=class extends S{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Ot.tidy(()=>{let r=Ot.cast(t.toBatchTensor(112,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(Ot.scalar(255)),s=Pr(a,e.dense0,!0);return s=Pr(s,e.dense1),s=Pr(s,e.dense2),s=Ot.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Jo(t)}extractParams(t){return qo(t)}};var Ye=class extends He{constructor(t=new co){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var mo=class extends te{};var U=b(g());var _e=b(g());var Wr=b(g());function Zo(o,t){return Wr.add(Wr.mul(o,t.weights),t.biases)}function po(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=_e.conv2d(o,a,e,n);return i=_e.add(i,s),i=Zo(i,t.scale),r?_e.relu(i):i}function Ko(o,t){return po(o,t,[1,1],!0)}function uo(o,t){return po(o,t,[1,1],!1)}function Br(o,t){return po(o,t,[2,2],!0,"valid")}var G=b(g());function va(o,t){function e(i,c,m){let p=o(i),d=p.length/(c*m*m);if(Vr(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return G.tidy(()=>G.transpose(G.tensor4d(p,[c,d,m,m]),[2,3,1,0]))}function r(i,c,m,p){let d=e(i,c,m),u=G.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:u}}function n(i,c){let m=G.tensor1d(o(i)),p=G.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let d=r(i,c,m,`${p}/conv`),u=n(c,`${p}/scale`);return{conv:d,scale:u}}function s(i,c,m,p,d=!1){let u=a((d?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:u,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Qo(o){let{extractWeights:t,getRemainingWeights:e}=R(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=va(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),d=a(36864,64,3,"conv64_1"),u=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),v=a(147456,128,3,"conv128_down",!0),w=a(147456,128,3,"conv128_1"),x=a(147456,128,3,"conv128_2"),y=a(589824,256,3,"conv256_down",!0),T=a(589824,256,3,"conv256_1"),F=a(589824,256,3,"conv256_2"),L=a(589824,256,3,"conv256_down_out"),z=G.tidy(()=>G.transpose(G.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:d,conv64_2:u,conv64_3:l,conv128_down:v,conv128_1:w,conv128_2:x,conv256_down:y,conv256_1:T,conv256_2:F,conv256_down_out:L,fc:z},paramMappings:r}}function ya(o,t){let e=H(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function tn(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=ya(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),d=r("conv64_3"),u=r("conv128_down"),l=r("conv128_1"),v=r("conv128_2"),w=r("conv256_down"),x=r("conv256_1"),y=r("conv256_2"),T=r("conv256_down_out"),{fc:F}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!zr(F))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${F}`);let L={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:d,conv128_down:u,conv128_1:l,conv128_2:v,conv256_down:w,conv256_1:x,conv256_2:y,conv256_down_out:T,fc:F};return B(o,t),{params:L,paramMappings:t}}var $=b(g());function at(o,t){let e=Ko(o,t.conv1);return e=uo(e,t.conv2),e=$.add(e,o),e=$.relu(e),e}function Ge(o,t){let e=Br(o,t.conv1);e=uo(e,t.conv2);let r=$.avgPool(o,2,2,"valid"),n=$.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=$.zeros(i);e=$.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=$.zeros(m);e=$.concat([e,p],2)}return r=a?$.concat([r,n],3):r,e=$.add(r,e),e=$.relu(e),e}var ee=class extends S{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return U.tidy(()=>{let r=U.cast(t.toBatchTensor(150,!0),"float32"),a=Z(r,[122.782,117.001,104.298]).div(U.scalar(256)),s=Br(a,e.conv32_down);s=U.maxPool(s,3,2,"valid"),s=at(s,e.conv32_1),s=at(s,e.conv32_2),s=at(s,e.conv32_3),s=Ge(s,e.conv64_down),s=at(s,e.conv64_1),s=at(s,e.conv64_2),s=at(s,e.conv64_3),s=Ge(s,e.conv128_down),s=at(s,e.conv128_1),s=at(s,e.conv128_2),s=Ge(s,e.conv256_down),s=at(s,e.conv256_1),s=at(s,e.conv256_2),s=Ge(s,e.conv256_down_out);let i=s.mean([1,2]);return U.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await E(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)==null?void 0:a.some(s=>s<=0))return new Float32Array(128);let e=await E(t),r=U.tidy(()=>U.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return tn(t)}extractParams(t){return Qo(t)}};function en(o){let t=new ee;return t.extractWeights(o),t}function ze(o,t){return{...o,...{descriptor:t}}}function rn(o){return typeof o.age=="number"}function Ve(o,t){return{...o,...{age:t}}}function on(o){return(o.gender===ht.MALE||o.gender===ht.FEMALE)&&de(o.genderProbability)}function Ue(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var it=b(g());var st=b(g());function Fa(o,t){function e(c,m){let p=st.tensor4d(o(3*3*c),[3,3,c,1]),d=st.tensor1d(o(c)),u=st.tensor1d(o(c)),l=st.tensor1d(o(c)),v=st.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:u,batch_norm_mean:l,batch_norm_variance:v}}function r(c,m,p,d,u){let l=st.tensor4d(o(c*m*p*p),[p,p,c,m]),v=st.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${u?"batch_norm_offset":"bias"}`}),{filters:l,bias:v}}function n(c,m,p,d){let{filters:u,bias:l}=r(c,m,p,d,!0);return{filters:u,batch_norm_offset:l}}function a(c,m,p){let d=e(c,`${p}/depthwise_conv`),u=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:u}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),d=a(128,128,"mobilenetv1/conv_3"),u=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),v=a(256,512,"mobilenetv1/conv_6"),w=a(512,512,"mobilenetv1/conv_7"),x=a(512,512,"mobilenetv1/conv_8"),y=a(512,512,"mobilenetv1/conv_9"),T=a(512,512,"mobilenetv1/conv_10"),F=a(512,512,"mobilenetv1/conv_11"),L=a(512,1024,"mobilenetv1/conv_12"),z=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,conv_8:x,conv_9:y,conv_10:T,conv_11:F,conv_12:L,conv_13:z}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),d=n(128,256,3,"prediction_layer/conv_3"),u=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),v=n(256,64,1,"prediction_layer/conv_6"),w=n(64,128,3,"prediction_layer/conv_7"),x=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),y=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),T=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),F=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),L=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),z=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),mt=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),q=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Et=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Mt=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Ct=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:v,conv_7:w,box_predictor_0:{box_encoding_predictor:x,class_predictor:y},box_predictor_1:{box_encoding_predictor:T,class_predictor:F},box_predictor_2:{box_encoding_predictor:L,class_predictor:z},box_predictor_3:{box_encoding_predictor:rt,class_predictor:mt},box_predictor_4:{box_encoding_predictor:q,class_predictor:Et},box_predictor_5:{box_encoding_predictor:Mt,class_predictor:Ct}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function nn(o){let t=[],{extractWeights:e,getRemainingWeights:r}=R(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Fa(e,t),s=n(),i=a(),m={extra_dim:st.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Ta(o,t){let e=H(o,t);function r(m,p,d){let u=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:u,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,d=`MobilenetV1/Conv2d_${m}_depthwise`,u=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,v=e(`${d}/depthwise_weights`,4,`${u}/filters`),w=e(`${d}/BatchNorm/gamma`,1,`${u}/batch_norm_scale`),x=e(`${d}/BatchNorm/beta`,1,`${u}/batch_norm_offset`),y=e(`${d}/BatchNorm/moving_mean`,1,`${u}/batch_norm_mean`),T=e(`${d}/BatchNorm/moving_variance`,1,`${u}/batch_norm_variance`);return{depthwise_conv:{filters:v,batch_norm_scale:w,batch_norm_offset:x,batch_norm_mean:y,batch_norm_variance:T},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let d=e(`${m}/weights`,4,`${p}/filters`),u=e(`${m}/biases`,1,`${p}/bias`);return{filters:d,bias:u}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),d=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function an(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Ta(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!gt(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return B(o,t),{params:a,paramMappings:t}}var Tt=b(g());var jt=b(g());function Q(o,t,e){return jt.tidy(()=>{let r=jt.conv2d(o,t.filters,e,"same");return r=jt.add(r,t.batch_norm_offset),jt.clipByValue(r,0,6)})}var _a=.0010000000474974513;function wa(o,t,e){return Tt.tidy(()=>{let r=Tt.depthwiseConv2d(o,t.filters,e,"same");return r=Tt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,_a),Tt.clipByValue(r,0,6)})}function Pa(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function sn(o,t){return Tt.tidy(()=>{let e,r=Q(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=Pa(i);r=wa(r,a.depthwise_conv,c),r=Q(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function Da(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),d=Math.max(r[e][1],r[e][3]),u=(s-n)*(i-a),l=(p-c)*(d-m);if(u<=0||l<=0)return 0;let v=Math.max(n,c),w=Math.max(a,m),x=Math.min(s,p),y=Math.min(i,d),T=Math.max(x-v,0)*Math.max(y-w,0);return T/(u+l-T)}function cn(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>n).sort((p,d)=>d.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let d=p.score;for(let u=m.length-1;u>=0;--u){let l=Da(o,p.boxIndex,m[u]);if(l!==0&&(p.score*=c(l),p.score<=n))break}d===p.score&&m.push(p.boxIndex)}),m}var f=b(g());function Ea(o){let t=f.unstack(f.transpose(o,[1,0])),e=[f.sub(t[2],t[0]),f.sub(t[3],t[1])],r=[f.add(t[0],f.div(e[0],f.scalar(2))),f.add(t[1],f.div(e[1],f.scalar(2)))];return{sizes:e,centers:r}}function Ma(o,t){let{sizes:e,centers:r}=Ea(o),n=f.unstack(f.transpose(t,[1,0])),a=f.div(f.mul(f.exp(f.div(n[2],f.scalar(5))),e[0]),f.scalar(2)),s=f.add(f.mul(f.div(n[0],f.scalar(10)),e[0]),r[0]),i=f.div(f.mul(f.exp(f.div(n[3],f.scalar(5))),e[1]),f.scalar(2)),c=f.add(f.mul(f.div(n[1],f.scalar(10)),e[1]),r[1]);return f.transpose(f.stack([f.sub(s,a),f.sub(c,i),f.add(s,a),f.add(c,i)]),[1,0])}function mn(o,t,e){return f.tidy(()=>{let r=o.shape[0],n=Ma(f.reshape(f.tile(e.extra_dim,[r,1,1]),[-1,4]),f.reshape(o,[-1,4]));n=f.reshape(n,[r,n.shape[0]/r,4]);let a=f.sigmoid(f.slice(t,[0,0,1],[-1,-1,-1])),s=f.slice(a,[0,0,0],[-1,-1,1]);s=f.reshape(s,[r,s.shape[1]]);let i=f.unstack(n),c=f.unstack(s);return{boxes:i,scores:c}})}var Je=b(g());var Xe=b(g());function re(o,t){return Xe.tidy(()=>{let e=o.shape[0],r=Xe.reshape(Kt(o,t.box_encoding_predictor),[e,-1,1,4]),n=Xe.reshape(Kt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function pn(o,t,e){return Je.tidy(()=>{let r=Q(o,e.conv_0,[1,1]),n=Q(r,e.conv_1,[2,2]),a=Q(n,e.conv_2,[1,1]),s=Q(a,e.conv_3,[2,2]),i=Q(s,e.conv_4,[1,1]),c=Q(i,e.conv_5,[2,2]),m=Q(c,e.conv_6,[1,1]),p=Q(m,e.conv_7,[2,2]),d=re(t,e.box_predictor_0),u=re(o,e.box_predictor_1),l=re(n,e.box_predictor_2),v=re(s,e.box_predictor_3),w=re(c,e.box_predictor_4),x=re(p,e.box_predictor_5),y=Je.concat([d.boxPredictionEncoding,u.boxPredictionEncoding,l.boxPredictionEncoding,v.boxPredictionEncoding,w.boxPredictionEncoding,x.boxPredictionEncoding],1),T=Je.concat([d.classPrediction,u.classPrediction,l.classPrediction,v.classPrediction,w.classPrediction,x.classPrediction],1);return{boxPredictions:y,classPredictions:T}})}var X=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Ht=class extends S{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return it.tidy(()=>{let r=it.cast(t.toBatchTensor(512,!1),"float32"),n=it.sub(it.mul(r,it.scalar(.007843137718737125)),it.scalar(1)),a=sn(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=pn(a.out,a.conv11,e.prediction_layer);return mn(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await E(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new X(e),a=await E(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let F=1;F{let[L,z]=[Math.max(0,y[F][0]),Math.min(1,y[F][2])].map(q=>q*x),[rt,mt]=[Math.max(0,y[F][1]),Math.min(1,y[F][3])].map(q=>q*w);return new M(p[F],new Xt(rt,L,mt-rt,z-L),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),T}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return an(t)}extractParams(t){return nn(t)}};function lo(o){let t=new Ht;return t.extractWeights(o),t}function dn(o){return lo(o)}var fo=class extends Ht{};var un=.4,ln=[new h(.738768,.874946),new h(2.42204,2.65704),new h(4.30971,7.04493),new h(10.246,4.59428),new h(12.6868,11.8741)],fn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],hn=[117.001,114.697,97.404],xn="tiny_yolov2_model",bn="tiny_yolov2_separable_conv_model";var N=b(g());var Rr=o=>typeof o=="number";function $r(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!Rr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>Rr(t.x)&&Rr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(Rr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var et=b(g());var tt=b(g());function we(o){return tt.tidy(()=>{let t=tt.mul(o,tt.scalar(.10000000149011612));return tt.add(tt.relu(tt.sub(o,t)),t)})}function _t(o,t){return et.tidy(()=>{let e=et.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=et.conv2d(e,t.conv.filters,[1,1],"valid"),e=et.sub(e,t.bn.sub),e=et.mul(e,t.bn.truediv),e=et.add(e,t.conv.bias),we(e)})}var Yt=b(g());function wt(o,t){return Yt.tidy(()=>{let e=Yt.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Yt.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=Yt.add(e,t.bias),we(e)})}var ho=b(g());function Ca(o,t){let e=ge(o,t);function r(s,i){let c=ho.tensor1d(o(s)),m=ho.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ve(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function gn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=R(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=Ca(n,s),p;if(t.withSeparableConvs){let[d,u,l,v,w,x,y,T,F]=r,L=t.isFirstLayerConv2d?i(d,u,3,"conv0"):m(d,u,"conv0"),z=m(u,l,"conv1"),rt=m(l,v,"conv2"),mt=m(v,w,"conv3"),q=m(w,x,"conv4"),Et=m(x,y,"conv5"),Mt=T?m(y,T,"conv6"):void 0,Ct=F?m(T,F,"conv7"):void 0,pe=i(F||T||y,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}else{let[d,u,l,v,w,x,y,T,F]=r,L=c(d,u,"conv0"),z=c(u,l,"conv1"),rt=c(l,v,"conv2"),mt=c(v,w,"conv3"),q=c(w,x,"conv4"),Et=c(x,y,"conv5"),Mt=c(y,T,"conv6"),Ct=c(T,F,"conv7"),pe=i(F,5*e,1,"conv8");p={conv0:L,conv1:z,conv2:rt,conv3:mt,conv4:q,conv5:Et,conv6:Mt,conv7:Ct,conv8:pe}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function Na(o,t){let e=H(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=ye(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function vn(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=Na(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return B(o,e),{params:s,paramMappings:e}}var ct=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var xo=class extends S{constructor(t){super("TinyYolov2");$r(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=_t(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=_t(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=_t(r,e.conv6),r=_t(r,e.conv7),Kt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?we(Kt(t,e.conv0,"valid",!1)):wt(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=wt(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?wt(r,e.conv6):r,r=e.conv7?wt(r,e.conv7):r,Kt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let n=N.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?Z(n,this.config.meanRgb):n,n=n.div(N.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(n,r):this.runTinyYolov2(n,r)})}async forward(t,e){return this.forwardInput(await E(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:n}=new ct(e),a=await E(t),s=await this.forwardInput(a,r),i=N.tidy(()=>N.unstack(s)[0].expandDims()),c={width:a.getInputWidth(0),height:a.getInputHeight(0)},m=await this.extractBoxes(i,a.getReshapedInputDimensions(0),n);s.dispose(),i.dispose();let p=m.map(x=>x.box),d=m.map(x=>x.score),u=m.map(x=>x.classScore),l=m.map(x=>this.config.classes[x.label]);return ur(p.map(x=>x.rescale(r)),d,this.config.iouThreshold,!0).map(x=>new vt(d[x],u[x],l[x],p[x],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return vn(t,this.config)}extractParams(t){let e=this.config.filterSizes||xo.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return gn(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:n,height:a}=e,s=Math.max(n,a),i=s/n,c=s/a,m=t.shape[1],p=this.config.anchors.length,[d,u,l]=N.tidy(()=>{let y=t.reshape([m,m,p,this.boxEncodingSize]),T=y.slice([0,0,0,0],[m,m,p,4]),F=y.slice([0,0,0,4],[m,m,p,1]),L=this.withClassScores?N.softmax(y.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):N.scalar(0);return[T,F,L]}),v=[],w=await u.array(),x=await d.array();for(let y=0;yr){let z=(T+ue(x[y][T][F][0]))/m*i,rt=(y+ue(x[y][T][F][1]))/m*c,mt=Math.exp(x[y][T][F][2])*this.config.anchors[F].x/m*i,q=Math.exp(x[y][T][F][3])*this.config.anchors[F].y/m*c,Et=z-mt/2,Mt=rt-q/2,Ct={row:y,col:T,anchor:F},{classScore:pe,label:Po}=this.withClassScores?await this.extractPredictedClass(l,Ct):{classScore:1,label:0};v.push({box:new Ut(Et,Mt,Et+mt,Mt+q),score:L,classScore:L*pe,label:Po,...Ct})}}return d.dispose(),u.dispose(),l.dispose(),v}async extractPredictedClass(t,e){let{row:r,col:n,anchor:a}=e,s=await t.array();return Array(this.config.classes.length).fill(0).map((i,c)=>s[r][n][a][c]).map((i,c)=>({classScore:i,label:c})).reduce((i,c)=>i.classScore>c.classScore?i:c)}},Pe=xo;Pe.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var oe=class extends Pe{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:un,classes:["face"],...t?{anchors:fn,meanRgb:hn}:{anchors:ln,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?bn:xn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function yn(o,t=!0){let e=new oe(t);return e.extractWeights(o),e}var qe=class extends ct{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var J=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var Ke=b(g());var bo=b(g());async function ne(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>$t(c)?n(c):c.detection),s=r||(t instanceof bo.Tensor?await Zt(t,a):await qt(t,a)),i=await e(s);return s.forEach(c=>c instanceof bo.Tensor&&c.dispose()),i}async function De(o,t,e,r,n){return ne([o],t,async a=>e(a[0]),r,n)}var Fn=.4,Tn=[new h(1.603231,2.094468),new h(6.041143,7.080126),new h(2.882459,3.518061),new h(4.266906,5.178857),new h(9.041765,10.66308)],_n=[117.001,114.697,97.404];var ae=class extends Pe{constructor(){let t={withSeparableConvs:!0,iouThreshold:Fn,classes:["face"],anchors:Tn,meanRgb:_n,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var _={ssdMobilenetv1:new Ht,tinyFaceDetector:new ae,tinyYolov2:new oe,faceLandmark68Net:new te,faceLandmark68TinyNet:new Ye,faceRecognitionNet:new ee,faceExpressionNet:new $e,ageGenderNet:new je},go=(o,t)=>_.ssdMobilenetv1.locateFaces(o,t),wn=(o,t)=>_.tinyFaceDetector.locateFaces(o,t),Pn=(o,t)=>_.tinyYolov2.locateFaces(o,t),vo=o=>_.faceLandmark68Net.detectLandmarks(o),Dn=o=>_.faceLandmark68TinyNet.detectLandmarks(o),En=o=>_.faceRecognitionNet.computeFaceDescriptor(o),Mn=o=>_.faceExpressionNet.predictExpressions(o),Cn=o=>_.ageGenderNet.predictAgeAndGender(o),yo=o=>_.ssdMobilenetv1.load(o),Nn=o=>_.tinyFaceDetector.load(o),In=o=>_.tinyYolov2.load(o),Ln=o=>_.faceLandmark68Net.load(o),kn=o=>_.faceLandmark68TinyNet.load(o),Sn=o=>_.faceRecognitionNet.load(o),An=o=>_.faceExpressionNet.load(o),Wn=o=>_.ageGenderNet.load(o),Bn=yo,Rn=go,$n=vo;var Fo=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ce=class extends Fo{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>Oe(r,e[n]))}withAgeAndGender(){return new Ee(this,this.input)}},Ne=class extends Fo{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceExpressionNet.predictExpressions(r),this.extractedFaces);return Oe(t,e)}withAgeAndGender(){return new Me(this,this.input)}},ce=class extends Ce{withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},me=class extends Ne{withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var To=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Ee=class extends To{async run(){let t=await this.parentTask,e=await ne(t,this.input,async r=>Promise.all(r.map(n=>_.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return Ve(Ue(r,s,i),a)})}withFaceExpressions(){return new Ce(this,this.input)}},Me=class extends To{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await De(t,this.input,a=>_.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return Ve(Ue(t,r,n),e)}withFaceExpressions(){return new Ne(this,this.input)}},se=class extends Ee{withFaceExpressions(){return new ce(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},ie=class extends Me{withFaceExpressions(){return new me(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var Ze=class extends J{constructor(t,e){super();this.parentTask=t;this.input=e}},Pt=class extends Ze{async run(){let t=await this.parentTask;return(await ne(t,this.input,r=>Promise.all(r.map(n=>_.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>ze(t[n],r))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}},Dt=class extends Ze{async run(){let t=await this.parentTask;if(!t)return;let e=await De(t,this.input,r=>_.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return ze(t,e)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}};var Qe=class extends J{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?_.faceLandmark68TinyNet:_.faceLandmark68Net}},tr=class extends Qe{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof Ke.Tensor?await Zt(this.input,e):await qt(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),t.map((a,s)=>Qt(a,n[s]))}withFaceExpressions(){return new ce(this,this.input)}withAgeAndGender(){return new se(this,this.input)}withFaceDescriptors(){return new Pt(this,this.input)}},er=class extends Qe{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Ke.Tensor?await Zt(this.input,[e]):await qt(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Ke.Tensor&&a.dispose()),Qt(t,n)}withFaceExpressions(){return new me(this,this.input)}withAgeAndGender(){return new ie(this,this.input)}withFaceDescriptor(){return new Dt(this,this.input)}};var rr=class extends J{constructor(t,e=new X){super();this.input=t;this.options=e}},Ie=class extends rr{async run(){let{input:t,options:e}=this,r;if(e instanceof qe)r=_.tinyFaceDetector.locateFaces(t,e);else if(e instanceof X)r=_.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ct)r=_.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>It({},r)))})}withFaceLandmarks(t=!1){return new tr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Ce(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Ee(this.runAndExtendWithFaceDetections(),this.input)}},or=class extends rr{async run(){let t=await new Ie(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?It({},e):void 0)})}withFaceLandmarks(t=!1){return new er(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Ne(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Me(this.runAndExtendWithFaceDetection(),this.input)}};function On(o,t=new X){return new or(o,t)}function nr(o,t=new X){return new Ie(o,t)}async function _o(o,t){return nr(o,new X(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function jn(o,t={}){return nr(o,new ct(t)).withFaceLandmarks().withFaceDescriptors()}var Hn=_o;function Or(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var ar=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof ut)return s;if(s instanceof Float32Array)return new ut(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new ut(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>Or(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new le(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>ut.fromJSON(r));return new ar(e,t.distanceThreshold)}};function Yn(o){let t=new ae;return t.extractWeights(o),t}function wo(o,t){let{width:e,height:r}=new A(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>wo(n,{width:e,height:r}));if($t(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return Qt(It(o,n),a)}return nt(o)?It(o,o.detection.forSize(e,r)):o instanceof j||o instanceof M?o.forSize(e,r):o}var Ia=typeof process!="undefined",La=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",zn={faceapi:Yo,node:Ia,browser:La};0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version}); //# sourceMappingURL=face-api.node.js.map diff --git a/package-lock.json b/package-lock.json index c49df02..eea0ddf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,9 @@ "@tensorflow/tfjs-backend-wasm": "^3.3.0", "@tensorflow/tfjs-node": "^3.3.0", "@tensorflow/tfjs-node-gpu": "^3.3.0", - "@types/node": "^14.14.34", - "@typescript-eslint/eslint-plugin": "^4.17.0", - "@typescript-eslint/parser": "^4.17.0", + "@types/node": "^14.14.35", + "@typescript-eslint/eslint-plugin": "^4.18.0", + "@typescript-eslint/parser": "^4.18.0", "@vladmandic/pilogger": "^0.2.14", "chokidar": "^3.5.1", "dayjs": "^1.10.4", @@ -27,7 +27,8 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.3.1", "rimraf": "^3.0.2", - "simple-git": "^2.36.2", + "seedrandom": "^3.0.5", + "simple-git": "^2.37.0", "tslib": "^2.1.0", "typedoc": "^0.20.32", "typescript": "^4.2.3" @@ -332,20 +333,6 @@ "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=", "dev": true }, - "node_modules/@tensorflow/tfjs-data": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-3.3.0.tgz", - "integrity": "sha512-0x28tRe6RJu5GmYq3IYN2GNnOgXU0nY+o6zZrlijkK+W3vjSTJlZzaBSifoeD6J8gzVpjs8W8qd/JKHQ1MQp8w==", - "dev": true, - "dependencies": { - "@types/node-fetch": "^2.1.2", - "node-fetch": "~2.6.1" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "3.3.0", - "seedrandom": "~2.4.3" - } - }, "node_modules/@tensorflow/tfjs-layers": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-3.3.0.tgz", @@ -419,6 +406,27 @@ "rimraf": "bin.js" } }, + "node_modules/@tensorflow/tfjs/node_modules/@tensorflow/tfjs-data": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-3.3.0.tgz", + "integrity": "sha512-0x28tRe6RJu5GmYq3IYN2GNnOgXU0nY+o6zZrlijkK+W3vjSTJlZzaBSifoeD6J8gzVpjs8W8qd/JKHQ1MQp8w==", + "dev": true, + "dependencies": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "3.3.0", + "seedrandom": "~2.4.3" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/seedrandom": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", + "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", + "dev": true, + "peer": true + }, "node_modules/@types/emscripten": { "version": "0.0.34", "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-0.0.34.tgz", @@ -438,9 +446,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "14.14.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.34.tgz", - "integrity": "sha512-dBPaxocOK6UVyvhbnpFIj2W+S+1cBTkHQbFQfeeJhoKFbzYcVUGHvddeWPSucKATb3F0+pgDq0i6ghEaZjsugA==", + "version": "14.14.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz", + "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==", "dev": true }, "node_modules/@types/node-fetch": { @@ -478,13 +486,13 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.17.0.tgz", - "integrity": "sha512-/fKFDcoHg8oNan39IKFOb5WmV7oWhQe1K6CDaAVfJaNWEhmfqlA24g+u1lqU5bMH7zuNasfMId4LaYWC5ijRLw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.18.0.tgz", + "integrity": "sha512-Lzkc/2+7EoH7+NjIWLS2lVuKKqbEmJhtXe3rmfA8cyiKnZm3IfLf51irnBcmow8Q/AptVV0XBZmBJKuUJTe6cQ==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.17.0", - "@typescript-eslint/scope-manager": "4.17.0", + "@typescript-eslint/experimental-utils": "4.18.0", + "@typescript-eslint/scope-manager": "4.18.0", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "lodash": "^4.17.15", @@ -510,15 +518,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.17.0.tgz", - "integrity": "sha512-ZR2NIUbnIBj+LGqCFGQ9yk2EBQrpVVFOh9/Kd0Lm6gLpSAcCuLLe5lUCibKGCqyH9HPwYC0GIJce2O1i8VYmWA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.18.0.tgz", + "integrity": "sha512-92h723Kblt9JcT2RRY3QS2xefFKar4ZQFVs3GityOKWQYgtajxt/tuXIzL7sVCUlM1hgreiV5gkGYyBpdOwO6A==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.17.0", - "@typescript-eslint/types": "4.17.0", - "@typescript-eslint/typescript-estree": "4.17.0", + "@typescript-eslint/scope-manager": "4.18.0", + "@typescript-eslint/types": "4.18.0", + "@typescript-eslint/typescript-estree": "4.18.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" }, @@ -534,14 +542,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.17.0.tgz", - "integrity": "sha512-KYdksiZQ0N1t+6qpnl6JeK9ycCFprS9xBAiIrw4gSphqONt8wydBw4BXJi3C11ywZmyHulvMaLjWsxDjUSDwAw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.18.0.tgz", + "integrity": "sha512-W3z5S0ZbecwX3PhJEAnq4mnjK5JJXvXUDBYIYGoweCyWyuvAKfGHvzmpUzgB5L4cRBb+cTu9U/ro66dx7dIimA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.17.0", - "@typescript-eslint/types": "4.17.0", - "@typescript-eslint/typescript-estree": "4.17.0", + "@typescript-eslint/scope-manager": "4.18.0", + "@typescript-eslint/types": "4.18.0", + "@typescript-eslint/typescript-estree": "4.18.0", "debug": "^4.1.1" }, "engines": { @@ -561,13 +569,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.17.0.tgz", - "integrity": "sha512-OJ+CeTliuW+UZ9qgULrnGpPQ1bhrZNFpfT/Bc0pzNeyZwMik7/ykJ0JHnQ7krHanFN9wcnPK89pwn84cRUmYjw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.18.0.tgz", + "integrity": "sha512-olX4yN6rvHR2eyFOcb6E4vmhDPsfdMyfQ3qR+oQNkAv8emKKlfxTWUXU5Mqxs2Fwe3Pf1BoPvrwZtwngxDzYzQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.17.0", - "@typescript-eslint/visitor-keys": "4.17.0" + "@typescript-eslint/types": "4.18.0", + "@typescript-eslint/visitor-keys": "4.18.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -578,9 +586,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.17.0.tgz", - "integrity": "sha512-RN5z8qYpJ+kXwnLlyzZkiJwfW2AY458Bf8WqllkondQIcN2ZxQowAToGSd9BlAUZDB5Ea8I6mqL2quGYCLT+2g==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.18.0.tgz", + "integrity": "sha512-/BRociARpj5E+9yQ7cwCF/SNOWwXJ3qhjurMuK2hIFUbr9vTuDeu476Zpu+ptxY2kSxUHDGLLKy+qGq2sOg37A==", "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -591,13 +599,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.17.0.tgz", - "integrity": "sha512-lRhSFIZKUEPPWpWfwuZBH9trYIEJSI0vYsrxbvVvNyIUDoKWaklOAelsSkeh3E2VBSZiNe9BZ4E5tYBZbUczVQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.18.0.tgz", + "integrity": "sha512-wt4xvF6vvJI7epz+rEqxmoNQ4ZADArGQO9gDU+cM0U5fdVv7N+IAuVoVAoZSOZxzGHBfvE3XQMLdy+scsqFfeg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.17.0", - "@typescript-eslint/visitor-keys": "4.17.0", + "@typescript-eslint/types": "4.18.0", + "@typescript-eslint/visitor-keys": "4.18.0", "debug": "^4.1.1", "globby": "^11.0.1", "is-glob": "^4.0.1", @@ -618,12 +626,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.17.0.tgz", - "integrity": "sha512-WfuMN8mm5SSqXuAr9NM+fItJ0SVVphobWYkWOwQ1odsfC014Vdxk/92t4JwS1Q6fCA/ABfCKpa3AVtpUKTNKGQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.18.0.tgz", + "integrity": "sha512-Q9t90JCvfYaN0OfFUgaLqByOfz8yPeTAdotn/XYNm5q9eHax90gzdb+RJ6E9T5s97Kv/UHWKERTmqA0jTKAEHw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.17.0", + "@typescript-eslint/types": "4.18.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -3397,11 +3405,10 @@ "dev": true }, "node_modules/seedrandom": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", - "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", - "dev": true, - "peer": true + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true }, "node_modules/semver": { "version": "7.3.4", @@ -3479,9 +3486,9 @@ "dev": true }, "node_modules/simple-git": { - "version": "2.36.2", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.36.2.tgz", - "integrity": "sha512-orBEf65GfSiQMsYedbJXSiRNnIRvhbeE5rrxZuEimCpWxDZOav0KLy2IEiPi1YJCF+zaC2quiJF8A4TsxI9/tw==", + "version": "2.37.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.37.0.tgz", + "integrity": "sha512-ZK6qRnP+Xa2v23UEZDNHUfzswsuNCDHOQpWZRkpqNaXn7V5wVBBx3zRJLji3pROJGzrzA7mXwY7preL5EKuAaQ==", "dev": true, "dependencies": { "@kwsites/file-exists": "^1.1.1", @@ -4347,6 +4354,25 @@ "core-js": "3", "regenerator-runtime": "^0.13.5", "yargs": "^16.0.3" + }, + "dependencies": { + "@tensorflow/tfjs-data": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-3.3.0.tgz", + "integrity": "sha512-0x28tRe6RJu5GmYq3IYN2GNnOgXU0nY+o6zZrlijkK+W3vjSTJlZzaBSifoeD6J8gzVpjs8W8qd/JKHQ1MQp8w==", + "dev": true, + "requires": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1" + } + }, + "seedrandom": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", + "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", + "dev": true, + "peer": true + } } }, "@tensorflow/tfjs-backend-cpu": { @@ -4427,16 +4453,6 @@ } } }, - "@tensorflow/tfjs-data": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-3.3.0.tgz", - "integrity": "sha512-0x28tRe6RJu5GmYq3IYN2GNnOgXU0nY+o6zZrlijkK+W3vjSTJlZzaBSifoeD6J8gzVpjs8W8qd/JKHQ1MQp8w==", - "dev": true, - "requires": { - "@types/node-fetch": "^2.1.2", - "node-fetch": "~2.6.1" - } - }, "@tensorflow/tfjs-layers": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-3.3.0.tgz", @@ -4517,9 +4533,9 @@ "dev": true }, "@types/node": { - "version": "14.14.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.34.tgz", - "integrity": "sha512-dBPaxocOK6UVyvhbnpFIj2W+S+1cBTkHQbFQfeeJhoKFbzYcVUGHvddeWPSucKATb3F0+pgDq0i6ghEaZjsugA==", + "version": "14.14.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz", + "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==", "dev": true }, "@types/node-fetch": { @@ -4557,13 +4573,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.17.0.tgz", - "integrity": "sha512-/fKFDcoHg8oNan39IKFOb5WmV7oWhQe1K6CDaAVfJaNWEhmfqlA24g+u1lqU5bMH7zuNasfMId4LaYWC5ijRLw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.18.0.tgz", + "integrity": "sha512-Lzkc/2+7EoH7+NjIWLS2lVuKKqbEmJhtXe3rmfA8cyiKnZm3IfLf51irnBcmow8Q/AptVV0XBZmBJKuUJTe6cQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.17.0", - "@typescript-eslint/scope-manager": "4.17.0", + "@typescript-eslint/experimental-utils": "4.18.0", + "@typescript-eslint/scope-manager": "4.18.0", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "lodash": "^4.17.15", @@ -4573,55 +4589,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.17.0.tgz", - "integrity": "sha512-ZR2NIUbnIBj+LGqCFGQ9yk2EBQrpVVFOh9/Kd0Lm6gLpSAcCuLLe5lUCibKGCqyH9HPwYC0GIJce2O1i8VYmWA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.18.0.tgz", + "integrity": "sha512-92h723Kblt9JcT2RRY3QS2xefFKar4ZQFVs3GityOKWQYgtajxt/tuXIzL7sVCUlM1hgreiV5gkGYyBpdOwO6A==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.17.0", - "@typescript-eslint/types": "4.17.0", - "@typescript-eslint/typescript-estree": "4.17.0", + "@typescript-eslint/scope-manager": "4.18.0", + "@typescript-eslint/types": "4.18.0", + "@typescript-eslint/typescript-estree": "4.18.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.17.0.tgz", - "integrity": "sha512-KYdksiZQ0N1t+6qpnl6JeK9ycCFprS9xBAiIrw4gSphqONt8wydBw4BXJi3C11ywZmyHulvMaLjWsxDjUSDwAw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.18.0.tgz", + "integrity": "sha512-W3z5S0ZbecwX3PhJEAnq4mnjK5JJXvXUDBYIYGoweCyWyuvAKfGHvzmpUzgB5L4cRBb+cTu9U/ro66dx7dIimA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.17.0", - "@typescript-eslint/types": "4.17.0", - "@typescript-eslint/typescript-estree": "4.17.0", + "@typescript-eslint/scope-manager": "4.18.0", + "@typescript-eslint/types": "4.18.0", + "@typescript-eslint/typescript-estree": "4.18.0", "debug": "^4.1.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.17.0.tgz", - "integrity": "sha512-OJ+CeTliuW+UZ9qgULrnGpPQ1bhrZNFpfT/Bc0pzNeyZwMik7/ykJ0JHnQ7krHanFN9wcnPK89pwn84cRUmYjw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.18.0.tgz", + "integrity": "sha512-olX4yN6rvHR2eyFOcb6E4vmhDPsfdMyfQ3qR+oQNkAv8emKKlfxTWUXU5Mqxs2Fwe3Pf1BoPvrwZtwngxDzYzQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.17.0", - "@typescript-eslint/visitor-keys": "4.17.0" + "@typescript-eslint/types": "4.18.0", + "@typescript-eslint/visitor-keys": "4.18.0" } }, "@typescript-eslint/types": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.17.0.tgz", - "integrity": "sha512-RN5z8qYpJ+kXwnLlyzZkiJwfW2AY458Bf8WqllkondQIcN2ZxQowAToGSd9BlAUZDB5Ea8I6mqL2quGYCLT+2g==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.18.0.tgz", + "integrity": "sha512-/BRociARpj5E+9yQ7cwCF/SNOWwXJ3qhjurMuK2hIFUbr9vTuDeu476Zpu+ptxY2kSxUHDGLLKy+qGq2sOg37A==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.17.0.tgz", - "integrity": "sha512-lRhSFIZKUEPPWpWfwuZBH9trYIEJSI0vYsrxbvVvNyIUDoKWaklOAelsSkeh3E2VBSZiNe9BZ4E5tYBZbUczVQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.18.0.tgz", + "integrity": "sha512-wt4xvF6vvJI7epz+rEqxmoNQ4ZADArGQO9gDU+cM0U5fdVv7N+IAuVoVAoZSOZxzGHBfvE3XQMLdy+scsqFfeg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.17.0", - "@typescript-eslint/visitor-keys": "4.17.0", + "@typescript-eslint/types": "4.18.0", + "@typescript-eslint/visitor-keys": "4.18.0", "debug": "^4.1.1", "globby": "^11.0.1", "is-glob": "^4.0.1", @@ -4630,12 +4646,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.17.0.tgz", - "integrity": "sha512-WfuMN8mm5SSqXuAr9NM+fItJ0SVVphobWYkWOwQ1odsfC014Vdxk/92t4JwS1Q6fCA/ABfCKpa3AVtpUKTNKGQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.18.0.tgz", + "integrity": "sha512-Q9t90JCvfYaN0OfFUgaLqByOfz8yPeTAdotn/XYNm5q9eHax90gzdb+RJ6E9T5s97Kv/UHWKERTmqA0jTKAEHw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.17.0", + "@typescript-eslint/types": "4.18.0", "eslint-visitor-keys": "^2.0.0" } }, @@ -6766,11 +6782,10 @@ "dev": true }, "seedrandom": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", - "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", - "dev": true, - "peer": true + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true }, "semver": { "version": "7.3.4", @@ -6830,9 +6845,9 @@ "dev": true }, "simple-git": { - "version": "2.36.2", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.36.2.tgz", - "integrity": "sha512-orBEf65GfSiQMsYedbJXSiRNnIRvhbeE5rrxZuEimCpWxDZOav0KLy2IEiPi1YJCF+zaC2quiJF8A4TsxI9/tw==", + "version": "2.37.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.37.0.tgz", + "integrity": "sha512-ZK6qRnP+Xa2v23UEZDNHUfzswsuNCDHOQpWZRkpqNaXn7V5wVBBx3zRJLji3pROJGzrzA7mXwY7preL5EKuAaQ==", "dev": true, "requires": { "@kwsites/file-exists": "^1.1.1", diff --git a/package.json b/package.json index 443d2e4..536fe4f 100644 --- a/package.json +++ b/package.json @@ -44,9 +44,9 @@ "@tensorflow/tfjs-backend-wasm": "^3.3.0", "@tensorflow/tfjs-node": "^3.3.0", "@tensorflow/tfjs-node-gpu": "^3.3.0", - "@types/node": "^14.14.34", - "@typescript-eslint/eslint-plugin": "^4.17.0", - "@typescript-eslint/parser": "^4.17.0", + "@types/node": "^14.14.35", + "@typescript-eslint/eslint-plugin": "^4.18.0", + "@typescript-eslint/parser": "^4.18.0", "@vladmandic/pilogger": "^0.2.14", "chokidar": "^3.5.1", "dayjs": "^1.10.4", @@ -58,7 +58,8 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.3.1", "rimraf": "^3.0.2", - "simple-git": "^2.36.2", + "seedrandom": "^3.0.5", + "simple-git": "^2.37.0", "tslib": "^2.1.0", "typedoc": "^0.20.32", "typescript": "^4.2.3"