/*
  Face-API
  homepage: <https://github.com/vladmandic/face-api>
  author: <https://github.com/vladmandic>'
*/

var ln=Object.create;var ze=Object.defineProperty;var dn=Object.getOwnPropertyDescriptor;var hn=Object.getOwnPropertyNames;var bn=Object.getPrototypeOf,gn=Object.prototype.hasOwnProperty;var fo=o=>ze(o,"__esModule",{value:!0});var xn=(o,t)=>()=>(t||o((t={exports:{}}).exports,t),t.exports),Dr=(o,t)=>{for(var e in t)ze(o,e,{get:t[e],enumerable:!0})},lo=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of hn(t))!gn.call(o,n)&&(e||n!=="default")&&ze(o,n,{get:()=>t[n],enumerable:!(r=dn(t,n))||r.enumerable});return o},y=(o,t)=>lo(fo(ze(o!=null?ln(bn(o)):{},"default",!t&&o&&o.__esModule?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o),vn=(o=>(t,e)=>o&&o.get(t)||(e=lo(fo({}),t,1),o&&o.set(t,e),e))(typeof WeakMap!="undefined"?new WeakMap:0);var g=xn((Ba,xo)=>{var ho=Object.defineProperty,yn=Object.getOwnPropertyDescriptor,Tn=Object.getOwnPropertyNames,_n=Object.prototype.hasOwnProperty,Pn=o=>ho(o,"__esModule",{value:!0}),bo=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Tn(t))!_n.call(o,n)&&(e||n!=="default")&&ho(o,n,{get:()=>t[n],enumerable:!(r=yn(t,n))||r.enumerable});return o},wn=(o=>(t,e)=>o&&o.get(t)||(e=bo(Pn({}),t,1),o&&o.set(t,e),e))(typeof WeakMap!="undefined"?new WeakMap:0),go={};bo(go,require("@tensorflow/tfjs-node-gpu"));xo.exports=wn(go)});var Na={};Dr(Na,{AgeGenderNet:()=>mr,BoundingBox:()=>Kt,Box:()=>D,ComposableTask:()=>Q,ComputeAllFaceDescriptorsTask:()=>Lt,ComputeFaceDescriptorsTaskBase:()=>xr,ComputeSingleFaceDescriptorTask:()=>St,DetectAllFaceLandmarksTask:()=>yr,DetectAllFacesTask:()=>He,DetectFaceLandmarksTaskBase:()=>vr,DetectFacesTaskBase:()=>_r,DetectSingleFaceLandmarksTask:()=>Tr,DetectSingleFaceTask:()=>Pr,Dimensions:()=>k,FACE_EXPRESSION_LABELS:()=>Xr,FaceDetection:()=>M,FaceDetectionNet:()=>Jo,FaceExpressionNet:()=>sr,FaceExpressions:()=>Mt,FaceLandmark68Net:()=>ue,FaceLandmark68TinyNet:()=>pr,FaceLandmarkNet:()=>Bo,FaceLandmarks:()=>U,FaceLandmarks5:()=>yo,FaceLandmarks68:()=>te,FaceMatch:()=>Fe,FaceMatcher:()=>Fr,FaceRecognitionNet:()=>de,Gender:()=>cr,LabeledBox:()=>De,LabeledFaceDescriptors:()=>dt,NetInput:()=>ht,NeuralNetwork:()=>A,ObjectDetection:()=>wt,Point:()=>b,PredictedBox:()=>To,Rect:()=>Qt,SsdMobilenetv1:()=>Gt,SsdMobilenetv1Options:()=>q,TinyFaceDetector:()=>ve,TinyFaceDetectorOptions:()=>gr,TinyYolov2:()=>ge,TinyYolov2Options:()=>ut,allFaces:()=>Ea,allFacesSsdMobilenetv1:()=>un,allFacesTinyYolov2:()=>Da,awaitMediaLoaded:()=>zr,bufferToImage:()=>Yr,computeFaceDescriptor:()=>fa,createCanvas:()=>Ot,createCanvasFromMedia:()=>Ie,createFaceDetectionNet:()=>aa,createFaceRecognitionNet:()=>Xn,createSsdMobilenetv1:()=>Xo,createTinyFaceDetector:()=>Ma,createTinyYolov2:()=>ca,detectAllFaces:()=>wr,detectFaceLandmarks:()=>mn,detectFaceLandmarksTiny:()=>ua,detectLandmarks:()=>wa,detectSingleFace:()=>Fa,draw:()=>Kr,env:()=>P,euclideanDistance:()=>po,extendWithAge:()=>dr,extendWithFaceDescriptor:()=>lr,extendWithFaceDetection:()=>Bt,extendWithFaceExpressions:()=>ir,extendWithFaceLandmarks:()=>pe,extendWithGender:()=>hr,extractFaceTensors:()=>re,extractFaces:()=>ee,fetchImage:()=>An,fetchJson:()=>jr,fetchNetWeights:()=>kn,fetchOrThrow:()=>bt,fetchVideo:()=>Wn,getContext2dOrThrow:()=>$,getMediaDimensions:()=>$t,imageTensorToCanvas:()=>Gr,imageToSquare:()=>Vr,inverseSigmoid:()=>En,iou:()=>Nr,isMediaElement:()=>Xe,isMediaLoaded:()=>Ce,isWithAge:()=>Jn,isWithFaceDetection:()=>mt,isWithFaceExpressions:()=>Jr,isWithFaceLandmarks:()=>zt,isWithGender:()=>qn,loadAgeGenderModel:()=>Ta,loadFaceDetectionModel:()=>_a,loadFaceExpressionModel:()=>ya,loadFaceLandmarkModel:()=>ga,loadFaceLandmarkTinyModel:()=>xa,loadFaceRecognitionModel:()=>va,loadSsdMobilenetv1Model:()=>pn,loadTinyFaceDetectorModel:()=>ha,loadTinyYolov2Model:()=>ba,loadWeightMap:()=>Ur,locateFaces:()=>Pa,matchDimensions:()=>Bn,minBbox:()=>Lr,nets:()=>w,nonMaxSuppression:()=>Sr,normalize:()=>rt,padToSquare:()=>Ar,predictAgeAndGender:()=>da,recognizeFaceExpressions:()=>la,resizeResults:()=>fn,resolveInput:()=>Rt,shuffleArray:()=>Dn,sigmoid:()=>we,ssdMobilenetv1:()=>cn,tf:()=>Ca,tinyFaceDetector:()=>ma,tinyYolov2:()=>pa,toNetInput:()=>E,utils:()=>Ir,validateConfig:()=>no,version:()=>Ia});var Ca=y(g());var Kr={};Dr(Kr,{AnchorPosition:()=>Or,DrawBox:()=>je,DrawBoxOptions:()=>Hr,DrawFaceLandmarks:()=>Zr,DrawFaceLandmarksOptions:()=>qr,DrawTextField:()=>Dt,DrawTextFieldOptions:()=>Me,drawContour:()=>ft,drawDetections:()=>Sn,drawFaceExpressions:()=>Rn,drawFaceLandmarks:()=>On});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 Ir={};Dr(Ir,{computeReshapedDimensions:()=>Cr,getCenterPoint:()=>Wt,isDimensions:()=>Ge,isEven:()=>Ye,isFloat:()=>Mr,isTensor:()=>At,isTensor1D:()=>Fn,isTensor2D:()=>Er,isTensor3D:()=>lt,isTensor4D:()=>j,isValidNumber:()=>et,isValidProbablitiy:()=>Zt,range:()=>it,round:()=>kt});var vo=y(g());var k=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 k(1/this.width,1/this.height)}};function At(o,t){return o instanceof vo.Tensor&&o.shape.length===t}function Fn(o){return At(o,1)}function Er(o){return At(o,2)}function lt(o){return At(o,3)}function j(o){return At(o,4)}function Mr(o){return o%1!==0}function Ye(o){return o%2===0}function kt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function Ge(o){return o&&o.width&&o.height}function Cr({width:o,height:t},e){let r=e/Math.max(t,o);return new k(Math.round(o*r),Math.round(t*r))}function Wt(o){return o.reduce((t,e)=>t.add(e),new b(0,0)).div(new b(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!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function Zt(o){return et(o)&&o>=0&&o<=1}var b=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new b(this.x+t.x,this.y+t.y)}sub(t){return new b(this.x-t.x,this.y-t.y)}mul(t){return new b(this.x*t.x,this.y*t.y)}div(t){return new b(this.x/t.x,this.y/t.y)}abs(){return new b(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new b(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(et)}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(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];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 b(this.left,this.top)}get topRight(){return new b(this.right,this.top)}get bottomLeft(){return new b(this.left,this.bottom)}get bottomRight(){return new b(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 r<n&&(t-=a/2,r+=a),n<r&&(e-=a/2,n+=a),new D({x:t,y:e,width:r,height:n})}rescale(t){let e=Ge(t)?t.width:t,r=Ge(t)?t.height:t;return new D({x:this.x*e,y:this.y*r,width:this.width*e,height:this.height*r})}pad(t,e){let[r,n,a,s]=[this.x-t/2,this.y-e/2,this.width+t,this.height+e];return new D({x:r,y:n,width:a,height:s})}clipAtImageBorders(t,e){let{x:r,y:n,right:a,bottom:s}=this,i=Math.max(r,0),c=Math.max(n,0),m=a-i,p=s-c,u=Math.min(m,t-i),f=Math.min(p,e-c);return new D({x:i,y:c,width:u,height:f}).floor()}shift(t,e){let{width:r,height:n}=this,a=this.x+t,s=this.y+e;return new D({x:a,y:s,width:r,height:n})}padAtBorders(t,e){let r=this.width+1,n=this.height+1,a=1,s=1,i=r,c=n,m=this.left,p=this.top,u=this.right,f=this.bottom;return u>e&&(i=-u+e+r,u=e),f>t&&(c=-f+t+n,f=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:f,x:m,ex:u,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 Kt=class extends D{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var wt=class{constructor(t,e,r,n,a){this._imageDims=new k(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 wt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends wt{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 Nr(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 Lr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>c<i?c:i,1/0),n=e.reduce((i,c)=>c<i?c:i,1/0),a=t.reduce((i,c)=>i<c?c:i,0),s=e.reduce((i,c)=>i<c?c:i,0);return new Kt(r,n,a,s)}function Sr(o,t,e,r=!0){let n=t.map((s,i)=>({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;m<i.length;m++){let p=i[m],u=o[s],f=o[p];c.push(Nr(u,f,r))}n=n.filter((m,p)=>c[p]<=e)}return a}var ct=y(g());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 Ft=y(g());function Ar(o,t=!1){return Ft.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=f=>{let l=o.shape.slice();return l[s]=f,Ft.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],u=[t&&m?i(m):null,o,c].filter(f=>!!f).map(f=>Ft.cast(f,"float32"));return Ft.concat(u,s)})}function Dn(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 we(o){return 1/(1+Math.exp(-o))}function En(o){return Math.log(o/(1-o))}var Qt=class extends D{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var Mn=.5,Cn=.43,In=.45,U=class{constructor(t,e,r=new b(0,0)){let{width:n,height:a}=e;this._imgDims=new k(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new b(n,a)).add(r))}get shift(){return new b(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 b(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 b(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=u=>n.sub(u).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/In),c=Wt(t),m=Math.floor(Math.max(0,c.x-Mn*i)),p=Math.floor(Math.max(0,c.y-Cn*i));return new Qt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=Lr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var yo=class extends U{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Wt([t[3],t[4]])]}};var te=class extends U{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(Wt)}};var Fe=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?` (${kt(this.distance)})`:""}`}};var De=class extends D{static assertIsValidLabeledBox(t,e){if(D.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 dt=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 dt(t.label,e)}};var To=class extends De{static assertIsValidPredictedBox(t,e){if(De.assertIsValidLabeledBox(t,e),!Zt(t.score)||!Zt(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 M}function Bt(o,t){return{...o,...{detection:t}}}function kr(){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"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Ee(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function Ve(o){let t="";if(!o&&Ee())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=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},n=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},a=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},s=global.fetch,i=Ve();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:n,createVideoElement:a,fetch:s,...i}}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 S;function Nn(){if(!S)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return S}function Rr(o){S=o}function $r(){return Br()?Rr(kr()):Ee()?Rr(Wr()):null}function Ln(o){if(S||$r(),!S)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=S.Canvas,Image:e=S.Image}=o;S.Canvas=t,S.Image=e,S.createCanvasElement=o.createCanvasElement||(()=>new t),S.createImageElement=o.createImageElement||(()=>new e),S.ImageData=o.ImageData||S.ImageData,S.Video=o.Video||S.Video,S.fetch=o.fetch||S.fetch,S.readFile=o.readFile||S.readFile}var P={getEnv:Nn,setEnv:Rr,initialize:$r,createBrowserEnv:kr,createFileSystem:Ve,createNodejsEnv:Wr,monkeyPatch:Ln,isBrowser:Br,isNodejs:Ee};$r();function Rt(o){return!P.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function $(o){let{Canvas:t,CanvasRenderingContext2D:e}=P.getEnv();if(o instanceof e)return o;let r=Rt(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 Or=(n=>(n.TOP_LEFT="TOP_LEFT",n.TOP_RIGHT="TOP_RIGHT",n.BOTTOM_LEFT="BOTTOM_LEFT",n.BOTTOM_RIGHT="BOTTOM_RIGHT",n))(Or||{}),Me=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||"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}},Dt=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof Dt?t.text:t,this.anchor=e,this.options=new Me(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r<n?n:r,0)+2*e}measureHeight(){let{fontSize:t,padding:e}=this.options;return this.text.length*t+2*e}getUpperLeft(t,e){let{anchorPosition:r}=this.options,n=r==="BOTTOM_RIGHT"||r==="TOP_RIGHT",a=r==="BOTTOM_LEFT"||r==="BOTTOM_RIGHT",s=this.measureWidth(t),i=this.measureHeight(),c=n?this.anchor.x-s:this.anchor.x,m=a?this.anchor.y-i:this.anchor.y;if(e){let{width:p,height:u}=e,f=Math.max(Math.min(c,p-s),0),l=Math.max(Math.min(m,u-i),0);return{x:f,y:l}}return{x:c,y:m}}draw(t){let e=Rt(t),r=$(e),{backgroundColor:n,fontColor:a,fontSize:s,fontStyle:i,padding:c}=this.options;r.font=`${s}px ${i}`;let m=this.measureWidth(r),p=this.measureHeight();r.fillStyle=n;let u=this.getUpperLeft(r,e);r.fillRect(u.x,u.y,m,p),r.fillStyle=a,this.text.forEach((f,l)=>{let x=c+u.x,F=c+u.y+(l+1)*s;r.fillText(f,x,F)})}};var Hr=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:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new Me({...s,...a})}},je=class{constructor(t,e={}){this.box=new D(t),this.options=new Hr(e)}draw(t){let e=$(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 Dt([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function Sn(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:mt(r)?r.detection.score:void 0,a=r instanceof M?r.box:mt(r)?r.detection.box:new D(r),s=n?`${kt(n)}`:void 0;new je(a,{label:s}).draw(o)})}var me=y(g());function Ce(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function zr(o){return new Promise((t,e)=>{(o instanceof P.getEnv().Canvas||Ce(o))&&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=P.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function $t(o){let{Image:t,Video:e}=P.getEnv();return o instanceof t?new k(o.naturalWidth,o.naturalHeight):o instanceof e?new k(o.videoWidth,o.videoHeight):new k(o.width,o.height)}function Ot({width:o,height:t}){let{createCanvasElement:e}=P.getEnv(),r=e();return r.width=o,r.height=t,r}function Ie(o,t){let{ImageData:e}=P.getEnv();if(!(o instanceof e)&&!Ce(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||$t(o),a=Ot({width:r,height:n});return o instanceof e?$(a).putImageData(o,0,0):$(a).drawImage(o,0,0,r,n),a}var Ue=y(g());async function Gr(o,t){let e=t||P.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(j(o)?1:0),s=Ue.tidy(()=>o.as3D(r,n,a).toInt());return await Ue.browser.toPixels(s,e),s.dispose(),e}function Xe(o){let{Image:t,Canvas:e,Video:r}=P.getEnv();return o instanceof t||o instanceof e||o instanceof r}var H=y(g());function Vr(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 Ot({width:1,height:1});let a=$t(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=Ot({width:t,height:t}),p=o instanceof n?o:Ie(o),u=Math.abs(i-c)/2,f=e&&i<c?u:0,l=e&&c<i?u:0;return p.width>0&&p.height>0&&$(m).drawImage(p,f,l,i,c),m}var ht=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;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(lt(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(j(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:Ie(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 Cr({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,H.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof H.Tensor){let i=j(s)?s:H.expandDims(s);return i=Ar(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=H.image.resizeBilinear(i,[t,t],!1,!1)),i.as3D(t,t,3)}if(s instanceof P.getEnv().Canvas)return H.browser.fromPixels(Vr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return H.stack(r.map(a=>H.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function E(o){if(o instanceof ht)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(Rt);return r.forEach((n,a)=>{if(!Xe(n)&&!lt(n)&&!j(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(j(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=>Xe(n)&&zr(n))),new ht(r,Array.isArray(o))}async function ee(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 Gr(i)}let n=$(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=Ot({width:c,height:m});return c>0&&m>0&&$(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var Je=y(g());async function re(o,t){if(!lt(o)&&!j(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(j(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return Je.tidy(()=>{let[e,r,n]=o.shape.slice(j(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})=>Je.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function bt(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 An(o){let t=await bt(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 jr(o){return(await bt(o)).json()}async function kn(o){return new Float32Array(await(await bt(o)).arrayBuffer())}function _o(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=P.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function Wn(o){let t=await bt(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return _o(e)}var Po=y(g());function qe(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}=qe(o,t),n=await jr(e);return Po.io.loadWeights(n,r)}function Bn(o,t,e=!1){let{width:r,height:n}=e?$t(t):t;return o.width=r,o.height=n,{width:r,height:n}}var ie=y(g());var gt=y(g());var A=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}=P.getEnv(),{manifestUri:r,modelBaseUri:n}=qe(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(u=>u.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 C=y(g());var oe=y(g());function O(o,t,e){return oe.tidy(()=>{let r=oe.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=oe.add(r,t.bias),r})}function Ze(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 Ne(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 Et=y(g());function Ht(o,t,e="same",r=!1){return Et.tidy(()=>{let n=Et.add(Et.conv2d(o,t.filters,[1,1],e),t.bias);return r?Et.relu(n):n})}function W(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var Ke=y(g());function ne(o,t){return(e,r,n,a)=>{let s=Ke.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Ke.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var Qe=y(g());function tr(o,t){return(e,r,n)=>{let a=Qe.tensor2d(o(e*r),[e,r]),s=Qe.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var Le=y(g());var er=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ae(o,t){return(e,r,n)=>{let a=Le.tensor4d(o(9*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 er(a,s,i)}}function se(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new er(e,r,n)}}function z(o,t){return(e,r,n)=>{let a=o[e];if(!At(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 B(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 rr(o,t){let e=ne(o,t),r=ae(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),u=r(i,i,`${c}/conv1`),f=r(i,i,`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function a(s,i,c,m=!1){let{conv0:p,conv1:u,conv2:f}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function wo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=B(o),{extractDenseBlock4Params:n}=rr(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 or(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function nr(o,t){let e=z(o,t),r=or(e),n=se(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:u}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`),f=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:u,conv3:f}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Fo(o){let t=[],{extractDenseBlock4Params:e}=nr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return W(o,t),{params:r,paramMappings:t}}var Se=class extends A{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return ie.tidy(()=>{let r=ie.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Ne(a,e.dense0,!0);return s=Ne(s,e.dense1),s=Ne(s,e.dense2),s=Ne(s,e.dense3),s=ie.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 Fo(t)}extractParams(t){return wo(t)}};var Mo=y(g());var ce=y(g());function Ae(o,t){return ce.tidy(()=>ce.add(ce.matMul(o,t.weights),t.bias))}function Do(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=B(o),i=tr(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 Eo(o){let t=[],e=z(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 W(o,t),{params:n,paramMappings:t}}function ar(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 ke=class extends A{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 Mo.tidy(()=>{let r=t instanceof ht?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 Do(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=ar(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Eo(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"],Mt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;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 sr=class extends ke{constructor(t=new Se){super("FaceExpressionNet",t)}forwardInput(t){return me.tidy(()=>me.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(me.unstack(r).map(async s=>{let i=s.dataSync();return s.dispose(),i}));r.dispose();let a=n.map(s=>new Mt(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 Mt}function ir(o,t){return{...o,...{expressions:t}}}function Rn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof Mt?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(u=>u.probability>e),m=mt(a)?a.detection.box.bottomLeft:r||new b(0,0);new Dt(c.map(u=>`${u.expression} (${kt(u.probability)})`),m).draw(o)})}function zt(o){return mt(o)&&o.landmarks instanceof U&&o.unshiftedLandmarks instanceof U&&o.alignedRect instanceof M}function $n(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)=>i<c._y?i:c._y,1/0),s=n.reduce((i,c)=>i>c._y?i:c._y,-1/0);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function pe(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=$n(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=$(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof te&&(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 On(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof U?r:zt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks<WithFaceDetection<{}>> or array thereof");new Zr(n).draw(o)})}var Co="1.6.6";var pt=y(g());var L=y(g());function Yn(o,t){let e=ne(o,t),r=ae(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}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 Io(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=B(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=Yn(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),u=i(64,128,"entry_flow/reduction_block_1"),f={conv_in:m,reduction_block_0:p,reduction_block_1:u},l={};it(t,0,1).forEach(v=>{l[`main_block_${v}`]=c(128,`middle_flow/main_block_${v}`)});let x=i(128,256,"exit_flow/reduction_block"),F=s(256,512,"exit_flow/separable_conv"),h={reduction_block:x,separable_conv:F};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:f,middle_flow:l,exit_flow:h}}}function Gn(o,t){let e=z(o,t),r=or(e),n=se(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 No(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=Gn(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},u={};it(t,0,1).forEach(F=>{u[`main_block_${F}`]=s(`middle_flow/main_block_${F}`)});let f=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),x={reduction_block:f,separable_conv:l};return W(o,e),{params:{entry_flow:p,middle_flow:u,exit_flow:x},paramMappings:e}}function Lo(o,t,e){return L.add(L.conv2d(o,t.filters,e,"same"),t.bias)}function Qr(o,t,e=!0){let r=e?L.relu(o):o;return r=O(r,t.separable_conv0,[1,1]),r=O(L.relu(r),t.separable_conv1,[1,1]),r=L.maxPool(r,[3,3],[2,2],"same"),r=L.add(r,Lo(o,t.expansion_conv,[2,2])),r}function Vn(o,t){let e=O(L.relu(o),t.separable_conv0,[1,1]);return e=O(L.relu(e),t.separable_conv1,[1,1]),e=O(L.relu(e),t.separable_conv2,[1,1]),e=L.add(e,o),e}var to=class extends A{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return L.tidy(()=>{let r=L.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=L.relu(Lo(a,e.entry_flow.conv_in,[2,2]));return s=Qr(s,e.entry_flow.reduction_block_0,!1),s=Qr(s,e.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(i=>{s=Vn(s,e.middle_flow[`main_block_${i}`])}),s=Qr(s,e.exit_flow.reduction_block),s=L.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 No(t,this._numMainBlocks)}extractParams(t){return Io(t,this._numMainBlocks)}};function So(o){let t=[],{extractWeights:e,getRemainingWeights:r}=B(o),n=tr(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 Ao(o){let t=[],e=z(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 W(o,t),{params:n,paramMappings:t}}var cr=(e=>(e.FEMALE="female",e.MALE="male",e))(cr||{});var mr=class extends A{constructor(t=new to(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 pt.tidy(()=>{let r=t instanceof ht?this.faceFeatureExtractor.forwardInput(t):t,n=pt.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 pt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:pt.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=pt.unstack(r.age),a=pt.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=c.dataSync()[0],u=m.dataSync()[0],f=u>.5,l=f?"male":"female",x=f?u:1-u;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:x}}));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 So(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=ar(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Ao(r)}extractParams(t){let r=t.slice(0,t.length-1539),n=t.slice(t.length-1539);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var Y=y(g());var We=class extends ke{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=(u,f)=>Y.stack([Y.fill([68],u,"float32"),Y.fill([68],f,"float32")],1).as2D(1,136).as1D(),i=(u,f)=>{let{width:l,height:x}=n[u];return f(l,x)?Math.abs(l-x)/2:0},c=u=>i(u,(f,l)=>f<l),m=u=>i(u,(f,l)=>l<f);return t.mul(Y.fill([a,136],e,"float32")).sub(Y.stack(Array.from(Array(a),(u,f)=>s(c(f),m(f))))).div(Y.stack(Array.from(Array(a),(u,f)=>s(n[f].width,n[f].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(a.dataSync()),c=i.filter((p,u)=>Ye(u)),m=i.filter((p,u)=>!Ye(u));return new te(Array(68).fill(0).map((p,u)=>new b(c[u],m[u])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var ue=class extends We{constructor(t=new Se){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var fe=y(g());function ko(o){let t=[],{extractDenseBlock3Params:e}=nr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return W(o,t),{params:r,paramMappings:t}}function Wo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=B(o),{extractDenseBlock3Params:n}=rr(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 eo=class extends A{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return fe.tidy(()=>{let r=fe.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Ze(a,e.dense0,!0);return s=Ze(s,e.dense1),s=Ze(s,e.dense2),s=fe.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 ko(t)}extractParams(t){return Wo(t)}};var pr=class extends We{constructor(t=new eo){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var Bo=class extends ue{};var nt=y(g());var le=y(g());var ur=y(g());function Ro(o,t){return ur.add(ur.mul(o,t.weights),t.biases)}function ro(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=le.conv2d(o,a,e,n);return i=le.add(i,s),i=Ro(i,t.scale),r?le.relu(i):i}function $o(o,t){return ro(o,t,[1,1],!0)}function oo(o,t){return ro(o,t,[1,1],!1)}function fr(o,t){return ro(o,t,[2,2],!0,"valid")}var G=y(g());function jn(o,t){function e(i,c,m){let p=o(i),u=p.length/(c*m*m);if(Mr(u))throw new Error(`depth has to be an integer: ${u}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return G.tidy(()=>G.transpose(G.tensor4d(p,[c,u,m,m]),[2,3,1,0]))}function r(i,c,m,p){let u=e(i,c,m),f=G.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:u,bias:f}}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 u=r(i,c,m,`${p}/conv`),f=n(c,`${p}/scale`);return{conv:u,scale:f}}function s(i,c,m,p,u=!1){let f=a((u?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:f,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Oo(o){let{extractWeights:t,getRemainingWeights:e}=B(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=jn(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),u=a(36864,64,3,"conv64_1"),f=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),x=a(147456,128,3,"conv128_down",!0),F=a(147456,128,3,"conv128_1"),h=a(147456,128,3,"conv128_2"),v=a(589824,256,3,"conv256_down",!0),_=a(589824,256,3,"conv256_1"),T=a(589824,256,3,"conv256_2"),N=a(589824,256,3,"conv256_down_out"),V=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:u,conv64_2:f,conv64_3:l,conv128_down:x,conv128_1:F,conv128_2:h,conv256_down:v,conv256_1:_,conv256_2:T,conv256_down_out:N,fc:V},paramMappings:r}}function Un(o,t){let e=z(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 Ho(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Un(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"),u=r("conv64_3"),f=r("conv128_down"),l=r("conv128_1"),x=r("conv128_2"),F=r("conv256_down"),h=r("conv256_1"),v=r("conv256_2"),_=r("conv256_down_out"),{fc:T}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!Er(T))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${T}`);let N={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:u,conv128_down:f,conv128_1:l,conv128_2:x,conv256_down:F,conv256_1:h,conv256_2:v,conv256_down_out:_,fc:T};return W(o,t),{params:N,paramMappings:t}}var R=y(g());function ot(o,t){let e=$o(o,t.conv1);return e=oo(e,t.conv2),e=R.add(e,o),e=R.relu(e),e}function Be(o,t){let e=fr(o,t.conv1);e=oo(e,t.conv2);let r=R.avgPool(o,2,2,"valid"),n=R.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=R.zeros(i);e=R.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=R.zeros(m);e=R.concat([e,p],2)}return r=a?R.concat([r,n],3):r,e=R.add(r,e),e=R.relu(e),e}var de=class extends A{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return nt.tidy(()=>{let r=nt.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=fr(a,e.conv32_down);s=nt.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Be(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Be(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Be(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Be(s,e.conv256_down_out);let i=s.mean([1,2]);return nt.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&&a.some(s=>s<=0))return new Float32Array(128);let e=await E(t),r=nt.tidy(()=>nt.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 Ho(t)}extractParams(t){return Oo(t)}};function Xn(o){let t=new de;return t.extractWeights(o),t}function lr(o,t){return{...o,...{descriptor:t}}}function Jn(o){return typeof o.age=="number"}function dr(o,t){return{...o,...{age:t}}}function qn(o){return(o.gender==="male"||o.gender==="female")&&Zt(o.genderProbability)}function hr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var It=y(g());var at=y(g());function Zn(o,t){function e(c,m){let p=at.tensor4d(o(9*c),[3,3,c,1]),u=at.tensor1d(o(c)),f=at.tensor1d(o(c)),l=at.tensor1d(o(c)),x=at.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:u,batch_norm_offset:f,batch_norm_mean:l,batch_norm_variance:x}}function r(c,m,p,u,f){let l=at.tensor4d(o(c*m*p*p),[p,p,c,m]),x=at.tensor1d(o(m));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/${f?"batch_norm_offset":"bias"}`}),{filters:l,bias:x}}function n(c,m,p,u){let{filters:f,bias:l}=r(c,m,p,u,!0);return{filters:f,batch_norm_offset:l}}function a(c,m,p){let u=e(c,`${p}/depthwise_conv`),f=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:u,pointwise_conv:f}}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"),u=a(128,128,"mobilenetv1/conv_3"),f=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),x=a(256,512,"mobilenetv1/conv_6"),F=a(512,512,"mobilenetv1/conv_7"),h=a(512,512,"mobilenetv1/conv_8"),v=a(512,512,"mobilenetv1/conv_9"),_=a(512,512,"mobilenetv1/conv_10"),T=a(512,512,"mobilenetv1/conv_11"),N=a(512,1024,"mobilenetv1/conv_12"),V=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:u,conv_4:f,conv_5:l,conv_6:x,conv_7:F,conv_8:h,conv_9:v,conv_10:_,conv_11:T,conv_12:N,conv_13:V}}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"),u=n(128,256,3,"prediction_layer/conv_3"),f=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),x=n(256,64,1,"prediction_layer/conv_6"),F=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"),_=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),T=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),N=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),V=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"),X=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Tt=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),_t=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:u,conv_4:f,conv_5:l,conv_6:x,conv_7:F,box_predictor_0:{box_encoding_predictor:h,class_predictor:v},box_predictor_1:{box_encoding_predictor:_,class_predictor:T},box_predictor_2:{box_encoding_predictor:N,class_predictor:V},box_predictor_3:{box_encoding_predictor:tt,class_predictor:st},box_predictor_4:{box_encoding_predictor:X,class_predictor:Tt},box_predictor_5:{box_encoding_predictor:_t,class_predictor:Pt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function zo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=B(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Zn(e,t),s=n(),i=a(),m={extra_dim:at.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 Kn(o,t){let e=z(o,t);function r(m,p,u){let f=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${u}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${u}/batch_norm_offset`);return{filters:f,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,u=`MobilenetV1/Conv2d_${m}_depthwise`,f=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,x=e(`${u}/depthwise_weights`,4,`${f}/filters`),F=e(`${u}/BatchNorm/gamma`,1,`${f}/batch_norm_scale`),h=e(`${u}/BatchNorm/beta`,1,`${f}/batch_norm_offset`),v=e(`${u}/BatchNorm/moving_mean`,1,`${f}/batch_norm_mean`),_=e(`${u}/BatchNorm/moving_variance`,1,`${f}/batch_norm_variance`);return{depthwise_conv:{filters:x,batch_norm_scale:F,batch_norm_offset:h,batch_norm_mean:v,batch_norm_variance:_},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 u=e(`${m}/weights`,4,`${p}/filters`),f=e(`${m}/biases`,1,`${p}/bias`);return{filters:u,bias:f}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),u=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:u}}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 Yo(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Kn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!lt(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 W(o,t),{params:a,paramMappings:t}}var xt=y(g());var Ct=y(g());function J(o,t,e){return Ct.tidy(()=>{let r=Ct.conv2d(o,t.filters,e,"same");return r=Ct.add(r,t.batch_norm_offset),Ct.clipByValue(r,0,6)})}var Qn=.0010000000474974513;function ta(o,t,e){return xt.tidy(()=>{let r=xt.depthwiseConv2d(o,t.filters,e,"same");return r=xt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Qn),xt.clipByValue(r,0,6)})}function ea(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function Go(o,t){return xt.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=ea(i);r=ta(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 ra(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]),u=Math.max(r[e][1],r[e][3]),f=(s-n)*(i-a),l=(p-c)*(u-m);if(f<=0||l<=0)return 0;let x=Math.max(n,c),F=Math.max(a,m),h=Math.min(s,p),v=Math.min(i,u),_=Math.max(h-x,0)*Math.max(v-F,0);return _/(f+l-_)}function Vo(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,u)=>({score:p,boxIndex:u})).filter(p=>p.score>n).sort((p,u)=>u.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let u=p.score;for(let f=m.length-1;f>=0;--f){let l=ra(o,p.boxIndex,m[f]);if(l!==0&&(p.score*=c(l),p.score<=n))break}u===p.score&&m.push(p.boxIndex)}),m}var d=y(g());function oa(o){let t=d.unstack(d.transpose(o,[1,0])),e=[d.sub(t[2],t[0]),d.sub(t[3],t[1])],r=[d.add(t[0],d.div(e[0],2)),d.add(t[1],d.div(e[1],2))];return{sizes:e,centers:r}}function na(o,t){let{sizes:e,centers:r}=oa(o),n=d.unstack(d.transpose(t,[1,0])),a=d.div(d.mul(d.exp(d.div(n[2],5)),e[0]),2),s=d.add(d.mul(d.div(n[0],10),e[0]),r[0]),i=d.div(d.mul(d.exp(d.div(n[3],5)),e[1]),2),c=d.add(d.mul(d.div(n[1],10),e[1]),r[1]);return d.transpose(d.stack([d.sub(s,a),d.sub(c,i),d.add(s,a),d.add(c,i)]),[1,0])}function jo(o,t,e){return d.tidy(()=>{let r=o.shape[0],n=na(d.reshape(d.tile(e.extra_dim,[r,1,1]),[-1,4]),d.reshape(o,[-1,4]));n=d.reshape(n,[r,n.shape[0]/r,4]);let a=d.sigmoid(d.slice(t,[0,0,1],[-1,-1,-1])),s=d.slice(a,[0,0,0],[-1,-1,1]);s=d.reshape(s,[r,s.shape[1]]);let i=d.unstack(n),c=d.unstack(s);return{boxes:i,scores:c}})}var $e=y(g());var Re=y(g());function Yt(o,t){return Re.tidy(()=>{let e=o.shape[0],r=Re.reshape(Ht(o,t.box_encoding_predictor),[e,-1,1,4]),n=Re.reshape(Ht(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function Uo(o,t,e){return $e.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]),u=Yt(t,e.box_predictor_0),f=Yt(o,e.box_predictor_1),l=Yt(n,e.box_predictor_2),x=Yt(s,e.box_predictor_3),F=Yt(c,e.box_predictor_4),h=Yt(p,e.box_predictor_5),v=$e.concat([u.boxPredictionEncoding,f.boxPredictionEncoding,l.boxPredictionEncoding,x.boxPredictionEncoding,F.boxPredictionEncoding,h.boxPredictionEncoding],1),_=$e.concat([u.classPrediction,f.classPrediction,l.classPrediction,x.classPrediction,F.classPrediction,h.classPrediction],1);return{boxPredictions:v,classPredictions:_}})}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 Gt=class extends A{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.div(r,127.5),1),a=Go(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=Uo(a.out,a.conv11,e.prediction_layer);return jo(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await E(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new q(e),a=await E(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let T=1;T<s.length;T++)s[T].dispose(),i[T].dispose();let p=Array.from(m.dataSync()),f=Vo(c,p,r,.5,n),l=a.getReshapedInputDimensions(0),x=a.inputSize,F=x/l.width,h=x/l.height,v=c.arraySync(),_=f.map(T=>{let[N,V]=[Math.max(0,v[T][0]),Math.min(1,v[T][2])].map(X=>X*h),[tt,st]=[Math.max(0,v[T][1]),Math.min(1,v[T][3])].map(X=>X*F);return new M(p[T],new Qt(tt,N,st-tt,V-N),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),_}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return Yo(t)}extractParams(t){return zo(t)}};function Xo(o){let t=new Gt;return t.extractWeights(o),t}function aa(o){return Xo(o)}var Jo=class extends Gt{};var qo=.4,Zo=[new b(.738768,.874946),new b(2.42204,2.65704),new b(4.30971,7.04493),new b(10.246,4.59428),new b(12.6868,11.8741)],Ko=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],Qo=[117.001,114.697,97.404],tn="tiny_yolov2_model",en="tiny_yolov2_separable_conv_model";var I=y(g());var br=o=>typeof o=="number";function no(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(!br(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=>br(t.x)&&br(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(br)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var K=y(g());var Z=y(g());function he(o){return Z.tidy(()=>{let t=Z.mul(o,Z.scalar(.10000000149011612));return Z.add(Z.relu(Z.sub(o,t)),t)})}function vt(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),he(e)})}var Nt=y(g());function yt(o,t){return Nt.tidy(()=>{let e=Nt.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Nt.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=Nt.add(e,t.bias),he(e)})}var ao=y(g());function sa(o,t){let e=ne(o,t);function r(s,i){let c=ao.tensor1d(o(s)),m=ao.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=ae(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function rn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=B(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=sa(n,s),p;if(t.withSeparableConvs){let[u,f,l,x,F,h,v,_,T]=r,N=t.isFirstLayerConv2d?i(u,f,3,"conv0"):m(u,f,"conv0"),V=m(f,l,"conv1"),tt=m(l,x,"conv2"),st=m(x,F,"conv3"),X=m(F,h,"conv4"),Tt=m(h,v,"conv5"),_t=_?m(v,_,"conv6"):void 0,Pt=T?m(_,T,"conv7"):void 0,qt=i(T||_||v,5*e,1,"conv8");p={conv0:N,conv1:V,conv2:tt,conv3:st,conv4:X,conv5:Tt,conv6:_t,conv7:Pt,conv8:qt}}else{let[u,f,l,x,F,h,v,_,T]=r,N=c(u,f,"conv0"),V=c(f,l,"conv1"),tt=c(l,x,"conv2"),st=c(x,F,"conv3"),X=c(F,h,"conv4"),Tt=c(h,v,"conv5"),_t=c(v,_,"conv6"),Pt=c(_,T,"conv7"),qt=i(T,5*e,1,"conv8");p={conv0:N,conv1:V,conv2:tt,conv3:st,conv4:X,conv5:Tt,conv6:_t,conv7:Pt,conv8:qt}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function ia(o,t){let e=z(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=se(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function on(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=ia(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 W(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 so=class extends A{constructor(t){super("TinyYolov2");no(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=vt(t,e.conv0);return r=I.maxPool(r,[2,2],[2,2],"same"),r=vt(r,e.conv1),r=I.maxPool(r,[2,2],[2,2],"same"),r=vt(r,e.conv2),r=I.maxPool(r,[2,2],[2,2],"same"),r=vt(r,e.conv3),r=I.maxPool(r,[2,2],[2,2],"same"),r=vt(r,e.conv4),r=I.maxPool(r,[2,2],[2,2],"same"),r=vt(r,e.conv5),r=I.maxPool(r,[2,2],[1,1],"same"),r=vt(r,e.conv6),r=vt(r,e.conv7),Ht(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?he(Ht(t,e.conv0,"valid",!1)):yt(t,e.conv0);return r=I.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv1),r=I.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv2),r=I.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv3),r=I.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv4),r=I.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv5),r=I.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?yt(r,e.conv6):r,r=e.conv7?yt(r,e.conv7):r,Ht(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return I.tidy(()=>{let n=I.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?rt(n,this.config.meanRgb):n,n=n.div(255),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 ut(e),a=await E(t),s=await this.forwardInput(a,r),i=I.tidy(()=>I.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),u=m.map(h=>h.score),f=m.map(h=>h.classScore),l=m.map(h=>this.config.classes[h.label]);return Sr(p.map(h=>h.rescale(r)),u,this.config.iouThreshold,!0).map(h=>new wt(u[h],f[h],l[h],p[h],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return on(t,this.config)}extractParams(t){let e=this.config.filterSizes||so.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 rn(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,[u,f,l]=I.tidy(()=>{let v=t.reshape([m,m,p,this.boxEncodingSize]),_=v.slice([0,0,0,0],[m,m,p,4]),T=v.slice([0,0,0,4],[m,m,p,1]),N=this.withClassScores?I.softmax(v.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):I.scalar(0);return[_,T,N]}),x=[],F=await f.array(),h=await u.array();for(let v=0;v<m;v++)for(let _=0;_<m;_++)for(let T=0;T<p;T++){let N=we(F[v][_][T][0]);if(!r||N>r){let V=(_+we(h[v][_][T][0]))/m*i,tt=(v+we(h[v][_][T][1]))/m*c,st=Math.exp(h[v][_][T][2])*this.config.anchors[T].x/m*i,X=Math.exp(h[v][_][T][3])*this.config.anchors[T].y/m*c,Tt=V-st/2,_t=tt-X/2,Pt={row:v,col:_,anchor:T},{classScore:qt,label:uo}=this.withClassScores?await this.extractPredictedClass(l,Pt):{classScore:1,label:0};x.push({box:new Kt(Tt,_t,Tt+st,_t+X),score:N,classScore:N*qt,label:uo,...Pt})}}return u.dispose(),f.dispose(),l.dispose(),x}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)}},be=so;be.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var ge=class extends be{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:qo,classes:["face"],...t?{anchors:Ko,meanRgb:Qo}:{anchors:Zo,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?en:tn}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function ca(o,t=!0){let e=new ge(t);return e.extractWeights(o),e}var gr=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 Oe=y(g());var io=y(g());async function Vt(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>zt(c)?n(c):c.detection),s=r||(t instanceof io.Tensor?await re(t,a):await ee(t,a)),i=await e(s);return s.forEach(c=>c instanceof io.Tensor&&c.dispose()),i}async function xe(o,t,e,r,n){return Vt([o],t,async a=>e(a[0]),r,n)}var nn=.4,an=[new b(1.603231,2.094468),new b(6.041143,7.080126),new b(2.882459,3.518061),new b(4.266906,5.178857),new b(9.041765,10.66308)],sn=[117.001,114.697,97.404];var ve=class extends be{constructor(){let t={withSeparableConvs:!0,iouThreshold:nn,classes:["face"],anchors:an,meanRgb:sn,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 w={ssdMobilenetv1:new Gt,tinyFaceDetector:new ve,tinyYolov2:new ge,faceLandmark68Net:new ue,faceLandmark68TinyNet:new pr,faceRecognitionNet:new de,faceExpressionNet:new sr,ageGenderNet:new mr},cn=(o,t)=>w.ssdMobilenetv1.locateFaces(o,t),ma=(o,t)=>w.tinyFaceDetector.locateFaces(o,t),pa=(o,t)=>w.tinyYolov2.locateFaces(o,t),mn=o=>w.faceLandmark68Net.detectLandmarks(o),ua=o=>w.faceLandmark68TinyNet.detectLandmarks(o),fa=o=>w.faceRecognitionNet.computeFaceDescriptor(o),la=o=>w.faceExpressionNet.predictExpressions(o),da=o=>w.ageGenderNet.predictAgeAndGender(o),pn=o=>w.ssdMobilenetv1.load(o),ha=o=>w.tinyFaceDetector.load(o),ba=o=>w.tinyYolov2.load(o),ga=o=>w.faceLandmark68Net.load(o),xa=o=>w.faceLandmark68TinyNet.load(o),va=o=>w.faceRecognitionNet.load(o),ya=o=>w.faceExpressionNet.load(o),Ta=o=>w.ageGenderNet.load(o),_a=pn,Pa=cn,wa=mn;var co=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},ye=class extends co{async run(){let t=await this.parentTask,e=await Vt(t,this.input,async r=>Promise.all(r.map(n=>w.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>ir(r,e[n]))}withAgeAndGender(){return new _e(this,this.input)}},Te=class extends co{async run(){let t=await this.parentTask;if(!t)return;let e=await xe(t,this.input,r=>w.faceExpressionNet.predictExpressions(r),this.extractedFaces);return ir(t,e)}withAgeAndGender(){return new Pe(this,this.input)}},jt=class extends ye{withAgeAndGender(){return new Xt(this,this.input)}withFaceDescriptors(){return new Lt(this,this.input)}},Ut=class extends Te{withAgeAndGender(){return new Jt(this,this.input)}withFaceDescriptor(){return new St(this,this.input)}};var mo=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},_e=class extends mo{async run(){let t=await this.parentTask,e=await Vt(t,this.input,async r=>Promise.all(r.map(n=>w.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return dr(hr(r,s,i),a)})}withFaceExpressions(){return new ye(this,this.input)}},Pe=class extends mo{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await xe(t,this.input,a=>w.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return dr(hr(t,r,n),e)}withFaceExpressions(){return new Te(this,this.input)}},Xt=class extends _e{withFaceExpressions(){return new jt(this,this.input)}withFaceDescriptors(){return new Lt(this,this.input)}},Jt=class extends Pe{withFaceExpressions(){return new Ut(this,this.input)}withFaceDescriptor(){return new St(this,this.input)}};var xr=class extends Q{constructor(t,e){super();this.parentTask=t;this.input=e}},Lt=class extends xr{async run(){let t=await this.parentTask;return(await Vt(t,this.input,r=>Promise.all(r.map(n=>w.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>lr(t[n],r))}withFaceExpressions(){return new jt(this,this.input)}withAgeAndGender(){return new Xt(this,this.input)}},St=class extends xr{async run(){let t=await this.parentTask;if(!t)return;let e=await xe(t,this.input,r=>w.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return lr(t,e)}withFaceExpressions(){return new Ut(this,this.input)}withAgeAndGender(){return new Jt(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?w.faceLandmark68TinyNet:w.faceLandmark68Net}},yr=class extends vr{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof Oe.Tensor?await re(this.input,e):await ee(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof Oe.Tensor&&a.dispose()),t.map((a,s)=>pe(a,n[s]))}withFaceExpressions(){return new jt(this,this.input)}withAgeAndGender(){return new Xt(this,this.input)}withFaceDescriptors(){return new Lt(this,this.input)}},Tr=class extends vr{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof Oe.Tensor?await re(this.input,[e]):await ee(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof Oe.Tensor&&a.dispose()),pe(t,n)}withFaceExpressions(){return new Ut(this,this.input)}withAgeAndGender(){return new Jt(this,this.input)}withFaceDescriptor(){return new St(this,this.input)}};var _r=class extends Q{constructor(t,e=new q){super();this.input=t;this.options=e}},He=class extends _r{async run(){let{input:t,options:e}=this,r;if(e instanceof gr)r=w.tinyFaceDetector.locateFaces(t,e);else if(e instanceof q)r=w.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ut)r=w.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise((t,e)=>{this.run().then(r=>t(r.map(n=>Bt({},n)))).catch(r=>e(r))})}withFaceLandmarks(t=!1){return new yr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new ye(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new _e(this.runAndExtendWithFaceDetections(),this.input)}},Pr=class extends _r{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?Bt({},e):void 0)})}withFaceLandmarks(t=!1){return new Tr(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Te(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Pe(this.runAndExtendWithFaceDetection(),this.input)}};function Fa(o,t=new q){return new Pr(o,t)}function wr(o,t=new q){return new He(o,t)}async function un(o,t){return wr(o,new q(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function Da(o,t={}){return wr(o,new ut(t)).withFaceLandmarks().withFaceDescriptors()}var Ea=un;function po(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 Fr=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 dt)return s;if(s instanceof Float32Array)return new dt(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new dt(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array | Array<LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>po(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new Fe(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distance<r.distance?e:r)}findBestMatch(t){let e=this.matchDescriptor(t);return e.distance<this._distanceThreshold?e:new Fe("unknown",e.distance)}toJSON(){return{distanceThreshold:this._distanceThreshold,labeledDescriptors:this._labeledDescriptors.map(t=>t.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>dt.fromJSON(r));return new Fr(e,t.distanceThreshold)}};function Ma(o){let t=new ve;return t.extractWeights(o),t}function fn(o,t){let{width:e,height:r}=new k(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=>fn(n,{width:e,height:r}));if(zt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return pe(Bt(o,n),a)}return mt(o)?Bt(o,o.detection.forSize(e,r)):o instanceof U||o instanceof M?o.forSize(e,r):o}var Ia=Co;module.exports=vn(Na);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,fetchVideo,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});
