ibelem commited on
Commit
8a7706c
·
verified ·
1 Parent(s): bb49359

Upload 9 files

Browse files
assets/index-Cn9SjWnX.css ADDED
@@ -0,0 +1 @@
 
 
1
+ *{box-sizing:border-box;padding:0;margin:0;font-family:sans-serif}html,body{height:100%}body{padding:16px 32px}body,#container{display:flex;flex-direction:column;justify-content:center;align-items:center}#controls{display:flex;padding:1rem;gap:1rem}#controls>div{text-align:center}h1,h4{text-align:center}h4{margin-top:.5rem}#container{position:relative;width:720px;height:405px;max-width:100%;max-height:100%;border:2px dashed #d1d5db;border-radius:.75rem;overflow:hidden;margin-top:1rem;background-size:100% 100%;background-position:center;background-repeat:no-repeat}#overlay,canvas{position:absolute;width:100%;height:100%}#status{min-height:16px;margin:8px 0}#video,#canvas,#size-container{display:none}#show-video-btn{position:absolute;top:10px;right:10px;z-index:10;background:none;border:none;cursor:pointer;padding:0}#show-video-btn svg{width:32px;height:32px}a{color:#275efe;text-decoration:none}a:hover{text-decoration:underline}#versions{margin-top:.5rem;font-size:.8rem;color:#0000004d}
assets/index-DG-aHmpJ.js ADDED
@@ -0,0 +1 @@
 
 
1
+ import*as u from"https://ibelem.github.io/transformersjs-dists/3.7.3_1.23.0-dev.20250906/transformers.js";(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))i(e);new MutationObserver(e=>{for(const n of e)if(n.type==="childList")for(const c of n.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&i(c)}).observe(document,{childList:!0,subtree:!0});function a(e){const n={};return e.integrity&&(n.integrity=e.integrity),e.referrerPolicy&&(n.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?n.credentials="include":e.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function i(e){if(e.ep)return;e.ep=!0;const n=a(e);fetch(e.href,n)}})();u.env.backends.onnx.wasm.proxy=!1;u.env.backends.onnx.wasm.simd=!0;u.env.backends.onnx.wasm.numThreads=1;u.env.backends.onnx.wasm.wasmPaths="https://ibelem.github.io/transformersjs-dists/3.7.3_1.23.0-dev.20250906/";const S=document.getElementById("device"),g=document.getElementById("status"),x=document.getElementById("container"),h=document.getElementById("canvas"),p=document.getElementById("output-canvas"),o=document.getElementById("video"),v=document.getElementById("size"),B=document.getElementById("size-value"),I=document.getElementById("scale"),F=document.getElementById("scale-value");function D(t,s){o.width=p.width=h.width=Math.round(t),o.height=p.height=h.height=Math.round(s)}g.textContent="Loading model...";function T(t,s){const a="webnn-gpu",i="fp16",e=["webnn-gpu","webnn-cpu","webnn-npu"],n=["fp16","fp32","int8"],c=(t||a).toLowerCase(),O=s&&n.includes(s.toLowerCase())?s.toLowerCase():i,P=e.includes(c)?{freeDimensionOverrides:{batch_size:1,height:256,width:320},logSeverityLevel:0}:{logSeverityLevel:0};return{device:c,dtype:O,sessionOptions:P}}const L=new URLSearchParams(window.location.search);let{device:l,dtype:U,sessionOptions:W}=T(L.get("device"),L.get("dtype")),r="WebNN GPU";switch(l){case"webgpu":r="WebGPU";break;case"webnn-gpu":r="WebNN GPU";break;case"webnn-cpu":r="WebNN CPU";break;case"webnn-npu":r="WebNN NPU";break;default:r="WebNN GPU"}S.textContent=r;["webgpu","webnn-gpu","webnn-cpu","webnn-npu"].includes(l)||(g.textContent=`Unsupported device ${l}. Falling back to WebNN GPU.`,l="webnn-gpu");const k="Xenova/modnet";let b;try{b=await u.pipeline("background-removal",k,{device:l,dtype:U,session_options:W})}catch(t){throw g.textContent=t.message,alert(t.message),t}let f=256;b.processor.feature_extractor.size={shortest_edge:f};v.addEventListener("input",()=>{f=Number(v.value),b.processor.feature_extractor.size={shortest_edge:f},B.textContent=f});v.disabled=!1;["webnn-gpu","webnn-cpu","webnn-npu"].includes(l)&&(v.disabled=!0);let d=.5;I.addEventListener("input",()=>{d=Number(I.value),D(o.videoWidth*d,o.videoHeight*d),F.textContent=d});I.disabled=!1;g.textContent="Ready";let w=!1,E;const C=h.getContext("2d",{willReadFrequently:!0}),z=p.getContext("2d",{willReadFrequently:!0}),N=document.getElementById("show-video-btn");let m=!1;function y(t){t?(o.style.display="block",o.style.width="100%",o.style.height="100%",p.style.display="none"):(o.style.display="none",p.style.display="block")}N.addEventListener("pointerdown",()=>{w&&(m=!0,y(!0))});N.addEventListener("pointerup",()=>{m&&(m=!1,y(!1))});N.addEventListener("pointerleave",()=>{m&&(m=!1,y(!1))});y(!1);function _(){const{width:t,height:s}=h;w||(w=!0,(async function(){C.drawImage(o,0,0,t,s);const a=C.getImageData(0,0,t,s),i=new u.RawImage(a.data,t,s,4),[e]=await b(i);if(z.putImageData(new ImageData(e.data,e.width,e.height),0,0),E!==void 0){const n=1e3/(performance.now()-E);g.textContent=`FPS: ${n.toFixed(2)}`}E=performance.now(),w=!1})()),window.requestAnimationFrame(_)}navigator.mediaDevices.getUserMedia({video:!0}).then(t=>{o.srcObject=t,o.play();const s=t.getVideoTracks()[0],{width:a,height:i}=s.getSettings();D(a*d,i*d);const e=a/i,[n,c]=e>720/405?[720,720/e]:[405*e,405];x.style.width=`${n}px`,x.style.height=`${c}px`,setTimeout(_,50)}).catch(t=>{alert(t)});
index.html ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Transformers.js | Real-time background removal</title>
7
+ <script type="module" crossorigin src="/assets/index-DG-aHmpJ.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-Cn9SjWnX.css">
9
+ </head>
10
+
11
+ <body>
12
+ <h1>
13
+ Real-time background removal w/
14
+ <a href="https://huggingface.co/Xenova/modnet" target="_blank">MODNet</a>
15
+ </h1>
16
+ <h4>
17
+ Runs locally in your browser, powered by
18
+ <a href="https://github.com/huggingface/transformers.js" target="_blank"
19
+ >🤗 Transformers.js</a
20
+ > x <label id="device"></label>
21
+ </h4>
22
+ <div id="container">
23
+ <video id="video" width="360" height="240" autoplay muted playsinline></video>
24
+ <canvas id="canvas" width="360" height="240"></canvas>
25
+ <canvas id="output-canvas" width="360" height="240"></canvas>
26
+ <button id="show-video-btn" title="Hold the button to show the original background">
27
+ <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24"><path fill="#d1d5db" d="M4 20q-.825 0-1.412-.587T2 18v-5q0-.425.288-.712T3 12t.713.288T4 13v5h12V6h-5q-.425 0-.712-.288T10 5t.288-.712T11 4h5q.825 0 1.413.588T18 6v4.5l3.15-3.15q.25-.25.55-.125t.3.475v8.6q0 .35-.3.475t-.55-.125L18 13.5V18q0 .825-.587 1.413T16 20zm2.975-6.625L5.6 15.2q-.2.25-.05.525T6 16h8q.3 0 .45-.275t-.05-.525l-2.375-3.175q-.15-.2-.4-.2t-.4.2L9 15l-1.225-1.625q-.15-.2-.4-.2t-.4.2M4 8H3q-.425 0-.712-.288T2 7t.288-.712T3 6h1V5q0-.425.288-.712T5 4t.713.288T6 5v1h1q.425 0 .713.288T8 7t-.288.713T7 8H6v1q0 .425-.288.713T5 10t-.712-.288T4 9z"/></svg>
28
+ </button>
29
+ </div>
30
+ <div id="controls">
31
+ <div
32
+ title="Read frames from your webcam and process them at a lower size (lower = faster)"
33
+ >
34
+ <label>Stream scale</label>
35
+ (<label id="scale-value">0.5</label>)
36
+ <br />
37
+ <input
38
+ id="scale"
39
+ type="range"
40
+ min="0.1"
41
+ max="1"
42
+ step="0.1"
43
+ value="0.5"
44
+ disabled
45
+ />
46
+ </div>
47
+ <div
48
+ id="size-container"
49
+ title="The length of the shortest edge of the image (lower = faster)"
50
+ >
51
+ <label>Image size</label>
52
+ (<label id="size-value">256</label>)
53
+ <br />
54
+ <input
55
+ id="size"
56
+ type="range"
57
+ min="64"
58
+ max="512"
59
+ step="32"
60
+ value="256"
61
+ disabled
62
+ />
63
+ </div>
64
+ </div>
65
+ <label id="status"></label>
66
+ <div>
67
+ <a href="?device=webnn-gpu">WebNN GPU</a> · <a href="?device=webnn-npu">WebNN NPU</a>
68
+ </div>
69
+ <div id="versions">
70
+ @huggingface/transformers: 3.7.3 · onnxruntime-web: 1.23.0-dev.20250906-ecb26fb775
71
+ </div>
72
+ </body>
73
+ </html>
src/index.html ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Transformers.js | Real-time background removal</title>
7
+ <link rel="stylesheet" href="/style.css" />
8
+ </head>
9
+
10
+ <body>
11
+ <h1>
12
+ Real-time background removal w/
13
+ <a href="https://huggingface.co/Xenova/modnet" target="_blank">MODNet</a>
14
+ </h1>
15
+ <h4>
16
+ Runs locally in your browser, powered by
17
+ <a href="https://github.com/huggingface/transformers.js" target="_blank"
18
+ >🤗 Transformers.js</a
19
+ > x <label id="device"></label>
20
+ </h4>
21
+ <div id="container">
22
+ <video id="video" width="360" height="240" autoplay muted playsinline></video>
23
+ <canvas id="canvas" width="360" height="240"></canvas>
24
+ <canvas id="output-canvas" width="360" height="240"></canvas>
25
+ <button id="show-video-btn" title="Hold the button to show the original background">
26
+ <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 24 24"><path fill="#d1d5db" d="M4 20q-.825 0-1.412-.587T2 18v-5q0-.425.288-.712T3 12t.713.288T4 13v5h12V6h-5q-.425 0-.712-.288T10 5t.288-.712T11 4h5q.825 0 1.413.588T18 6v4.5l3.15-3.15q.25-.25.55-.125t.3.475v8.6q0 .35-.3.475t-.55-.125L18 13.5V18q0 .825-.587 1.413T16 20zm2.975-6.625L5.6 15.2q-.2.25-.05.525T6 16h8q.3 0 .45-.275t-.05-.525l-2.375-3.175q-.15-.2-.4-.2t-.4.2L9 15l-1.225-1.625q-.15-.2-.4-.2t-.4.2M4 8H3q-.425 0-.712-.288T2 7t.288-.712T3 6h1V5q0-.425.288-.712T5 4t.713.288T6 5v1h1q.425 0 .713.288T8 7t-.288.713T7 8H6v1q0 .425-.288.713T5 10t-.712-.288T4 9z"/></svg>
27
+ </button>
28
+ </div>
29
+ <div id="controls">
30
+ <div
31
+ title="Read frames from your webcam and process them at a lower size (lower = faster)"
32
+ >
33
+ <label>Stream scale</label>
34
+ (<label id="scale-value">0.5</label>)
35
+ <br />
36
+ <input
37
+ id="scale"
38
+ type="range"
39
+ min="0.1"
40
+ max="1"
41
+ step="0.1"
42
+ value="0.5"
43
+ disabled
44
+ />
45
+ </div>
46
+ <div
47
+ id="size-container"
48
+ title="The length of the shortest edge of the image (lower = faster)"
49
+ >
50
+ <label>Image size</label>
51
+ (<label id="size-value">256</label>)
52
+ <br />
53
+ <input
54
+ id="size"
55
+ type="range"
56
+ min="64"
57
+ max="512"
58
+ step="32"
59
+ value="256"
60
+ disabled
61
+ />
62
+ </div>
63
+ </div>
64
+ <label id="status"></label>
65
+ <div>
66
+ <a href="?device=webnn-gpu">WebNN GPU</a> · <a href="?device=webnn-npu">WebNN NPU</a>
67
+ </div>
68
+ <div id="versions">
69
+ @huggingface/transformers: 3.7.3 · onnxruntime-web: 1.23.0-dev.20250906-ecb26fb775
70
+ </div>
71
+ <script type="module" src="/main.js"></script>
72
+ </body>
73
+ </html>
src/main.js ADDED
@@ -0,0 +1,226 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as transformers from "https://ibelem.github.io/transformersjs-dists/3.7.3_1.23.0-dev.20250906/transformers.js";
2
+ transformers.env.backends.onnx.wasm.proxy = false;
3
+ transformers.env.backends.onnx.wasm.simd = true;
4
+ transformers.env.backends.onnx.wasm.numThreads = 1;
5
+ transformers.env.backends.onnx.wasm.wasmPaths = "https://ibelem.github.io/transformersjs-dists/3.7.3_1.23.0-dev.20250906/";
6
+
7
+ // Reference the elements that we will need
8
+ const deviceLabel = document.getElementById("device");
9
+ const status = document.getElementById("status");
10
+ const container = document.getElementById("container");
11
+ const canvas = document.getElementById("canvas");
12
+ const outputCanvas = document.getElementById("output-canvas");
13
+ const video = document.getElementById("video");
14
+ const sizeSlider = document.getElementById("size");
15
+ const sizeLabel = document.getElementById("size-value");
16
+ const scaleSlider = document.getElementById("scale");
17
+ const scaleLabel = document.getElementById("scale-value");
18
+
19
+ function setStreamSize(width, height) {
20
+ video.width = outputCanvas.width = canvas.width = Math.round(width);
21
+ video.height = outputCanvas.height = canvas.height = Math.round(height);
22
+ }
23
+
24
+ status.textContent = "Loading model...";
25
+
26
+ function getDeviceConfig(deviceParam, dtypeParam) {
27
+ const defaultDevice = 'webnn-gpu';
28
+ const defaultDtype = 'fp16';
29
+ const webnnDevices = ['webnn-gpu', 'webnn-cpu', 'webnn-npu'];
30
+ const supportedDtypes = ['fp16', 'fp32', 'int8'];
31
+
32
+ const device = (deviceParam || defaultDevice).toLowerCase();
33
+ const dtype = (dtypeParam && supportedDtypes.includes(dtypeParam.toLowerCase()))
34
+ ? dtypeParam.toLowerCase()
35
+ : defaultDtype;
36
+
37
+ const FREE_DIMENSION_HEIGHT = 256;
38
+ const FREE_DIMENSION_WIDTH = 320;
39
+
40
+ const sessionOptions = webnnDevices.includes(device)
41
+ ? {
42
+ freeDimensionOverrides: {
43
+ batch_size: 1,
44
+ height: FREE_DIMENSION_HEIGHT,
45
+ width: FREE_DIMENSION_WIDTH,
46
+ },
47
+ logSeverityLevel: 0
48
+ }
49
+ : {
50
+ logSeverityLevel: 0
51
+ };
52
+
53
+ return { device, dtype, sessionOptions };
54
+ }
55
+
56
+ const urlParams = new URLSearchParams(window.location.search);
57
+ let { device, dtype, sessionOptions } = getDeviceConfig(urlParams.get('device'), urlParams.get('dtype'));
58
+
59
+ let deviceValue = 'WebNN GPU';
60
+ switch (device) {
61
+ case 'webgpu':
62
+ deviceValue = 'WebGPU';
63
+ break;
64
+ case 'webnn-gpu':
65
+ deviceValue = 'WebNN GPU';
66
+ break;
67
+ case 'webnn-cpu':
68
+ deviceValue = 'WebNN CPU';
69
+ break;
70
+ case 'webnn-npu':
71
+ deviceValue = 'WebNN NPU';
72
+ break;
73
+ default:
74
+ deviceValue = 'WebNN GPU';
75
+ }
76
+
77
+ deviceLabel.textContent = deviceValue;
78
+ if (!['webgpu', 'webnn-gpu', 'webnn-cpu', 'webnn-npu'].includes(device)) {
79
+ status.textContent = `Unsupported device ${device}. Falling back to WebNN GPU.`;
80
+ device = 'webnn-gpu';
81
+ }
82
+
83
+ // Load model and processor
84
+ const model_id = "Xenova/modnet";
85
+ let pipe;
86
+ try {
87
+ pipe = await transformers.pipeline("background-removal", model_id, {
88
+ device: device,
89
+ dtype: dtype,
90
+ session_options: sessionOptions
91
+ });
92
+ } catch (err) {
93
+ status.textContent = err.message;
94
+ alert(err.message);
95
+ throw err;
96
+ }
97
+
98
+ // Set up controls
99
+ let size = 256;
100
+ pipe.processor.feature_extractor.size = { shortest_edge: size };
101
+ sizeSlider.addEventListener("input", () => {
102
+ size = Number(sizeSlider.value);
103
+ pipe.processor.feature_extractor.size = { shortest_edge: size };
104
+ sizeLabel.textContent = size;
105
+ });
106
+ sizeSlider.disabled = false;
107
+
108
+ if (['webnn-gpu', 'webnn-cpu', 'webnn-npu'].includes(device)) {
109
+ sizeSlider.disabled = true;
110
+ }
111
+
112
+ let scale = 0.5;
113
+ scaleSlider.addEventListener("input", () => {
114
+ scale = Number(scaleSlider.value);
115
+ setStreamSize(video.videoWidth * scale, video.videoHeight * scale);
116
+ scaleLabel.textContent = scale;
117
+ });
118
+ scaleSlider.disabled = false;
119
+
120
+ status.textContent = "Ready";
121
+
122
+ let isProcessing = false;
123
+ let previousTime;
124
+ const context = canvas.getContext("2d", { willReadFrequently: true });
125
+ const outputContext = outputCanvas.getContext("2d", {
126
+ willReadFrequently: true,
127
+ });
128
+
129
+ // Button logic for toggling video/output-canvas display
130
+ const showVideoBtn = document.getElementById("show-video-btn");
131
+ let videoToggleActive = false;
132
+
133
+ function setVideoCanvasDisplay(showVideo) {
134
+ if (showVideo) {
135
+ video.style.display = "block";
136
+ video.style.width = "100%";
137
+ video.style.height = "100%";
138
+ outputCanvas.style.display = "none";
139
+ } else {
140
+ video.style.display = "none";
141
+ outputCanvas.style.display = "block";
142
+ }
143
+ }
144
+
145
+ showVideoBtn.addEventListener("pointerdown", () => {
146
+ if (isProcessing) {
147
+ videoToggleActive = true;
148
+ setVideoCanvasDisplay(true);
149
+ }
150
+ });
151
+ showVideoBtn.addEventListener("pointerup", () => {
152
+ if (videoToggleActive) {
153
+ videoToggleActive = false;
154
+ setVideoCanvasDisplay(false);
155
+ }
156
+ });
157
+ showVideoBtn.addEventListener("pointerleave", () => {
158
+ if (videoToggleActive) {
159
+ videoToggleActive = false;
160
+ setVideoCanvasDisplay(false);
161
+ }
162
+ });
163
+
164
+ // Ensure initial state
165
+ setVideoCanvasDisplay(false);
166
+ function updateCanvas() {
167
+ const { width, height } = canvas;
168
+
169
+ if (!isProcessing) {
170
+ isProcessing = true;
171
+ (async function () {
172
+ // Read the current frame from the video
173
+ context.drawImage(video, 0, 0, width, height);
174
+ const currentFrame = context.getImageData(0, 0, width, height);
175
+ const image = new transformers.RawImage(currentFrame.data, width, height, 4);
176
+
177
+ // Predict alpha matte
178
+ const [output] = await pipe(image);
179
+
180
+ // Draw the alpha matte on the canvas
181
+ outputContext.putImageData(
182
+ new ImageData(output.data, output.width, output.height),
183
+ 0,
184
+ 0,
185
+ );
186
+
187
+ if (previousTime !== undefined) {
188
+ const fps = 1000 / (performance.now() - previousTime);
189
+ status.textContent = `FPS: ${fps.toFixed(2)}`;
190
+ }
191
+ previousTime = performance.now();
192
+
193
+ isProcessing = false;
194
+ })();
195
+ }
196
+
197
+ window.requestAnimationFrame(updateCanvas);
198
+ }
199
+
200
+ // Start the video stream
201
+ navigator.mediaDevices
202
+ .getUserMedia(
203
+ { video: true }, // Ask for video
204
+ )
205
+ .then((stream) => {
206
+ // Set up the video and canvas elements.
207
+ video.srcObject = stream;
208
+ video.play();
209
+
210
+ const videoTrack = stream.getVideoTracks()[0];
211
+ const { width, height } = videoTrack.getSettings();
212
+
213
+ setStreamSize(width * scale, height * scale);
214
+
215
+ // Set container width and height depending on the image aspect ratio
216
+ const ar = width / height;
217
+ const [cw, ch] = ar > 720 / 405 ? [720, 720 / ar] : [405 * ar, 405];
218
+ container.style.width = `${cw}px`;
219
+ container.style.height = `${ch}px`;
220
+
221
+ // Start the animation loop
222
+ setTimeout(updateCanvas, 50);
223
+ })
224
+ .catch((error) => {
225
+ alert(error);
226
+ });
src/package-lock.json ADDED
@@ -0,0 +1,1021 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "video-background-removal",
3
+ "version": "0.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "video-background-removal",
9
+ "version": "0.0.0",
10
+ "devDependencies": {
11
+ "vite": "^7.1.6"
12
+ }
13
+ },
14
+ "node_modules/@esbuild/aix-ppc64": {
15
+ "version": "0.25.0",
16
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
17
+ "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
18
+ "cpu": [
19
+ "ppc64"
20
+ ],
21
+ "dev": true,
22
+ "optional": true,
23
+ "os": [
24
+ "aix"
25
+ ],
26
+ "engines": {
27
+ "node": ">=18"
28
+ }
29
+ },
30
+ "node_modules/@esbuild/android-arm": {
31
+ "version": "0.25.0",
32
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
33
+ "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
34
+ "cpu": [
35
+ "arm"
36
+ ],
37
+ "dev": true,
38
+ "optional": true,
39
+ "os": [
40
+ "android"
41
+ ],
42
+ "engines": {
43
+ "node": ">=18"
44
+ }
45
+ },
46
+ "node_modules/@esbuild/android-arm64": {
47
+ "version": "0.25.0",
48
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
49
+ "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
50
+ "cpu": [
51
+ "arm64"
52
+ ],
53
+ "dev": true,
54
+ "optional": true,
55
+ "os": [
56
+ "android"
57
+ ],
58
+ "engines": {
59
+ "node": ">=18"
60
+ }
61
+ },
62
+ "node_modules/@esbuild/android-x64": {
63
+ "version": "0.25.0",
64
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
65
+ "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
66
+ "cpu": [
67
+ "x64"
68
+ ],
69
+ "dev": true,
70
+ "optional": true,
71
+ "os": [
72
+ "android"
73
+ ],
74
+ "engines": {
75
+ "node": ">=18"
76
+ }
77
+ },
78
+ "node_modules/@esbuild/darwin-arm64": {
79
+ "version": "0.25.0",
80
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
81
+ "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
82
+ "cpu": [
83
+ "arm64"
84
+ ],
85
+ "dev": true,
86
+ "optional": true,
87
+ "os": [
88
+ "darwin"
89
+ ],
90
+ "engines": {
91
+ "node": ">=18"
92
+ }
93
+ },
94
+ "node_modules/@esbuild/darwin-x64": {
95
+ "version": "0.25.0",
96
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
97
+ "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
98
+ "cpu": [
99
+ "x64"
100
+ ],
101
+ "dev": true,
102
+ "optional": true,
103
+ "os": [
104
+ "darwin"
105
+ ],
106
+ "engines": {
107
+ "node": ">=18"
108
+ }
109
+ },
110
+ "node_modules/@esbuild/freebsd-arm64": {
111
+ "version": "0.25.0",
112
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
113
+ "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
114
+ "cpu": [
115
+ "arm64"
116
+ ],
117
+ "dev": true,
118
+ "optional": true,
119
+ "os": [
120
+ "freebsd"
121
+ ],
122
+ "engines": {
123
+ "node": ">=18"
124
+ }
125
+ },
126
+ "node_modules/@esbuild/freebsd-x64": {
127
+ "version": "0.25.0",
128
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
129
+ "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
130
+ "cpu": [
131
+ "x64"
132
+ ],
133
+ "dev": true,
134
+ "optional": true,
135
+ "os": [
136
+ "freebsd"
137
+ ],
138
+ "engines": {
139
+ "node": ">=18"
140
+ }
141
+ },
142
+ "node_modules/@esbuild/linux-arm": {
143
+ "version": "0.25.0",
144
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
145
+ "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
146
+ "cpu": [
147
+ "arm"
148
+ ],
149
+ "dev": true,
150
+ "optional": true,
151
+ "os": [
152
+ "linux"
153
+ ],
154
+ "engines": {
155
+ "node": ">=18"
156
+ }
157
+ },
158
+ "node_modules/@esbuild/linux-arm64": {
159
+ "version": "0.25.0",
160
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
161
+ "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
162
+ "cpu": [
163
+ "arm64"
164
+ ],
165
+ "dev": true,
166
+ "optional": true,
167
+ "os": [
168
+ "linux"
169
+ ],
170
+ "engines": {
171
+ "node": ">=18"
172
+ }
173
+ },
174
+ "node_modules/@esbuild/linux-ia32": {
175
+ "version": "0.25.0",
176
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
177
+ "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
178
+ "cpu": [
179
+ "ia32"
180
+ ],
181
+ "dev": true,
182
+ "optional": true,
183
+ "os": [
184
+ "linux"
185
+ ],
186
+ "engines": {
187
+ "node": ">=18"
188
+ }
189
+ },
190
+ "node_modules/@esbuild/linux-loong64": {
191
+ "version": "0.25.0",
192
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
193
+ "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
194
+ "cpu": [
195
+ "loong64"
196
+ ],
197
+ "dev": true,
198
+ "optional": true,
199
+ "os": [
200
+ "linux"
201
+ ],
202
+ "engines": {
203
+ "node": ">=18"
204
+ }
205
+ },
206
+ "node_modules/@esbuild/linux-mips64el": {
207
+ "version": "0.25.0",
208
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
209
+ "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
210
+ "cpu": [
211
+ "mips64el"
212
+ ],
213
+ "dev": true,
214
+ "optional": true,
215
+ "os": [
216
+ "linux"
217
+ ],
218
+ "engines": {
219
+ "node": ">=18"
220
+ }
221
+ },
222
+ "node_modules/@esbuild/linux-ppc64": {
223
+ "version": "0.25.0",
224
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
225
+ "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
226
+ "cpu": [
227
+ "ppc64"
228
+ ],
229
+ "dev": true,
230
+ "optional": true,
231
+ "os": [
232
+ "linux"
233
+ ],
234
+ "engines": {
235
+ "node": ">=18"
236
+ }
237
+ },
238
+ "node_modules/@esbuild/linux-riscv64": {
239
+ "version": "0.25.0",
240
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
241
+ "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
242
+ "cpu": [
243
+ "riscv64"
244
+ ],
245
+ "dev": true,
246
+ "optional": true,
247
+ "os": [
248
+ "linux"
249
+ ],
250
+ "engines": {
251
+ "node": ">=18"
252
+ }
253
+ },
254
+ "node_modules/@esbuild/linux-s390x": {
255
+ "version": "0.25.0",
256
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
257
+ "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
258
+ "cpu": [
259
+ "s390x"
260
+ ],
261
+ "dev": true,
262
+ "optional": true,
263
+ "os": [
264
+ "linux"
265
+ ],
266
+ "engines": {
267
+ "node": ">=18"
268
+ }
269
+ },
270
+ "node_modules/@esbuild/linux-x64": {
271
+ "version": "0.25.0",
272
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
273
+ "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
274
+ "cpu": [
275
+ "x64"
276
+ ],
277
+ "dev": true,
278
+ "optional": true,
279
+ "os": [
280
+ "linux"
281
+ ],
282
+ "engines": {
283
+ "node": ">=18"
284
+ }
285
+ },
286
+ "node_modules/@esbuild/netbsd-arm64": {
287
+ "version": "0.25.0",
288
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
289
+ "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
290
+ "cpu": [
291
+ "arm64"
292
+ ],
293
+ "dev": true,
294
+ "optional": true,
295
+ "os": [
296
+ "netbsd"
297
+ ],
298
+ "engines": {
299
+ "node": ">=18"
300
+ }
301
+ },
302
+ "node_modules/@esbuild/netbsd-x64": {
303
+ "version": "0.25.0",
304
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
305
+ "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
306
+ "cpu": [
307
+ "x64"
308
+ ],
309
+ "dev": true,
310
+ "optional": true,
311
+ "os": [
312
+ "netbsd"
313
+ ],
314
+ "engines": {
315
+ "node": ">=18"
316
+ }
317
+ },
318
+ "node_modules/@esbuild/openbsd-arm64": {
319
+ "version": "0.25.0",
320
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
321
+ "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
322
+ "cpu": [
323
+ "arm64"
324
+ ],
325
+ "dev": true,
326
+ "optional": true,
327
+ "os": [
328
+ "openbsd"
329
+ ],
330
+ "engines": {
331
+ "node": ">=18"
332
+ }
333
+ },
334
+ "node_modules/@esbuild/openbsd-x64": {
335
+ "version": "0.25.0",
336
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
337
+ "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
338
+ "cpu": [
339
+ "x64"
340
+ ],
341
+ "dev": true,
342
+ "optional": true,
343
+ "os": [
344
+ "openbsd"
345
+ ],
346
+ "engines": {
347
+ "node": ">=18"
348
+ }
349
+ },
350
+ "node_modules/@esbuild/sunos-x64": {
351
+ "version": "0.25.0",
352
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
353
+ "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
354
+ "cpu": [
355
+ "x64"
356
+ ],
357
+ "dev": true,
358
+ "optional": true,
359
+ "os": [
360
+ "sunos"
361
+ ],
362
+ "engines": {
363
+ "node": ">=18"
364
+ }
365
+ },
366
+ "node_modules/@esbuild/win32-arm64": {
367
+ "version": "0.25.0",
368
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
369
+ "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
370
+ "cpu": [
371
+ "arm64"
372
+ ],
373
+ "dev": true,
374
+ "optional": true,
375
+ "os": [
376
+ "win32"
377
+ ],
378
+ "engines": {
379
+ "node": ">=18"
380
+ }
381
+ },
382
+ "node_modules/@esbuild/win32-ia32": {
383
+ "version": "0.25.0",
384
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
385
+ "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
386
+ "cpu": [
387
+ "ia32"
388
+ ],
389
+ "dev": true,
390
+ "optional": true,
391
+ "os": [
392
+ "win32"
393
+ ],
394
+ "engines": {
395
+ "node": ">=18"
396
+ }
397
+ },
398
+ "node_modules/@esbuild/win32-x64": {
399
+ "version": "0.25.0",
400
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
401
+ "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
402
+ "cpu": [
403
+ "x64"
404
+ ],
405
+ "dev": true,
406
+ "optional": true,
407
+ "os": [
408
+ "win32"
409
+ ],
410
+ "engines": {
411
+ "node": ">=18"
412
+ }
413
+ },
414
+ "node_modules/@rollup/rollup-android-arm-eabi": {
415
+ "version": "4.50.2",
416
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz",
417
+ "integrity": "sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==",
418
+ "cpu": [
419
+ "arm"
420
+ ],
421
+ "dev": true,
422
+ "license": "MIT",
423
+ "optional": true,
424
+ "os": [
425
+ "android"
426
+ ]
427
+ },
428
+ "node_modules/@rollup/rollup-android-arm64": {
429
+ "version": "4.50.2",
430
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz",
431
+ "integrity": "sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==",
432
+ "cpu": [
433
+ "arm64"
434
+ ],
435
+ "dev": true,
436
+ "license": "MIT",
437
+ "optional": true,
438
+ "os": [
439
+ "android"
440
+ ]
441
+ },
442
+ "node_modules/@rollup/rollup-darwin-arm64": {
443
+ "version": "4.50.2",
444
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.2.tgz",
445
+ "integrity": "sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==",
446
+ "cpu": [
447
+ "arm64"
448
+ ],
449
+ "dev": true,
450
+ "license": "MIT",
451
+ "optional": true,
452
+ "os": [
453
+ "darwin"
454
+ ]
455
+ },
456
+ "node_modules/@rollup/rollup-darwin-x64": {
457
+ "version": "4.50.2",
458
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.2.tgz",
459
+ "integrity": "sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==",
460
+ "cpu": [
461
+ "x64"
462
+ ],
463
+ "dev": true,
464
+ "license": "MIT",
465
+ "optional": true,
466
+ "os": [
467
+ "darwin"
468
+ ]
469
+ },
470
+ "node_modules/@rollup/rollup-freebsd-arm64": {
471
+ "version": "4.50.2",
472
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.2.tgz",
473
+ "integrity": "sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==",
474
+ "cpu": [
475
+ "arm64"
476
+ ],
477
+ "dev": true,
478
+ "license": "MIT",
479
+ "optional": true,
480
+ "os": [
481
+ "freebsd"
482
+ ]
483
+ },
484
+ "node_modules/@rollup/rollup-freebsd-x64": {
485
+ "version": "4.50.2",
486
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.2.tgz",
487
+ "integrity": "sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==",
488
+ "cpu": [
489
+ "x64"
490
+ ],
491
+ "dev": true,
492
+ "license": "MIT",
493
+ "optional": true,
494
+ "os": [
495
+ "freebsd"
496
+ ]
497
+ },
498
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
499
+ "version": "4.50.2",
500
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.2.tgz",
501
+ "integrity": "sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==",
502
+ "cpu": [
503
+ "arm"
504
+ ],
505
+ "dev": true,
506
+ "license": "MIT",
507
+ "optional": true,
508
+ "os": [
509
+ "linux"
510
+ ]
511
+ },
512
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
513
+ "version": "4.50.2",
514
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.2.tgz",
515
+ "integrity": "sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==",
516
+ "cpu": [
517
+ "arm"
518
+ ],
519
+ "dev": true,
520
+ "license": "MIT",
521
+ "optional": true,
522
+ "os": [
523
+ "linux"
524
+ ]
525
+ },
526
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
527
+ "version": "4.50.2",
528
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.2.tgz",
529
+ "integrity": "sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==",
530
+ "cpu": [
531
+ "arm64"
532
+ ],
533
+ "dev": true,
534
+ "license": "MIT",
535
+ "optional": true,
536
+ "os": [
537
+ "linux"
538
+ ]
539
+ },
540
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
541
+ "version": "4.50.2",
542
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.2.tgz",
543
+ "integrity": "sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==",
544
+ "cpu": [
545
+ "arm64"
546
+ ],
547
+ "dev": true,
548
+ "license": "MIT",
549
+ "optional": true,
550
+ "os": [
551
+ "linux"
552
+ ]
553
+ },
554
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
555
+ "version": "4.50.2",
556
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.50.2.tgz",
557
+ "integrity": "sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==",
558
+ "cpu": [
559
+ "loong64"
560
+ ],
561
+ "dev": true,
562
+ "license": "MIT",
563
+ "optional": true,
564
+ "os": [
565
+ "linux"
566
+ ]
567
+ },
568
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
569
+ "version": "4.50.2",
570
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.2.tgz",
571
+ "integrity": "sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==",
572
+ "cpu": [
573
+ "ppc64"
574
+ ],
575
+ "dev": true,
576
+ "license": "MIT",
577
+ "optional": true,
578
+ "os": [
579
+ "linux"
580
+ ]
581
+ },
582
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
583
+ "version": "4.50.2",
584
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.2.tgz",
585
+ "integrity": "sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==",
586
+ "cpu": [
587
+ "riscv64"
588
+ ],
589
+ "dev": true,
590
+ "license": "MIT",
591
+ "optional": true,
592
+ "os": [
593
+ "linux"
594
+ ]
595
+ },
596
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
597
+ "version": "4.50.2",
598
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.2.tgz",
599
+ "integrity": "sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==",
600
+ "cpu": [
601
+ "riscv64"
602
+ ],
603
+ "dev": true,
604
+ "license": "MIT",
605
+ "optional": true,
606
+ "os": [
607
+ "linux"
608
+ ]
609
+ },
610
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
611
+ "version": "4.50.2",
612
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.2.tgz",
613
+ "integrity": "sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==",
614
+ "cpu": [
615
+ "s390x"
616
+ ],
617
+ "dev": true,
618
+ "license": "MIT",
619
+ "optional": true,
620
+ "os": [
621
+ "linux"
622
+ ]
623
+ },
624
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
625
+ "version": "4.50.2",
626
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.2.tgz",
627
+ "integrity": "sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==",
628
+ "cpu": [
629
+ "x64"
630
+ ],
631
+ "dev": true,
632
+ "license": "MIT",
633
+ "optional": true,
634
+ "os": [
635
+ "linux"
636
+ ]
637
+ },
638
+ "node_modules/@rollup/rollup-linux-x64-musl": {
639
+ "version": "4.50.2",
640
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.2.tgz",
641
+ "integrity": "sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==",
642
+ "cpu": [
643
+ "x64"
644
+ ],
645
+ "dev": true,
646
+ "license": "MIT",
647
+ "optional": true,
648
+ "os": [
649
+ "linux"
650
+ ]
651
+ },
652
+ "node_modules/@rollup/rollup-openharmony-arm64": {
653
+ "version": "4.50.2",
654
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.2.tgz",
655
+ "integrity": "sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==",
656
+ "cpu": [
657
+ "arm64"
658
+ ],
659
+ "dev": true,
660
+ "license": "MIT",
661
+ "optional": true,
662
+ "os": [
663
+ "openharmony"
664
+ ]
665
+ },
666
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
667
+ "version": "4.50.2",
668
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.2.tgz",
669
+ "integrity": "sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==",
670
+ "cpu": [
671
+ "arm64"
672
+ ],
673
+ "dev": true,
674
+ "license": "MIT",
675
+ "optional": true,
676
+ "os": [
677
+ "win32"
678
+ ]
679
+ },
680
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
681
+ "version": "4.50.2",
682
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.2.tgz",
683
+ "integrity": "sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==",
684
+ "cpu": [
685
+ "ia32"
686
+ ],
687
+ "dev": true,
688
+ "license": "MIT",
689
+ "optional": true,
690
+ "os": [
691
+ "win32"
692
+ ]
693
+ },
694
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
695
+ "version": "4.50.2",
696
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.2.tgz",
697
+ "integrity": "sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==",
698
+ "cpu": [
699
+ "x64"
700
+ ],
701
+ "dev": true,
702
+ "license": "MIT",
703
+ "optional": true,
704
+ "os": [
705
+ "win32"
706
+ ]
707
+ },
708
+ "node_modules/@types/estree": {
709
+ "version": "1.0.8",
710
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
711
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
712
+ "dev": true,
713
+ "license": "MIT"
714
+ },
715
+ "node_modules/@types/node": {
716
+ "version": "24.5.2",
717
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz",
718
+ "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==",
719
+ "dev": true,
720
+ "license": "MIT",
721
+ "optional": true,
722
+ "peer": true,
723
+ "dependencies": {
724
+ "undici-types": "~7.12.0"
725
+ }
726
+ },
727
+ "node_modules/esbuild": {
728
+ "version": "0.25.0",
729
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
730
+ "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
731
+ "dev": true,
732
+ "hasInstallScript": true,
733
+ "bin": {
734
+ "esbuild": "bin/esbuild"
735
+ },
736
+ "engines": {
737
+ "node": ">=18"
738
+ },
739
+ "optionalDependencies": {
740
+ "@esbuild/aix-ppc64": "0.25.0",
741
+ "@esbuild/android-arm": "0.25.0",
742
+ "@esbuild/android-arm64": "0.25.0",
743
+ "@esbuild/android-x64": "0.25.0",
744
+ "@esbuild/darwin-arm64": "0.25.0",
745
+ "@esbuild/darwin-x64": "0.25.0",
746
+ "@esbuild/freebsd-arm64": "0.25.0",
747
+ "@esbuild/freebsd-x64": "0.25.0",
748
+ "@esbuild/linux-arm": "0.25.0",
749
+ "@esbuild/linux-arm64": "0.25.0",
750
+ "@esbuild/linux-ia32": "0.25.0",
751
+ "@esbuild/linux-loong64": "0.25.0",
752
+ "@esbuild/linux-mips64el": "0.25.0",
753
+ "@esbuild/linux-ppc64": "0.25.0",
754
+ "@esbuild/linux-riscv64": "0.25.0",
755
+ "@esbuild/linux-s390x": "0.25.0",
756
+ "@esbuild/linux-x64": "0.25.0",
757
+ "@esbuild/netbsd-arm64": "0.25.0",
758
+ "@esbuild/netbsd-x64": "0.25.0",
759
+ "@esbuild/openbsd-arm64": "0.25.0",
760
+ "@esbuild/openbsd-x64": "0.25.0",
761
+ "@esbuild/sunos-x64": "0.25.0",
762
+ "@esbuild/win32-arm64": "0.25.0",
763
+ "@esbuild/win32-ia32": "0.25.0",
764
+ "@esbuild/win32-x64": "0.25.0"
765
+ }
766
+ },
767
+ "node_modules/fdir": {
768
+ "version": "6.5.0",
769
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
770
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
771
+ "dev": true,
772
+ "license": "MIT",
773
+ "engines": {
774
+ "node": ">=12.0.0"
775
+ },
776
+ "peerDependencies": {
777
+ "picomatch": "^3 || ^4"
778
+ },
779
+ "peerDependenciesMeta": {
780
+ "picomatch": {
781
+ "optional": true
782
+ }
783
+ }
784
+ },
785
+ "node_modules/fsevents": {
786
+ "version": "2.3.3",
787
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
788
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
789
+ "dev": true,
790
+ "hasInstallScript": true,
791
+ "license": "MIT",
792
+ "optional": true,
793
+ "os": [
794
+ "darwin"
795
+ ],
796
+ "engines": {
797
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
798
+ }
799
+ },
800
+ "node_modules/nanoid": {
801
+ "version": "3.3.11",
802
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
803
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
804
+ "dev": true,
805
+ "funding": [
806
+ {
807
+ "type": "github",
808
+ "url": "https://github.com/sponsors/ai"
809
+ }
810
+ ],
811
+ "license": "MIT",
812
+ "bin": {
813
+ "nanoid": "bin/nanoid.cjs"
814
+ },
815
+ "engines": {
816
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
817
+ }
818
+ },
819
+ "node_modules/picocolors": {
820
+ "version": "1.1.1",
821
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
822
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
823
+ "dev": true,
824
+ "license": "ISC"
825
+ },
826
+ "node_modules/picomatch": {
827
+ "version": "4.0.3",
828
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
829
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
830
+ "dev": true,
831
+ "license": "MIT",
832
+ "engines": {
833
+ "node": ">=12"
834
+ },
835
+ "funding": {
836
+ "url": "https://github.com/sponsors/jonschlinkert"
837
+ }
838
+ },
839
+ "node_modules/postcss": {
840
+ "version": "8.5.6",
841
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
842
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
843
+ "dev": true,
844
+ "funding": [
845
+ {
846
+ "type": "opencollective",
847
+ "url": "https://opencollective.com/postcss/"
848
+ },
849
+ {
850
+ "type": "tidelift",
851
+ "url": "https://tidelift.com/funding/github/npm/postcss"
852
+ },
853
+ {
854
+ "type": "github",
855
+ "url": "https://github.com/sponsors/ai"
856
+ }
857
+ ],
858
+ "license": "MIT",
859
+ "dependencies": {
860
+ "nanoid": "^3.3.11",
861
+ "picocolors": "^1.1.1",
862
+ "source-map-js": "^1.2.1"
863
+ },
864
+ "engines": {
865
+ "node": "^10 || ^12 || >=14"
866
+ }
867
+ },
868
+ "node_modules/rollup": {
869
+ "version": "4.50.2",
870
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.2.tgz",
871
+ "integrity": "sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==",
872
+ "dev": true,
873
+ "license": "MIT",
874
+ "dependencies": {
875
+ "@types/estree": "1.0.8"
876
+ },
877
+ "bin": {
878
+ "rollup": "dist/bin/rollup"
879
+ },
880
+ "engines": {
881
+ "node": ">=18.0.0",
882
+ "npm": ">=8.0.0"
883
+ },
884
+ "optionalDependencies": {
885
+ "@rollup/rollup-android-arm-eabi": "4.50.2",
886
+ "@rollup/rollup-android-arm64": "4.50.2",
887
+ "@rollup/rollup-darwin-arm64": "4.50.2",
888
+ "@rollup/rollup-darwin-x64": "4.50.2",
889
+ "@rollup/rollup-freebsd-arm64": "4.50.2",
890
+ "@rollup/rollup-freebsd-x64": "4.50.2",
891
+ "@rollup/rollup-linux-arm-gnueabihf": "4.50.2",
892
+ "@rollup/rollup-linux-arm-musleabihf": "4.50.2",
893
+ "@rollup/rollup-linux-arm64-gnu": "4.50.2",
894
+ "@rollup/rollup-linux-arm64-musl": "4.50.2",
895
+ "@rollup/rollup-linux-loong64-gnu": "4.50.2",
896
+ "@rollup/rollup-linux-ppc64-gnu": "4.50.2",
897
+ "@rollup/rollup-linux-riscv64-gnu": "4.50.2",
898
+ "@rollup/rollup-linux-riscv64-musl": "4.50.2",
899
+ "@rollup/rollup-linux-s390x-gnu": "4.50.2",
900
+ "@rollup/rollup-linux-x64-gnu": "4.50.2",
901
+ "@rollup/rollup-linux-x64-musl": "4.50.2",
902
+ "@rollup/rollup-openharmony-arm64": "4.50.2",
903
+ "@rollup/rollup-win32-arm64-msvc": "4.50.2",
904
+ "@rollup/rollup-win32-ia32-msvc": "4.50.2",
905
+ "@rollup/rollup-win32-x64-msvc": "4.50.2",
906
+ "fsevents": "~2.3.2"
907
+ }
908
+ },
909
+ "node_modules/source-map-js": {
910
+ "version": "1.2.1",
911
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
912
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
913
+ "dev": true,
914
+ "license": "BSD-3-Clause",
915
+ "engines": {
916
+ "node": ">=0.10.0"
917
+ }
918
+ },
919
+ "node_modules/tinyglobby": {
920
+ "version": "0.2.15",
921
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
922
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
923
+ "dev": true,
924
+ "license": "MIT",
925
+ "dependencies": {
926
+ "fdir": "^6.5.0",
927
+ "picomatch": "^4.0.3"
928
+ },
929
+ "engines": {
930
+ "node": ">=12.0.0"
931
+ },
932
+ "funding": {
933
+ "url": "https://github.com/sponsors/SuperchupuDev"
934
+ }
935
+ },
936
+ "node_modules/undici-types": {
937
+ "version": "7.12.0",
938
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz",
939
+ "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==",
940
+ "dev": true,
941
+ "license": "MIT",
942
+ "optional": true,
943
+ "peer": true
944
+ },
945
+ "node_modules/vite": {
946
+ "version": "7.1.6",
947
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.6.tgz",
948
+ "integrity": "sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==",
949
+ "dev": true,
950
+ "license": "MIT",
951
+ "dependencies": {
952
+ "esbuild": "^0.25.0",
953
+ "fdir": "^6.5.0",
954
+ "picomatch": "^4.0.3",
955
+ "postcss": "^8.5.6",
956
+ "rollup": "^4.43.0",
957
+ "tinyglobby": "^0.2.15"
958
+ },
959
+ "bin": {
960
+ "vite": "bin/vite.js"
961
+ },
962
+ "engines": {
963
+ "node": "^20.19.0 || >=22.12.0"
964
+ },
965
+ "funding": {
966
+ "url": "https://github.com/vitejs/vite?sponsor=1"
967
+ },
968
+ "optionalDependencies": {
969
+ "fsevents": "~2.3.3"
970
+ },
971
+ "peerDependencies": {
972
+ "@types/node": "^20.19.0 || >=22.12.0",
973
+ "jiti": ">=1.21.0",
974
+ "less": "^4.0.0",
975
+ "lightningcss": "^1.21.0",
976
+ "sass": "^1.70.0",
977
+ "sass-embedded": "^1.70.0",
978
+ "stylus": ">=0.54.8",
979
+ "sugarss": "^5.0.0",
980
+ "terser": "^5.16.0",
981
+ "tsx": "^4.8.1",
982
+ "yaml": "^2.4.2"
983
+ },
984
+ "peerDependenciesMeta": {
985
+ "@types/node": {
986
+ "optional": true
987
+ },
988
+ "jiti": {
989
+ "optional": true
990
+ },
991
+ "less": {
992
+ "optional": true
993
+ },
994
+ "lightningcss": {
995
+ "optional": true
996
+ },
997
+ "sass": {
998
+ "optional": true
999
+ },
1000
+ "sass-embedded": {
1001
+ "optional": true
1002
+ },
1003
+ "stylus": {
1004
+ "optional": true
1005
+ },
1006
+ "sugarss": {
1007
+ "optional": true
1008
+ },
1009
+ "terser": {
1010
+ "optional": true
1011
+ },
1012
+ "tsx": {
1013
+ "optional": true
1014
+ },
1015
+ "yaml": {
1016
+ "optional": true
1017
+ }
1018
+ }
1019
+ }
1020
+ }
1021
+ }
src/package.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "video-background-removal",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "devDependencies": {
12
+ "vite": "^7.1.6"
13
+ },
14
+ "dependencies": {}
15
+ }
src/style.css ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ * {
2
+ box-sizing: border-box;
3
+ padding: 0;
4
+ margin: 0;
5
+ font-family: sans-serif;
6
+ }
7
+
8
+ html,
9
+ body {
10
+ height: 100%;
11
+ }
12
+
13
+ body {
14
+ padding: 16px 32px;
15
+ }
16
+
17
+ body,
18
+ #container {
19
+ display: flex;
20
+ flex-direction: column;
21
+ justify-content: center;
22
+ align-items: center;
23
+ }
24
+
25
+ #controls {
26
+ display: flex;
27
+ padding: 1rem;
28
+ gap: 1rem;
29
+ }
30
+
31
+ #controls > div {
32
+ text-align: center;
33
+ }
34
+
35
+ h1,
36
+ h4 {
37
+ text-align: center;
38
+ }
39
+
40
+ h4 {
41
+ margin-top: 0.5rem;
42
+ }
43
+
44
+ #container {
45
+ position: relative;
46
+ width: 720px;
47
+ height: 405px;
48
+ max-width: 100%;
49
+ max-height: 100%;
50
+ border: 2px dashed #d1d5db;
51
+ border-radius: 0.75rem;
52
+ overflow: hidden;
53
+ margin-top: 1rem;
54
+ background-size: 100% 100%;
55
+ background-position: center;
56
+ background-repeat: no-repeat;
57
+ }
58
+
59
+ #overlay,
60
+ canvas {
61
+ position: absolute;
62
+ width: 100%;
63
+ height: 100%;
64
+ }
65
+
66
+ #status {
67
+ min-height: 16px;
68
+ margin: 8px 0;
69
+ }
70
+
71
+ #video,
72
+ #canvas {
73
+ display: none;
74
+ }
75
+
76
+ #size-container {
77
+ display: none;
78
+ }
79
+
80
+ #show-video-btn {
81
+ position: absolute;
82
+ top: 10px;
83
+ right: 10px;
84
+ z-index: 10;
85
+ background: none;
86
+ border: none;
87
+ cursor: pointer;
88
+ padding: 0;
89
+ }
90
+
91
+ #show-video-btn svg {
92
+ width: 32px;
93
+ height: 32px;
94
+ }
95
+
96
+ a {
97
+ color: rgba(39, 94, 254, 1);
98
+ text-decoration: none;
99
+ }
100
+
101
+ a:hover {
102
+ text-decoration: underline;
103
+ }
104
+
105
+ #versions {
106
+ margin-top: 0.5rem;
107
+ font-size: 0.8rem;
108
+ color: rgba(0, 0, 0, 0.3);
109
+ }
src/vite.config.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from "vite";
2
+ export default defineConfig({
3
+ build: {
4
+ target: "esnext",
5
+ outDir: '../',
6
+ }
7
+ });