@fapost/jig-ui 0.1.0-next.6 → 0.1.0-next.8
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/dist/args.js +4 -2
- package/dist/http/access.js +46 -0
- package/dist/http/app.js +54 -30
- package/dist/jig/client.js +46 -0
- package/dist/main.js +64 -13
- package/dist/open-browser.js +47 -0
- package/dist/registry/config-dir.js +10 -0
- package/dist/registry/instance.js +50 -0
- package/dist/registry/projects.js +78 -0
- package/dist/source/checkout.js +25 -0
- package/dist/source/local.js +37 -0
- package/dist/web/assets/index-B-WsHAHz.js +2 -0
- package/dist/web/index.html +12 -0
- package/package.json +10 -6
package/dist/args.js
CHANGED
|
@@ -10,6 +10,7 @@ export function parseCliArgs(argv) {
|
|
|
10
10
|
allowPositionals: false,
|
|
11
11
|
options: {
|
|
12
12
|
port: { type: 'string' },
|
|
13
|
+
'no-open': { type: 'boolean' },
|
|
13
14
|
help: { type: 'boolean', short: 'h' },
|
|
14
15
|
version: { type: 'boolean', short: 'v' },
|
|
15
16
|
},
|
|
@@ -22,11 +23,12 @@ export function parseCliArgs(argv) {
|
|
|
22
23
|
return { kind: 'help' };
|
|
23
24
|
if (values.version)
|
|
24
25
|
return { kind: 'version' };
|
|
26
|
+
const open = !values['no-open'];
|
|
25
27
|
if (values.port === undefined)
|
|
26
|
-
return { kind: 'run', port: DEFAULT_PORT };
|
|
28
|
+
return { kind: 'run', port: DEFAULT_PORT, open };
|
|
27
29
|
const port = /^\d+$/.test(values.port) ? Number(values.port) : Number.NaN;
|
|
28
30
|
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
29
31
|
return { kind: 'error', message: `Invalid --port value: ${values.port}. Use a number from 1 to 65535.` };
|
|
30
32
|
}
|
|
31
|
-
return { kind: 'run', port };
|
|
33
|
+
return { kind: 'run', port, open };
|
|
32
34
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { getCookie, setCookie } from 'hono/cookie';
|
|
3
|
+
import { cookieName } from '../registry/instance.js';
|
|
4
|
+
/** Refuses requests whose `Host` or `Origin` is not this server's own loopback address. */
|
|
5
|
+
export function localOnly(port) {
|
|
6
|
+
const hosts = new Set([`127.0.0.1:${port}`, `localhost:${port}`]);
|
|
7
|
+
const origins = new Set([`http://127.0.0.1:${port}`, `http://localhost:${port}`]);
|
|
8
|
+
return async (c, next) => {
|
|
9
|
+
const host = c.req.header('host');
|
|
10
|
+
const origin = c.req.header('origin');
|
|
11
|
+
if (host === undefined || !hosts.has(host.toLowerCase())) {
|
|
12
|
+
return c.text('Forbidden', 403);
|
|
13
|
+
}
|
|
14
|
+
if (origin !== undefined && !origins.has(origin.toLowerCase())) {
|
|
15
|
+
return c.text('Forbidden', 403);
|
|
16
|
+
}
|
|
17
|
+
await next();
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function sameSecret(given, token) {
|
|
21
|
+
if (given === undefined)
|
|
22
|
+
return false;
|
|
23
|
+
const a = Buffer.from(given);
|
|
24
|
+
const b = Buffer.from(token);
|
|
25
|
+
return a.length === b.length && timingSafeEqual(a, b);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The per-start token: `/?token=` swaps it for a cookie and redirects to `/`, and every `/api/*`
|
|
29
|
+
* request without that cookie is refused. Static files need no token; they carry no data.
|
|
30
|
+
*/
|
|
31
|
+
export function tokenAccess({ port, token }) {
|
|
32
|
+
const cookie = cookieName(port);
|
|
33
|
+
return async (c, next) => {
|
|
34
|
+
const path = c.req.path;
|
|
35
|
+
if (path === '/' && c.req.query('token') !== undefined) {
|
|
36
|
+
if (!sameSecret(c.req.query('token'), token))
|
|
37
|
+
return c.text('Forbidden', 403);
|
|
38
|
+
setCookie(c, cookie, token, { httpOnly: true, sameSite: 'Strict', path: '/' });
|
|
39
|
+
return c.redirect('/', 302);
|
|
40
|
+
}
|
|
41
|
+
if ((path === '/api' || path.startsWith('/api/')) && !sameSecret(getCookie(c, cookie), token)) {
|
|
42
|
+
return c.json({ error: 'unauthorized' }, 401);
|
|
43
|
+
}
|
|
44
|
+
await next();
|
|
45
|
+
};
|
|
46
|
+
}
|
package/dist/http/app.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { isAbsolute, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { serveStatic } from '@hono/node-server/serve-static';
|
|
2
6
|
import { Hono } from 'hono';
|
|
7
|
+
import { addProject, readProjects, RegistryUnreadable, removeProject } from '../registry/projects.js';
|
|
8
|
+
import { connectable, projectState } from '../source/local.js';
|
|
9
|
+
import { localOnly, tokenAccess } from './access.js';
|
|
3
10
|
/**
|
|
4
11
|
* Reads the version from the package's own package.json. The relative path is the same from
|
|
5
12
|
* `server/http/` (tests) and `dist/http/` (published), as both sit two levels below the root.
|
|
@@ -9,37 +16,54 @@ export function readPackageVersion() {
|
|
|
9
16
|
const pkg = JSON.parse(readFileSync(url, 'utf8'));
|
|
10
17
|
return pkg.version;
|
|
11
18
|
}
|
|
12
|
-
/**
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
if (origin !== undefined && !origins.has(origin.toLowerCase())) {
|
|
23
|
-
return c.text('Forbidden', 403);
|
|
24
|
-
}
|
|
25
|
-
await next();
|
|
26
|
-
};
|
|
19
|
+
/** The built page: `dist/web`, next to `dist/http` where this file runs when published. */
|
|
20
|
+
export const DEFAULT_WEB_ROOT = fileURLToPath(new URL('../web', import.meta.url));
|
|
21
|
+
const refuse = (c, status, code, message) => c.json({ error: { code, message } }, status);
|
|
22
|
+
/** The path the person typed, absolute; `~/` stands for their home. */
|
|
23
|
+
function absolute(path) {
|
|
24
|
+
if (typeof path !== 'string')
|
|
25
|
+
return undefined;
|
|
26
|
+
const expanded = path.trim().replace(/^~(?=$|[\\/])/, homedir());
|
|
27
|
+
return isAbsolute(expanded) ? expanded : undefined;
|
|
27
28
|
}
|
|
28
|
-
export function createApp({ port, version = readPackageVersion() }) {
|
|
29
|
+
export function createApp({ port, token, configDir, version = readPackageVersion(), webRoot = DEFAULT_WEB_ROOT }) {
|
|
29
30
|
const app = new Hono();
|
|
30
31
|
app.use(localOnly(port));
|
|
31
|
-
app.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
app.use(tokenAccess({ port, token }));
|
|
33
|
+
app.onError((error, c) => {
|
|
34
|
+
if (error instanceof RegistryUnreadable)
|
|
35
|
+
return refuse(c, 500, 'registry-unreadable', error.message);
|
|
36
|
+
console.error(error);
|
|
37
|
+
return c.text('Internal Server Error', 500);
|
|
38
|
+
});
|
|
39
|
+
app.get('/api/instance', (c) => c.json({ version }));
|
|
40
|
+
app.get('/api/projects', async (c) => {
|
|
41
|
+
const projects = await readProjects(configDir);
|
|
42
|
+
return c.json({ projects: await Promise.all(projects.map(projectState)) });
|
|
43
|
+
});
|
|
44
|
+
app.post('/api/projects', async (c) => {
|
|
45
|
+
const body = await c.req.json().catch(() => undefined);
|
|
46
|
+
const path = absolute(body?.path);
|
|
47
|
+
if (path === undefined)
|
|
48
|
+
return refuse(c, 422, 'usage', 'Give the absolute path of a project.');
|
|
49
|
+
const found = await connectable(path);
|
|
50
|
+
if ('code' in found)
|
|
51
|
+
return refuse(c, 422, found.code, found.message);
|
|
52
|
+
const { project, created } = await addProject(configDir, found.root);
|
|
53
|
+
return c.json({ project: await projectState(project) }, created ? 201 : 200);
|
|
54
|
+
});
|
|
55
|
+
app.delete('/api/projects/:id', async (c) => {
|
|
56
|
+
if (!(await removeProject(configDir, c.req.param('id')))) {
|
|
57
|
+
return refuse(c, 404, 'not-connected', 'No connected project has this id.');
|
|
58
|
+
}
|
|
59
|
+
return c.body(null, 204);
|
|
60
|
+
});
|
|
61
|
+
app.all('/api/*', (c) => c.json({ error: 'not found' }, 404));
|
|
62
|
+
if (existsSync(join(webRoot, 'index.html'))) {
|
|
63
|
+
app.use('/*', serveStatic({ root: webRoot }));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
app.get('/', (c) => c.text('The page is not built. Run npm run build.', 503));
|
|
67
|
+
}
|
|
44
68
|
return app;
|
|
45
69
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
const run = promisify(execFile);
|
|
6
|
+
/** The oldest Jig whose reads Jig UI understands: 0.29.0 is the first that prints JSON. */
|
|
7
|
+
export const MIN_JIG_VERSION = '0.29.0';
|
|
8
|
+
const SCRIPT = join('.ai', 'scripts', 'jig');
|
|
9
|
+
const TIMEOUT_MS = 10_000;
|
|
10
|
+
/**
|
|
11
|
+
* The bash that runs `.ai/scripts/jig`. On Windows it is Git's, found next to git itself
|
|
12
|
+
* (`<git>/mingw64/libexec/git-core` → `<git>/bin/bash.exe`): a `bash` on PATH may be WSL's.
|
|
13
|
+
*/
|
|
14
|
+
async function bash(platform) {
|
|
15
|
+
if (platform !== 'win32')
|
|
16
|
+
return 'bash';
|
|
17
|
+
const { stdout } = await run('git', ['--exec-path'], { timeout: TIMEOUT_MS });
|
|
18
|
+
return resolve(stdout.trim(), '..', '..', '..', 'bin', 'bash.exe');
|
|
19
|
+
}
|
|
20
|
+
/** Runs the project's own Jig in its main checkout, without a shell. */
|
|
21
|
+
async function jig(root, args, platform) {
|
|
22
|
+
const { stdout } = await run(await bash(platform), [SCRIPT, ...args], { cwd: root, timeout: TIMEOUT_MS });
|
|
23
|
+
return stdout;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The project's Jig version, `undefined` when the checkout has no Jig. Throws when Jig is there but
|
|
27
|
+
* does not answer with a version.
|
|
28
|
+
*/
|
|
29
|
+
export async function jigVersion(root, platform = process.platform) {
|
|
30
|
+
if (!existsSync(join(root, SCRIPT)))
|
|
31
|
+
return undefined;
|
|
32
|
+
const match = /^jig (\d+\.\d+\.\d+)\b/.exec((await jig(root, ['--version'], platform)).trim());
|
|
33
|
+
if (!match?.[1])
|
|
34
|
+
throw new Error('jig --version did not print a version');
|
|
35
|
+
return match[1];
|
|
36
|
+
}
|
|
37
|
+
/** True when `version` is at least the minimum Jig UI reads. */
|
|
38
|
+
export function supports(version, minimum = MIN_JIG_VERSION) {
|
|
39
|
+
const a = version.split('.').map(Number);
|
|
40
|
+
const b = minimum.split('.').map(Number);
|
|
41
|
+
for (let i = 0; i < 3; i++) {
|
|
42
|
+
if ((a[i] ?? 0) !== (b[i] ?? 0))
|
|
43
|
+
return (a[i] ?? 0) > (b[i] ?? 0);
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
package/dist/main.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
1
4
|
import { serve } from '@hono/node-server';
|
|
2
|
-
import { parseCliArgs } from './args.js';
|
|
5
|
+
import { DEFAULT_PORT, parseCliArgs } from './args.js';
|
|
3
6
|
import { createApp, readPackageVersion } from './http/app.js';
|
|
7
|
+
import { openBrowser } from './open-browser.js';
|
|
8
|
+
import { configDir } from './registry/config-dir.js';
|
|
9
|
+
import { probeInstance, readInstance, removeInstance, writeInstance } from './registry/instance.js';
|
|
4
10
|
const HOST = '127.0.0.1';
|
|
5
11
|
const HELP = `Usage: jig-ui [options]
|
|
6
12
|
|
|
7
13
|
Options:
|
|
8
14
|
--port <n> Port to listen on (default 4870)
|
|
15
|
+
--no-open Print the link instead of opening the browser
|
|
9
16
|
-v, --version Print the version and exit
|
|
10
17
|
-h, --help Print this help and exit
|
|
11
18
|
`;
|
|
@@ -13,7 +20,28 @@ function fail(message) {
|
|
|
13
20
|
console.error(message);
|
|
14
21
|
process.exit(1);
|
|
15
22
|
}
|
|
16
|
-
|
|
23
|
+
const link = ({ port, token }) => `http://${HOST}:${port}/?token=${token}`;
|
|
24
|
+
async function show(info, open, dir) {
|
|
25
|
+
console.log(`Open it at ${link(info)}`);
|
|
26
|
+
if (open && !(await openBrowser(link(info), dir)))
|
|
27
|
+
console.log('Could not open a browser; open the link above.');
|
|
28
|
+
}
|
|
29
|
+
/** The instance recorded in the config directory, if it still answers with its token. */
|
|
30
|
+
async function runningInstance(dir) {
|
|
31
|
+
const info = await readInstance(dir);
|
|
32
|
+
return info && (await probeInstance(info)) ? info : undefined;
|
|
33
|
+
}
|
|
34
|
+
/** After losing the port: the winner writes its file only once it listens, so give it a moment. */
|
|
35
|
+
async function winnerOfRace(dir) {
|
|
36
|
+
for (let attempt = 0; attempt < 5; attempt++) {
|
|
37
|
+
const winner = await runningInstance(dir);
|
|
38
|
+
if (winner)
|
|
39
|
+
return winner;
|
|
40
|
+
await delay(200);
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
export async function main() {
|
|
17
45
|
const command = parseCliArgs(process.argv.slice(2));
|
|
18
46
|
if (command.kind === 'error')
|
|
19
47
|
fail(command.message);
|
|
@@ -25,22 +53,45 @@ export function main() {
|
|
|
25
53
|
console.log(readPackageVersion());
|
|
26
54
|
return;
|
|
27
55
|
}
|
|
28
|
-
const { port } = command;
|
|
56
|
+
const { port, open } = command;
|
|
57
|
+
const dir = configDir(process.env, process.platform, homedir());
|
|
58
|
+
const running = await runningInstance(dir);
|
|
59
|
+
if (running) {
|
|
60
|
+
console.log(`Jig UI is already running on port ${running.port}.`);
|
|
61
|
+
// ponytail: a --port equal to the default is indistinguishable from no flag; no note then.
|
|
62
|
+
if (port !== running.port && port !== DEFAULT_PORT)
|
|
63
|
+
console.log(`--port ${port} is ignored.`);
|
|
64
|
+
await show(running, open, dir);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
29
67
|
const version = readPackageVersion();
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
68
|
+
const token = randomBytes(32).toString('base64url');
|
|
69
|
+
const server = serve({ fetch: createApp({ port, token, configDir: dir, version }).fetch, hostname: HOST, port }, () => {
|
|
70
|
+
void (async () => {
|
|
71
|
+
await writeInstance(dir, { port, token, pid: process.pid, version });
|
|
72
|
+
console.log(`Jig UI ${version} is running at http://${HOST}:${port}/`);
|
|
73
|
+
await show({ port, token }, open, dir);
|
|
74
|
+
console.log('Press Ctrl+C to stop.');
|
|
75
|
+
})().catch((error) => fail(`Could not start: ${error instanceof Error ? error.message : String(error)}`));
|
|
33
76
|
});
|
|
34
77
|
server.on('error', (error) => {
|
|
35
|
-
if (error.code
|
|
36
|
-
fail(`
|
|
37
|
-
|
|
38
|
-
|
|
78
|
+
if (error.code !== 'EADDRINUSE')
|
|
79
|
+
fail(`Could not start the server: ${error.message}`);
|
|
80
|
+
// Two starts at once: the one that lost the port opens the one that won.
|
|
81
|
+
void winnerOfRace(dir).then(async (winner) => {
|
|
82
|
+
if (!winner)
|
|
83
|
+
fail(`Port ${port} is already in use. Stop the other process or choose another port with --port.`);
|
|
84
|
+
console.log(`Jig UI is already running on port ${winner.port}.`);
|
|
85
|
+
await show(winner, open, dir);
|
|
86
|
+
process.exit(0);
|
|
87
|
+
});
|
|
39
88
|
});
|
|
40
89
|
const shutdown = () => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
server
|
|
90
|
+
void removeInstance(dir, token).finally(() => {
|
|
91
|
+
server.close(() => process.exit(0));
|
|
92
|
+
if ('closeAllConnections' in server)
|
|
93
|
+
server.closeAllConnections();
|
|
94
|
+
});
|
|
44
95
|
};
|
|
45
96
|
process.on('SIGINT', shutdown);
|
|
46
97
|
process.on('SIGTERM', shutdown);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { OPEN_FILE, writeConfigFile } from './registry/instance.js';
|
|
3
|
+
/** The system command that opens a file in the default browser. */
|
|
4
|
+
export function browserCommand(platform, file) {
|
|
5
|
+
if (platform === 'darwin')
|
|
6
|
+
return { cmd: 'open', args: [file] };
|
|
7
|
+
if (platform === 'win32')
|
|
8
|
+
return { cmd: 'explorer.exe', args: [file] };
|
|
9
|
+
return { cmd: 'xdg-open', args: [file] };
|
|
10
|
+
}
|
|
11
|
+
/** A page that sends the browser on to `url`; the token travels in the file, not in a process's arguments. */
|
|
12
|
+
export function redirectPage(url) {
|
|
13
|
+
const json = JSON.stringify(url).replace(/</g, '\\u003c');
|
|
14
|
+
const attr = url.replace(/&/g, '&').replace(/"/g, '"');
|
|
15
|
+
return `<!doctype html>
|
|
16
|
+
<html lang="en">
|
|
17
|
+
<head>
|
|
18
|
+
<meta charset="utf-8" />
|
|
19
|
+
<meta http-equiv="refresh" content="0; url=${attr}" />
|
|
20
|
+
<title>Jig UI</title>
|
|
21
|
+
<script>location.replace(${json});</script>
|
|
22
|
+
</head>
|
|
23
|
+
<body><a href="${attr}">Open Jig UI</a></body>
|
|
24
|
+
</html>
|
|
25
|
+
`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Opens `url` in the default browser through a redirect file, because `ps` shows every user the
|
|
29
|
+
* arguments of a process, and the url carries the token. The file lives in the config directory
|
|
30
|
+
* and is not removed here: a second start exits at once, maybe before the browser read it; the
|
|
31
|
+
* instance removes it when it stops. Resolves false when no browser could be started; the caller
|
|
32
|
+
* prints the link instead.
|
|
33
|
+
*/
|
|
34
|
+
export async function openBrowser(url, dir, platform = process.platform) {
|
|
35
|
+
let file;
|
|
36
|
+
try {
|
|
37
|
+
file = await writeConfigFile(dir, OPEN_FILE, redirectPage(url));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const { cmd, args } = browserCommand(platform, file);
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
// explorer.exe exits with 1 even when it opened the file, so on Windows only a spawn error counts.
|
|
45
|
+
execFile(cmd, args, (error) => resolve(!error || (platform === 'win32' && typeof error.code === 'number')));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { posix, win32 } from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Jig UI's config directory, following each system's convention: `%APPDATA%\jig-ui` on Windows,
|
|
4
|
+
* else `$XDG_CONFIG_HOME/jig-ui`, else `~/.config/jig-ui`. Pure: the caller passes the environment.
|
|
5
|
+
*/
|
|
6
|
+
export function configDir(env, platform, home) {
|
|
7
|
+
if (platform === 'win32')
|
|
8
|
+
return win32.join(env.APPDATA || win32.join(home, 'AppData', 'Roaming'), 'jig-ui');
|
|
9
|
+
return posix.join(env.XDG_CONFIG_HOME || posix.join(home, '.config'), 'jig-ui');
|
|
10
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const FILE = 'instance.json';
|
|
5
|
+
/** The page that sends the browser on to the instance; it carries the token, so it lives here too. */
|
|
6
|
+
export const OPEN_FILE = 'open.html';
|
|
7
|
+
/** The cookie that carries the token; named by port, as browsers do not separate cookies by port. */
|
|
8
|
+
export const cookieName = (port) => `jig-ui-${port}`;
|
|
9
|
+
export async function readInstance(dir) {
|
|
10
|
+
try {
|
|
11
|
+
const info = JSON.parse(await readFile(join(dir, FILE), 'utf8'));
|
|
12
|
+
if (typeof info.port !== 'number' || typeof info.token !== 'string')
|
|
13
|
+
return undefined;
|
|
14
|
+
return info;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Writes a file of the config directory atomically (temp file, then rename), readable only by the user. */
|
|
21
|
+
export async function writeConfigFile(dir, name, content) {
|
|
22
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
23
|
+
const temp = join(dir, `${name}.${randomBytes(6).toString('hex')}.tmp`);
|
|
24
|
+
await writeFile(temp, content, { mode: 0o600 });
|
|
25
|
+
await rename(temp, join(dir, name));
|
|
26
|
+
return join(dir, name);
|
|
27
|
+
}
|
|
28
|
+
export async function writeInstance(dir, info) {
|
|
29
|
+
await writeConfigFile(dir, FILE, `${JSON.stringify(info, null, 2)}\n`);
|
|
30
|
+
}
|
|
31
|
+
/** Removes the files only while they are still ours: an instance started after us may have replaced them. */
|
|
32
|
+
export async function removeInstance(dir, token) {
|
|
33
|
+
if ((await readInstance(dir))?.token !== token)
|
|
34
|
+
return;
|
|
35
|
+
await rm(join(dir, OPEN_FILE), { force: true });
|
|
36
|
+
await rm(join(dir, FILE), { force: true });
|
|
37
|
+
}
|
|
38
|
+
/** True when an instance answers on its port with its token; a crash leaves the file behind. */
|
|
39
|
+
export async function probeInstance(info, timeoutMs = 1000) {
|
|
40
|
+
try {
|
|
41
|
+
const res = await fetch(`http://127.0.0.1:${info.port}/api/instance`, {
|
|
42
|
+
headers: { cookie: `${cookieName(info.port)}=${info.token}` },
|
|
43
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
44
|
+
});
|
|
45
|
+
return res.ok;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { basename, join } from 'node:path';
|
|
3
|
+
import { writeConfigFile } from './instance.js';
|
|
4
|
+
const FILE = 'projects.json';
|
|
5
|
+
/** The registry file exists but cannot be read; it is never overwritten then, so the list is not lost. */
|
|
6
|
+
export class RegistryUnreadable extends Error {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(`${FILE} in Jig UI's config directory cannot be read; fix or remove it.`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const isProject = (p) => typeof p === 'object' && p !== null && typeof p.id === 'string' && typeof p.path === 'string';
|
|
12
|
+
/** The connected projects in the order they were connected; none when there is no registry yet. */
|
|
13
|
+
export async function readProjects(dir) {
|
|
14
|
+
let text;
|
|
15
|
+
try {
|
|
16
|
+
text = await readFile(join(dir, FILE), 'utf8');
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error.code === 'ENOENT')
|
|
20
|
+
return [];
|
|
21
|
+
throw new RegistryUnreadable();
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const { projects } = JSON.parse(text);
|
|
25
|
+
if (Array.isArray(projects) && projects.every(isProject))
|
|
26
|
+
return projects;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// falls through
|
|
30
|
+
}
|
|
31
|
+
throw new RegistryUnreadable();
|
|
32
|
+
}
|
|
33
|
+
/** The id for a checkout: its directory name as a slug, with `-2`, `-3`… when that is taken. */
|
|
34
|
+
export function slugFor(root, taken) {
|
|
35
|
+
const base = basename(root)
|
|
36
|
+
.normalize('NFKD')
|
|
37
|
+
.replace(/[̀-ͯ]/g, '')
|
|
38
|
+
.toLowerCase()
|
|
39
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
40
|
+
.replace(/^-+|-+$/g, '') || 'project';
|
|
41
|
+
let id = base;
|
|
42
|
+
for (let n = 2; taken.has(id); n++)
|
|
43
|
+
id = `${base}-${n}`;
|
|
44
|
+
return id;
|
|
45
|
+
}
|
|
46
|
+
// One instance is the only writer; this chain keeps its own requests from overlapping.
|
|
47
|
+
let writes = Promise.resolve();
|
|
48
|
+
function serialized(change) {
|
|
49
|
+
const next = writes.then(change, change);
|
|
50
|
+
writes = next.catch(() => undefined);
|
|
51
|
+
return next;
|
|
52
|
+
}
|
|
53
|
+
async function save(dir, projects) {
|
|
54
|
+
await writeConfigFile(dir, FILE, `${JSON.stringify({ projects }, null, 2)}\n`);
|
|
55
|
+
}
|
|
56
|
+
/** Connects the checkout at `root`; a checkout already connected keeps its id. */
|
|
57
|
+
export function addProject(dir, root) {
|
|
58
|
+
return serialized(async () => {
|
|
59
|
+
const projects = await readProjects(dir);
|
|
60
|
+
const existing = projects.find((p) => p.path === root);
|
|
61
|
+
if (existing)
|
|
62
|
+
return { project: existing, created: false };
|
|
63
|
+
const project = { id: slugFor(root, new Set(projects.map((p) => p.id))), path: root };
|
|
64
|
+
await save(dir, [...projects, project]);
|
|
65
|
+
return { project, created: true };
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/** Disconnects a project; false when no project has that id. Nothing in the project is touched. */
|
|
69
|
+
export function removeProject(dir, id) {
|
|
70
|
+
return serialized(async () => {
|
|
71
|
+
const projects = await readProjects(dir);
|
|
72
|
+
const rest = projects.filter((p) => p.id !== id);
|
|
73
|
+
if (rest.length === projects.length)
|
|
74
|
+
return false;
|
|
75
|
+
await save(dir, rest);
|
|
76
|
+
return true;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { realpath } from 'node:fs/promises';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
const run = promisify(execFile);
|
|
5
|
+
/**
|
|
6
|
+
* Where `path` sits in git: a clone's main checkout (its root, even from a subdirectory), a
|
|
7
|
+
* worktree, or nothing git knows. Only a worktree has a git directory of its own beside the
|
|
8
|
+
* clone's common one; a submodule or a `--separate-git-dir` clone has one directory for both.
|
|
9
|
+
*/
|
|
10
|
+
export async function mainCheckout(path) {
|
|
11
|
+
let stdout;
|
|
12
|
+
try {
|
|
13
|
+
({ stdout } = await run('git', ['rev-parse', '--path-format=absolute', '--show-toplevel', '--git-dir', '--git-common-dir'], {
|
|
14
|
+
cwd: path,
|
|
15
|
+
timeout: 10_000,
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return { kind: 'not-a-repository' };
|
|
20
|
+
}
|
|
21
|
+
const [top, own, common] = stdout.trim().split(/\r?\n/);
|
|
22
|
+
if (!top || !own || !common)
|
|
23
|
+
return { kind: 'not-a-repository' };
|
|
24
|
+
return (await realpath(own)) === (await realpath(common)) ? { kind: 'main', root: await realpath(top) } : { kind: 'worktree' };
|
|
25
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { jigVersion, MIN_JIG_VERSION, supports } from '../jig/client.js';
|
|
3
|
+
import { mainCheckout } from './checkout.js';
|
|
4
|
+
/** Jig's version in the checkout: `null` when Jig is there but names no version Jig UI can read. */
|
|
5
|
+
async function version(root) {
|
|
6
|
+
try {
|
|
7
|
+
return await jigVersion(root);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** The main checkout `path` names, or why it cannot be connected. A Jig below the minimum can. */
|
|
14
|
+
export async function connectable(path) {
|
|
15
|
+
const checkout = await mainCheckout(path);
|
|
16
|
+
if (checkout.kind === 'not-a-repository') {
|
|
17
|
+
return { code: 'not-a-repository', message: 'This is not a directory inside a git repository.' };
|
|
18
|
+
}
|
|
19
|
+
if (checkout.kind === 'worktree') {
|
|
20
|
+
return { code: 'worktree', message: "This is a worktree. Connect its clone's main checkout instead." };
|
|
21
|
+
}
|
|
22
|
+
if ((await version(checkout.root)) === undefined) {
|
|
23
|
+
return { code: 'no-jig', message: 'There is no Jig in this repository. Run jig init in it first.' };
|
|
24
|
+
}
|
|
25
|
+
return { root: checkout.root };
|
|
26
|
+
}
|
|
27
|
+
/** Reads a connected project's state; a project below the minimum Jig is not read any further. */
|
|
28
|
+
export async function projectState({ id, path }) {
|
|
29
|
+
if (!existsSync(path))
|
|
30
|
+
return { id, state: 'unavailable', reason: 'missing' };
|
|
31
|
+
const v = await version(path);
|
|
32
|
+
if (v === undefined)
|
|
33
|
+
return { id, state: 'unavailable', reason: 'no-jig' };
|
|
34
|
+
if (v === null || !supports(v))
|
|
35
|
+
return { id, state: 'unsupported', jigVersion: v, minimum: MIN_JIG_VERSION };
|
|
36
|
+
return { id, state: 'ready', jigVersion: v };
|
|
37
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(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)}})();function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>x(e)===`[object Map]`,p=e=>x(e)===`[object Set]`,m=e=>x(e)===`[object Date]`,h=e=>typeof e==`function`,g=e=>typeof e==`string`,_=e=>typeof e==`symbol`,v=e=>typeof e==`object`&&!!e,y=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),b=Object.prototype.toString,x=e=>b.call(e),S=e=>x(e).slice(8,-1),C=e=>x(e)===`[object Object]`,w=e=>g(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,ee=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),te=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ne=/-\w/g,T=te(e=>e.replace(ne,e=>e.slice(1).toUpperCase())),re=/\B([A-Z])/g,E=te(e=>e.replace(re,`-$1`).toLowerCase()),ie=te(e=>e.charAt(0).toUpperCase()+e.slice(1)),ae=te(e=>e?`on${ie(e)}`:``),D=(e,t)=>!Object.is(e,t),oe=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},O=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},se=e=>{let t=parseFloat(e);return isNaN(t)?e:t},ce,le=()=>ce||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};function ue(e){if(d(e)){let t={};for(let n=0;n<e.length;n++){let r=e[n],i=g(r)?me(r):ue(r);if(i)for(let e in i)t[e]=i[e]}return t}if(g(e)||v(e))return e}var de=/;(?![^(]*\))/g,fe=/:([^]+)/,pe=/"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g;function me(e){let t={};return e.replace(pe,e=>e.startsWith(`/*`)?``:e).split(de).forEach(e=>{if(e){let n=e.split(fe);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function k(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;n<e.length;n++){let r=k(e[n]);r&&(t+=r+` `)}else if(v(e))for(let n in e)e[n]&&(t+=n+` `);return t.trim()}var he=e(`itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,playsinline,readonly`);function ge(e){return!!e||e===``}function _e(e,t,n){if(e.length!==t.length)return!1;let r=!0;for(let i=0;r&&i<e.length;i++)r=xe(e[i],t[i],n);return r}function ve(e,t,n){if(e.size!==t.size)return!1;let r=Array.from(t),i=new Uint8Array(r.length);for(let t of e){let e=-1;for(let a=0;a<r.length;a++)if(!i[a]&&xe(t,r[a],n)){e=a;break}if(e<0)return!1;i[e]=1}return!0}function ye(e,t,n){let r=f(e),i=f(t);if(r||i||(r=p(e),i=p(t),r||i))return r&&i?ve(e,t,n):!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let r in e){let i=e.hasOwnProperty(r),a=t.hasOwnProperty(r);if(i&&!a||!i&&a||!xe(e[r],t[r],n))return!1}return String(e)===String(t)}function be(e,t,n,r){n||=[new Map,new Map];let[i,a]=n;if(i.has(e)||a.has(t))return i.get(e)===t&&a.get(t)===e;i.set(e,t),a.set(t,e);let o=r(e,t,n);return i.delete(e),a.delete(t),o}function xe(e,t,n){if(e===t)return!0;let r=m(e),i=m(t);return r||i?r&&i?e.getTime()===t.getTime():!1:(r=_(e),i=_(t),r||i?e===t:(r=d(e),i=d(t),r||i?r&&i?be(e,t,n,_e):!1:(r=v(e),i=v(t),r||i?!r||!i?!1:be(e,t,n,ye):String(e)===String(t))))}var Se=e=>!!(e&&e.__v_isRef===!0),Ce=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?Se(e)?Ce(e.value):JSON.stringify(e,we,2):String(e),we=(e,t)=>Se(t)?we(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[Te(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>Te(e))}:_(t)?Te(t):v(t)&&!d(t)&&!C(t)?String(t):t,Te=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,A,Ee=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&A&&(A.active?(this.parent=A,this.index=(A.scopes||(A.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,t;if(this.scopes){let n=this.scopes.slice();for(e=0,t=n.length;e<t;e++)n[e].pause()}for(e=0,t=this.effects.length;e<t;e++)this.effects[e].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let e,t;if(this.scopes){let n=this.scopes.slice();for(e=0,t=n.length;e<t;e++)n[e].resume()}let n=this.effects.slice();for(e=0,t=n.length;e<t;e++)n[e].resume()}}run(e){if(this._active){let t=A;try{return A=this,e()}finally{A=t}}}on(){++this._on===1&&(this.prevScope=A,A=this)}off(){if(this._on>0&&--this._on===0){if(A===this)A=this.prevScope;else{let e=A;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(this.effects.length=0,t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.cleanups.length=0,this.scopes){let e=this.scopes.slice();for(t=0,n=e.length;t<n;t++)e[t].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!e){let e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.parent=void 0}}};function De(){return A}var j,Oe=new WeakSet,ke=class{constructor(e){this.fn=e,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,A&&(A.active?A.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,Oe.has(this)&&(Oe.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Ne(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,We(this),Ie(this);let e=j,t=M;j=this,M=!0;try{return this.fn()}finally{Le(this),j=e,M=t,this.flags&=-3}}stop(){if(this.flags&1){for(let e=this.deps;e;e=e.nextDep)Be(e);this.deps=this.depsTail=void 0,We(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?Oe.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Re(this)&&this.run()}get dirty(){return Re(this)}},Ae=0,je,Me;function Ne(e,t=!1){e.flags|=8,t?(e.next=Me,Me=e):(e.next=je,je=e)}function Pe(){Ae++}function Fe(){if(--Ae>0)return;if(Me){let e=Me;for(Me=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;je;){let t=je;for(je=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(t){e||=t}t=n}}if(e)throw e}function Ie(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Le(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),Be(r),Ve(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Re(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(ze(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function ze(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ge)||(e.globalVersion=Ge,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Re(e))))return;e.flags|=2;let t=e.dep,n=j,r=M;j=e,M=!0;try{Ie(e);let n=e.fn(e._value);(t.version===0||D(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{j=n,M=r,Le(e),e.flags&=-3}}function Be(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Be(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Ve(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var M=!0,He=[];function Ue(){He.push(M),M=!1}function N(){let e=He.pop();M=e===void 0||e}function We(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=j;j=void 0;try{t()}finally{j=e}}}var Ge=0,Ke=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},qe=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!j||!M||j===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==j)t=this.activeLink=new Ke(j,this),j.deps?(t.prevDep=j.depsTail,j.depsTail.nextDep=t,j.depsTail=t):j.deps=j.depsTail=t,Je(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=j.depsTail,t.nextDep=void 0,j.depsTail.nextDep=t,j.depsTail=t,j.deps===t&&(j.deps=e)}return t}trigger(e){this.version++,Ge++,this.notify(e)}notify(e){Pe();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{Fe()}}};function Je(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)Je(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var Ye=new WeakMap,Xe=Symbol(``),Ze=Symbol(``),Qe=Symbol(``);function P(e,t,n){if(M&&j){let t=Ye.get(e);t||Ye.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new qe),r.map=t,r.key=n),r.track()}}function $e(e,t,n,r,i,a){let o=Ye.get(e);if(!o){Ge++;return}let s=e=>{e&&e.trigger()};if(Pe(),t===`clear`)o.forEach(s);else{let i=d(e),a=i&&w(n);if(i&&n===`length`){let e=Number(r);o.forEach((t,n)=>{(n===`length`||n===Qe||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(Qe)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Xe)),f(e)&&s(o.get(Ze)));break;case`delete`:i||(s(o.get(Xe)),f(e)&&s(o.get(Ze)));break;case`set`:f(e)&&s(o.get(Xe))}}Fe()}function et(e){let t=R(e);return t===e||(P(t,`iterate`,Qe),L(e))?t:I(e)?Lt(e)?t.map(e=>Bt(z(e))):t.map(Bt):t.map(z)}function tt(e){return P(e=R(e),`iterate`,Qe),e}function F(e,t){return I(e)?Bt(Lt(e)?z(t):t):z(t)}var nt={__proto__:null,[Symbol.iterator](){return rt(this,Symbol.iterator,e=>F(this,e))},concat(...e){return et(this).concat(...e.map(e=>d(e)?et(e):e))},entries(){return rt(this,`entries`,e=>(e[1]=F(this,e[1]),e))},every(e,t){return ot(this,`every`,e,t,void 0,arguments)},filter(e,t){return ot(this,`filter`,e,t,e=>e.map(e=>F(this,e)),arguments)},find(e,t){return ot(this,`find`,e,t,e=>F(this,e),arguments)},findIndex(e,t){return ot(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return ot(this,`findLast`,e,t,e=>F(this,e),arguments)},findLastIndex(e,t){return ot(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return ot(this,`forEach`,e,t,void 0,arguments)},includes(...e){return ct(this,`includes`,e)},indexOf(...e){return ct(this,`indexOf`,e)},join(e){return et(this).join(e)},lastIndexOf(...e){return ct(this,`lastIndexOf`,e)},map(e,t){return ot(this,`map`,e,t,void 0,arguments)},pop(){return lt(this,`pop`)},push(...e){return lt(this,`push`,e)},reduce(e,...t){return st(this,`reduce`,e,t)},reduceRight(e,...t){return st(this,`reduceRight`,e,t)},shift(){return lt(this,`shift`)},some(e,t){return ot(this,`some`,e,t,void 0,arguments)},splice(...e){return lt(this,`splice`,e)},toReversed(){return et(this).toReversed()},toSorted(e){return et(this).toSorted(e)},toSpliced(...e){return et(this).toSpliced(...e)},unshift(...e){return lt(this,`unshift`,e)},values(){return rt(this,`values`,e=>F(this,e))}};function rt(e,t,n){let r=tt(e),i=r[t],a=i.call(r);if(r!==e&&!L(e)){if(a[Symbol.toStringTag]===`Array Iterator`){let e=Object.create(Object.getPrototypeOf(a));return e.next=()=>it(a.next(),n),i!==at[t]&&Object.defineProperties(e,{return:{get(){let e=a.return;return typeof e==`function`?e.bind(a):e}},throw:{get(){let e=a.throw;return typeof e==`function`?e.bind(a):e}}}),e}a._next=a.next,a.next=()=>it(a._next(),n)}return a}function it(e,t){return e.done||(e.value=t(e.value)),e}var at=Array.prototype;function ot(e,t,n,r,i,a){let o=tt(e),s=o!==e&&!L(e),c=o[t];if(c!==at[t]){let t=c.apply(e,a);return s?z(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,F(e,t),r,e)}:n.length>2&&(l=function(t,r){return n.call(this,t,r,e)}));let u=c.call(o,l,r);return s&&i?i(u):u}function st(e,t,n,r){let i=tt(e),a=i!==e&&!L(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=F(e,t)),n.call(this,t,F(e,r),i,e)}):n.length>3&&(o=function(t,r,i){return n.call(this,t,r,i,e)}));let c=i[t](o,...r);return s?F(e,c):c}function ct(e,t,n){let r=R(e);P(r,`iterate`,Qe);let i=r[t](...n);return(i===-1||i===!1)&&Rt(n[0])?(n[0]=R(n[0]),r[t](...n)):i}function lt(e,t,n=[]){Ue(),Pe();let r=R(e)[t].apply(e,n);return Fe(),N(),r}var ut=e(`__proto__,__v_isRef,__isVue`),dt=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function ft(e){_(e)||(e=String(e));let t=R(this);return P(t,`has`,e),t.hasOwnProperty(e)}var pt=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(t===`__v_skip`)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(t===`__v_isReactive`)return!r;if(t===`__v_isReadonly`)return r;if(t===`__v_isShallow`)return i;if(t===`__v_raw`)return n===(r?i?jt:At:i?kt:Ot).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=nt[t]))return e;if(t===`hasOwnProperty`)return ft}let o=Reflect.get(e,t,B(e)?e:n);if((_(t)?dt.has(t):ut(t))||(r||P(e,`get`,t),i))return o;if(B(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?Ft(e):e}return v(o)?r?Ft(o):Nt(o):o}},mt=class extends pt{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],a=d(e)&&w(t);if(!this._isShallow){let e=I(i);if(!L(n)&&!I(n)&&(i=R(i),n=R(n)),!a&&B(i)&&!B(n))return e||(i.value=n),!0}let o=a?Number(t)<e.length:u(e,t),s=Reflect.set(e,t,n,B(e)?e:r);return e===R(r)&&s&&(o?D(n,i)&&$e(e,`set`,t,n,i):$e(e,`add`,t,n)),s}deleteProperty(e,t){let n=u(e,t),r=e[t],i=Reflect.deleteProperty(e,t);return i&&n&&$e(e,`delete`,t,void 0,r),i}has(e,t){let n=Reflect.has(e,t);return(!_(t)||!dt.has(t))&&P(e,`has`,t),n}ownKeys(e){return P(e,`iterate`,d(e)?`length`:Xe),Reflect.ownKeys(e)}},ht=class extends pt{constructor(e=!1){super(!0,e)}set(e,t){return!0}deleteProperty(e,t){return!0}},gt=new mt,_t=new ht,vt=new mt(!0),yt=e=>e,bt=e=>Reflect.getPrototypeOf(e);function xt(e,t,n){return function(...r){let i=this.__v_raw,a=R(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?yt:t?Bt:z;return!t&&P(a,`iterate`,l?Ze:Xe),s(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:c?[d(e[0]),d(e[1])]:d(e),done:t}}})}}function St(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function Ct(e,t){let n={get(n){let r=this.__v_raw,i=R(r),a=R(n);e||(D(n,a)&&P(i,`get`,n),P(i,`get`,a));let{has:o}=bt(i),s=t?yt:e?Bt:z;if(o.call(i,n))return s(r.get(n));if(o.call(i,a))return s(r.get(a));r!==i&&r.get(n)},get size(){let t=this.__v_raw;return!e&&P(R(t),`iterate`,Xe),t.size},has(t){let n=this.__v_raw,r=R(n),i=R(t);return e||(D(t,i)&&P(r,`has`,t),P(r,`has`,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,a=i.__v_raw,o=R(a),s=t?yt:e?Bt:z;return!e&&P(o,`iterate`,Xe),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:St(`add`),set:St(`set`),delete:St(`delete`),clear:St(`clear`)}:{add(e){let n=R(this),r=bt(n),i=R(e),a=!t&&!L(e)&&!I(e)?i:e;return r.has.call(n,a)||D(e,a)&&r.has.call(n,e)||D(i,a)&&r.has.call(n,i)||(n.add(a),$e(n,`add`,a,a)),this},set(e,n){!t&&!L(n)&&!I(n)&&(n=R(n));let r=R(this),{has:i,get:a}=bt(r),o=i.call(r,e);o||=(e=R(e),i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?D(n,s)&&$e(r,`set`,e,n,s):$e(r,`add`,e,n),this},delete(e){let t=R(this),{has:n,get:r}=bt(t),i=n.call(t,e);i||=(e=R(e),n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&$e(t,`delete`,e,void 0,a),o},clear(){let e=R(this),t=e.size!==0,n=e.clear();return t&&$e(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=xt(r,e,t)}),n}function wt(e,t){let n=Ct(e,t);return(r,i,a)=>i===`__v_isReactive`?!e:i===`__v_isReadonly`?e:i===`__v_isShallow`?t:i===`__v_raw`?r:Reflect.get(u(n,i)&&i in r?n:r,i,a)}var Tt={get:wt(!1,!1)},Et={get:wt(!1,!0)},Dt={get:wt(!0,!1)},Ot=new WeakMap,kt=new WeakMap,At=new WeakMap,jt=new WeakMap;function Mt(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function Nt(e){return I(e)?e:It(e,!1,gt,Tt,Ot)}function Pt(e){return It(e,!1,vt,Et,kt)}function Ft(e){return It(e,!0,_t,Dt,At)}function It(e,t,n,r,i){if(!v(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let a=i.get(e);if(a)return a;let o=Mt(S(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function Lt(e){return I(e)?Lt(e.__v_raw):!!(e&&e.__v_isReactive)}function I(e){return!!(e&&e.__v_isReadonly)}function L(e){return!!(e&&e.__v_isShallow)}function Rt(e){return e?!!e.__v_raw:!1}function R(e){let t=e&&e.__v_raw;return t?R(t):e}function zt(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&O(e,`__v_skip`,!0),e}var z=e=>v(e)?Nt(e):e,Bt=e=>v(e)?Ft(e):e;function B(e){return e?e.__v_isRef===!0:!1}function Vt(e){return Ht(e,!1)}function Ht(e,t){return B(e)?e:new Ut(e,t)}var Ut=class{constructor(e,t){this.dep=new qe,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:R(e),this._value=t?e:z(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||L(e)||I(e);e=n?e:R(e),D(e,t)&&(this._rawValue=e,this._value=n?e:z(e),this.dep.trigger())}};function Wt(e){return B(e)?e.value:e}var Gt={get:(e,t,n)=>t===`__v_raw`?e:Wt(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return B(i)&&!B(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Kt(e){return Lt(e)?e:new Proxy(e,Gt)}var qt=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new qe(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ge-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&j!==this)return Ne(this,!0),!0}get value(){let e=this.dep.track();return ze(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function Jt(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new qt(r,i,n)}var Yt={},Xt=new WeakMap,Zt=void 0;function Qt(e,t=!1,n=Zt){if(n){let t=Xt.get(n);t||Xt.set(n,t=[]),t.push(e)}}function $t(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:L(e)||o===!1||o===0?en(e,1):en(e),m,g,_,v,y=!1,b=!1;if(B(e)?(g=()=>e.value,y=L(e)):Lt(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>Lt(e)||L(e)),g=()=>e.map(e=>{if(B(e))return e.value;if(Lt(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){Ue();try{_()}finally{N()}}let t=Zt;Zt=m;try{return f?f(e,3,[v]):e(v)}finally{Zt=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>en(e(),t)}let x=De(),S=()=>{m.stop(),x&&x.active&&c(x.effects,m)};if(s&&n){let e=n;n=(...t)=>{try{return e(...t)}finally{S()}}}let C=b?Array(e.length).fill(Yt):Yt,w=e=>{if(m.flags&1&&(m.dirty||e)){if(n){let t=m.run();if(e||o||y||(b?t.some((e,t)=>D(e,C[t])):D(t,C))){let e=Zt;Ue();try{_&&_(),Zt=m;let e=[t,C===Yt?void 0:b&&C[0]===Yt?[]:C,v];C=t,f?f(n,3,e):n(...e)}finally{Zt=e,N()}}}else m.run()}};return u&&u(w),m=new ke(g),m.scheduler=l?()=>l(w,!1):w,v=e=>Qt(e,!1,m),_=m.onStop=()=>{let e=Xt.get(m);if(e){if(f)f(e,4);else for(let t of e)t();Xt.delete(m)}},n?a?w(!0):C=m.run():l?l(w.bind(null,!0),!0):m.run(),S.pause=m.pause.bind(m),S.resume=m.resume.bind(m),S.stop=S,S}function en(e,t=1/0,n){if(t<=0||!v(e)||e.__v_skip||(n||=new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,B(e))en(e.value,t,n);else if(d(e))for(let r=0;r<e.length;r++)en(e[r],t,n);else if(p(e)||f(e))e.forEach(e=>{en(e,t,n)});else if(C(e)){for(let r in e)en(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&en(e[r],t,n)}return e}function tn(e,t,n,r){try{return r?e(...r):e()}catch(e){nn(e,t,n)}}function V(e,t,n,r){if(h(e)){let i=tn(e,t,n,r);return i&&y(i)&&i.catch(e=>{nn(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a<e.length;a++)i.push(V(e[a],t,n,r));return i}}function nn(e,n,r,i=!0){let a=n?n.vnode:null,{errorHandler:o,throwUnhandledErrorInProduction:s}=n&&n.appContext.config||t;if(n){let t=n.parent,i=n.proxy,a=`https://vuejs.org/error-reference/#runtime-${r}`;for(;t;){let n=t.ec;if(n){for(let t=0;t<n.length;t++)if(n[t](e,i,a)===!1)return}t=t.parent}if(o){Ue(),tn(o,null,10,[e,i,a]),N();return}}rn(e,r,a,i,s)}function rn(e,t,n,r=!0,i=!1){if(i)throw e;console.error(e)}var H=[],U=-1,an=[],on=null,sn=0,cn=Promise.resolve(),ln=null;function un(e){let t=ln||cn;return e?t.then(this?e.bind(this):e):t}function dn(e){let t=U+1,n=H.length;for(;t<n;){let r=t+n>>>1,i=H[r],a=yn(i);a<e||a===e&&i.flags&2?t=r+1:n=r}return t}function fn(e){if(!(e.flags&1)){let t=yn(e),n=H[H.length-1];!n||!(e.flags&2)&&t>=yn(n)?H.push(e):H.splice(dn(t),0,e),e.flags|=1,pn()}}function pn(){ln||=cn.then(bn)}function mn(e){if(!d(e))on&&e.id===-1?on.splice(sn+1,0,e):e.flags&1||(an.push(e),e.flags|=1);else for(let t=0;t<e.length;t++)an.push(e[t]);pn()}function hn(e,t,n,r=U+1){for(;r<H.length;r++){let n=H[r];if(n&&n.flags&2){if(e&&n.id!==e.uid||t!==void 0&&!(n.id>=t))continue;H.splice(r,1),r=e?r-1:U,n.flags&4&&(n.flags&=-2),n(),n.flags&4||(n.flags&=-2)}}}function gn(e,t,n=0){if(an.length){let e=an,r=0;if(t){e=[];for(let i=0;i<an.length;i++){let a=an[i];(a.i===void 0?t.has(a):!a.i||a.i.uid<n)?an[r++]=a:e.push(a)}}let i=[...new Set(e)].sort((e,t)=>yn(e)-yn(t));if(an.length=r,on){for(let e=0;e<i.length;e++)on.push(i[e]);return}for(on=i,sn=0;sn<on.length;sn++){let e=on[sn];e.flags&4&&(e.flags&=-2),e.flags&8||e(),e.flags&=-2}on=null,sn=0}}var _n=!1;function vn(e,t){if(_n){e();return}let n=t===void 0?void 0:new Set(an);e(),_n=!0;try{hn(void 0,t),gn(void 0,n,t)}finally{_n=!1}}var yn=e=>e.id==null?e.flags&2?-1:1/0:e.id;function bn(e){try{for(U=0;U<H.length;U++){let e=H[U];e&&!(e.flags&8)&&(e.flags&4&&(e.flags&=-2),tn(e,e.i,e.i?15:14),e.flags&4||(e.flags&=-2))}}finally{for(;U<H.length;U++){let e=H[U];e&&(e.flags&=-2)}U=-1,H.length=0,gn(e),ln=null,(H.length||an.length)&&bn(e)}}var W=null,xn=null;function Sn(e){let t=W;return W=e,xn=e&&e.type.__scopeId||null,t}function Cn(e,t=W,n){if(!t||e._n)return e;let r=(...n)=>{r._d&&Ai(-1);let i=Sn(t),a=Di.length,o;try{o=e(...n)}finally{for(let e=Di.length;e>a;e--)Oi();Sn(i),r._d&&Ai(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function wn(e,n){if(W===null)return e;let r=da(W),i=e.dirs||=[];for(let e=0;e<n.length;e++){let[a,o,s,c=t]=n[e];a&&(h(a)&&(a={mounted:a,updated:a}),a.deep&&en(o),i.push({dir:a,instance:r,value:o,oldValue:void 0,arg:s,modifiers:c}))}return e}function Tn(e,t,n,r){let i=e.dirs,a=t&&t.dirs;for(let o=0;o<i.length;o++){let s=i[o];a&&(s.oldValue=a[o].value);let c=s.dir[r];c&&(Ue(),V(c,n,8,[e.el,s,e,t]),N())}}function En(e,t){if($){let n=$.provides,r=$.parent&&$.parent.provides;r===n&&(n=$.provides=Object.create(r)),n[e]=t}}function Dn(e,t,n=!1){let r=Qi();if(r||Fr){let i=Fr?Fr._context.provides:r?r.parent==null||r.ce?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides:void 0;if(i&&e in i)return i[e];if(arguments.length>1)return n&&h(t)?t.call(r&&r.proxy):t}}var On=Symbol.for(`v-scx`),kn=()=>Dn(On);function An(e,t,n){return jn(e,t,n)}function jn(e,n,i=t){let{immediate:a,deep:o,flush:c,once:l}=i,u=s({},i),d=n&&a||!n&&c!==`post`,f;if(ia){if(c===`sync`){let e=kn();f=e.__watcherHandles||=[]}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=$;u.call=(e,t,n)=>V(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{e.i=p,K(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():fn(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=$t(e,n,u);return ia&&(f?f.push(h):d&&h()),h}function Mn(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?Nn(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=ta(this),s=jn(i,a.bind(r),n);return o(),s}function Nn(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}var Pn=Symbol(`_vte`),Fn=e=>e.__isTeleport,In=Symbol(`_leaveCb`);function Ln(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==J){t=n;break}}return t}function Rn(e){if(!Jn(e))return Fn(e.type)&&e.children?Ln(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&h(n.default))return n.default()}}function zn(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let n=e.component.subTree;zn(Fn(n.type)&&Rn(n)||n,t)}else if(e.shapeFlag&128)e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback);else if(e.transition=t,e.type===q&&d(e.children)){let n=Hr(e.children,!1);n&&zn(n,t)}}function Bn(e){if(e.component)return Bn(e.component.subTree);if(e.type===q){let t=d(e.children)&&Hr(e.children,!1);return t?Bn(t):void 0}if(e.type!==J)return e}function Vn(e,t){return h(e)?s({name:e.name},t,{setup:e}):e}function Hn(e){e.ids=[e.ids[0]+e.ids[2]+++`-`,0,0]}function Un(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}var Wn=new WeakMap;function Gn(e,n,r,a,o=!1){if(d(e)){e.forEach((e,t)=>Gn(e,n&&(d(n)?n[t]:n),r,a,o));return}if(qn(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&Gn(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?da(a.component):a.el,l=o?null:s,{i:f,r:p}=e,m=n&&n.r,_=f.refs===t?f.refs={}:f.refs,v=f.setupState,y=R(v),b=v===t?i:e=>!Un(_,e)&&u(y,e),x=(e,t)=>!(t&&Un(_,t));if(m!=null&&m!==p){if(Kn(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(B(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))tn(p,f,12,[l,_]);else{let t=g(p),n=B(p);if(t||n){let i=()=>{if(e.f){let n=t?b(p)?v[p]:_[p]:x(p)||!e.k?p.value:_[e.k];if(o)d(n)&&c(n,s);else if(d(n))n.includes(s)||n.push(s);else if(t)_[p]=[s],b(p)&&(v[p]=_[p]);else{let t=[s];x(p,e.k)&&(p.value=t),e.k&&(_[e.k]=t)}}else t?(_[p]=l,b(p)&&(v[p]=l)):n&&(x(p,e.k)&&(p.value=l),e.k&&(_[e.k]=l))};if(l){let t=()=>{i(),Wn.delete(e)};t.id=-1,Wn.set(e,t),K(t,r)}else Kn(e),i()}}}function Kn(e){let t=Wn.get(e);t&&(t.flags|=8,Wn.delete(e))}le().requestIdleCallback,le().cancelIdleCallback;var qn=e=>!!e.type.__asyncLoader,Jn=e=>e.type.__isKeepAlive;function Yn(e,t){Zn(e,`a`,t)}function Xn(e,t){Zn(e,`da`,t)}function Zn(e,t,n=$){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if($n(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Jn(e.parent.vnode)&&Qn(r,t,n,e),e=e.parent}}function Qn(e,t,n,r){let i=$n(t,e,r,!0);or(()=>{c(r[t],i)},n)}function $n(e,t,n=$,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{Ue();let i=ta(n),a=V(t,n,e,r);return i(),N(),a};return r?i.unshift(a):i.push(a),a}}var er=e=>(t,n=$)=>{(!ia||e===`sp`)&&$n(e,(...e)=>t(...e),n)},tr=er(`bm`),nr=er(`m`),rr=er(`bu`),ir=er(`u`),ar=er(`bum`),or=er(`um`),sr=er(`sp`),cr=er(`rtg`),lr=er(`rtc`);function ur(e,t=$){$n(`ec`,e,t)}var dr=Symbol.for(`v-ndc`);function fr(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&Lt(e),r=!1,s=!1;n&&(r=!L(e),s=I(e),e=tt(e)),i=Array(e.length);for(let n=0,o=e.length;n<o;n++)i[n]=t(r?s?Bt(z(e[n])):z(e[n]):e[n],n,void 0,a&&a[n])}else if(typeof e==`number`){if(!Number.isInteger(e)||e<0)i=[];else{i=Array(e);for(let n=0;n<e;n++)i[n]=t(n+1,n,void 0,a&&a[n])}}else if(v(e)){if(e[Symbol.iterator])i=Array.from(e,(e,n)=>t(e,n,void 0,a&&a[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,o=n.length;r<o;r++){let o=n[r];i[r]=t(e[o],o,r,a&&a[r])}}}else i=[];return n&&(n[r]=i),i}var pr=e=>e?ra(e)?da(e):pr(e.parent):null,mr=s(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>pr(e.parent),$root:e=>pr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Cr(e),$forceUpdate:e=>e.f||=()=>{fn(e.update)},$nextTick:e=>e.n||=un.bind(e.proxy),$watch:e=>Mn.bind(e)}),hr=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),gr={get({_:e},n){if(n===`__v_skip`)return!0;let{ctx:r,setupState:i,data:a,props:o,accessCache:s,type:c,appContext:l}=e;if(n[0]!==`$`){let e=s[n];if(e!==void 0)switch(e){case 1:return i[n];case 2:return a[n];case 4:return r[n];case 3:return o[n]}else if(hr(i,n))return s[n]=1,i[n];else if(a!==t&&u(a,n))return s[n]=2,a[n];else if(u(o,n))return s[n]=3,o[n];else if(r!==t&&u(r,n))return s[n]=4,r[n];else vr&&(s[n]=0)}let d=mr[n],f,p;if(d)return n===`$attrs`&&P(e.attrs,`get`,``),d(e);if((f=c.__cssModules)&&(f=f[n]))return f;if(r!==t&&u(r,n))return s[n]=4,r[n];if(p=l.config.globalProperties,u(p,n))return p[n]},set({_:e},n,r){let{data:i,setupState:a,ctx:o}=e;return hr(a,n)?(a[n]=r,!0):i!==t&&u(i,n)?(i[n]=r,!0):u(e.props,n)||n[0]===`$`&&n.slice(1)in e?!1:(o[n]=r,!0)},has({_:{data:e,setupState:n,accessCache:r,ctx:i,appContext:a,props:o,type:s}},c){let l;return!!(r[c]||e!==t&&c[0]!==`$`&&u(e,c)||hr(n,c)||u(o,c)||u(i,c)||u(mr,c)||u(a.config.globalProperties,c)||(l=s.__cssModules)&&l[c])},defineProperty(e,t,n){return n.get==null?u(n,`value`)&&this.set(e,t,n.value,null):e._.accessCache[t]=0,Reflect.defineProperty(e,t,n)}};function _r(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var vr=!0;function yr(e){let t=Cr(e),n=e.proxy,i=e.ctx;vr=!1,t.beforeCreate&&xr(t.beforeCreate,e,`bc`);let{data:a,computed:o,methods:s,watch:c,provide:l,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:g,updated:_,activated:y,deactivated:b,beforeDestroy:x,beforeUnmount:S,destroyed:C,unmounted:w,render:ee,renderTracked:te,renderTriggered:ne,errorCaptured:T,serverPrefetch:re,expose:E,inheritAttrs:ie,components:ae,directives:D,filters:oe}=t;if(u&&br(u,i,null),s)for(let e in s){let t=s[e];h(t)&&(i[e]=t.bind(n))}if(a){let t=a.call(n,n);v(t)&&(e.data=Nt(t))}if(vr=!0,o)for(let e in o){let t=o[e],a=pa({get:h(t)?t.bind(n,n):h(t.get)?t.get.bind(n,n):r,set:!h(t)&&h(t.set)?t.set.bind(n):r});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(c)for(let e in c)Sr(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{En(t,e[t])})}f&&xr(f,e,`c`);function O(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(O(tr,p),O(nr,m),O(rr,g),O(ir,_),O(Yn,y),O(Xn,b),O(ur,T),O(lr,te),O(cr,ne),O(ar,S),O(or,w),O(sr,re),d(E)){if(E.length){let t=e.exposed||={};E.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||={}}ee&&e.render===r&&(e.render=ee),ie!=null&&(e.inheritAttrs=ie),ae&&(e.components=ae),D&&(e.directives=D),re&&Hn(e)}function br(e,t,n=r){d(e)&&(e=Or(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?Dn(r.from||n,r.default,!0):Dn(r.from||n):Dn(r),B(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function xr(e,t,n){V(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function Sr(e,t,n,r){let i=r.includes(`.`)?Nn(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&An(i,n)}else if(h(e))An(i,e.bind(n));else if(v(e)){if(d(e))e.forEach(e=>Sr(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&An(i,r,e)}}}function Cr(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t),c;return s?c=s:!i.length&&!n&&!r?c=t:(c={},i.length&&i.forEach(e=>wr(c,e,o,!0)),wr(c,t,o)),v(t)&&a.set(t,c),c}function wr(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&wr(e,a,n,!0),i&&i.forEach(t=>wr(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=Tr[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var Tr={data:Er,props:Ar,emits:Ar,methods:kr,computed:kr,beforeCreate:G,created:G,beforeMount:G,mounted:G,beforeUpdate:G,updated:G,beforeDestroy:G,beforeUnmount:G,destroyed:G,unmounted:G,activated:G,deactivated:G,errorCaptured:G,serverPrefetch:G,components:kr,directives:kr,watch:jr,provide:Er,inject:Dr};function Er(e,t){return t?e?function(){return s(h(e)?e.call(this,this):e,h(t)?t.call(this,this):t)}:t:e}function Dr(e,t){return kr(Or(e),Or(t))}function Or(e){if(d(e)){let t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function G(e,t){return e?[...new Set([].concat(e,t))]:t}function kr(e,t){return e?s(Object.create(null),e,t):t}function Ar(e,t){return e?d(e)&&d(t)?[...new Set([...e,...t])]:s(Object.create(null),_r(e),_r(t??{})):t}function jr(e,t){if(!e)return t;if(!t)return e;let n=s(Object.create(null),e);for(let r in t)n[r]=G(e[r],t[r]);return n}function Mr(){return{app:null,config:{isNativeTag:i,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}var Nr=0;function Pr(e,t){return function(n,r=null){h(n)||(n=s({},n)),r!=null&&!v(r)&&(r=null);let i=Mr(),a=new WeakSet,o=[],c=!1,l=i.app={_uid:Nr++,_component:n,_props:r,_container:null,_context:i,_instance:null,version:ma,get config(){return i.config},set config(e){},use(e,...t){return a.has(e)||(e&&h(e.install)?(a.add(e),e.install(l,...t)):h(e)&&(a.add(e),e(l,...t))),l},mixin(e){return i.mixins.includes(e)||i.mixins.push(e),l},component(e,t){return t?(i.components[e]=t,l):i.components[e]},directive(e,t){return t?(i.directives[e]=t,l):i.directives[e]},mount(a,o,s){if(!c){let u=l._ceVNode||Li(n,r);return u.appContext=i,s===!0?s=`svg`:s===!1&&(s=void 0),o&&t?t(u,a):e(u,a,s),c=!0,l._container=a,a.__vue_app__=l,da(u.component)}},onUnmount(e){o.push(e)},unmount(){c&&(V(o,l._instance,16),e(null,l._container),delete l._container.__vue_app__)},provide(e,t){return i.provides[e]=t,l},runWithContext(e){let t=Fr;Fr=l;try{return e()}finally{Fr=t}}};return l}}var Fr=null,Ir=(e,t)=>t===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${T(t)}Modifiers`]||e[`${E(t)}Modifiers`];function Lr(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&Ir(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>g(e)?e.trim():e)),s.number&&(a=a.map(se)));let c,l=i[c=ae(n)]||i[c=ae(T(n))];!l&&o&&(l=i[c=ae(E(n))]),l&&V(l,e,6,a);let u=i[c+`Once`];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,V(u,e,6,a)}}var Rr=new WeakMap;function zr(e,t,n=!1){let r=n?Rr:t.emitsCache,i=r.get(e);if(i!==void 0)return i;let a=e.emits,o={},c=!1;if(!h(e)){let r=e=>{let n=zr(e,t,!0);n&&(c=!0,s(o,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return!a&&!c?(v(e)&&r.set(e,null),null):(d(a)?a.forEach(e=>o[e]=null):s(o,a),v(e)&&r.set(e,o),o)}function Br(e,t){return!e||!a(t)?!1:(t=t.slice(2),t=t===`Once`?t:t.replace(/Once$/,``),u(e,t[0].toLowerCase()+t.slice(1))||u(e,E(t))||u(e,t))}function Vr(e){let{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[a],slots:s,attrs:c,emit:l,render:u,renderCache:d,props:f,data:p,setupState:m,ctx:h,inheritAttrs:g}=e,_=Sn(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=Ui(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=Ui(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:Ur(c)}}catch(t){Di.length=0,nn(t,e,1),v=Li(J)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=Wr(y,a)),b=Bi(b,y,!1,!0))}return n.dirs&&(b=Bi(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&zn(Fn(b.type)&&Rn(b)||b,n.transition),v=b,Sn(_),v}function Hr(e,t=!0){let n;for(let t=0;t<e.length;t++){let r=e[t];if(Ni(r)){if(r.type!==J||r.children===`v-if`){if(n)return;n=r}}else return}return n}var Ur=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||={})[n]=e[n]);return t},Wr=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Gr(e,t,n){let{props:r,children:i,component:a}=e,{props:o,children:s,patchFlag:c}=t,l=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Kr(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;t<e.length;t++){let n=e[t];if(qr(o,r,n)&&!Br(l,n))return!0}}}else return(i||s)&&(!s||!s.$stable)?!0:r===o?!1:r?!o||Kr(r,o,l):!!o;return!1}function Kr(e,t,n){let r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let i=0;i<r.length;i++){let a=r[i];if(!u(e,a)||qr(t,e,a)&&!Br(n,a))return!0}return!1}function qr(e,t,n){let r=e[n],i=t[n];return n===`style`&&v(r)&&v(i)?!xe(r,i):r!==i}function Jr({vnode:e,parent:t,suspense:n},r){for(;t;){let n=t.subTree;if(n.suspense&&n.suspense.activeBranch===e&&(n.suspense.vnode.el=n.el=r,e=n),n===e)(e=t.vnode).el=r,t=t.parent;else break}n&&n.activeBranch===e&&(n.vnode.el=r)}var Yr={},Xr=()=>Object.create(Yr),Zr=e=>Object.getPrototypeOf(e)===Yr;function Qr(e,t,n,r=!1){let i={},a=Xr();e.propsDefaults=Object.create(null),ei(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);e.props=n?r?i:Pt(i):e.type.props?i:a,e.attrs=a}function $r(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=R(i),[c]=e.propsOptions,l=!1;if((r||o>0)&&!(o&16)){if(o&8){let n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let o=n[r];if(Br(e.emitsOptions,o))continue;let d=t[o];if(c){if(u(a,o))d!==a[o]&&(a[o]=d,l=!0);else{let t=T(o);i[t]=ti(c,s,t,d,e,!1)}}else d!==a[o]&&(a[o]=d,l=!0)}}}else{ei(e,t,i,a)&&(l=!0);let r;for(let a in s)(!t||!u(t,a)&&((r=E(a))===a||!u(t,r)))&&(c?n&&(n[a]!==void 0||n[r]!==void 0)&&(i[a]=ti(c,s,a,void 0,e,!0)):delete i[a]);if(a!==s)for(let e in a)(!t||!u(t,e))&&(delete a[e],l=!0)}l&&$e(e.attrs,`set`,``)}function ei(e,n,r,i){let[a,o]=e.propsOptions,s=!1,c;if(n)for(let t in n){if(ee(t))continue;let l=n[t],d;a&&u(a,d=T(t))?!o||!o.includes(d)?r[d]=l:(c||={})[d]=l:Br(e.emitsOptions,t)||(!(t in i)||l!==i[t])&&(i[t]=l,s=!0)}if(o){let n=R(r),i=c||t;for(let t=0;t<o.length;t++){let s=o[t];r[s]=ti(a,n,s,i[s],e,!u(i,s))}}return s}function ti(e,t,n,r,i,a){let o=e[n];if(o!=null){let e=u(o,`default`);if(e&&r===void 0){let e=o.default;if(o.type!==Function&&!o.skipFactory&&h(e)){let{propsDefaults:a}=i;if(n in a)r=a[n];else{let o=ta(i);r=a[n]=e.call(null,t),o()}}else r=e;i.ce&&i.ce._setProp(n,r)}o[0]&&(a&&!e?r=!1:o[1]&&(r===``||r===E(n))&&(r=!0))}return r}var ni=new WeakMap;function ri(e,r,i=!1){let a=i?ni:r.propsCache,o=a.get(e);if(o)return o;let c=e.props,l={},f=[],p=!1;if(!h(e)){let t=e=>{p=!0;let[t,n]=ri(e,r,!0);s(l,t),n&&f.push(...n)};!i&&r.mixins.length&&r.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!c&&!p)return v(e)&&a.set(e,n),n;if(d(c))for(let e=0;e<c.length;e++){let n=T(c[e]);ii(n)&&(l[n]=t)}else if(c)for(let e in c){let t=T(e);if(ii(t)){let n=c[e],r=l[t]=d(n)||h(n)?{type:n}:s({},n),i=r.type,a=!1,o=!0;if(d(i))for(let e=0;e<i.length;++e){let t=i[e],n=h(t)&&t.name;if(n===`Boolean`){a=!0;break}n===`String`&&(o=!1)}else a=h(i)&&i.name===`Boolean`;r[0]=a,r[1]=o,(a||u(r,`default`))&&f.push(t)}}let m=[l,f];return v(e)&&a.set(e,m),m}function ii(e){return e[0]!==`$`&&!ee(e)}var ai=e=>e===`_`||e===`_ctx`||e===`$stable`,oi=e=>d(e)?e.map(Ui):[Ui(e)],si=(e,t,n)=>{if(t._n)return t;let r=Cn((...e)=>oi(t(...e)),n);return r._c=!1,r},ci=(e,t,n)=>{let r=e._ctx;for(let n in e){if(ai(n))continue;let i=e[n];if(h(i))t[n]=si(n,i,r);else if(i!=null){let e=oi(i);t[n]=()=>e}}},li=(e,t)=>{let n=oi(t);e.slots.default=()=>n},ui=(e,t,n)=>{for(let r in t)(n||!ai(r))&&(e[r]=t[r])},di=(e,t,n)=>{let r=e.slots=Xr();if(e.vnode.shapeFlag&32){let e=t._;e?(ui(r,t,n),n&&O(r,`_`,e,!0)):ci(t,r)}else t&&li(e,t)},fi=(e,n,r)=>{let{vnode:i,slots:a}=e,o=!0,s=t;if(i.shapeFlag&32){let e=n._;e?r&&e===1?o=!1:ui(a,n,r):(o=!n.$stable,ci(n,a)),s=n}else n&&(li(e,n),s={default:1});if(o)for(let e in a)!ai(e)&&s[e]==null&&delete a[e]},K=wi;function pi(e){return mi(e)}function mi(e,i){let a=le();a.__VUE__=!0;let{insert:o,remove:s,patchProp:c,createElement:l,createText:u,createComment:d,setText:f,setElementText:p,parentNode:m,nextSibling:h,setScopeId:g=r,insertStaticContent:_}=e,v=(e,t,r,i=null,a=null,o=null,s=void 0,c=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!Pi(e,t)&&(i=ye(e),k(e,a,o,!0),e=null),t.patchFlag===-2&&(l=!1,t.dynamicChildren=null),t.dynamicChildren&&e&&e.dynamicChildren&&e.dynamicChildren.hasOnce&&(t.dynamicChildren===n&&(t.dynamicChildren=[]),t.dynamicChildren.hasOnce=!0);let{type:u,ref:d,shapeFlag:f}=t;switch(u){case Ti:y(e,t,r,i);break;case J:b(e,t,r,i);break;case Ei:e??x(t,r,i,s);break;case q:ae(e,t,r,i,a,o,s,c,l);break;default:f&1?w(e,t,r,i,a,o,s,c,l):f&6?D(e,t,r,i,a,o,s,c,l):(f&64||f&128)&&u.process(e,t,r,i,a,o,s,c,l,xe)}d!=null&&a?Gn(d,e&&e.ref,o,t||e,!t):d==null&&e&&e.ref!=null&&Gn(e.ref,null,o,e,!0)},y=(e,t,n,r)=>{if(e==null)o(t.el=u(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},b=(e,t,n,r)=>{e==null?o(t.el=d(t.children||``),n,r):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},S=({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=h(e),o(e,n,r),e=i;o(t,n,r)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)},w=(e,t,n,r,i,a,o,s,c)=>{if(t.type===`svg`?o=`svg`:t.type===`math`&&(o=`mathml`),e==null)te(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),re(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},te=(e,t,n,r,i,a,s,u)=>{let d,f,{props:m,shapeFlag:h,transition:g,dirs:_}=e;if(d=e.el=l(e.type,a,m&&m.is,m),h&8?p(d,e.children):h&16&&T(e.children,d,null,r,i,hi(e,a),s,u),_&&Tn(e,null,r,`created`),ne(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!ee(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&qi(f,r,e)}_&&Tn(e,null,r,`beforeMount`);let v=_i(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&K(()=>{try{f&&qi(f,r,e),v&&g.enter(d),_&&Tn(e,null,r,`mounted`)}finally{}},i)},ne=(e,t,n,r,i)=>{if(n&&g(e,n),r)for(let t=0;t<r.length;t++)g(e,r[t]);if(i){let n=i.subTree;if(t===n||Ci(n.type)&&(n.ssContent===t||n.ssFallback===t)){let t=i.vnode;ne(e,t,t.scopeId,t.slotScopeIds,i.parent)}}},T=(e,t,n,r,i,a,o,s,c=0)=>{for(let l=c;l<e.length;l++){let c=e[l]=s?Wi(e[l]):Ui(e[l]);v(null,c,t,n,r,i,a,o,s)}},re=(e,n,r,i,a,o,s)=>{let l=n.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:f}=n;u|=e.patchFlag&16;let m=e.props||t,h=n.props||t,g;if(r&&gi(r,!1),(g=h.onVnodeBeforeUpdate)&&qi(g,r,n,e),f&&Tn(n,e,r,`beforeUpdate`),r&&gi(r,!0),d&&(!e.dynamicChildren||e.dynamicChildren.length!==d.length)&&(u=0,s=!1,d=null),(m.innerHTML&&h.innerHTML==null||m.textContent&&h.textContent==null)&&p(l,``),d?E(e.dynamicChildren,d,l,r,i,hi(n,a),o):s||de(e,n,l,null,r,i,hi(n,a),o,!1),u>0){if(u&16)ie(l,m,h,r,a);else if(u&2&&m.class!==h.class&&c(l,`class`,null,h.class,a),u&4&&c(l,`style`,m.style,h.style,a),u&8){let e=n.dynamicProps;for(let t=0;t<e.length;t++){let n=e[t],i=m[n],o=h[n];(o!==i||n===`value`)&&c(l,n,i,o,a,r)}}u&1&&e.children!==n.children&&p(l,n.children)}else!s&&d==null&&ie(l,m,h,r,a);((g=h.onVnodeUpdated)||f)&&K(()=>{g&&qi(g,r,n,e),f&&Tn(n,e,r,`updated`)},i)},E=(e,t,n,r,i,a,o)=>{for(let s=0;s<t.length;s++){let c=e[s],l=t[s],u=c.el||Si(c),d=u&&(c.type===q||!Pi(c,l)||c.shapeFlag&198)?m(u):n;v(c,l,d,null,r,i,a,o,!0)}},ie=(e,n,r,i,a)=>{if(n!==r){if(n!==t)for(let t in n)!ee(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(ee(t))continue;let o=r[t],s=n[t];o!==s&&t!==`value`&&c(e,t,s,o,a,i)}`value`in r&&c(e,`value`,n.value,r.value,a)}},ae=(e,t,n,r,i,a,s,c,l)=>{let d=t.el=e?e.el:u(``),f=t.anchor=e?e.anchor:u(``),{patchFlag:p,dynamicChildren:m,slotScopeIds:h}=t;h&&(c=c?c.concat(h):h),e==null?(o(d,n,r),o(f,n,r),T(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(E(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&vi(e,t,!0)):de(e,t,n,f,i,a,s,c,l)},D=(e,t,n,r,i,a,o,s,c)=>{t.slotScopeIds=s,e==null?t.shapeFlag&512?i.ctx.activate(t,n,r,o,c):O(t,n,r,i,a,o,c):se(e,t,c)},O=(e,t,n,r,i,a,o)=>{let s=e.component=Zi(e,r,i);if(Jn(e)&&(s.ctx.renderer=xe),aa(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,ce,o,a),!e.el){let r=s.subTree=Li(J);b(null,r,t,n),e.placeholder=r.el}}else ce(s,e,t,n,i,a,o)},se=(e,t,n)=>{let r=t.component=e.component;if(Gr(e,t,n)){if(r.asyncDep&&!r.asyncResolved){t.el=e.el,t.placeholder=e.placeholder,ue(r,t,n);return}r.next=t,r.update()}else t.el=e.el,t.placeholder=e.placeholder,r.vnode=t},ce=(e,t,n,r,i,a,o)=>{let s=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{let n=bi(e);if(n){t&&(t.el=c.el,ue(e,t,o)),n.asyncDep.then(()=>{K(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;gi(e,!1),t?(t.el=c.el,ue(e,t,o)):t=c,n&&oe(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&qi(d,s,t,c),gi(e,!0);let f=Vr(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),ye(p),e,i,a),t.el=f.el,u===null&&Jr(e,f.el),r&&K(r,i),(d=t.props&&t.props.onVnodeUpdated)&&K(()=>qi(d,s,t,c),i)}else{let o,{el:s,props:c}=t,{bm:l,m:u,parent:d,root:f,type:p}=e,m=qn(t);if(gi(e,!1),l&&oe(l),!m&&(o=c&&c.onVnodeBeforeMount)&&qi(o,d,t),gi(e,!0),s&&Ce){let t=()=>{e.subTree=Vr(e),Ce(s,e.subTree,e,i,null)};m&&p.__asyncHydrate?p.__asyncHydrate(s,e,t):t()}else{f.ce&&f.ce._hasShadowRoot()&&f.ce._injectChildStyle(p,e.parent?e.parent.type:void 0);let o=e.subTree=Vr(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&K(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;K(()=>qi(o,d,e),i)}(t.shapeFlag&256||d&&qn(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&K(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new ke(s);e.scope.off();let l=e.update=c.run.bind(c),u=e.job=c.runIfDirty.bind(c);u.i=e,u.id=e.uid,c.scheduler=()=>fn(u),gi(e,!0),l()},ue=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,$r(e,t.props,r,n),fi(e,t.children,n),Ue(),hn(e),N()},de=(e,t,n,r,i,a,o,s,c=!1)=>{let l=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:m}=t;if(f>0){if(f&128){pe(l,d,n,r,i,a,o,s,c);return}if(f&256){fe(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&ve(l,i,a),d!==l&&p(n,d)):u&16?m&16?pe(l,d,n,r,i,a,o,s,c):ve(l,i,a,!0):(u&8&&p(n,``),m&16&&T(d,n,r,i,a,o,s,c))},fe=(e,t,r,i,a,o,s,c,l)=>{e||=n,t||=n;let u=e.length,d=t.length,f=Math.min(u,d),p=0;for(;p<f;p++){let n=t[p]=l?Wi(t[p]):Ui(t[p]);v(e[p],n,r,null,a,o,s,c,l)}u>d?ve(e,a,o,!0,!1,f):T(t,r,i,a,o,s,c,l,f)},pe=(e,t,r,i,a,o,s,c,l)=>{let u=0,d=t.length,f=e.length-1,p=d-1;for(;u<=f&&u<=p;){let n=e[u],i=t[u]=l?Wi(t[u]):Ui(t[u]);if(Pi(n,i))v(n,i,r,null,a,o,s,c,l);else break;u++}for(;u<=f&&u<=p;){let n=e[f],i=t[p]=l?Wi(t[p]):Ui(t[p]);if(Pi(n,i))v(n,i,r,null,a,o,s,c,l);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,n=e<d?t[e].el:i;for(;u<=p;)v(null,t[u]=l?Wi(t[u]):Ui(t[u]),r,n,a,o,s,c,l),u++}}else if(u>p)for(;u<=f;)k(e[u],a,o,!0),u++;else{let m=u,h=u,g=new Map;for(u=h;u<=p;u++){let e=t[u]=l?Wi(t[u]):Ui(t[u]);e.key!=null&&g.set(e.key,u)}let _,y=0,b=p-h+1,x=!1,S=0,C=Array(b);for(u=0;u<b;u++)C[u]=0;for(u=m;u<=f;u++){let n=e[u];if(y>=b){k(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&Pi(n,t[_])){i=_;break}i===void 0?k(n,a,o,!0):(C[i-h]=u+1,i>=S?S=i:x=!0,v(n,t[i],r,null,a,o,s,c,l),y++)}let w=x?yi(C):n;for(_=w.length-1,u=b-1;u>=0;u--){let e=h+u,n=t[e],f=t[e+1],p=e+1<d?f.el||Si(f):i;C[u]===0?v(null,n,r,p,a,o,s,c,l):x&&(_<0||u!==w[_]?me(n,r,p,2):_--)}}},me=(e,t,n,r,i=null)=>{let{el:a,type:c,transition:l,children:u,shapeFlag:d}=e;if(d&6)me(e.component.subTree,t,n,r);else if(d&128)e.suspense.move(t,n,r);else if(d&64)c.move(e,t,n,xe);else if(c===q){o(a,t,n);for(let e=0;e<u.length;e++)me(u[e],t,n,r);o(e.anchor,t,n)}else if(c===Ei)S(e,t,n);else if(r!==2&&d&1&&l){if(r===0)l.persisted&&!a[In]?o(a,t,n):(l.beforeEnter(a),o(a,t,n),K(()=>l.enter(a),i));else{let{leave:r,delayLeave:i,afterLeave:c}=l,u=()=>{e.ctx.isUnmounted?s(a):o(a,t,n)},d=()=>{let e=a._isLeaving||!!a[In];a._isLeaving&&a[In](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}}else o(a,t,n)},k=(e,t,n,r=!1,i=!1)=>{let{type:a,props:o,ref:s,children:c,dynamicChildren:l,shapeFlag:u,patchFlag:d,dirs:f,cacheIndex:p,memo:m}=e;if((d===-2||l&&l.hasOnce)&&(i=!1),s!=null&&(Ue(),Gn(s,null,n,e,!0),N()),p!=null&&(!e.ctx||e.ctx===t)&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!qn(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&qi(_,t,e),u&6)_e(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Tn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,xe,r):l&&!l.hasOnce&&(a!==q||d>0&&d&64)?ve(l,t,n,!1,!0):(a===q&&d&384||!i&&u&16)&&ve(c,t,n),r&&he(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&K(()=>{_&&qi(_,t,e),h&&Tn(e,null,t,`unmounted`),v&&(e.el=null)},n)},he=e=>{let{type:t,el:n,anchor:r,transition:i}=e,a=t===q;if(a&&!i){ge(n,r);return}if(t===Ei){C(e),i&&!i.persisted&&i.afterLeave&&i.afterLeave();return}let o=a?Bn(e):e,c=()=>{a?m(n)&&ge(n,r):s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(o&&o.shapeFlag&1&&i&&!i.persisted){let{leave:e,delayLeave:t}=i,n=o.el,r=()=>e(n,c);t?t(n,c,r):r()}else c()},ge=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},_e=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;xi(c),xi(l),r&&oe(r),i.stop(),a?(a.flags|=8,k(o,e,t,n)):e.vnode.el&&o&&(o.transition=e.vnode.transition,k(o,e,t,n)),s&&K(s,t),K(()=>{e.isUnmounted=!0},t)},ve=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o<e.length;o++)k(e[o],t,n,r,i)},ye=e=>{if(e.shapeFlag&6)return ye(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[Pn];return n?h(n):t},be=(e,t,n)=>{vn(()=>{e==null?t._vnode&&k(t._vnode,null,null,!0):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e},e&&t._vnode?void 0:e&&e.component?e.component.uid:Xi())},xe={p:v,um:k,m:me,r:he,mt:O,mc:T,pc:de,pbc:E,n:ye,o:e},Se,Ce;return i&&([Se,Ce]=i(xe)),{render:be,hydrate:Se,createApp:Pr(be,Se)}}function hi({type:e,props:t},n){return n===`svg`&&e===`foreignObject`||n===`mathml`&&e===`annotation-xml`&&t&&t.encoding&&t.encoding.includes(`html`)?void 0:n}function gi({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function _i(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function vi(e,t,n=!1){let r=e.children,i=t.children;if(d(r)&&d(i))for(let e=0;e<r.length;e++){let t=r[e],a=i[e];a.shapeFlag&1&&!a.dynamicChildren&&((a.patchFlag<=0||a.patchFlag===32)&&(a=i[e]=Wi(i[e]),a.el=t.el),!n&&a.patchFlag!==-2&&vi(t,a)),a.type===Ti&&(a.patchFlag===-1&&(a=i[e]=Wi(a)),a.el=t.el),a.type===J&&!a.el&&(a.el=t.el)}}function yi(e){let t=e.slice(),n=[0],r,i,a,o,s,c=e.length;for(r=0;r<c;r++){let c=e[r];if(c!==0){if(i=n[n.length-1],e[i]<c){t[r]=i,n.push(r);continue}for(a=0,o=n.length-1;a<o;)s=a+o>>1,e[n[s]]<c?a=s+1:o=s;c<e[n[a]]&&(a>0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,o=n[a-1];a-->0;)n[a]=o,o=t[o];return n}function bi(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:bi(t)}function xi(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function Si(e){if(e.placeholder)return e.placeholder;let t=e.component;return t?Si(t.subTree):null}var Ci=e=>e.__isSuspense;function wi(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):mn(e)}var q=Symbol.for(`v-fgt`),Ti=Symbol.for(`v-txt`),J=Symbol.for(`v-cmt`),Ei=Symbol.for(`v-stc`),Di=[],Y=null;function X(e=!1){Di.push(Y=e?null:[])}function Oi(){Di.pop(),Y=Di[Di.length-1]||null}var ki=1;function Ai(e,t=!1){ki+=e,e<0&&Y&&t&&(Y.hasOnce=!0)}function ji(e){return e.dynamicChildren=ki>0?Y||n:null,Oi(),ki>0&&Y&&Y.push(e),e}function Z(e,t,n,r,i,a){return ji(Q(e,t,n,r,i,a,!0))}function Mi(e,t,n,r,i){return ji(Li(e,t,n,r,i,!0))}function Ni(e){return e?e.__v_isVNode===!0:!1}function Pi(e,t){return e.type===t.type&&e.key===t.key}var Fi=({key:e})=>e??null,Ii=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:g(e)||B(e)||h(e)?{i:W,r:e,k:t,f:!!n}:e);function Q(e,t=null,n=null,r=0,i=null,a=e===q?0:1,o=!1,s=!1){let c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Fi(t),ref:t&&Ii(t),scopeId:xn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:W};return s?(Gi(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=g(n)?8:16),ki>0&&!o&&Y&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&Y.push(c),c}var Li=Ri;function Ri(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===dr)&&(e=J),Ni(e)){let r=Bi(e,t,!0);return n&&Gi(r,n),ki>0&&!a&&Y&&(r.shapeFlag&6?Y[Y.indexOf(e)]=r:Y.push(r)),r.patchFlag=-2,r}if(fa(e)&&(e=e.__vccOpts),t){t=zi(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=k(e)),v(n)&&(Rt(n)&&!d(n)&&(n=s({},n)),t.style=ue(n))}let o=g(e)?1:Ci(e)?128:Fn(e)?64:v(e)?4:h(e)?2:0;return Q(e,t,n,r,i,o,a,!0)}function zi(e){return e?Rt(e)||Zr(e)?s({},e):e:null}function Bi(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?Ki(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Fi(l),ref:t&&t.ref?n&&a?d(a)?a.concat(Ii(t)):[a,Ii(t)]:Ii(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==q?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Bi(e.ssContent),ssFallback:e.ssFallback&&Bi(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return c&&r&&zn(u,c.clone(u)),u}function Vi(e=` `,t=0){return Li(Ti,null,e,t)}function Hi(e=``,t=!1){return t?(X(),Mi(J,null,e)):Li(J,null,e)}function Ui(e){return e==null||typeof e==`boolean`?Li(J):d(e)?Li(q,null,e.slice()):Ni(e)?Wi(e):Li(Ti,null,String(e))}function Wi(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Bi(e)}function Gi(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(d(t))n=16;else if(typeof t==`object`){if(r&65){let n=t.default;n&&(n._c&&(n._d=!1),Gi(e,n()),n._c&&(n._d=!0));return}{n=32;let r=t._;!r&&!Zr(t)?t._ctx=W:r===3&&W&&(W.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}}else if(h(t)){if(r&65){Gi(e,{default:t});return}t={default:t,_ctx:W},n=32}else t=String(t),r&64?(n=16,t=[Vi(t)]):n=8;e.children=t,e.shapeFlag|=n}function Ki(...e){let t={};for(let n=0;n<e.length;n++){let r=e[n];for(let e in r)if(e===`class`)t.class!==r.class&&(t.class=k([t.class,r.class]));else if(e===`style`)t.style=ue([t.style,r.style]);else if(a(e)){let n=t[e],i=r[e];i&&n!==i&&!(d(n)&&n.includes(i))?t[e]=n?[].concat(n,i):i:i==null&&n==null&&!o(e)&&(t[e]=i)}else e!==``&&(t[e]=r[e])}return t}function qi(e,t,n,r=null){V(e,t,7,[n,r])}var Ji=Mr(),Yi=0;function Xi(){return Yi}function Zi(e,n,r){let i=e.type,a=(n?n.appContext:e.appContext)||Ji,o={uid:Yi++,vnode:e,type:i,parent:n,appContext:a,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Ee(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:n?n.provides:Object.create(a.provides),ids:n?n.ids:[``,0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ri(i,a),emitsOptions:zr(i,a),emit:null,emitted:null,propsDefaults:t,inheritAttrs:i.inheritAttrs,ctx:t,data:t,props:t,attrs:t,slots:t,refs:t,setupState:t,setupContext:null,suspense:r,suspenseId:r?r.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return o.ctx={_:o},o.root=n?n.root:o,o.emit=Lr.bind(null,o),e.ce&&e.ce(o),o}var $=null,Qi=()=>$||W,$i,ea;{let e=le(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};$i=t(`__VUE_INSTANCE_SETTERS__`,e=>$=e),ea=t(`__VUE_SSR_SETTERS__`,e=>ia=e)}var ta=e=>{let t=$;return $i(e),e.scope.on(),()=>{e.scope.off(),$i(t)}},na=()=>{$&&$.scope.off(),$i(null)};function ra(e){return e.vnode.shapeFlag&4}var ia=!1;function aa(e,t=!1,n=!1){t&&ea(t);let{props:r,children:i}=e.vnode,a=ra(e);Qr(e,r,a,t),di(e,i,n||t);let o=a?oa(e,t):void 0;return t&&ea(!1),o}function oa(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,gr);let{setup:r}=n;if(r){Ue();let n=e.setupContext=r.length>1?ua(e):null,i=ta(e),a=tn(r,e,0,[e.props,n]),o=y(a);if(N(),i(),(o||e.sp)&&!qn(e)&&Hn(e),o){if(a.then(na,na),t)return a.then(n=>{ea(!0);try{sa(e,n,t)}finally{ea(!1)}}).catch(t=>{nn(t,e,0)});e.asyncDep=a}else sa(e,a,t)}else ca(e,t)}function sa(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=Kt(t)),ca(e,n)}function ca(e,t,n){let i=e.type;e.render||=i.render||r;{let t=ta(e);Ue();try{yr(e)}finally{N(),t()}}}var la={get(e,t){return P(e,`get`,``),e[t]}};function ua(e){return{attrs:new Proxy(e.attrs,la),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function da(e){return e.exposed?e.exposeProxy||=new Proxy(Kt(zt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in mr)return mr[n](e)},has(e,t){return t in e||t in mr}}):e.proxy}function fa(e){return h(e)&&`__vccOpts`in e}var pa=(e,t)=>Jt(e,t,ia),ma=`3.5.44`,ha=void 0,ga=typeof window<`u`&&window.trustedTypes;if(ga)try{ha=ga.createPolicy(`vue`,{createHTML:e=>e})}catch{}var _a=ha?e=>ha.createHTML(e):e=>e,va=`http://www.w3.org/2000/svg`,ya=`http://www.w3.org/1998/Math/MathML`,ba=typeof document<`u`?document:null,xa=ba&&ba.createElement(`template`),Sa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?ba.createElementNS(va,e):t===`mathml`?ba.createElementNS(ya,e):n?ba.createElement(e,{is:n}):ba.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>ba.createTextNode(e),createComment:e=>ba.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ba.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==a&&(i=i.nextSibling););else{xa.innerHTML=_a(r===`svg`?`<svg>${e}</svg>`:r===`mathml`?`<math>${e}</math>`:e);let i=xa.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ca=Symbol(`_vtc`);function wa(e,t,n){let r=e[Ca];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var Ta=Symbol(`_vod`),Ea=Symbol(`_vsh`),Da=Symbol(``),Oa=/(?:^|;)\s*display\s*:/;function ka(e,t,n){let r=e.style,i=g(n),a=!1;if(n&&!i){if(t){if(g(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??ja(r,t,``)}else for(let e in t)n[e]??ja(r,e,``)}for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?ja(r,i,``):Fa(e,i,!g(t)&&t?t[i]:void 0,o)||ja(r,i,o)}}else if(i){if(t!==n){let e=r[Da];e&&(n+=`;`+e),r.cssText=n,a=Oa.test(n)}}else t&&e.removeAttribute(`style`);Ta in e&&((!i||t!==n)&&(e[Ta]=a?r.display:``),e[Ea]&&(r.display=`none`))}var Aa=/\s*!important$/;function ja(e,t,n){if(d(n))n.forEach(n=>ja(e,t,n));else if(n??=``,t.startsWith(`--`))Aa.test(n)?e.setProperty(t,n.replace(Aa,``),`important`):e.setProperty(t,n);else{let r=Pa(e,t);Aa.test(n)?e.setProperty(E(r),n.replace(Aa,``),`important`):e[r]=n}}var Ma=[`Webkit`,`Moz`,`ms`],Na={};function Pa(e,t){let n=Na[t];if(n)return n;let r=T(t);if(r!==`filter`&&r in e)return Na[t]=r;r=ie(r);for(let n=0;n<Ma.length;n++){let i=Ma[n]+r;if(i in e)return Na[t]=i}return t}function Fa(e,t,n,r){return e.tagName===`TEXTAREA`&&(t===`width`||t===`height`)&&g(r)&&n===r}var Ia=`http://www.w3.org/1999/xlink`;function La(e,t,n,r,i,a=he(t)){r&&t.startsWith(`xlink:`)?n==null?e.removeAttributeNS(Ia,t.slice(6,t.length)):e.setAttributeNS(Ia,t,n):n==null||a&&!ge(n)?e.removeAttribute(t):e.setAttribute(t,a?``:_(n)?String(n):n)}function Ra(e,t,n,r,i){if(t===`innerHTML`||t===`textContent`){n!=null&&(e[t]=t===`innerHTML`?_a(n):n);return}let a=e.tagName;if(t===`value`&&a!==`PROGRESS`&&!a.includes(`-`)){let r=a===`OPTION`?e.getAttribute(`value`)||``:e.value,i=n==null?e.type===`checkbox`?`on`:``:String(n);(r!==i||!(`_value`in e))&&(e.value=i),n??e.removeAttribute(t),e._value=n;return}let o=!1;if(n===``||n==null){let r=typeof e[t];r===`boolean`?n=ge(n):n==null&&r===`string`?(n=``,o=!0):r===`number`&&(n=0,o=!0)}try{e[t]=n}catch{}o&&e.removeAttribute(i||t)}function za(e,t,n,r){e.addEventListener(t,n,r)}function Ba(e,t,n,r){e.removeEventListener(t,n,r)}var Va=Symbol(`_vei`);function Ha(e,t,n,r,i=null){let a=e[Va]||(e[Va]={}),o=a[t];if(r&&o)o.value=r;else{let[n,s]=Ga(t);r?za(e,n,a[t]=Ya(r,i),s):o&&(Ba(e,n,o,s),a[t]=void 0)}}var Ua=/(Once|Passive|Capture)$/,Wa=/^on:?(?:Once|Passive|Capture)$/;function Ga(e){let t,n;for(;(n=e.match(Ua))&&!Wa.test(e);)t||={},e=e.slice(0,e.length-n[1].length),t[n[1].toLowerCase()]=!0;return[e[2]===`:`?e.slice(3):E(e.slice(2)),t]}var Ka=0,qa=Promise.resolve(),Ja=()=>Ka||=(qa.then(()=>Ka=0),Date.now());function Ya(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;let r=n.value;if(d(r)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let i=r.slice(),a=[e];for(let n=0;n<i.length&&!e._stopped;n++){let e=i[n];e&&V(e,t,5,a)}}else V(r,t,5,[e])};return n.value=e,n.attached=Ja(),n}var Xa=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Za=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?wa(e,r,c):t===`style`?ka(e,n,r):a(t)?o(t)||Ha(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),1):t[0]===`^`?(t=t.slice(1),0):Qa(e,t,r,c))?(Ra(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&La(e,t,r,c,s,t!==`value`)):e._isVueCE&&($a(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?Ra(e,T(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),La(e,t,r,c))};function Qa(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&Xa(t)&&h(n));if(t===`spellcheck`||t===`draggable`||t===`translate`||t===`autocorrect`||t===`sandbox`&&e.tagName===`IFRAME`||t===`form`||t===`list`&&e.tagName===`INPUT`||t===`type`&&e.tagName===`TEXTAREA`)return!1;if(t===`width`||t===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return Xa(t)&&g(n)?!1:t in e}function $a(e,t){let n=e._def.props;if(!n)return!1;let r=T(t);return Array.isArray(n)?n.some(e=>T(e)===r):Object.keys(n).some(e=>T(e)===r)}var eo=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return d(t)?e=>oe(t,e):t};function to(e){e.target.composing=!0}function no(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var ro=Symbol(`_assign`),io=Symbol(`_initialValue`);function ao(e,t,n){return t&&(e=e.trim()),n&&(e=se(e)),e}var oo={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e.parentNode&&(e.type===`text`?e[io]=e.defaultValue.replace(/[\r\n]/g,``):e.type===`textarea`&&(e[io]=e.defaultValue.replace(/\r\n?/g,`
|
|
2
|
+
`))),e[ro]=eo(i);let a=r||i.props&&i.props.type===`number`;za(e,t?`change`:`input`,t=>{t.target.composing||e[ro](ao(e.value,n,a))}),(n||a)&&za(e,`change`,()=>{e.value=ao(e.value,n,a)}),t||(za(e,`compositionstart`,to),za(e,`compositionend`,no),za(e,`change`,no))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let i=t??``,a=e[io];delete e[io],a!==void 0&&(e.type===`text`||e.type===`textarea`)&&e.value!==a?e[ro](ao(e.value,n,r)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[ro]=eo(o),e.composing)return;let s=(a||e.type===`number`)&&!/^0\d/.test(e.value)?se(e.value):e.value,c=t??``;if(s===c)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&e.type!==`range`&&(r&&t===n||i&&e.value.trim()===c)||(e.value=c)}},so=[`ctrl`,`shift`,`alt`,`meta`],co={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>`button`in e&&e.button!==0,middle:e=>`button`in e&&e.button!==1,right:e=>`button`in e&&e.button!==2,exact:(e,t)=>so.some(n=>e[`${n}Key`]&&!t.includes(n))},lo=(e,t)=>{if(!e)return e;let n=e._withMods||={},r=t.join(`.`);return n[r]||(n[r]=((n,...r)=>{for(let e=0;e<t.length;e++){let r=co[t[e]];if(r&&r(n,t))return}return e(n,...r)}))},uo=s({patchProp:Za},Sa),fo;function po(){return fo||=pi(uo)}var mo=((...e)=>{let t=po().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=go(e);if(!r)return;let i=t._component;!h(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent=``);let a=n(r,!1,ho(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t});function ho(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function go(e){return g(e)?document.querySelector(e):e}var _o={key:0},vo={key:0},yo={key:1},bo=[`onClick`],xo=[`aria-invalid`],So=[`disabled`],Co={key:0,id:`connect-refusal`,role:`alert`},wo={key:2,role:`alert`},To={key:3,role:`alert`},Eo={key:4,role:`alert`};mo(Vn({__name:`App`,setup(e){let t=Vt({kind:`loading`}),n=Vt(``),r=Vt(),i=Vt(!1);async function a(e,n){try{let r=await fetch(e,n);if(r.status===401)t.value={kind:`session-ended`};else if(r.status===500){let{error:e}=await r.json();t.value={kind:`registry-unreadable`,message:e.message}}else return r}catch{t.value={kind:`not-running`}}}async function o(){let[e,n]=await Promise.all([a(`/api/instance`),a(`/api/projects`)]);if(!e||!n)return;let{version:r}=await e.json(),{projects:i}=await n.json();t.value={kind:`ready`,version:r,projects:i}}async function s(){i.value=!0,r.value=void 0;let e=await a(`/api/projects`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({path:n.value})});i.value=!1,e&&(e.ok?(n.value=``,await o()):r.value=(await e.json()).error.message)}async function c(e){await a(`/api/projects/${encodeURIComponent(e)}`,{method:`DELETE`})&&await o()}function l(e){return e.state===`ready`?`Jig ${e.jigVersion}`:e.state===`unsupported`?`${e.jigVersion?`Jig ${e.jigVersion}`:`A Jig of unknown version`} — Jig UI needs ${e.minimum} or later. Run jig upgrade in the project.`:e.reason===`missing`?`The project directory is not there any more.`:`There is no Jig in the project any more.`}return nr(o),(e,a)=>(X(),Z(`main`,null,[t.value.kind===`loading`?(X(),Z(`p`,_o,`Connecting…`)):t.value.kind===`ready`?(X(),Z(q,{key:1},[Q(`h1`,null,`Jig UI `+Ce(t.value.version),1),t.value.projects.length===0?(X(),Z(`p`,vo,`No projects yet. Paste the path of a project's main checkout below.`)):(X(),Z(`ul`,yo,[(X(!0),Z(q,null,fr(t.value.projects,e=>(X(),Z(`li`,{key:e.id},[Q(`strong`,null,Ce(e.id),1),Q(`span`,null,Ce(l(e)),1),Q(`button`,{type:`button`,onClick:t=>c(e.id)},`Disconnect`,8,bo)]))),128))])),Q(`form`,{onSubmit:lo(s,[`prevent`])},[a[1]||=Q(`label`,{for:`project-path`},`Project path`,-1),wn(Q(`input`,{id:`project-path`,"onUpdate:modelValue":a[0]||=e=>n.value=e,required:``,placeholder:`/path/to/project`,"aria-invalid":r.value!==void 0,"aria-describedby":`connect-refusal`},null,8,xo),[[oo,n.value]]),Q(`button`,{type:`submit`,disabled:i.value},Ce(i.value?`Connecting…`:`Connect`),9,So),r.value?(X(),Z(`p`,Co,Ce(r.value),1)):Hi(``,!0)],32)],64)):t.value.kind===`registry-unreadable`?(X(),Z(`p`,wo,Ce(t.value.message),1)):t.value.kind===`session-ended`?(X(),Z(`p`,To,[...a[2]||=[Vi(` This page's session has ended. Run `,-1),Q(`code`,null,`npx @fapost/jig-ui`,-1),Vi(` again to reopen it. `,-1)]])):(X(),Z(`p`,Eo,[...a[3]||=[Vi(`Jig UI is not running. Start it with `,-1),Q(`code`,null,`npx @fapost/jig-ui`,-1),Vi(`.`,-1)]]))]))}})).mount(`#app`);
|
|
@@ -0,0 +1,12 @@
|
|
|
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" />
|
|
6
|
+
<title>Jig UI</title>
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-B-WsHAHz.js"></script>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="app"></div>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fapost/jig-ui",
|
|
3
|
-
"version": "0.1.0-next.
|
|
3
|
+
"version": "0.1.0-next.8",
|
|
4
4
|
"description": "A local web interface for Jig, the agent SDLC framework.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
"url": "git+https://github.com/fapost-lab/jig-ui.git"
|
|
22
22
|
},
|
|
23
23
|
"scripts": {
|
|
24
|
-
"build": "tsc -p tsconfig.build.json",
|
|
24
|
+
"build": "tsc -p tsconfig.build.json && vite build",
|
|
25
25
|
"start": "npm run build && node dist/cli.js",
|
|
26
|
-
"dev": "npm run build && (tsc -p tsconfig.build.json --watch --preserveWatchOutput & node --watch dist/cli.js)",
|
|
27
|
-
"typecheck": "tsc --noEmit",
|
|
26
|
+
"dev": "npm run build && (tsc -p tsconfig.build.json --watch --preserveWatchOutput & vite build --watch & node --watch dist/cli.js --no-open)",
|
|
27
|
+
"typecheck": "tsc --noEmit && vue-tsc --noEmit -p web/tsconfig.json",
|
|
28
28
|
"test": "vitest run"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
@@ -33,7 +33,11 @@
|
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "^24.19.2",
|
|
36
|
-
"
|
|
37
|
-
"
|
|
36
|
+
"@vitejs/plugin-vue": "^6.0.10",
|
|
37
|
+
"typescript": "^6.0.3",
|
|
38
|
+
"vite": "^8.3.4",
|
|
39
|
+
"vitest": "^5.0.4",
|
|
40
|
+
"vue": "^3.5.44",
|
|
41
|
+
"vue-tsc": "^3.3.13"
|
|
38
42
|
}
|
|
39
43
|
}
|