humanish 0.145.0 → 0.147.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/dist/actors/computer-use/loop/spend.js +5 -4
- package/dist/actors/computer-use/loop/trace.js +3 -0
- package/dist/actors/computer-use/loop/types.d.ts +5 -0
- package/dist/actors/computer-use/loop/usage.js +10 -2
- package/dist/actors/computer-use/openai-conversation.d.ts +7 -0
- package/dist/actors/computer-use/openai-conversation.js +19 -2
- package/dist/actors/computer-use/openai-provider.d.ts +2 -0
- package/dist/actors/computer-use/openai-provider.js +2 -0
- package/dist/actors/computer-use/openai-wire.d.ts +4 -0
- package/dist/actors/computer-use/openai-wire.js +9 -1
- package/dist/actors/contract.d.ts +5 -0
- package/dist/analysis/admission.d.ts +8 -3
- package/dist/analysis/admission.js +7 -3
- package/dist/analysis/automatic-config.js +2 -1
- package/dist/analysis/automatic.js +2 -2
- package/dist/analysis/evidence.js +8 -4
- package/dist/analysis/execute.d.ts +7 -10
- package/dist/analysis/execute.js +79 -49
- package/dist/analysis/image-tokens.js +9 -3
- package/dist/analysis/output-limit.d.ts +12 -0
- package/dist/analysis/output-limit.js +34 -0
- package/dist/analysis/output-retry.d.ts +20 -0
- package/dist/analysis/output-retry.js +63 -0
- package/dist/analysis/provider.d.ts +1 -1
- package/dist/analysis/provider.js +3 -3
- package/dist/analysis/responses.js +1 -1
- package/dist/analysis/service.js +2 -2
- package/dist/cli/commands/analyze.js +1 -1
- package/dist/cli/io.js +2 -0
- package/dist/cli/run-findings.js +10 -2
- package/dist/evidence/image.d.ts +2 -0
- package/dist/evidence/image.js +24 -3
- package/dist/evidence/webp-encode-worker.d.ts +1 -0
- package/dist/evidence/webp-encode-worker.js +31 -0
- package/dist/evidence/webp-transcoder.d.ts +15 -0
- package/dist/evidence/webp-transcoder.js +98 -0
- package/dist/evidence/webp.d.ts +31 -0
- package/dist/evidence/webp.js +94 -0
- package/dist/feedback/derivative-text.d.ts +7 -2
- package/dist/feedback/derivative-text.js +20 -1
- package/dist/feedback/export-bundle.js +79 -25
- package/dist/observer-app.html +1 -1
- package/dist/remote/launch.js +93 -48
- package/dist/remote/runner.d.ts +47 -14
- package/dist/remote/runner.js +199 -64
- package/dist/routes/computer-use/e2b-desktop/desktop.js +47 -7
- package/dist/routes/computer-use/e2b-desktop/prepare.d.ts +4 -2
- package/dist/routes/computer-use/e2b-desktop/prepare.js +4 -2
- package/dist/routes/computer-use/e2b-desktop/start.d.ts +14 -6
- package/dist/routes/computer-use/e2b-desktop/start.js +72 -34
- package/dist/routes/computer-use/participant-execution.d.ts +0 -7
- package/dist/routes/computer-use/participant-execution.js +6 -28
- package/dist/routes/computer-use/participant-frames.d.ts +32 -0
- package/dist/routes/computer-use/participant-frames.js +93 -0
- package/dist/routes/computer-use/participant-model.js +3 -0
- package/dist/routes/computer-use/participant-runs.js +4 -0
- package/dist/routes/computer-use/plan.js +5 -1
- package/dist/routes/computer-use/result.js +6 -0
- package/dist/routes/computer-use/types.d.ts +4 -0
- package/dist/routes/shared-world/plan.js +4 -1
- package/dist/run/pricing.d.ts +7 -0
- package/dist/run/pricing.js +58 -15
- package/dist/study/config.js +4 -1
- package/dist/study/keys.d.ts +1 -0
- package/dist/study/keys.js +1 -0
- package/dist/study/parse/actors.js +5 -0
- package/dist/study/plan-participants.d.ts +2 -0
- package/dist/study/plan-participants.js +2 -0
- package/dist/study/types.d.ts +7 -0
- package/dist/study/validation.d.ts +5 -0
- package/dist/study/validation.js +23 -0
- package/dist/substrates/e2b/cdp-probe.d.ts +16 -1
- package/dist/substrates/e2b/cdp-probe.js +67 -5
- package/dist/substrates/e2b/desktop-browser.js +4 -2
- package/dist/substrates/e2b/desktop-cdp.d.ts +9 -2
- package/dist/substrates/e2b/desktop-cdp.js +26 -4
- package/dist/verify/artifacts.js +2 -1
- package/docs/contracts/run-bundle.md +29 -11
- package/docs/contracts/schemas.md +20 -12
- package/docs/contracts/study-analysis.md +64 -11
- package/docs/product/automatic-analysis.md +9 -6
- package/package.json +6 -5
|
@@ -62,7 +62,10 @@ function updateScreenshotDeclarations(value, imagePaths) {
|
|
|
62
62
|
if (typeof ref.path !== "string" || !imagePaths.has(ref.path)) {
|
|
63
63
|
throw new Error("Actor screenshot reference must resolve to a PNG transformed from this run's inventory.");
|
|
64
64
|
}
|
|
65
|
-
return {
|
|
65
|
+
return {
|
|
66
|
+
...entry,
|
|
67
|
+
screenshotRef: { ...ref, path: imagePaths.get(ref.path), redaction: "blurred" },
|
|
68
|
+
};
|
|
66
69
|
});
|
|
67
70
|
}
|
|
68
71
|
}
|
|
@@ -120,11 +123,27 @@ export function derivedBundle(bundle, imagePaths) {
|
|
|
120
123
|
status: "passed",
|
|
121
124
|
notes: `${bundle.redaction.notes} Exported copy: screenshots were blurred during export; the original capture is retained separately. See derivation.json.`,
|
|
122
125
|
};
|
|
126
|
+
// Only a path whose output differs is rewritten; every other cite keeps its exact spelling.
|
|
127
|
+
const renamed = (cite) => {
|
|
128
|
+
const output = imagePaths.get(path.posix.normalize(cite));
|
|
129
|
+
return output !== undefined && output !== path.posix.normalize(cite) ? output : cite;
|
|
130
|
+
};
|
|
123
131
|
for (const stream of transformed.streams) {
|
|
132
|
+
// The stream's latest frame, as the Observer embeds it and its UI state names it.
|
|
133
|
+
if (stream.embed?.kind === "screenshot" && stream.embed.url !== undefined)
|
|
134
|
+
stream.embed.url = renamed(stream.embed.url);
|
|
135
|
+
if (stream.ui?.screenshotUrl !== undefined)
|
|
136
|
+
stream.ui.screenshotUrl = renamed(stream.ui.screenshotUrl);
|
|
124
137
|
for (const artifact of stream.artifacts) {
|
|
138
|
+
artifact.path = renamed(artifact.path);
|
|
125
139
|
if (artifact.kind === "screenshot")
|
|
126
140
|
artifact.label = artifact.label.replace(/\((raw|blurred)\)/g, "(blurred at export)");
|
|
127
141
|
}
|
|
128
142
|
}
|
|
143
|
+
for (const candidate of transformed.feedbackCandidates)
|
|
144
|
+
for (const evidence of candidate.evidence)
|
|
145
|
+
evidence.path = renamed(evidence.path);
|
|
146
|
+
for (const artifact of transformed.adapterArtifacts ?? [])
|
|
147
|
+
artifact.path = renamed(artifact.path);
|
|
129
148
|
return transformed;
|
|
130
149
|
}
|
|
@@ -7,7 +7,11 @@ import { tmpdir } from "node:os";
|
|
|
7
7
|
import { renderObserver } from "../observer/render.js";
|
|
8
8
|
import { inventorySandboxIds, publicSandboxView, scrubSandboxIdBytes } from "../run/sandbox-ids.js";
|
|
9
9
|
import { splitStreamTraces } from "../run/stream-trace.js";
|
|
10
|
+
import { PNG } from "pngjs";
|
|
11
|
+
import { imageDimensionsError } from "../evidence/image.js";
|
|
10
12
|
import { redactScreenshot, redactText } from "../evidence/redaction.js";
|
|
13
|
+
import { readingsOf } from "../evidence/encoded-text.js";
|
|
14
|
+
import { decodeWebp, webpStructure } from "../evidence/webp.js";
|
|
11
15
|
import { assertRewritableNumbers, derivedBundle, jsonBytes, transformText, } from "./derivative-text.js";
|
|
12
16
|
import { streamScreenshotPaths } from "../verify/artifacts.js";
|
|
13
17
|
import { runEntryLimit } from "../verify/scan-limit.js";
|
|
@@ -146,7 +150,7 @@ async function prospectivePhysicalPath(requested) {
|
|
|
146
150
|
return path.join(await prospectivePhysicalPath(parent), path.basename(requested));
|
|
147
151
|
}
|
|
148
152
|
}
|
|
149
|
-
function assertFeedbackReferences(bundle, source) {
|
|
153
|
+
function assertFeedbackReferences(bundle, source, imagePaths) {
|
|
150
154
|
const retained = new Set(source.files.filter((file) => omittedReason(file.path) === undefined).map((file) => file.path));
|
|
151
155
|
retained.add("observer/index.html");
|
|
152
156
|
retained.add("observer/observer-data.json");
|
|
@@ -154,14 +158,16 @@ function assertFeedbackReferences(bundle, source) {
|
|
|
154
158
|
for (const evidence of candidate.evidence) {
|
|
155
159
|
if (!retained.has(evidence.path))
|
|
156
160
|
throw new Error("Feedback evidence must resolve to a retained or regenerated artifact in the derivative.");
|
|
157
|
-
if (evidence.kind === "screenshot" &&
|
|
161
|
+
if (evidence.kind === "screenshot" &&
|
|
162
|
+
path.extname(imagePaths.get(evidence.path) ?? evidence.path).toLowerCase() !== ".png") {
|
|
158
163
|
throw new Error("Feedback screenshot evidence must resolve to a transformed PNG.");
|
|
159
164
|
}
|
|
160
165
|
}
|
|
161
166
|
}
|
|
162
167
|
}
|
|
163
|
-
|
|
164
|
-
|
|
168
|
+
const IMAGE_EXTENSIONS = new Set([".png", ".webp"]);
|
|
169
|
+
/** Image paths that run.json cites outside actor traces: feedback, adapter and stream artifacts. */
|
|
170
|
+
function citedImagePaths(bundle) {
|
|
165
171
|
const cited = [
|
|
166
172
|
...bundle.feedbackCandidates.flatMap((candidate) => candidate.evidence.map(({ path }) => path)),
|
|
167
173
|
...(bundle.adapterArtifacts ?? []).map((artifact) => artifact.path),
|
|
@@ -169,25 +175,38 @@ function citedPngPaths(bundle) {
|
|
|
169
175
|
];
|
|
170
176
|
return new Set(cited
|
|
171
177
|
.map((cite) => path.posix.normalize(cite))
|
|
172
|
-
.filter((cite) => path.extname(cite).toLowerCase()
|
|
178
|
+
.filter((cite) => IMAGE_EXTENSIONS.has(path.extname(cite).toLowerCase())));
|
|
173
179
|
}
|
|
174
180
|
/**
|
|
175
|
-
* The
|
|
176
|
-
*
|
|
177
|
-
*
|
|
181
|
+
* The images the derivative keeps, each with the path the copy holds it at: a PNG at its own path,
|
|
182
|
+
* a WebP frame at the same path ending .png, since a blurred frame is a PNG. verify cannot read an
|
|
183
|
+
* image, so only one an actor trace registers as a stream screenshot can be share_ready. An image
|
|
184
|
+
* nothing cites is dropped; one that other evidence cites refuses the export, since dropping it
|
|
185
|
+
* would change that evidence.
|
|
178
186
|
*/
|
|
179
|
-
function
|
|
187
|
+
function keptImagePaths(source, bundle) {
|
|
180
188
|
const streamShots = streamScreenshotPaths(bundle);
|
|
181
|
-
const cited =
|
|
182
|
-
const
|
|
189
|
+
const cited = citedImagePaths(bundle);
|
|
190
|
+
const present = new Set(source.files.map((file) => file.path));
|
|
191
|
+
const kept = new Map();
|
|
192
|
+
const outputs = new Set();
|
|
183
193
|
for (const file of source.files) {
|
|
184
|
-
|
|
194
|
+
const extension = path.extname(file.path).toLowerCase();
|
|
195
|
+
if (!IMAGE_EXTENSIONS.has(extension))
|
|
185
196
|
continue;
|
|
186
|
-
// A file that only claims to be
|
|
187
|
-
if (!file.bytes.subarray(0, 8).equals(PNG_MAGIC))
|
|
197
|
+
// A file that only claims to be an image may conceal a payload; refuse it rather than drop it.
|
|
198
|
+
if (extension === ".png" && !file.bytes.subarray(0, 8).equals(PNG_MAGIC))
|
|
188
199
|
throw new Error("PNG artifact has invalid signature.");
|
|
200
|
+
if (extension === ".webp" && webpStructure(file.bytes).error !== null)
|
|
201
|
+
throw new Error(`WebP artifact ${file.path} is not a lossless WebP frame.`);
|
|
189
202
|
if (streamShots.has(file.path)) {
|
|
190
|
-
|
|
203
|
+
const output = extension === ".webp" ? `${file.path.slice(0, -extension.length)}.png` : file.path;
|
|
204
|
+
if (output !== file.path && present.has(output))
|
|
205
|
+
throw new Error(`${file.path} would be blurred to ${output}, which the run already holds; export refuses to overwrite it.`);
|
|
206
|
+
if (outputs.has(output))
|
|
207
|
+
throw new Error(`Two frames would be exported as ${output}.`);
|
|
208
|
+
outputs.add(output);
|
|
209
|
+
kept.set(file.path, output);
|
|
191
210
|
}
|
|
192
211
|
else if (cited.has(file.path)) {
|
|
193
212
|
throw new Error(`Evidence cites ${file.path}, an image that is not a stream screenshot; verify cannot read it, so no export of this run can be share_ready.`);
|
|
@@ -195,9 +214,21 @@ function keptPngPaths(source, bundle) {
|
|
|
195
214
|
}
|
|
196
215
|
return kept;
|
|
197
216
|
}
|
|
217
|
+
/** A WebP frame as the PNG redactScreenshot reads, after the same pixel cap a PNG meets. */
|
|
218
|
+
async function webpAsPng(bytes) {
|
|
219
|
+
const structure = webpStructure(bytes);
|
|
220
|
+
const refusal = structure.error ??
|
|
221
|
+
imageDimensionsError("WebP", structure.dimensions.width, structure.dimensions.height);
|
|
222
|
+
if (refusal !== null)
|
|
223
|
+
throw new Error(`WebP artifact could not be decoded safely: ${refusal}.`);
|
|
224
|
+
const image = await decodeWebp(bytes);
|
|
225
|
+
const png = new PNG({ width: image.width, height: image.height });
|
|
226
|
+
image.data.copy(png.data);
|
|
227
|
+
return PNG.sync.write(png);
|
|
228
|
+
}
|
|
198
229
|
async function writeDerivative(source, stagePaths, bundle) {
|
|
199
230
|
const entries = [];
|
|
200
|
-
const imagePaths =
|
|
231
|
+
const imagePaths = keptImagePaths(source, bundle);
|
|
201
232
|
const sandboxIds = inventorySandboxIds(source.files);
|
|
202
233
|
// run.json and each trace file come from one rewritten bundle, so each trace's index binds the
|
|
203
234
|
// bytes written here. A v1 source is written as v2.
|
|
@@ -206,11 +237,25 @@ async function writeDerivative(source, stagePaths, bundle) {
|
|
|
206
237
|
["run.json", jsonBytes(derived.bundle)],
|
|
207
238
|
...derived.files.map((file) => [file.path, file.bytes]),
|
|
208
239
|
]);
|
|
240
|
+
// A file that still names a WebP frame would cite a frame the copy lacks. Its file name is
|
|
241
|
+
// matched in every reading verify decodes (escapes, percent-encoding), so an alias such as
|
|
242
|
+
// `screenshots/./frame.webp` or `%66rame.webp` is caught too.
|
|
243
|
+
const renamedNames = [...imagePaths]
|
|
244
|
+
.filter(([from, to]) => from !== to)
|
|
245
|
+
.map(([from]) => path.posix.basename(from).toLowerCase());
|
|
246
|
+
const assertNoRenamedSource = (relative, bytes) => {
|
|
247
|
+
if (renamedNames.length === 0)
|
|
248
|
+
return;
|
|
249
|
+
const readings = readingsOf(bytes.toString("utf8")).map((reading) => reading.toLowerCase());
|
|
250
|
+
const named = renamedNames.find((name) => readings.some((reading) => reading.includes(name)));
|
|
251
|
+
if (named !== undefined)
|
|
252
|
+
throw new Error(`${relative} names ${named}, a WebP frame the copy holds as a blurred PNG; export cannot rewrite that reference.`);
|
|
253
|
+
};
|
|
209
254
|
let images = 0;
|
|
210
255
|
for (const file of source.files) {
|
|
211
|
-
const
|
|
256
|
+
const isImage = IMAGE_EXTENSIONS.has(path.extname(file.path).toLowerCase());
|
|
212
257
|
const reason = omittedReason(file.path) ??
|
|
213
|
-
(
|
|
258
|
+
(isImage && !imagePaths.has(file.path)
|
|
214
259
|
? "unreferenced image: nothing cites it and verify cannot read it"
|
|
215
260
|
: undefined);
|
|
216
261
|
if (reason) {
|
|
@@ -220,10 +265,11 @@ async function writeDerivative(source, stagePaths, bundle) {
|
|
|
220
265
|
const extension = path.extname(file.path).toLowerCase();
|
|
221
266
|
let bytes;
|
|
222
267
|
let action;
|
|
223
|
-
|
|
224
|
-
|
|
268
|
+
const outputPath = imagePaths.get(file.path) ?? file.path;
|
|
269
|
+
if (extension === ".png" || extension === ".webp") {
|
|
270
|
+
if (extension === ".png" && !file.bytes.subarray(0, 8).equals(PNG_MAGIC))
|
|
225
271
|
throw new Error("PNG artifact has invalid signature.");
|
|
226
|
-
const redacted = redactScreenshot(file.bytes);
|
|
272
|
+
const redacted = redactScreenshot(extension === ".webp" ? await webpAsPng(file.bytes) : file.bytes);
|
|
227
273
|
if (!redacted.decoded)
|
|
228
274
|
throw new Error("PNG artifact could not be decoded safely; export refuses a placeholder.");
|
|
229
275
|
bytes = redacted.buffer;
|
|
@@ -232,7 +278,7 @@ async function writeDerivative(source, stagePaths, bundle) {
|
|
|
232
278
|
}
|
|
233
279
|
else {
|
|
234
280
|
if (!TEXT_EXTENSIONS.has(extension))
|
|
235
|
-
throw new Error(`Unsupported artifact format ${extension || "(no extension)"}; bundle export supports PNG and UTF-8 text only.`);
|
|
281
|
+
throw new Error(`Unsupported artifact format ${extension || "(no extension)"}; bundle export supports PNG, lossless WebP frames and UTF-8 text only.`);
|
|
236
282
|
bytes = transformText(file, imagePaths);
|
|
237
283
|
const rewritten = derivedFiles.get(file.path);
|
|
238
284
|
if (rewritten !== undefined) {
|
|
@@ -241,16 +287,24 @@ async function writeDerivative(source, stagePaths, bundle) {
|
|
|
241
287
|
derivedFiles.delete(file.path);
|
|
242
288
|
}
|
|
243
289
|
bytes = scrubSandboxIdBytes(file.path, bytes, sandboxIds);
|
|
290
|
+
assertNoRenamedSource(file.path, bytes);
|
|
244
291
|
action = bytes.equals(file.bytes) ? "copied" : "updated";
|
|
245
292
|
}
|
|
246
|
-
await writeContainedOutputFile(stagePaths,
|
|
247
|
-
entries.push({
|
|
293
|
+
await writeContainedOutputFile(stagePaths, outputPath, bytes);
|
|
294
|
+
entries.push({
|
|
295
|
+
path: file.path,
|
|
296
|
+
...(outputPath === file.path ? {} : { outputPath }),
|
|
297
|
+
sourceSha256: file.sha256,
|
|
298
|
+
outputSha256: hash(bytes),
|
|
299
|
+
action,
|
|
300
|
+
});
|
|
248
301
|
}
|
|
249
302
|
// A v1 source stream with no actor trace file gets one; its content came from run.json.
|
|
250
303
|
const runJson = source.files.find((file) => file.path === "run.json");
|
|
251
304
|
for (const [relative, bytes] of derivedFiles) {
|
|
252
305
|
if (relative === "run.json" || runJson === undefined)
|
|
253
306
|
continue;
|
|
307
|
+
assertNoRenamedSource(relative, bytes);
|
|
254
308
|
await writeContainedOutputFile(stagePaths, relative, bytes);
|
|
255
309
|
entries.push({
|
|
256
310
|
path: relative,
|
|
@@ -419,7 +473,7 @@ async function verifyFrozenSource(workspace, source, runId) {
|
|
|
419
473
|
if (bundle.runId !== runId)
|
|
420
474
|
throw new Error("Source run identity does not match its directory.");
|
|
421
475
|
assertFinished(bundle);
|
|
422
|
-
assertFeedbackReferences(bundle, source);
|
|
476
|
+
assertFeedbackReferences(bundle, source, keptImagePaths(source, bundle));
|
|
423
477
|
await removeOwnedDirectory(rawSnapshot, true);
|
|
424
478
|
workspace.rawSnapshot = undefined;
|
|
425
479
|
return { bundle };
|
package/dist/observer-app.html
CHANGED
|
@@ -61,7 +61,7 @@ SOFTWARE.
|
|
|
61
61
|
} catch (e) {}
|
|
62
62
|
})();
|
|
63
63
|
</script>
|
|
64
|
-
<script type="module" crossorigin>var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.for(`react.view_transition`),m=Symbol.iterator;function h(e){return typeof e!=`object`||!e?null:(e=m&&e[m]||e[`@@iterator`],typeof e==`function`?e:null)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function y(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function b(){}b.prototype=y.prototype;function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}var S=x.prototype=new b;S.constructor=x,_(S,y.prototype),S.isPureReactComponent=!0;var C=Array.isArray;function w(){}var T={H:null,A:null,T:null,S:null},E=Object.prototype.hasOwnProperty;function D(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function O(e,t){return D(e.type,t,e.props)}function k(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function A(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var j=/\/+/g;function M(e,t){return typeof e==`object`&&e&&e.key!=null?A(``+e.key):t.toString(36)}function N(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(w,w):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function P(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,P(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+M(e,0):a,C(o)?(i=``,c!=null&&(i=c.replace(j,`$&/`)+`/`),P(o,r,i,``,function(e){return e})):o!=null&&(k(o)&&(o=O(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(j,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(C(e))for(var u=0;u<e.length;u++)a=e[u],s=l+M(a,u),c+=P(a,r,i,s,o);else if(u=h(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+M(a,u++),c+=P(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return P(N(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function F(e,t,n){if(e==null)return e;var r=[],i=0;return P(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function I(e){if(e._status===-1){var t=e._result,n=t();n.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t,n.status===void 0&&(n.status=`fulfilled`,n.value=t))},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t,n.status===void 0&&(n.status=`rejected`,n.reason=t))}),e._status===-1&&(e._status=0,e._result=n)}if(e._status===1)return e._result.default;throw e._result}var L=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)};function R(e){var t=T.T,n={};n.types=t===null?null:t.types,T.T=n;try{var r=e(),i=T.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(w,L)}catch(e){L(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),T.T=t}}function z(e){var t=T.T;if(t!==null){var n=t.types;n===null?t.types=[e]:n.indexOf(e)===-1&&n.push(e)}else R(z.bind(null,e))}var B={map:F,forEach:function(e,t,n){F(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return F(e,function(){t++}),t},toArray:function(e){return F(e,function(e){return e})||[]},only:function(e){if(!k(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=B,e.Component=y,e.Fragment=r,e.Profiler=a,e.PureComponent=x,e.StrictMode=i,e.Suspense=l,e.ViewTransition=p,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=T,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return T.H.useMemoCache(e)}},e.addTransitionType=z,e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=_({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!E.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return D(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)E.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return D(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=k,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:I}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=R,e.unstable_useCacheRefresh=function(){return T.H.useCacheRefresh()},e.use=function(e){return T.H.use(e)},e.useActionState=function(e,t,n){return T.H.useActionState(e,t,n)},e.useCallback=function(e,t){return T.H.useCallback(e,t)},e.useContext=function(e){return T.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return T.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return T.H.useEffect(e,t)},e.useEffectEvent=function(e){return T.H.useEffectEvent(e)},e.useId=function(){return T.H.useId()},e.useImperativeHandle=function(e,t,n){return T.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return T.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return T.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return T.H.useMemo(e,t)},e.useOptimistic=function(e,t){return T.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return T.H.useReducer(e,t,n)},e.useRef=function(e){return T.H.useRef(e)},e.useState=function(e){return T.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return T.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return T.H.useTransition()},e.version=`19.3.0`})),u=o(((e,t)=>{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0<n;){var r=n-1>>>1,a=e[r];if(0<i(a,t))e[r]=t,e[n]=a,n=r;else break a}}function n(e){return e.length===0?null:e[0]}function r(e){if(e.length===0)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;a:for(var r=0,a=e.length,o=a>>>1;r<o;){var s=2*(r+1)-1,c=e[s],l=s+1,u=e[l];if(0>i(c,n))l<a&&0>i(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(l<a&&0>i(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&j(x,t.startTime-e)}}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-T<w)}function D(){if(g=!1,S){var t=e.unstable_now();T=t;var i=!0;try{a:{m=!1,h&&(h=!1,v(C),C=-1),p=!0;var a=f;try{b:{for(b(t),d=n(c);d!==null&&!(d.expirationTime>t&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&j(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var k=new MessageChannel,A=k.port2;k.port1.onmessage=D,O=function(){A.postMessage(null)}}else O=function(){_(D,0)};function j(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125<e?console.error(`forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported`):w=0<e?Math.floor(1e3/e):5},e.unstable_getCurrentPriorityLevel=function(){return f},e.unstable_next=function(e){switch(f){case 1:case 2:case 3:var t=3;break;default:t=f}var n=f;f=t;try{return e()}finally{f=n}},e.unstable_requestPaint=function(){g=!0},e.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=f;f=e;try{return t()}finally{f=n}},e.unstable_scheduleCallback=function(r,i,a){var o=e.unstable_now();switch(typeof a==`object`&&a?(a=a.delay,a=typeof a==`number`&&0<a?o+a:o):a=o,r){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return s=a+s,r={id:u++,callback:i,priorityLevel:r,startTime:a,expirationTime:s,sortIndex:-1},a>o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,j(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function r(){}var i={d:{f:r,r:function(){throw Error(n(522))},D:r,C:r,L:r,m:r,X:r,S:r,M:r},p:0,findDOMNode:null},a=Symbol.for(`react.portal`),o=Symbol.for(`react.recoverable`),s=Symbol.for(`react.optimistic_key`);function c(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:a,key:r==null?null:r===s?s:``+r,children:e,containerInfo:t,implementation:n}}var l=t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function d(e,t){if(e===`font`)return``;if(typeof t==`string`)return t===`use-credentials`?t:``}e.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=i,e.browser=function(e){return{$$typeof:o,_reason:e}},e.createPortal=function(e,t){var r=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)throw Error(n(299));return c(e,t,null,r)},e.flushSync=function(e){var t=l.T,n=i.p;try{if(l.T=null,i.p=2,e)return e()}finally{l.T=t,i.p=n,i.d.f()}},e.preconnect=function(e,t){typeof e==`string`&&(t?(t=t.crossOrigin,t=typeof t==`string`?t===`use-credentials`?t:``:void 0):t=null,i.d.C(e,t))},e.prefetchDNS=function(e){typeof e==`string`&&i.d.D(e)},e.preinit=function(e,t){if(typeof e==`string`&&t&&typeof t.as==`string`){var n=t.as,r=d(n,t.crossOrigin),a=typeof t.integrity==`string`?t.integrity:void 0,o=typeof t.fetchPriority==`string`?t.fetchPriority:void 0;n===`style`?i.d.S(e,typeof t.precedence==`string`?t.precedence:void 0,{crossOrigin:r,integrity:a,fetchPriority:o}):n===`script`&&i.d.X(e,{crossOrigin:r,integrity:a,fetchPriority:o,nonce:typeof t.nonce==`string`?t.nonce:void 0})}},e.preinitModule=function(e,t){if(typeof e==`string`){if(typeof t==`object`&&t){if(t.as==null||t.as===`script`){var n=d(t.as,t.crossOrigin);i.d.M(e,{crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0})}}else t??i.d.M(e)}},e.preload=function(e,t){if(typeof e==`string`&&typeof t==`object`&&t&&typeof t.as==`string`){var n=t.as,r=d(n,t.crossOrigin);i.d.L(e,n,{crossOrigin:r,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,type:typeof t.type==`string`?t.type:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0,referrerPolicy:typeof t.referrerPolicy==`string`?t.referrerPolicy:void 0,imageSrcSet:typeof t.imageSrcSet==`string`?t.imageSrcSet:void 0,imageSizes:typeof t.imageSizes==`string`?t.imageSizes:void 0,media:typeof t.media==`string`?t.media:void 0})}},e.preloadModule=function(e,t){if(typeof e==`string`){if(t){var n=d(t.as,t.crossOrigin);i.d.m(e,{as:typeof t.as==`string`&&t.as!==`script`?t.as:void 0,crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0})}else i.d.m(e)}},e.requestFormReset=function(e){i.d.r(e)},e.unstable_batchedUpdates=function(e,t){return e(t)},e.useFormState=function(e,t,n){return l.H.useFormState(e,t,n)},e.useFormStatus=function(){return l.H.useHostTransitionStatus()},e.version=`19.3.0`})),m=o(((e,t)=>{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function a(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function o(e){for(var t=e,n=t;n&&!n.alternate;)t=n,t.flags&4098&&(e=t.return),n=t.return;for(;t.return;)t=t.return;return t.tag===3?e:null}function s(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function c(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function l(e){if(o(e)!==e)throw Error(i(188))}function d(e){var t=e.alternate;if(!t){if(t=o(e),t===null)throw Error(i(188));return t===e?e:null}for(var n=e,r=t;;){var a=n.return;if(a===null)break;var s=a.alternate;if(s===null){if(r=a.return,r!==null){n=r;continue}break}if(a.child===s.child){for(s=a.child;s;){if(s===n)return l(a),e;if(s===r)return l(a),t;s=s.sibling}throw Error(i(188))}if(n.return!==r.return)n=a,r=s;else{for(var c=!1,u=a.child;u;){if(u===n){c=!0,n=a,r=s;break}if(u===r){c=!0,r=a,n=s;break}u=u.sibling}if(!c){for(u=s.child;u;){if(u===n){c=!0,n=s,r=a;break}if(u===r){c=!0,r=s,n=a;break}u=u.sibling}if(!c)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(n.tag!==3)throw Error(i(188));return n.stateNode.current===n?e:t}function p(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=p(e),t!==null)return t;e=e.sibling}return null}function h(e,t,n,r,i,a){for(;e!==null;){if((e.tag===5||e.tag===27||e.tag===6)&&n(e,r,i,a)||(e.tag!==22||e.memoizedState===null)&&(t||e.tag!==5&&e.tag!==27)&&h(e.child,t,n,r,i,a))return!0;e=e.sibling}return!1}function g(e){for(e=e.return;e!==null;){if(e.tag===3||e.tag===5||e.tag===27)return e;e=e.return}return null}function _(e){var t=!1;for(e=e.return;e!==null&&(e.tag===4&&(t=!0),e.tag!==3&&e.tag!==5&&e.tag!==27);)e=e.return;return t}function v(e){var t=[null,null],n=g(e);return n===null||y(t,e,n.child,{foundSelf:!1}),t}function y(e,t,n,r){for(;n!==null;){if(n===t)r.foundSelf=!0;else if(n.tag===5||n.tag===27||n.tag===6){if(r.foundSelf)return e[1]=n,!0;e[0]=n}else if((n.tag!==22||n.memoizedState===null)&&y(e,t,n.child,r))return!0;n=n.sibling}return!1}function b(e){switch(e.tag){case 5:case 27:case 6:return e.stateNode;case 3:return e.stateNode.containerInfo;default:throw Error(i(559))}}var x=null,S=null;function C(e,t,n){return e===n||e===t&&(x=e,!0)}function w(e,t,n){return e===n?(S=e,!1):e===t&&(S!==null&&(x=e),!0)}function T(e){if(e===null)return null;do e=e===null?null:e.return;while(e&&e.tag!==5&&e.tag!==27&&e.tag!==3);return e||null}function E(e,t,n){for(var r=0,i=e;i;i=n(i))r++;i=0;for(var a=t;a;a=n(a))i++;for(;0<r-i;)e=n(e),r--;for(;0<i-r;)t=n(t),i--;for(;r--;){if(e===t||t!==null&&e===t.alternate)return e;e=n(e),t=n(t)}return null}var D=Object.assign,O=Symbol.for(`react.element`),k=Symbol.for(`react.transitional.element`),A=Symbol.for(`react.portal`),j=Symbol.for(`react.fragment`),M=Symbol.for(`react.strict_mode`),N=Symbol.for(`react.profiler`),P=Symbol.for(`react.consumer`),F=Symbol.for(`react.context`),I=Symbol.for(`react.forward_ref`),L=Symbol.for(`react.suspense`),R=Symbol.for(`react.suspense_list`),z=Symbol.for(`react.memo`),B=Symbol.for(`react.lazy`),V=Symbol.for(`react.activity`),ee=Symbol.for(`react.legacy_hidden`),te=Symbol.for(`react.memo_cache_sentinel`),ne=Symbol.for(`react.view_transition`),H=Symbol.for(`react.recoverable`),re=Symbol.iterator;function ie(e){return typeof e!=`object`||!e?null:(e=re&&e[re]||e[`@@iterator`],typeof e==`function`?e:null)}var ae=Symbol.for(`react.client.reference`);function oe(e){if(e==null)return null;if(typeof e==`function`)return e.$$typeof===ae?null:e.displayName||e.name||null;if(typeof e==`string`)return e;switch(e){case j:return`Fragment`;case N:return`Profiler`;case M:return`StrictMode`;case L:return`Suspense`;case R:return`SuspenseList`;case V:return`Activity`;case ne:return`ViewTransition`}if(typeof e==`object`)switch(e.$$typeof){case A:return`Portal`;case F:return e.displayName||`Context`;case P:return(e._context.displayName||`Context`)+`.Consumer`;case I:var t=e.render;return e=e.displayName,e||=(e=t.displayName||t.name||``,e===``?`ForwardRef`:`ForwardRef(`+e+`)`),e;case z:return t=e.displayName||null,t===null?oe(e.type)||`Memo`:t;case B:t=e._payload,e=e._init;try{return oe(e(t))}catch{}}return null}var se=Array.isArray,U=n.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,ce=r.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,le={pending:!1,data:null,method:null,action:null},ue=[],de=-1;function fe(e){return{current:e}}function pe(e){0>de||(e.current=ue[de],ue[de]=null,de--)}function W(e,t){de++,ue[de]=e.current,e.current=t}var me=fe(null),he=fe(null),ge=fe(null),_e=fe(null);function ve(e,t){switch(W(ge,t),W(he,e),W(me,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?up(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=up(t),e=dp(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}pe(me),W(me,e)}function ye(){pe(me),pe(he),pe(ge)}function be(e){var t=e.memoizedState;t!==null&&(sh._currentValue=t.memoizedState,W(_e,e)),t=me.current;var n=dp(t,e.type);t!==n&&(W(he,e),W(me,n))}function xe(e){he.current===e&&(pe(me),pe(he)),_e.current===e&&(pe(_e),sh._currentValue=le)}var Se,Ce;function we(e){if(Se===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Se=t&&t[1]||``,Ce=-1<e.stack.indexOf(`
|
|
64
|
+
<script type="module" crossorigin>var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.for(`react.view_transition`),m=Symbol.iterator;function h(e){return typeof e!=`object`||!e?null:(e=m&&e[m]||e[`@@iterator`],typeof e==`function`?e:null)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function y(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function b(){}b.prototype=y.prototype;function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}var S=x.prototype=new b;S.constructor=x,_(S,y.prototype),S.isPureReactComponent=!0;var C=Array.isArray;function w(){}var T={H:null,A:null,T:null,S:null},E=Object.prototype.hasOwnProperty;function D(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function O(e,t){return D(e.type,t,e.props)}function k(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function A(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var j=/\/+/g;function M(e,t){return typeof e==`object`&&e&&e.key!=null?A(``+e.key):t.toString(36)}function N(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(w,w):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function P(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,P(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+M(e,0):a,C(o)?(i=``,c!=null&&(i=c.replace(j,`$&/`)+`/`),P(o,r,i,``,function(e){return e})):o!=null&&(k(o)&&(o=O(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(j,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(C(e))for(var u=0;u<e.length;u++)a=e[u],s=l+M(a,u),c+=P(a,r,i,s,o);else if(u=h(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+M(a,u++),c+=P(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return P(N(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function F(e,t,n){if(e==null)return e;var r=[],i=0;return P(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function I(e){if(e._status===-1){var t=e._result,n=t();n.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t,n.status===void 0&&(n.status=`fulfilled`,n.value=t))},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t,n.status===void 0&&(n.status=`rejected`,n.reason=t))}),e._status===-1&&(e._status=0,e._result=n)}if(e._status===1)return e._result.default;throw e._result}var L=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)};function R(e){var t=T.T,n={};n.types=t===null?null:t.types,T.T=n;try{var r=e(),i=T.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(w,L)}catch(e){L(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),T.T=t}}function z(e){var t=T.T;if(t!==null){var n=t.types;n===null?t.types=[e]:n.indexOf(e)===-1&&n.push(e)}else R(z.bind(null,e))}var B={map:F,forEach:function(e,t,n){F(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return F(e,function(){t++}),t},toArray:function(e){return F(e,function(e){return e})||[]},only:function(e){if(!k(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=B,e.Component=y,e.Fragment=r,e.Profiler=a,e.PureComponent=x,e.StrictMode=i,e.Suspense=l,e.ViewTransition=p,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=T,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return T.H.useMemoCache(e)}},e.addTransitionType=z,e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=_({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!E.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return D(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)E.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return D(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=k,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:I}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=R,e.unstable_useCacheRefresh=function(){return T.H.useCacheRefresh()},e.use=function(e){return T.H.use(e)},e.useActionState=function(e,t,n){return T.H.useActionState(e,t,n)},e.useCallback=function(e,t){return T.H.useCallback(e,t)},e.useContext=function(e){return T.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return T.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return T.H.useEffect(e,t)},e.useEffectEvent=function(e){return T.H.useEffectEvent(e)},e.useId=function(){return T.H.useId()},e.useImperativeHandle=function(e,t,n){return T.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return T.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return T.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return T.H.useMemo(e,t)},e.useOptimistic=function(e,t){return T.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return T.H.useReducer(e,t,n)},e.useRef=function(e){return T.H.useRef(e)},e.useState=function(e){return T.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return T.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return T.H.useTransition()},e.version=`19.3.0`})),u=o(((e,t)=>{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0<n;){var r=n-1>>>1,a=e[r];if(0<i(a,t))e[r]=t,e[n]=a,n=r;else break a}}function n(e){return e.length===0?null:e[0]}function r(e){if(e.length===0)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;a:for(var r=0,a=e.length,o=a>>>1;r<o;){var s=2*(r+1)-1,c=e[s],l=s+1,u=e[l];if(0>i(c,n))l<a&&0>i(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(l<a&&0>i(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&j(x,t.startTime-e)}}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-T<w)}function D(){if(g=!1,S){var t=e.unstable_now();T=t;var i=!0;try{a:{m=!1,h&&(h=!1,v(C),C=-1),p=!0;var a=f;try{b:{for(b(t),d=n(c);d!==null&&!(d.expirationTime>t&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&j(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var k=new MessageChannel,A=k.port2;k.port1.onmessage=D,O=function(){A.postMessage(null)}}else O=function(){_(D,0)};function j(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125<e?console.error(`forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported`):w=0<e?Math.floor(1e3/e):5},e.unstable_getCurrentPriorityLevel=function(){return f},e.unstable_next=function(e){switch(f){case 1:case 2:case 3:var t=3;break;default:t=f}var n=f;f=t;try{return e()}finally{f=n}},e.unstable_requestPaint=function(){g=!0},e.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=f;f=e;try{return t()}finally{f=n}},e.unstable_scheduleCallback=function(r,i,a){var o=e.unstable_now();switch(typeof a==`object`&&a?(a=a.delay,a=typeof a==`number`&&0<a?o+a:o):a=o,r){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return s=a+s,r={id:u++,callback:i,priorityLevel:r,startTime:a,expirationTime:s,sortIndex:-1},a>o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,j(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function r(){}var i={d:{f:r,r:function(){throw Error(n(522))},D:r,C:r,L:r,m:r,X:r,S:r,M:r},p:0,findDOMNode:null},a=Symbol.for(`react.portal`),o=Symbol.for(`react.recoverable`),s=Symbol.for(`react.optimistic_key`);function c(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:a,key:r==null?null:r===s?s:``+r,children:e,containerInfo:t,implementation:n}}var l=t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function d(e,t){if(e===`font`)return``;if(typeof t==`string`)return t===`use-credentials`?t:``}e.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=i,e.browser=function(e){return{$$typeof:o,_reason:e}},e.createPortal=function(e,t){var r=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)throw Error(n(299));return c(e,t,null,r)},e.flushSync=function(e){var t=l.T,n=i.p;try{if(l.T=null,i.p=2,e)return e()}finally{l.T=t,i.p=n,i.d.f()}},e.preconnect=function(e,t){typeof e==`string`&&(t?(t=t.crossOrigin,t=typeof t==`string`?t===`use-credentials`?t:``:void 0):t=null,i.d.C(e,t))},e.prefetchDNS=function(e){typeof e==`string`&&i.d.D(e)},e.preinit=function(e,t){if(typeof e==`string`&&t&&typeof t.as==`string`){var n=t.as,r=d(n,t.crossOrigin),a=typeof t.integrity==`string`?t.integrity:void 0,o=typeof t.fetchPriority==`string`?t.fetchPriority:void 0;n===`style`?i.d.S(e,typeof t.precedence==`string`?t.precedence:void 0,{crossOrigin:r,integrity:a,fetchPriority:o}):n===`script`&&i.d.X(e,{crossOrigin:r,integrity:a,fetchPriority:o,nonce:typeof t.nonce==`string`?t.nonce:void 0})}},e.preinitModule=function(e,t){if(typeof e==`string`){if(typeof t==`object`&&t){if(t.as==null||t.as===`script`){var n=d(t.as,t.crossOrigin);i.d.M(e,{crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0})}}else t??i.d.M(e)}},e.preload=function(e,t){if(typeof e==`string`&&typeof t==`object`&&t&&typeof t.as==`string`){var n=t.as,r=d(n,t.crossOrigin);i.d.L(e,n,{crossOrigin:r,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,type:typeof t.type==`string`?t.type:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0,referrerPolicy:typeof t.referrerPolicy==`string`?t.referrerPolicy:void 0,imageSrcSet:typeof t.imageSrcSet==`string`?t.imageSrcSet:void 0,imageSizes:typeof t.imageSizes==`string`?t.imageSizes:void 0,media:typeof t.media==`string`?t.media:void 0})}},e.preloadModule=function(e,t){if(typeof e==`string`){if(t){var n=d(t.as,t.crossOrigin);i.d.m(e,{as:typeof t.as==`string`&&t.as!==`script`?t.as:void 0,crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0})}else i.d.m(e)}},e.requestFormReset=function(e){i.d.r(e)},e.unstable_batchedUpdates=function(e,t){return e(t)},e.useFormState=function(e,t,n){return l.H.useFormState(e,t,n)},e.useFormStatus=function(){return l.H.useHostTransitionStatus()},e.version=`19.3.0`})),m=o(((e,t)=>{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function a(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function o(e){for(var t=e,n=t;n&&!n.alternate;)t=n,t.flags&4098&&(e=t.return),n=t.return;for(;t.return;)t=t.return;return t.tag===3?e:null}function s(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function c(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function l(e){if(o(e)!==e)throw Error(i(188))}function d(e){var t=e.alternate;if(!t){if(t=o(e),t===null)throw Error(i(188));return t===e?e:null}for(var n=e,r=t;;){var a=n.return;if(a===null)break;var s=a.alternate;if(s===null){if(r=a.return,r!==null){n=r;continue}break}if(a.child===s.child){for(s=a.child;s;){if(s===n)return l(a),e;if(s===r)return l(a),t;s=s.sibling}throw Error(i(188))}if(n.return!==r.return)n=a,r=s;else{for(var c=!1,u=a.child;u;){if(u===n){c=!0,n=a,r=s;break}if(u===r){c=!0,r=a,n=s;break}u=u.sibling}if(!c){for(u=s.child;u;){if(u===n){c=!0,n=s,r=a;break}if(u===r){c=!0,r=s,n=a;break}u=u.sibling}if(!c)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(n.tag!==3)throw Error(i(188));return n.stateNode.current===n?e:t}function p(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=p(e),t!==null)return t;e=e.sibling}return null}function h(e,t,n,r,i,a){for(;e!==null;){if((e.tag===5||e.tag===27||e.tag===6)&&n(e,r,i,a)||(e.tag!==22||e.memoizedState===null)&&(t||e.tag!==5&&e.tag!==27)&&h(e.child,t,n,r,i,a))return!0;e=e.sibling}return!1}function g(e){for(e=e.return;e!==null;){if(e.tag===3||e.tag===5||e.tag===27)return e;e=e.return}return null}function _(e){var t=!1;for(e=e.return;e!==null&&(e.tag===4&&(t=!0),e.tag!==3&&e.tag!==5&&e.tag!==27);)e=e.return;return t}function v(e){var t=[null,null],n=g(e);return n===null||y(t,e,n.child,{foundSelf:!1}),t}function y(e,t,n,r){for(;n!==null;){if(n===t)r.foundSelf=!0;else if(n.tag===5||n.tag===27||n.tag===6){if(r.foundSelf)return e[1]=n,!0;e[0]=n}else if((n.tag!==22||n.memoizedState===null)&&y(e,t,n.child,r))return!0;n=n.sibling}return!1}function b(e){switch(e.tag){case 5:case 27:case 6:return e.stateNode;case 3:return e.stateNode.containerInfo;default:throw Error(i(559))}}var x=null,S=null;function C(e,t,n){return e===n||e===t&&(x=e,!0)}function w(e,t,n){return e===n?(S=e,!1):e===t&&(S!==null&&(x=e),!0)}function T(e){if(e===null)return null;do e=e===null?null:e.return;while(e&&e.tag!==5&&e.tag!==27&&e.tag!==3);return e||null}function E(e,t,n){for(var r=0,i=e;i;i=n(i))r++;i=0;for(var a=t;a;a=n(a))i++;for(;0<r-i;)e=n(e),r--;for(;0<i-r;)t=n(t),i--;for(;r--;){if(e===t||t!==null&&e===t.alternate)return e;e=n(e),t=n(t)}return null}var D=Object.assign,O=Symbol.for(`react.element`),k=Symbol.for(`react.transitional.element`),A=Symbol.for(`react.portal`),j=Symbol.for(`react.fragment`),M=Symbol.for(`react.strict_mode`),N=Symbol.for(`react.profiler`),P=Symbol.for(`react.consumer`),F=Symbol.for(`react.context`),I=Symbol.for(`react.forward_ref`),L=Symbol.for(`react.suspense`),R=Symbol.for(`react.suspense_list`),z=Symbol.for(`react.memo`),B=Symbol.for(`react.lazy`),V=Symbol.for(`react.activity`),ee=Symbol.for(`react.legacy_hidden`),te=Symbol.for(`react.memo_cache_sentinel`),ne=Symbol.for(`react.view_transition`),H=Symbol.for(`react.recoverable`),re=Symbol.iterator;function ie(e){return typeof e!=`object`||!e?null:(e=re&&e[re]||e[`@@iterator`],typeof e==`function`?e:null)}var ae=Symbol.for(`react.client.reference`);function oe(e){if(e==null)return null;if(typeof e==`function`)return e.$$typeof===ae?null:e.displayName||e.name||null;if(typeof e==`string`)return e;switch(e){case j:return`Fragment`;case N:return`Profiler`;case M:return`StrictMode`;case L:return`Suspense`;case R:return`SuspenseList`;case V:return`Activity`;case ne:return`ViewTransition`}if(typeof e==`object`)switch(e.$$typeof){case A:return`Portal`;case F:return e.displayName||`Context`;case P:return(e._context.displayName||`Context`)+`.Consumer`;case I:var t=e.render;return e=e.displayName,e||=(e=t.displayName||t.name||``,e===``?`ForwardRef`:`ForwardRef(`+e+`)`),e;case z:return t=e.displayName||null,t===null?oe(e.type)||`Memo`:t;case B:t=e._payload,e=e._init;try{return oe(e(t))}catch{}}return null}var se=Array.isArray,U=n.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,ce=r.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,le={pending:!1,data:null,method:null,action:null},ue=[],de=-1;function fe(e){return{current:e}}function pe(e){0>de||(e.current=ue[de],ue[de]=null,de--)}function W(e,t){de++,ue[de]=e.current,e.current=t}var me=fe(null),he=fe(null),ge=fe(null),_e=fe(null);function ve(e,t){switch(W(ge,t),W(he,e),W(me,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?up(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=up(t),e=dp(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}pe(me),W(me,e)}function ye(){pe(me),pe(he),pe(ge)}function be(e){var t=e.memoizedState;t!==null&&(sh._currentValue=t.memoizedState,W(_e,e)),t=me.current;var n=dp(t,e.type);t!==n&&(W(he,e),W(me,n))}function xe(e){he.current===e&&(pe(me),pe(he)),_e.current===e&&(pe(_e),sh._currentValue=le)}var Se,Ce;function we(e){if(Se===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Se=t&&t[1]||``,Ce=-1<e.stack.indexOf(`
|
|
65
65
|
at`)?` (<anonymous>)`:-1<e.stack.indexOf(`@`)?`@unknown:0:0`:``}return`
|
|
66
66
|
`+Se+e+Ce}var Te=!1;function Ee(e,t){if(!e||Te)return``;Te=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var r={DetermineComponentFrameRoot:function(){try{if(t){var n=function(){throw Error()};if(Object.defineProperty(n.prototype,"props",{set:function(){throw Error()}}),typeof Reflect==`object`&&Reflect.construct){try{Reflect.construct(n,[])}catch(e){var r=e}Reflect.construct(e,[],n)}else{try{n.call()}catch(e){r=e}n=!1;try{var i=Object.getOwnPropertyDescriptor(e.prototype,`props`);Object.defineProperty(e.prototype,"props",{configurable:!0,set:function(){throw Error()}}),n=!0,new e}finally{n&&(i===void 0?delete e.prototype.props:Object.defineProperty(e.prototype,"props",i))}}}else{try{throw Error()}catch(e){r=e}(n=e())&&typeof n.catch==`function`&&n.catch(function(){})}}catch(e){if(e&&r&&typeof e.stack==`string`)return[e.stack,r.stack]}return[null,null]}};r.DetermineComponentFrameRoot.displayName=`DetermineComponentFrameRoot`;var i=Object.getOwnPropertyDescriptor(r.DetermineComponentFrameRoot,`name`);i&&i.configurable&&Object.defineProperty(r.DetermineComponentFrameRoot,"name",{value:`DetermineComponentFrameRoot`});var a=r.DetermineComponentFrameRoot(),o=a[0],s=a[1];if(o&&s){var c=o.split(`
|
|
67
67
|
`),l=s.split(`
|
package/dist/remote/launch.js
CHANGED
|
@@ -8,7 +8,7 @@ import { tmpdir } from "node:os";
|
|
|
8
8
|
import path from "node:path";
|
|
9
9
|
import { fileURLToPath } from "node:url";
|
|
10
10
|
import { promisify } from "node:util";
|
|
11
|
-
import { readContainedRegularFile, writeContainedOutputFile } from "../run/contained-output.js";
|
|
11
|
+
import { readContainedRegularFile, removeContainedOutputFile, writeContainedOutputFile, } from "../run/contained-output.js";
|
|
12
12
|
import { createRunArtifactPaths } from "../run/paths.js";
|
|
13
13
|
import { reclaimRunSandboxes } from "../run/reclaim.js";
|
|
14
14
|
import { pointLatestRunAt } from "../run/run.js";
|
|
@@ -19,11 +19,13 @@ import { E2B_SYSTEM_CA_BUNDLE, holdKeysInEgress } from "../substrates/e2b/egress
|
|
|
19
19
|
import { acquireE2BShellSandbox } from "../substrates/e2b/sandbox.js";
|
|
20
20
|
import { loadModalShellModule } from "../substrates/modal/sandbox.js";
|
|
21
21
|
import { serveObserverProxy } from "./observer-proxy.js";
|
|
22
|
-
import {
|
|
23
|
-
/**
|
|
24
|
-
const
|
|
25
|
-
/**
|
|
26
|
-
const
|
|
22
|
+
import { listRemoteRun, listSettledEvidence, readProject, readRemoteBytes, readRemoteFiles, RUNNER_OBSERVER_PORT, runnerOf, setUpRunner, startRemoteRun, stopRemoteRun, waitForRemoteRun, } from "./runner.js";
|
|
23
|
+
/** The longest one read of the runner's run waits there for a change. */
|
|
24
|
+
const WAIT_MS = 5_000;
|
|
25
|
+
/** How long the launcher waits after a read the runner did not answer before it reads again. */
|
|
26
|
+
const RETRY_MS = 5_000;
|
|
27
|
+
/** How long the runner may leave reads unanswered before the launcher gives it up. */
|
|
28
|
+
const UNANSWERED_LIMIT_MS = 120_000;
|
|
27
29
|
/** How long the run has to write its status record after it is started. */
|
|
28
30
|
const START_DEADLINE_MS = 3 * 60_000;
|
|
29
31
|
/** How often the launcher copies the run's settled evidence while it goes on. */
|
|
@@ -52,11 +54,14 @@ export async function launchRemoteRun(launch) {
|
|
|
52
54
|
// Installed before the first sandbox exists, so a signal never ends this process while one is
|
|
53
55
|
// being created without a cleanup.
|
|
54
56
|
const signals = watchSignals();
|
|
55
|
-
let tarballDir;
|
|
56
57
|
let proxy;
|
|
58
|
+
let tarball;
|
|
57
59
|
try {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
// Read and checked before any sandbox exists, so a refused file costs nothing.
|
|
61
|
+
const project = await readProject(cwd, remote.uploads, remote.uploadDirectories);
|
|
62
|
+
// Packed while the runner is created and Node installs in it.
|
|
63
|
+
tarball = packThisHumanish();
|
|
64
|
+
tarball.catch(() => undefined);
|
|
60
65
|
if (signals.requested !== undefined)
|
|
61
66
|
return { runId, exitCode: signals.exitCode, error: "stopped before the runner was created" };
|
|
62
67
|
const where = remote.provider === "modal" ? "a Modal sandbox" : "an E2B sandbox";
|
|
@@ -68,6 +73,14 @@ export async function launchRemoteRun(launch) {
|
|
|
68
73
|
exitCode: signals.exitCode,
|
|
69
74
|
error: "stopped before the run started",
|
|
70
75
|
});
|
|
76
|
+
// Setting up can take minutes; a signal stops waiting for it, and the reclaim below stops the
|
|
77
|
+
// runner, and the setup with it. A setup left behind that way fails once its runner is gone.
|
|
78
|
+
const setup = setUpRunner(runner, {
|
|
79
|
+
tarball,
|
|
80
|
+
dependencies: [...(await ownDependencies()), await peerSpec(remote.provider)],
|
|
81
|
+
project,
|
|
82
|
+
});
|
|
83
|
+
setup.catch(() => undefined);
|
|
71
84
|
await writeRemoteRecord(paths, {
|
|
72
85
|
runId,
|
|
73
86
|
provider: remote.provider,
|
|
@@ -75,24 +88,13 @@ export async function launchRemoteRun(launch) {
|
|
|
75
88
|
});
|
|
76
89
|
// Bound before the run starts, so a taken --port fails before any participant exists.
|
|
77
90
|
proxy = await serveObserverProxy(await runner.sandbox.portAccess(RUNNER_OBSERVER_PORT), launch.port);
|
|
78
|
-
|
|
79
|
-
// runner, and the install with it.
|
|
80
|
-
const installing = installHumanish(runner, tarball.bytes, [await peerSpec(remote.provider)]);
|
|
81
|
-
// An install left behind by a signal fails once its runner is gone; that is expected.
|
|
82
|
-
installing.catch(() => undefined);
|
|
83
|
-
const version = await Promise.race([installing, signals.received.then(() => "")]);
|
|
84
|
-
if (signals.requested !== undefined)
|
|
85
|
-
return await endRun(launch, runId, {
|
|
86
|
-
exitCode: signals.exitCode,
|
|
87
|
-
error: "stopped before the run started",
|
|
88
|
-
});
|
|
89
|
-
say(`Installed humanish ${version} in the runner; uploading the study.`);
|
|
90
|
-
await uploadProject(runner, cwd, remote.uploads, remote.uploadDirectories);
|
|
91
|
+
const version = await Promise.race([setup, signals.received.then(() => "")]);
|
|
91
92
|
if (signals.requested !== undefined)
|
|
92
93
|
return await endRun(launch, runId, {
|
|
93
94
|
exitCode: signals.exitCode,
|
|
94
95
|
error: "stopped before the run started",
|
|
95
96
|
});
|
|
97
|
+
say(`Installed humanish ${version} in the runner and uploaded the study; starting its run.`);
|
|
96
98
|
await startRemoteRun(runner, {
|
|
97
99
|
study: launch.study,
|
|
98
100
|
runId,
|
|
@@ -110,8 +112,8 @@ export async function launchRemoteRun(launch) {
|
|
|
110
112
|
finally {
|
|
111
113
|
signals.dispose();
|
|
112
114
|
await proxy?.close();
|
|
113
|
-
|
|
114
|
-
|
|
115
|
+
// A pack still going removes its directory when it ends; this process waits for that.
|
|
116
|
+
await tarball?.catch(() => undefined);
|
|
115
117
|
}
|
|
116
118
|
}
|
|
117
119
|
async function acquireRunner(launch, paths, network) {
|
|
@@ -139,7 +141,7 @@ export async function followRemoteRun(args) {
|
|
|
139
141
|
// Evidence already copied while the run went on, by path, with its size then.
|
|
140
142
|
const copied = new Map();
|
|
141
143
|
const copy = async () => {
|
|
142
|
-
const { files, alreadyHere } = await copyRunBack(runner, paths, runId);
|
|
144
|
+
const { files, alreadyHere } = await copyRunBack(runner, paths, runId, copied);
|
|
143
145
|
if (alreadyHere > 0)
|
|
144
146
|
say(`${alreadyHere} of its ${files} files were already here.`);
|
|
145
147
|
return files;
|
|
@@ -147,11 +149,25 @@ export async function followRemoteRun(args) {
|
|
|
147
149
|
let syncAt = Date.now() + SYNC_EVERY_MS;
|
|
148
150
|
let state;
|
|
149
151
|
let stopAt;
|
|
150
|
-
let
|
|
152
|
+
let answeredAt = Date.now();
|
|
153
|
+
// The run was started just before, so it is taken as alive until a read says otherwise.
|
|
154
|
+
let alive = true;
|
|
151
155
|
const startBy = Date.now() + START_DEADLINE_MS;
|
|
152
156
|
for (;;) {
|
|
153
|
-
const
|
|
154
|
-
|
|
157
|
+
const read = await readRun(runner, runId, { state, alive }, signals);
|
|
158
|
+
// A signal ends the read, and is handled below without one.
|
|
159
|
+
const run = read === "signal" ? undefined : read;
|
|
160
|
+
if (read === undefined) {
|
|
161
|
+
if (Date.now() - answeredAt < UNANSWERED_LIMIT_MS)
|
|
162
|
+
await Promise.race([
|
|
163
|
+
new Promise((resolve) => setTimeout(resolve, RETRY_MS)),
|
|
164
|
+
signals.requested === undefined ? signals.received : new Promise(() => undefined),
|
|
165
|
+
]);
|
|
166
|
+
}
|
|
167
|
+
else if (run !== undefined) {
|
|
168
|
+
answeredAt = Date.now();
|
|
169
|
+
alive = run.alive;
|
|
170
|
+
}
|
|
155
171
|
if (run?.state !== undefined && state === undefined) {
|
|
156
172
|
say(`Run ${runId} is running. Watch it live at ${args.proxyUrl}`);
|
|
157
173
|
say("Closing this terminal leaves the study running; Ctrl-C stops it.");
|
|
@@ -197,8 +213,8 @@ export async function followRemoteRun(args) {
|
|
|
197
213
|
});
|
|
198
214
|
await stopRemoteRun(runner).catch(() => undefined);
|
|
199
215
|
}
|
|
200
|
-
const ended =
|
|
201
|
-
? `the runner sandbox stopped answering for ${
|
|
216
|
+
const ended = Date.now() - answeredAt >= UNANSWERED_LIMIT_MS
|
|
217
|
+
? `the runner sandbox stopped answering for ${UNANSWERED_LIMIT_MS / 1000} s`
|
|
202
218
|
: run !== undefined && state !== undefined && !run.alive
|
|
203
219
|
? stopAt === undefined
|
|
204
220
|
? `the run ended without a result: ${run.errTail || "no output"}`
|
|
@@ -224,35 +240,49 @@ export async function followRemoteRun(args) {
|
|
|
224
240
|
// Best effort: what this misses, the copy at the end takes.
|
|
225
241
|
await copySettledEvidence(runner, paths, runId, copied).catch(() => undefined);
|
|
226
242
|
}
|
|
227
|
-
await new Promise((resolve) => setTimeout(resolve, POLL_MS));
|
|
228
243
|
}
|
|
229
244
|
}
|
|
245
|
+
/**
|
|
246
|
+
* One read of the runner's run, waiting there for a change. The first signal ends the wait here,
|
|
247
|
+
* and the read left in the runner ends on its own. Undefined when the runner did not answer.
|
|
248
|
+
*/
|
|
249
|
+
async function readRun(runner, runId, seen, signals) {
|
|
250
|
+
const read = waitForRemoteRun(runner, runId, seen, WAIT_MS).catch(() => undefined);
|
|
251
|
+
if (signals.requested !== undefined)
|
|
252
|
+
return await read;
|
|
253
|
+
return await Promise.race([read, signals.received.then(() => "signal")]);
|
|
254
|
+
}
|
|
230
255
|
/**
|
|
231
256
|
* Copy every file of the runner's run directory into this machine's run directory, each checked
|
|
232
257
|
* against the digest the runner listed. The sandbox journal keeps this machine's lines (the
|
|
233
|
-
* runner's own receipt) and adds the runner's (its participants').
|
|
258
|
+
* runner's own receipt) and adds the runner's (its participants'). A file copied while the run went
|
|
259
|
+
* on that the runner no longer has, a frame's PNG replaced by its WebP, is removed here too.
|
|
234
260
|
*/
|
|
235
|
-
async function copyRunBack(runner, paths, runId) {
|
|
261
|
+
async function copyRunBack(runner, paths, runId, copiedWhileRunning) {
|
|
236
262
|
const files = await listRemoteRun(runner, runId);
|
|
237
263
|
let alreadyHere = 0;
|
|
264
|
+
const wanted = [];
|
|
238
265
|
for (const file of files) {
|
|
239
266
|
if (file.path === "owner-key")
|
|
240
267
|
continue;
|
|
241
268
|
// Already here with the same bytes, copied while the run went on or by an earlier attempt.
|
|
242
269
|
if (file.path !== SANDBOX_RECEIPTS_ARTIFACT &&
|
|
243
|
-
(await localDigest(paths, file.path)) === file.sha256)
|
|
270
|
+
(await localDigest(paths, file.path)) === file.sha256)
|
|
244
271
|
alreadyHere += 1;
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
const bytes = await readRemoteFile(runner, runId, file);
|
|
248
|
-
if (file.path === SANDBOX_RECEIPTS_ARTIFACT) {
|
|
249
|
-
const local = await readContainedRegularFile(paths, file.path, 16 * 1024 * 1024);
|
|
250
|
-
const mine = local.status === "read" ? Buffer.from(local.bytes).toString("utf8") : "";
|
|
251
|
-
await writeContainedOutputFile(paths, file.path, joinJournals(mine, Buffer.from(bytes).toString("utf8")), "utf8");
|
|
252
|
-
continue;
|
|
253
|
-
}
|
|
254
|
-
await writeContainedOutputFile(paths, file.path, bytes);
|
|
272
|
+
else
|
|
273
|
+
wanted.push(file);
|
|
255
274
|
}
|
|
275
|
+
await readRemoteFiles(runner, runId, wanted, async (file, bytes) => {
|
|
276
|
+
if (file.path !== SANDBOX_RECEIPTS_ARTIFACT)
|
|
277
|
+
return await writeContainedOutputFile(paths, file.path, bytes);
|
|
278
|
+
const local = await readContainedRegularFile(paths, file.path, 16 * 1024 * 1024);
|
|
279
|
+
const mine = local.status === "read" ? Buffer.from(local.bytes).toString("utf8") : "";
|
|
280
|
+
await writeContainedOutputFile(paths, file.path, joinJournals(mine, Buffer.from(bytes).toString("utf8")), "utf8");
|
|
281
|
+
});
|
|
282
|
+
const listed = new Set(files.map((file) => file.path));
|
|
283
|
+
for (const file of copiedWhileRunning.keys())
|
|
284
|
+
if (!listed.has(file))
|
|
285
|
+
await removeContainedOutputFile(paths, file);
|
|
256
286
|
await pointLatestRunAt(paths, runId);
|
|
257
287
|
return { files: files.length, alreadyHere };
|
|
258
288
|
}
|
|
@@ -387,15 +417,30 @@ export function runsFromPackage() {
|
|
|
387
417
|
* This machine's humanish as an npm tarball, so the runner runs exactly the same code. A run from
|
|
388
418
|
* source has no built package to pack.
|
|
389
419
|
*/
|
|
390
|
-
|
|
420
|
+
function packThisHumanish() {
|
|
391
421
|
const here = fileURLToPath(import.meta.url);
|
|
392
422
|
const root = path.resolve(path.dirname(here), "..", "..");
|
|
423
|
+
// Thrown here, not from the promise, so it refuses the run before any sandbox exists.
|
|
393
424
|
if (!runsFromPackage())
|
|
394
425
|
throw new Error("A remote run installs this humanish in the runner, and a run from source has no built package. Run `pnpm build`, then `node dist/cli.js`, or use an installed humanish.");
|
|
426
|
+
return pack(root);
|
|
427
|
+
}
|
|
428
|
+
async function pack(root) {
|
|
395
429
|
const dir = await mkdtemp(path.join(tmpdir(), "humanish-pack-"));
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
430
|
+
try {
|
|
431
|
+
const { stdout } = await promisify(execFile)("npm", ["pack", "--ignore-scripts", "--json", "--pack-destination", dir, root], { maxBuffer: 16 * 1024 * 1024 });
|
|
432
|
+
const [packed] = JSON.parse(stdout);
|
|
433
|
+
return await readFile(path.join(dir, packed.filename));
|
|
434
|
+
}
|
|
435
|
+
finally {
|
|
436
|
+
await rm(dir, { recursive: true, force: true });
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/** The npm specs this humanish's package.json depends on, as name@range. */
|
|
440
|
+
async function ownDependencies() {
|
|
441
|
+
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
442
|
+
const manifest = JSON.parse(await readFile(path.join(root, "package.json"), "utf8"));
|
|
443
|
+
return Object.entries(manifest.dependencies ?? {}).map(([name, range]) => `${name}@${range}`);
|
|
399
444
|
}
|
|
400
445
|
/** The provider SDK the runner's participants need, at the version this machine has. */
|
|
401
446
|
async function peerSpec(provider) {
|