@leemour/cli-messaging 0.39.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/messenger/after.d.ts +5 -0
- package/dist/cli/messenger/after.d.ts.map +1 -0
- package/dist/cli/messenger/after.js +10 -0
- package/dist/cli/messenger/after.js.map +1 -0
- package/dist/cli/messenger/backfill-jobs.d.ts +1 -5
- package/dist/cli/messenger/backfill-jobs.d.ts.map +1 -1
- package/dist/cli/messenger/backfill-jobs.js +4 -27
- package/dist/cli/messenger/backfill-jobs.js.map +1 -1
- package/dist/cli/messenger/chats-command.d.ts +25 -0
- package/dist/cli/messenger/chats-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-command.js +51 -4
- package/dist/cli/messenger/chats-command.js.map +1 -1
- package/dist/cli/messenger/messages-command.d.ts +1 -1
- package/dist/cli/messenger/messages-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-command.js +16 -6
- package/dist/cli/messenger/messages-command.js.map +1 -1
- package/dist/cli/messenger/port.d.ts +11 -0
- package/dist/cli/messenger/port.d.ts.map +1 -1
- package/dist/cli/messenger/port.js.map +1 -1
- package/dist/cli/messenger/processes.d.ts +9 -0
- package/dist/cli/messenger/processes.d.ts.map +1 -0
- package/dist/cli/messenger/processes.js +37 -0
- package/dist/cli/messenger/processes.js.map +1 -0
- package/dist/cli/messenger/serve-command.d.ts +4 -5
- package/dist/cli/messenger/serve-command.d.ts.map +1 -1
- package/dist/cli/messenger/serve-command.js +14 -22
- package/dist/cli/messenger/serve-command.js.map +1 -1
- package/dist/cli/messenger/server-command.d.ts +27 -0
- package/dist/cli/messenger/server-command.d.ts.map +1 -0
- package/dist/cli/messenger/server-command.js +453 -0
- package/dist/cli/messenger/server-command.js.map +1 -0
- package/dist/cli/messenger/watch-command.d.ts +2 -1
- package/dist/cli/messenger/watch-command.d.ts.map +1 -1
- package/dist/cli/messenger/watch-command.js +2 -2
- package/dist/cli/messenger/watch-command.js.map +1 -1
- package/dist/mcp/tools/chats.d.ts.map +1 -1
- package/dist/mcp/tools/chats.js +17 -5
- package/dist/mcp/tools/chats.js.map +1 -1
- package/dist/mcp/tools/messages.d.ts.map +1 -1
- package/dist/mcp/tools/messages.js +15 -5
- package/dist/mcp/tools/messages.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/messenger/service-command.d.ts +0 -21
- package/dist/cli/messenger/service-command.d.ts.map +0 -1
- package/dist/cli/messenger/service-command.js +0 -305
- package/dist/cli/messenger/service-command.js.map +0 -1
|
@@ -3,6 +3,7 @@ import { join } from "node:path";
|
|
|
3
3
|
import { CliError, resolvePaths, writeSecurely } from "@leemour/cli-core";
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
import { messengerContext } from "./context.js";
|
|
6
|
+
import { alive } from "./processes.js";
|
|
6
7
|
import { listenUntilStopped } from "./watch-command.js";
|
|
7
8
|
export const lockPath = (app, profile, env) => join(resolvePaths({ appName: app.appName, prefix: app.envPrefix, env }).state, "serve", `${profile}.lock`);
|
|
8
9
|
export const readLock = (path) => {
|
|
@@ -14,20 +15,10 @@ export const readLock = (path) => {
|
|
|
14
15
|
return undefined;
|
|
15
16
|
}
|
|
16
17
|
};
|
|
17
|
-
/** Signal 0 checks that the process exists without touching it. */
|
|
18
|
-
export const alive = (pid) => {
|
|
19
|
-
try {
|
|
20
|
-
process.kill(pid, 0);
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
catch (error) {
|
|
24
|
-
return error.code === "EPERM";
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
18
|
/**
|
|
28
19
|
* Keeps the store current: every new message, edit, deletion and reaction, and on start what arrived
|
|
29
20
|
* while nothing listened. **One per profile**, held by a lock file; a lock whose process is gone is
|
|
30
|
-
* taken over. Started by a person
|
|
21
|
+
* taken over. Started by a person, a service unit or `server start` — never by itself (NEED-9).
|
|
31
22
|
*/
|
|
32
23
|
export const serveCommand = (messenger) => {
|
|
33
24
|
const command = new Command("serve").description("keep the local store current until stopped — what a systemd or launchd unit runs");
|
|
@@ -41,13 +32,23 @@ export const serveCommand = (messenger) => {
|
|
|
41
32
|
throw new CliError("validation_error", `${messenger.app.command} serve is already running for profile ${context.profile} (PID ${held.pid}, since ${held.startedAt})`);
|
|
42
33
|
}
|
|
43
34
|
const startedAt = new Date().toISOString();
|
|
44
|
-
writeSecurely(path, `${JSON.stringify(
|
|
35
|
+
const hold = (lock) => writeSecurely(path, `${JSON.stringify(lock)}\n`, 0o600);
|
|
36
|
+
hold({ pid: process.pid, startedAt });
|
|
37
|
+
// `server start` answers on this, not on the lock alone: a lock is written before the connection opens.
|
|
38
|
+
const onReady = () => {
|
|
39
|
+
hold({ pid: process.pid, startedAt, listeningAt: new Date().toISOString() });
|
|
40
|
+
context.renderer.note(`listening for profile ${context.profile}, catching up on what arrived while it was down`);
|
|
41
|
+
};
|
|
45
42
|
const counts = {};
|
|
46
43
|
const count = (event) => {
|
|
47
44
|
counts[event.event] = (counts[event.event] ?? 0) + 1;
|
|
48
45
|
};
|
|
49
46
|
try {
|
|
50
|
-
await listenUntilStopped(this, context, messenger, count, {
|
|
47
|
+
await listenUntilStopped(this, context, messenger, count, {
|
|
48
|
+
stop: new AbortController(),
|
|
49
|
+
catchUp: true,
|
|
50
|
+
onReady,
|
|
51
|
+
});
|
|
51
52
|
}
|
|
52
53
|
finally {
|
|
53
54
|
if (readLock(path)?.pid === process.pid)
|
|
@@ -55,15 +56,6 @@ export const serveCommand = (messenger) => {
|
|
|
55
56
|
}
|
|
56
57
|
context.renderer.result({ profile: context.profile, startedAt, stoppedAt: new Date().toISOString(), kept: counts });
|
|
57
58
|
});
|
|
58
|
-
command
|
|
59
|
-
.command("status")
|
|
60
|
-
.description("whether a serve is running for this profile, and since when")
|
|
61
|
-
.action(function () {
|
|
62
|
-
const { profile, env, renderer } = messengerContext(this, messenger);
|
|
63
|
-
const lock = readLock(lockPath(messenger.app, profile, env));
|
|
64
|
-
const running = lock !== undefined && alive(lock.pid);
|
|
65
|
-
renderer.result({ profile, running, ...(running && lock ? { pid: lock.pid, since: lock.startedAt } : {}) });
|
|
66
|
-
});
|
|
67
59
|
return command;
|
|
68
60
|
};
|
|
69
61
|
//# sourceMappingURL=serve-command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/serve-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAkB,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"serve-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/serve-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type Messenger } from "./context.js";
|
|
3
|
+
export interface Ran {
|
|
4
|
+
code: number;
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
}
|
|
8
|
+
/** What `server` asks of the machine. Tests hand one in; nothing else does. */
|
|
9
|
+
export interface ServerSystem {
|
|
10
|
+
platform: NodeJS.Platform;
|
|
11
|
+
run: (argv: string[], env: NodeJS.ProcessEnv) => Promise<Ran>;
|
|
12
|
+
/** The command line that starts this CLI: the node binary and the script, both absolute. */
|
|
13
|
+
entry: string[];
|
|
14
|
+
uid: number;
|
|
15
|
+
/** Starts `<cli> <argv>` apart from this process, writing to `log`, and answers its PID. */
|
|
16
|
+
spawn: (argv: string[], env: NodeJS.ProcessEnv, log: string) => number;
|
|
17
|
+
/** The pause between two looks at whether `serve` is listening yet. */
|
|
18
|
+
pause: () => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* `serve` in the background, the way max-cli's `server` is: `start`, `stop`, `restart`, `status`,
|
|
22
|
+
* `logs`. Without a unit, `start` runs `serve` as a process of its own; with one — `install`, a
|
|
23
|
+
* systemd user unit or a launchd agent — it goes through systemd or launchd. **Nothing starts until
|
|
24
|
+
* `start` is typed** (NEED-9): `install` only writes the file.
|
|
25
|
+
*/
|
|
26
|
+
export declare const serverCommand: (messenger: Messenger) => Command;
|
|
27
|
+
//# sourceMappingURL=server-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/server-command.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAI/D,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IAC7D,4FAA4F;IAC5F,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,4FAA4F;IAC5F,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACtE,uEAAuE;IACvE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AA2QD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,OA6OpD,CAAA"}
|
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import { execFile, spawn } from "node:child_process";
|
|
2
|
+
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, realpathSync, rmSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
5
|
+
import { CliError, resolvePaths, writeSecurely } from "@leemour/cli-core";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import { environmentOf } from "../context.js";
|
|
8
|
+
import { messengerContext } from "./context.js";
|
|
9
|
+
import { alive, carries } from "./processes.js";
|
|
10
|
+
import { lockPath, readLock } from "./serve-command.js";
|
|
11
|
+
const runProgram = (argv, env) => new Promise((resolve, reject) => {
|
|
12
|
+
const [file = "", ...args] = argv;
|
|
13
|
+
execFile(file, args, { env, encoding: "utf8" }, (error, stdout, stderr) => {
|
|
14
|
+
if (error?.code === "ENOENT") {
|
|
15
|
+
reject(new CliError("configuration_error", `${file} was not found — this machine has no ${file} to run serve`));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
resolve({ code: typeof error?.code === "number" ? error.code : error ? 1 : 0, stdout, stderr });
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
const thisMachine = () => {
|
|
22
|
+
const entry = [process.execPath, realpathSync(process.argv[1] ?? "")];
|
|
23
|
+
return {
|
|
24
|
+
platform: process.platform,
|
|
25
|
+
run: runProgram,
|
|
26
|
+
entry,
|
|
27
|
+
uid: process.getuid?.() ?? 0,
|
|
28
|
+
spawn: (argv, env, log) => {
|
|
29
|
+
mkdirSync(dirname(log), { recursive: true, mode: 0o700 });
|
|
30
|
+
const out = openSync(log, "a", 0o600);
|
|
31
|
+
try {
|
|
32
|
+
const [file = "", ...rest] = entry;
|
|
33
|
+
const child = spawn(file, [...rest, ...argv], { detached: true, stdio: ["ignore", out, out], env });
|
|
34
|
+
child.unref();
|
|
35
|
+
return child.pid ?? 0;
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
closeSync(out);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
pause: () => sleep(250),
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
/** How many looks, a pause apart, `start` gives `serve` to connect — about 30 seconds on a real machine. */
|
|
45
|
+
const LOOKS = 120;
|
|
46
|
+
/**
|
|
47
|
+
* Only the variables that say **where** the files are travel into the unit: a unit written from a
|
|
48
|
+
* development checkout must open that checkout's session and store, never the owner's real ones.
|
|
49
|
+
* Nothing that could hold a credential is copied.
|
|
50
|
+
*/
|
|
51
|
+
const locationVariables = (app, env) => {
|
|
52
|
+
const names = [
|
|
53
|
+
...["CONFIG_DIR", "STATE_DIR", "CACHE_DIR"].map((name) => `${app.envPrefix}_${name}`),
|
|
54
|
+
"MESSAGING_STORE",
|
|
55
|
+
"MESSAGING_STATE_DIR",
|
|
56
|
+
];
|
|
57
|
+
return Object.fromEntries(names.flatMap((name) => (env[name] === undefined ? [] : [[name, env[name]]])));
|
|
58
|
+
};
|
|
59
|
+
const home = (env) => {
|
|
60
|
+
if (!env.HOME)
|
|
61
|
+
throw new CliError("configuration_error", "HOME is not set, so there is nowhere to put the unit");
|
|
62
|
+
return env.HOME;
|
|
63
|
+
};
|
|
64
|
+
/** `%` is a specifier in both; `$` is a variable only in `ExecStart=` — in `Environment=` it is itself. */
|
|
65
|
+
const systemdQuote = (value, { command = false } = {}) => {
|
|
66
|
+
const quoted = value.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("%", "%%");
|
|
67
|
+
return `"${command ? quoted.replaceAll("$", "$$$$") : quoted}"`;
|
|
68
|
+
};
|
|
69
|
+
const systemd = (app, system, env) => {
|
|
70
|
+
const folder = join(env.XDG_CONFIG_HOME ?? join(home(env), ".config"), "systemd", "user");
|
|
71
|
+
const checked = async (argv) => {
|
|
72
|
+
const ran = await system.run(argv, env);
|
|
73
|
+
if (ran.code !== 0)
|
|
74
|
+
throw new CliError("configuration_error", `${argv.join(" ")} failed: ${ran.stderr.trim()}`);
|
|
75
|
+
return ran.stdout;
|
|
76
|
+
};
|
|
77
|
+
return {
|
|
78
|
+
unit: (base) => {
|
|
79
|
+
const name = `${app.command}-serve-${base.profile}.service`;
|
|
80
|
+
return { ...base, name, path: join(folder, name) };
|
|
81
|
+
},
|
|
82
|
+
text: (unit) => [
|
|
83
|
+
"[Unit]",
|
|
84
|
+
`Description=${app.command} serve — keep the local message archive current (profile ${unit.profile})`,
|
|
85
|
+
"",
|
|
86
|
+
"[Service]",
|
|
87
|
+
`ExecStart=${unit.command.map((word) => systemdQuote(word, { command: true })).join(" ")}`,
|
|
88
|
+
...Object.entries(unit.environment).map(([name, value]) => `Environment=${systemdQuote(`${name}=${value}`)}`),
|
|
89
|
+
"Restart=on-failure",
|
|
90
|
+
"RestartSec=30",
|
|
91
|
+
"",
|
|
92
|
+
"[Install]",
|
|
93
|
+
"WantedBy=default.target",
|
|
94
|
+
"",
|
|
95
|
+
].join("\n"),
|
|
96
|
+
start: (unit) => [
|
|
97
|
+
["systemctl", "--user", "daemon-reload"],
|
|
98
|
+
["systemctl", "--user", "start", unit.name],
|
|
99
|
+
],
|
|
100
|
+
stop: (unit) => [["systemctl", "--user", "stop", unit.name]],
|
|
101
|
+
state: async (unit) => {
|
|
102
|
+
const ran = await system.run([
|
|
103
|
+
"systemctl",
|
|
104
|
+
"--user",
|
|
105
|
+
"show",
|
|
106
|
+
unit.name,
|
|
107
|
+
"-p",
|
|
108
|
+
"LoadState",
|
|
109
|
+
"-p",
|
|
110
|
+
"ActiveState",
|
|
111
|
+
"-p",
|
|
112
|
+
"SubState",
|
|
113
|
+
"-p",
|
|
114
|
+
"MainPID",
|
|
115
|
+
], env);
|
|
116
|
+
const fields = Object.fromEntries(ran.stdout
|
|
117
|
+
.split("\n")
|
|
118
|
+
.filter((line) => line.includes("="))
|
|
119
|
+
.map((line) => [line.slice(0, line.indexOf("=")), line.slice(line.indexOf("=") + 1)]));
|
|
120
|
+
const pid = Number(fields.MainPID);
|
|
121
|
+
return {
|
|
122
|
+
loaded: fields.LoadState === "loaded",
|
|
123
|
+
active: fields.ActiveState === "active",
|
|
124
|
+
...(pid > 0 ? { pid } : {}),
|
|
125
|
+
...(fields.ActiveState ? { detail: `${fields.ActiveState} (${fields.SubState})` } : {}),
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
logs: (unit, lines) => checked(["journalctl", "--user", "-u", unit.name, "-n", String(lines), "--no-pager"]),
|
|
129
|
+
atLogin: (unit) => `at every login too: systemctl --user enable ${unit.name.replace(/\.service$/, "")}`,
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
const xml = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
|
|
133
|
+
const launchd = (app, system, env) => {
|
|
134
|
+
const folder = join(home(env), "Library", "LaunchAgents");
|
|
135
|
+
const domain = `gui/${system.uid}`;
|
|
136
|
+
return {
|
|
137
|
+
unit: (base) => {
|
|
138
|
+
const name = `${app.appName}.serve.${base.profile}`;
|
|
139
|
+
return { ...base, name, path: join(folder, `${name}.plist`) };
|
|
140
|
+
},
|
|
141
|
+
text: (unit) => [
|
|
142
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
143
|
+
'<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
|
|
144
|
+
'<plist version="1.0">',
|
|
145
|
+
"<dict>",
|
|
146
|
+
` <key>Label</key><string>${xml(unit.name)}</string>`,
|
|
147
|
+
" <key>ProgramArguments</key>",
|
|
148
|
+
" <array>",
|
|
149
|
+
...unit.command.map((word) => ` <string>${xml(word)}</string>`),
|
|
150
|
+
" </array>",
|
|
151
|
+
" <key>EnvironmentVariables</key>",
|
|
152
|
+
" <dict>",
|
|
153
|
+
...Object.entries(unit.environment).map(([name, value]) => ` <key>${xml(name)}</key><string>${xml(value)}</string>`),
|
|
154
|
+
" </dict>",
|
|
155
|
+
// launchd loads every agent here at login; disabled, it waits for `server start` to enable it.
|
|
156
|
+
" <key>Disabled</key><true/>",
|
|
157
|
+
" <key>RunAtLoad</key><true/>",
|
|
158
|
+
" <key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict>",
|
|
159
|
+
" <key>ThrottleInterval</key><integer>30</integer>",
|
|
160
|
+
` <key>StandardOutPath</key><string>${xml(unit.logPath ?? "")}</string>`,
|
|
161
|
+
` <key>StandardErrorPath</key><string>${xml(unit.logPath ?? "")}</string>`,
|
|
162
|
+
"</dict>",
|
|
163
|
+
"</plist>",
|
|
164
|
+
"",
|
|
165
|
+
].join("\n"),
|
|
166
|
+
// RunAtLoad makes loading the agent the start; `enable` overrides the file's Disabled until `disable`.
|
|
167
|
+
start: (unit) => [
|
|
168
|
+
["launchctl", "enable", `${domain}/${unit.name}`],
|
|
169
|
+
["launchctl", "bootstrap", domain, unit.path],
|
|
170
|
+
],
|
|
171
|
+
stop: (unit) => [
|
|
172
|
+
["launchctl", "bootout", `${domain}/${unit.name}`],
|
|
173
|
+
["launchctl", "disable", `${domain}/${unit.name}`],
|
|
174
|
+
],
|
|
175
|
+
state: async (unit) => {
|
|
176
|
+
const ran = await system.run(["launchctl", "print", `${domain}/${unit.name}`], env);
|
|
177
|
+
if (ran.code !== 0)
|
|
178
|
+
return { loaded: false, active: false };
|
|
179
|
+
const state = /^\s*state = (.+)$/m.exec(ran.stdout)?.[1]?.trim();
|
|
180
|
+
const pid = Number(/^\s*pid = (\d+)$/m.exec(ran.stdout)?.[1]);
|
|
181
|
+
return {
|
|
182
|
+
loaded: true,
|
|
183
|
+
active: state === "running",
|
|
184
|
+
...(pid > 0 ? { pid } : {}),
|
|
185
|
+
...(state ? { detail: state } : {}),
|
|
186
|
+
};
|
|
187
|
+
},
|
|
188
|
+
// launchd opens the log itself and does not create its folder.
|
|
189
|
+
prepare: (unit) => {
|
|
190
|
+
if (unit.logPath)
|
|
191
|
+
mkdirSync(dirname(unit.logPath), { recursive: true, mode: 0o700 });
|
|
192
|
+
},
|
|
193
|
+
logs: async (unit, lines) => tail(unit.logPath, lines),
|
|
194
|
+
atLogin: () => "from then on it also starts at every login, until `server stop`",
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
const tail = (path, lines) => path && existsSync(path) ? `${readFileSync(path, "utf8").split("\n").filter(Boolean).slice(-lines).join("\n")}\n` : "";
|
|
198
|
+
/** Where there is neither: `start` still runs serve in the background; only `install` needs one of them. */
|
|
199
|
+
const noUnits = (app, system) => {
|
|
200
|
+
const refuse = () => {
|
|
201
|
+
throw new CliError("validation_error", `${app.command} server install knows systemd (Linux) and launchd (macOS), not ${system.platform} — \`${app.command} server start\` runs serve without a unit`);
|
|
202
|
+
};
|
|
203
|
+
return {
|
|
204
|
+
unit: (base) => ({ ...base, name: `${app.command}-serve-${base.profile}`, path: "" }),
|
|
205
|
+
text: refuse,
|
|
206
|
+
start: refuse,
|
|
207
|
+
stop: refuse,
|
|
208
|
+
state: async () => ({ loaded: false, active: false }),
|
|
209
|
+
logs: async () => "",
|
|
210
|
+
atLogin: () => "",
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
const platformFor = (app, system, env) => {
|
|
214
|
+
if (system.platform === "linux")
|
|
215
|
+
return systemd(app, system, env);
|
|
216
|
+
if (system.platform === "darwin")
|
|
217
|
+
return launchd(app, system, env);
|
|
218
|
+
return noUnits(app, system);
|
|
219
|
+
};
|
|
220
|
+
/** A person reads paths under their home as `~/…`. */
|
|
221
|
+
const tilde = (path, env) => env.HOME && path.startsWith(`${env.HOME}/`) ? `~${path.slice(env.HOME.length)}` : path;
|
|
222
|
+
/** Local time, and the date too when it is not today. */
|
|
223
|
+
const clock = (iso) => {
|
|
224
|
+
const when = new Date(iso);
|
|
225
|
+
const time = when.toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit" });
|
|
226
|
+
return when.toDateString() === new Date().toDateString() ? time : `${when.toLocaleDateString("sv-SE")} ${time}`;
|
|
227
|
+
};
|
|
228
|
+
/**
|
|
229
|
+
* `serve` in the background, the way max-cli's `server` is: `start`, `stop`, `restart`, `status`,
|
|
230
|
+
* `logs`. Without a unit, `start` runs `serve` as a process of its own; with one — `install`, a
|
|
231
|
+
* systemd user unit or a launchd agent — it goes through systemd or launchd. **Nothing starts until
|
|
232
|
+
* `start` is typed** (NEED-9): `install` only writes the file.
|
|
233
|
+
*/
|
|
234
|
+
export const serverCommand = (messenger) => {
|
|
235
|
+
const { app } = messenger;
|
|
236
|
+
const command = new Command("server").description(`\`${app.command} serve\` in the background: start, stop, restart, status, logs; install adds a systemd or launchd unit`);
|
|
237
|
+
const marker = (profile) => `${app.envPrefix}_SERVER=${profile}`;
|
|
238
|
+
const prepare = (self) => {
|
|
239
|
+
const context = messengerContext(self, messenger);
|
|
240
|
+
const system = environmentOf(self).system ?? thisMachine();
|
|
241
|
+
const platform = platformFor(app, system, context.env);
|
|
242
|
+
const state = resolvePaths({ appName: app.appName, prefix: app.envPrefix, env: context.env }).state;
|
|
243
|
+
const unit = platform.unit({
|
|
244
|
+
profile: context.profile,
|
|
245
|
+
command: [...system.entry, "serve"],
|
|
246
|
+
environment: { [`${app.envPrefix}_PROFILE`]: context.profile, ...locationVariables(app, context.env) },
|
|
247
|
+
logPath: join(state, "serve", `${context.profile}.log`),
|
|
248
|
+
});
|
|
249
|
+
const each = async (argvs) => {
|
|
250
|
+
for (const argv of argvs) {
|
|
251
|
+
const ran = await system.run(argv, context.env);
|
|
252
|
+
if (ran.code !== 0)
|
|
253
|
+
throw new CliError("configuration_error", `${argv.join(" ")} failed: ${ran.stderr.trim()}`);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
const lock = () => {
|
|
257
|
+
const held = readLock(lockPath(app, unit.profile, context.env));
|
|
258
|
+
return held && alive(held.pid) ? held : undefined;
|
|
259
|
+
};
|
|
260
|
+
const say = (value, lines) => {
|
|
261
|
+
if (context.format === "pretty")
|
|
262
|
+
context.streams.data(lines.join("\n"));
|
|
263
|
+
else
|
|
264
|
+
context.renderer.result(value);
|
|
265
|
+
};
|
|
266
|
+
return { context, system, platform, unit, each, lock, say };
|
|
267
|
+
};
|
|
268
|
+
const installed = (unit) => {
|
|
269
|
+
if (!existsSync(unit.path)) {
|
|
270
|
+
throw new CliError("not_found", `no unit for profile ${unit.profile} — \`${app.command} server install\` writes it`);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
const byOf = async ({ platform, unit }, held) => {
|
|
274
|
+
if (existsSync(unit.path) && (await platform.state(unit)).pid === held.pid)
|
|
275
|
+
return "unit";
|
|
276
|
+
return carries(held.pid, marker(unit.profile)) ? "server" : "hand";
|
|
277
|
+
};
|
|
278
|
+
const how = (by, unit) => by === "unit"
|
|
279
|
+
? `under ${unit.path.endsWith(".plist") ? "launchd" : "systemd"} (${unit.name})`
|
|
280
|
+
: by === "server"
|
|
281
|
+
? `started by \`${app.command} server start\``
|
|
282
|
+
: `started by hand — \`${app.command} server stop\` leaves it alone`;
|
|
283
|
+
const start = async (prepared) => {
|
|
284
|
+
const { context, system, platform, unit, each, lock, say } = prepared;
|
|
285
|
+
const held = lock();
|
|
286
|
+
if (held) {
|
|
287
|
+
say({ profile: unit.profile, started: false, running: true, pid: held.pid, since: held.startedAt }, [
|
|
288
|
+
`Already serving profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}).`,
|
|
289
|
+
]);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
let by;
|
|
293
|
+
let spawned;
|
|
294
|
+
if (existsSync(unit.path)) {
|
|
295
|
+
await each(platform.start(unit));
|
|
296
|
+
by = "unit";
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
// A shell's --timeout default would end a server meant to outlive the shell.
|
|
300
|
+
const { [`${app.envPrefix}_TIMEOUT`]: _timeout, ...inherited } = context.env;
|
|
301
|
+
const [name = "", value = ""] = marker(unit.profile).split("=");
|
|
302
|
+
spawned = system.spawn(["serve"], { ...inherited, [`${app.envPrefix}_PROFILE`]: unit.profile, [name]: value }, unit.logPath ?? "");
|
|
303
|
+
by = "server";
|
|
304
|
+
}
|
|
305
|
+
for (let look = 0; look < LOOKS; look++) {
|
|
306
|
+
const now = lock();
|
|
307
|
+
if (now?.listeningAt) {
|
|
308
|
+
say({ profile: unit.profile, started: true, by, pid: now.pid, listeningSince: now.listeningAt }, [
|
|
309
|
+
`Started: serving profile ${unit.profile} (PID ${now.pid}), listening since ${clock(now.listeningAt)}, ${how(by, unit)}.`,
|
|
310
|
+
`Its log: ${app.command} server logs`,
|
|
311
|
+
]);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const gone = spawned !== undefined ? !alive(spawned) : look > 8 && !(await platform.state(unit)).active;
|
|
315
|
+
if (gone) {
|
|
316
|
+
const last = (by === "unit" ? await platform.logs(unit, 5) : tail(unit.logPath, 5)).trim();
|
|
317
|
+
throw new CliError("provider_unavailable", `serve stopped before it was listening${last ? `:\n${last}` : ""}`);
|
|
318
|
+
}
|
|
319
|
+
await system.pause();
|
|
320
|
+
}
|
|
321
|
+
throw new CliError("timeout", `serve is running but not listening yet — \`${app.command} server status\`, \`${app.command} server logs\``);
|
|
322
|
+
};
|
|
323
|
+
const stop = async (prepared) => {
|
|
324
|
+
const { platform, unit, each, lock, say, system } = prepared;
|
|
325
|
+
if (existsSync(unit.path) && (await platform.state(unit)).active) {
|
|
326
|
+
await each(platform.stop(unit));
|
|
327
|
+
say({ profile: unit.profile, stopped: true, by: "unit" }, [`Stopped ${unit.name}.`]);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
const held = lock();
|
|
331
|
+
if (!held) {
|
|
332
|
+
say({ profile: unit.profile, stopped: false }, [`Nothing to stop: profile ${unit.profile} is not being served.`]);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (!carries(held.pid, marker(unit.profile))) {
|
|
336
|
+
throw new CliError("validation_error", `serve for profile ${unit.profile} (PID ${held.pid}) was not started by \`${app.command} server start\` — stop it where it runs`);
|
|
337
|
+
}
|
|
338
|
+
process.kill(held.pid, "SIGTERM");
|
|
339
|
+
for (let look = 0; look < LOOKS && alive(held.pid); look++)
|
|
340
|
+
await system.pause();
|
|
341
|
+
say({ profile: unit.profile, stopped: true, by: "server", pid: held.pid }, [
|
|
342
|
+
`Stopped serving profile ${unit.profile} (PID ${held.pid}).`,
|
|
343
|
+
]);
|
|
344
|
+
};
|
|
345
|
+
command
|
|
346
|
+
.command("start")
|
|
347
|
+
.description("start serve in the background — through the unit if one is installed — and answer once it listens")
|
|
348
|
+
.action(async function () {
|
|
349
|
+
await start(prepare(this));
|
|
350
|
+
});
|
|
351
|
+
command
|
|
352
|
+
.command("stop")
|
|
353
|
+
.description("stop the serve that `server start` or the unit started")
|
|
354
|
+
.action(async function () {
|
|
355
|
+
await stop(prepare(this));
|
|
356
|
+
});
|
|
357
|
+
command
|
|
358
|
+
.command("restart")
|
|
359
|
+
.description("stop it and start it again")
|
|
360
|
+
.action(async function () {
|
|
361
|
+
const prepared = prepare(this);
|
|
362
|
+
await stop({ ...prepared, say: () => { } });
|
|
363
|
+
await start(prepared);
|
|
364
|
+
});
|
|
365
|
+
command
|
|
366
|
+
.command("status")
|
|
367
|
+
.description("whether serve runs for this profile, since when, who started it, and the unit if there is one")
|
|
368
|
+
.action(async function () {
|
|
369
|
+
const prepared = prepare(this);
|
|
370
|
+
const { context, platform, unit, lock, say } = prepared;
|
|
371
|
+
const isInstalled = existsSync(unit.path);
|
|
372
|
+
const state = isInstalled ? await platform.state(unit) : { loaded: false, active: false };
|
|
373
|
+
const held = lock();
|
|
374
|
+
const by = held ? await byOf(prepared, held) : null;
|
|
375
|
+
const unitLine = isInstalled
|
|
376
|
+
? `Unit: ${tilde(unit.path, context.env)} — ${state.detail ?? (state.active ? "active" : "inactive")}.`
|
|
377
|
+
: `No unit installed — \`${app.command} server install\` adds one, for starting under systemd or launchd.`;
|
|
378
|
+
say({
|
|
379
|
+
profile: unit.profile,
|
|
380
|
+
running: held !== undefined,
|
|
381
|
+
...(held
|
|
382
|
+
? {
|
|
383
|
+
pid: held.pid,
|
|
384
|
+
since: held.startedAt,
|
|
385
|
+
listening: held.listeningAt !== undefined,
|
|
386
|
+
...(held.listeningAt ? { listeningSince: held.listeningAt } : {}),
|
|
387
|
+
by,
|
|
388
|
+
}
|
|
389
|
+
: {}),
|
|
390
|
+
unit: { name: unit.name, path: unit.path, installed: isInstalled, ...state },
|
|
391
|
+
}, [
|
|
392
|
+
held
|
|
393
|
+
? held.listeningAt
|
|
394
|
+
? `Serving profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}), listening since ${clock(held.listeningAt)}, ${how(by ?? "hand", unit)}.`
|
|
395
|
+
: `Starting profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}) — not listening yet, ${how(by ?? "hand", unit)}.`
|
|
396
|
+
: `Not serving profile ${unit.profile}.${isInstalled && state.detail?.startsWith("failed") ? ` The unit failed — \`${app.command} server logs\`.` : ""}`,
|
|
397
|
+
unitLine,
|
|
398
|
+
]);
|
|
399
|
+
});
|
|
400
|
+
command
|
|
401
|
+
.command("logs")
|
|
402
|
+
.description("serve's latest log lines — from the journal under systemd, else its log file")
|
|
403
|
+
.option("-n, --lines <n>", "how many lines", (value) => wholeNumber(value), 50)
|
|
404
|
+
.action(async function () {
|
|
405
|
+
const { lines } = this.opts();
|
|
406
|
+
const { context, platform, unit } = prepare(this);
|
|
407
|
+
const text = existsSync(unit.path) ? await platform.logs(unit, lines) : tail(unit.logPath, lines);
|
|
408
|
+
if (!text)
|
|
409
|
+
context.renderer.note(`no log yet for profile ${unit.profile}`);
|
|
410
|
+
if (context.format === "pretty") {
|
|
411
|
+
if (text)
|
|
412
|
+
context.streams.data(text.replace(/\n$/, ""));
|
|
413
|
+
}
|
|
414
|
+
else
|
|
415
|
+
context.renderer.result({ profile: unit.profile, unit: unit.name, lines: text.split("\n").filter(Boolean) });
|
|
416
|
+
});
|
|
417
|
+
command
|
|
418
|
+
.command("install")
|
|
419
|
+
.description("write a systemd user unit or a launchd agent for this profile; starts nothing")
|
|
420
|
+
.action(function () {
|
|
421
|
+
const { context, platform, unit, say } = prepare(this);
|
|
422
|
+
const replaced = existsSync(unit.path);
|
|
423
|
+
writeSecurely(unit.path, platform.text(unit, app), 0o644);
|
|
424
|
+
platform.prepare?.(unit);
|
|
425
|
+
say({ profile: unit.profile, unit: unit.name, path: unit.path, command: unit.command, replaced }, [
|
|
426
|
+
`${replaced ? "Rewrote" : "Wrote"} ${tilde(unit.path, context.env)} — nothing started.`,
|
|
427
|
+
`It runs: ${unit.command.map((word) => tilde(word, context.env)).join(" ")}`,
|
|
428
|
+
`Start it now: ${app.command} server start · ${platform.atLogin(unit)}`,
|
|
429
|
+
]);
|
|
430
|
+
});
|
|
431
|
+
command
|
|
432
|
+
.command("uninstall")
|
|
433
|
+
.description("remove this profile's unit; stop it first")
|
|
434
|
+
.action(async function () {
|
|
435
|
+
const { context, platform, unit, say } = prepare(this);
|
|
436
|
+
installed(unit);
|
|
437
|
+
if ((await platform.state(unit)).active) {
|
|
438
|
+
throw new CliError("validation_error", `the unit is running — \`${app.command} server stop\` first`);
|
|
439
|
+
}
|
|
440
|
+
rmSync(unit.path, { force: true });
|
|
441
|
+
say({ profile: unit.profile, unit: unit.name, path: unit.path, removed: true }, [
|
|
442
|
+
`Removed ${tilde(unit.path, context.env)}.`,
|
|
443
|
+
]);
|
|
444
|
+
});
|
|
445
|
+
return command;
|
|
446
|
+
};
|
|
447
|
+
const wholeNumber = (value) => {
|
|
448
|
+
const parsed = Number(value);
|
|
449
|
+
if (!Number.isInteger(parsed) || parsed < 1)
|
|
450
|
+
throw new CliError("validation_error", `"${value}" is not a count`);
|
|
451
|
+
return parsed;
|
|
452
|
+
};
|
|
453
|
+
//# sourceMappingURL=server-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/server-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACxG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAwB,aAAa,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAkB,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAa,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAqBlE,MAAM,UAAU,GAAG,CAAC,IAAc,EAAE,GAAsB,EAAgB,EAAE,CAC1E,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QACxE,IAAK,KAAsC,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/D,MAAM,CAAC,IAAI,QAAQ,CAAC,qBAAqB,EAAE,GAAG,IAAI,wCAAwC,IAAI,eAAe,CAAC,CAAC,CAAA;YAC/G,OAAM;QACR,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACjG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ,MAAM,WAAW,GAAG,GAAiB,EAAE;IACrC,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACrE,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,EAAE,UAAU;QACf,KAAK;QACL,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC;QAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACxB,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;YACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;YACrC,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAA;gBAClC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;gBACnG,KAAK,CAAC,KAAK,EAAE,CAAA;gBACb,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;YACvB,CAAC;oBAAS,CAAC;gBACT,SAAS,CAAC,GAAG,CAAC,CAAA;YAChB,CAAC;QACH,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;KACxB,CAAA;AACH,CAAC,CAAA;AAED,4GAA4G;AAC5G,MAAM,KAAK,GAAG,GAAG,CAAA;AAajB;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,CAAC,GAAgB,EAAE,GAAsB,EAA0B,EAAE;IAC7F,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;QACrF,iBAAiB;QACjB,qBAAqB;KACtB,CAAA;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1G,CAAC,CAAA;AAeD,MAAM,IAAI,GAAG,CAAC,GAAsB,EAAU,EAAE;IAC9C,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,sDAAsD,CAAC,CAAA;IAChH,OAAO,GAAG,CAAC,IAAI,CAAA;AACjB,CAAC,CAAA;AAED,2GAA2G;AAC3G,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC1F,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,GAAgB,EAAE,MAAoB,EAAE,GAAsB,EAAY,EAAE;IAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACzF,MAAM,OAAO,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACvC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC/G,OAAO,GAAG,CAAC,MAAM,CAAA;IACnB,CAAC,CAAA;IACD,OAAO;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,UAAU,CAAA;YAC3D,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAA;QACpD,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACb;YACE,QAAQ;YACR,eAAe,GAAG,CAAC,OAAO,4DAA4D,IAAI,CAAC,OAAO,GAAG;YACrG,EAAE;YACF,WAAW;YACX,aAAa,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC1F,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,eAAe,YAAY,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;YAC7G,oBAAoB;YACpB,eAAe;YACf,EAAE;YACF,WAAW;YACX,yBAAyB;YACzB,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC;QACd,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YACf,CAAC,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC;YACxC,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;SAC5C;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B;gBACE,WAAW;gBACX,QAAQ;gBACR,MAAM;gBACN,IAAI,CAAC,IAAI;gBACT,IAAI;gBACJ,WAAW;gBACX,IAAI;gBACJ,aAAa;gBACb,IAAI;gBACJ,UAAU;gBACV,IAAI;gBACJ,SAAS;aACV,EACD,GAAG,CACJ,CAAA;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,GAAG,CAAC,MAAM;iBACP,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;iBACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACxF,CAAA;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAClC,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,SAAS,KAAK,QAAQ;gBACrC,MAAM,EAAE,MAAM,CAAC,WAAW,KAAK,QAAQ;gBACvC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxF,CAAA;QACH,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC;QAC5G,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,+CAA+C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE;KACxG,CAAA;AACH,CAAC,CAAA;AAED,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AAE7G,MAAM,OAAO,GAAG,CAAC,GAAgB,EAAE,MAAoB,EAAE,GAAsB,EAAY,EAAE;IAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;IACzD,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,GAAG,EAAE,CAAA;IAClC,OAAO;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,CAAA;YACnD,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAA;QAC/D,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACb;YACE,wCAAwC;YACxC,wGAAwG;YACxG,uBAAuB;YACvB,QAAQ;YACR,6BAA6B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW;YACtD,+BAA+B;YAC/B,WAAW;YACX,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;YAClE,YAAY;YACZ,mCAAmC;YACnC,UAAU;YACV,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CACrC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,KAAK,CAAC,WAAW,CAC/E;YACD,WAAW;YACX,+FAA+F;YAC/F,8BAA8B;YAC9B,+BAA+B;YAC/B,sEAAsE;YACtE,oDAAoD;YACpD,uCAAuC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW;YACzE,yCAAyC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW;YAC3E,SAAS;YACT,UAAU;YACV,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC;QACd,uGAAuG;QACvG,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YACf,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACjD,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;SAC9C;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YACd,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAClD,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;SACnD;QACD,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;YACnF,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;YAC3D,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;YAChE,MAAM,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7D,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,KAAK,KAAK,SAAS;gBAC3B,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpC,CAAA;QACH,CAAC;QACD,+DAA+D;QAC/D,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,IAAI,CAAC,OAAO;gBAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACtF,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;QACtD,OAAO,EAAE,GAAG,EAAE,CAAC,iEAAiE;KACjF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,IAAI,GAAG,CAAC,IAAwB,EAAE,KAAa,EAAU,EAAE,CAC/D,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;AAExH,4GAA4G;AAC5G,MAAM,OAAO,GAAG,CAAC,GAAgB,EAAE,MAAoB,EAAY,EAAE;IACnE,MAAM,MAAM,GAAG,GAAU,EAAE;QACzB,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,GAAG,GAAG,CAAC,OAAO,kEAAkE,MAAM,CAAC,QAAQ,QAAQ,GAAG,CAAC,OAAO,2CAA2C,CAC9J,CAAA;IACH,CAAC,CAAA;IACD,OAAO;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACrF,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACrD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;KAClB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,GAAgB,EAAE,MAAoB,EAAE,GAAsB,EAAY,EAAE;IAC/F,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IACjE,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IAClE,OAAO,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AAC7B,CAAC,CAAA;AAID,sDAAsD;AACtD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,GAAsB,EAAE,EAAE,CACrD,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAExF,yDAAyD;AACzD,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;IACrF,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAA;AACjH,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAAW,EAAE;IAC7D,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,CAAA;IACzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAC/C,KAAK,GAAG,CAAC,OAAO,wGAAwG,CACzH,CAAA;IACD,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,WAAW,OAAO,EAAE,CAAA;IAExE,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QACjD,MAAM,MAAM,GAAG,aAAa,CAA8C,IAAI,CAAC,CAAC,MAAM,IAAI,WAAW,EAAE,CAAA;QACvG,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QACtD,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAA;QACnG,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;YACnC,WAAW,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,UAAU,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;YACtG,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,MAAM,CAAC;SACxD,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,KAAK,EAAE,KAAiB,EAAE,EAAE;YACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;gBAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;oBAAE,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YACjH,CAAC;QACH,CAAC,CAAA;QACD,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;YAC/D,OAAO,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;QACnD,CAAC,CAAA;QACD,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,KAAe,EAAE,EAAE;YAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;gBAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;;gBAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC,CAAA;QACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;IAC7D,CAAC,CAAA;IAGD,MAAM,SAAS,GAAG,CAAC,IAAU,EAAE,EAAE;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,QAAQ,CAChB,WAAW,EACX,uBAAuB,IAAI,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,6BAA6B,CACpF,CAAA;QACH,CAAC;IACH,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAY,EAAE,IAAU,EAAe,EAAE;QAC3E,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;YAAE,OAAO,MAAM,CAAA;QACzF,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;IACpE,CAAC,CAAA;IAED,MAAM,GAAG,GAAG,CAAC,EAAM,EAAE,IAAU,EAAE,EAAE,CACjC,EAAE,KAAK,MAAM;QACX,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,GAAG;QAChF,CAAC,CAAC,EAAE,KAAK,QAAQ;YACf,CAAC,CAAC,gBAAgB,GAAG,CAAC,OAAO,iBAAiB;YAC9C,CAAC,CAAC,uBAAuB,GAAG,CAAC,OAAO,gCAAgC,CAAA;IAE1E,MAAM,KAAK,GAAG,KAAK,EAAE,QAAkB,EAAE,EAAE;QACzC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAA;QACrE,MAAM,IAAI,GAAG,IAAI,EAAE,CAAA;QACnB,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;gBAClG,2BAA2B,IAAI,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,GAAG,IAAI;aAC5F,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QACD,IAAI,EAAM,CAAA;QACV,IAAI,OAA2B,CAAA;QAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YAChC,EAAE,GAAG,MAAM,CAAA;QACb,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC,GAAG,CAAA;YAC5E,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/D,OAAO,GAAG,MAAM,CAAC,KAAK,CACpB,CAAC,OAAO,CAAC,EACT,EAAE,GAAG,SAAS,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,UAAU,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAC3E,IAAI,CAAC,OAAO,IAAI,EAAE,CACnB,CAAA;YACD,EAAE,GAAG,QAAQ,CAAA;QACf,CAAC;QACD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,EAAE,CAAA;YAClB,IAAI,GAAG,EAAE,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE;oBAC/F,4BAA4B,IAAI,CAAC,OAAO,SAAS,GAAG,CAAC,GAAG,sBAAsB,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG;oBACzH,YAAY,GAAG,CAAC,OAAO,cAAc;iBACtC,CAAC,CAAA;gBACF,OAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;YACvG,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBAC1F,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,wCAAwC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YAChH,CAAC;YACD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,SAAS,EACT,8CAA8C,GAAG,CAAC,OAAO,uBAAuB,GAAG,CAAC,OAAO,gBAAgB,CAC5G,CAAA;IACH,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,KAAK,EAAE,QAAkB,EAAE,EAAE;QACxC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;QAC5D,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACjE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YAC/B,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;YACpF,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,EAAE,CAAA;QACnB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,4BAA4B,IAAI,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAA;YACjH,OAAM;QACR,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,qBAAqB,IAAI,CAAC,OAAO,SAAS,IAAI,CAAC,GAAG,0BAA0B,GAAG,CAAC,OAAO,yCAAyC,CACjI,CAAA;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QACjC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;YAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QAChF,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;YACzE,2BAA2B,IAAI,CAAC,OAAO,SAAS,IAAI,CAAC,GAAG,IAAI;SAC7D,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mGAAmG,CAAC;SAChH,MAAM,CAAC,KAAK;QACX,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,KAAK;QACX,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK;QACX,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAA;QAC1C,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+FAA+F,CAAC;SAC5G,MAAM,CAAC,KAAK;QACX,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAA;QACvD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QACzF,MAAM,IAAI,GAAG,IAAI,EAAE,CAAA;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACnD,MAAM,QAAQ,GAAG,WAAW;YAC1B,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG;YACvG,CAAC,CAAC,yBAAyB,GAAG,CAAC,OAAO,oEAAoE,CAAA;QAC5G,GAAG,CACD;YACE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,KAAK,SAAS;YAC3B,GAAG,CAAC,IAAI;gBACN,CAAC,CAAC;oBACE,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,KAAK,EAAE,IAAI,CAAC,SAAS;oBACrB,SAAS,EAAE,IAAI,CAAC,WAAW,KAAK,SAAS;oBACzC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjE,EAAE;iBACH;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE;SAC7E,EACD;YACE,IAAI;gBACF,CAAC,CAAC,IAAI,CAAC,WAAW;oBAChB,CAAC,CAAC,mBAAmB,IAAI,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,GAAG,sBAAsB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,MAAM,EAAE,IAAI,CAAC,GAAG;oBAC7J,CAAC,CAAC,oBAAoB,IAAI,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,GAAG,0BAA0B,GAAG,CAAC,EAAE,IAAI,MAAM,EAAE,IAAI,CAAC,GAAG;gBACxI,CAAC,CAAC,uBAAuB,IAAI,CAAC,OAAO,IAAI,WAAW,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,wBAAwB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1J,QAAQ;SACT,CACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8EAA8E,CAAC;SAC3F,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;SAC9E,MAAM,CAAC,KAAK;QACX,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAqB,CAAA;QAChD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACjG,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,IAAI;gBAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAA;QACzD,CAAC;;YACC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAChH,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,+EAA+E,CAAC;SAC5F,MAAM,CAAC;QACN,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;QACzD,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;QACxB,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;YAChG,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;YACvF,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC5E,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;SACxE,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,KAAK;QACX,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACtD,SAAS,CAAC,IAAI,CAAC,CAAA;QACf,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,2BAA2B,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAA;QACtG,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAClC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YAC9E,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG;SAC5C,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,IAAI,KAAK,kBAAkB,CAAC,CAAA;IAChH,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
|
|
@@ -11,9 +11,10 @@ export declare const watchCommand: (messenger: Messenger) => Command;
|
|
|
11
11
|
* Listens until Ctrl-C, SIGTERM, `--timeout` or — with `pipe` — a reader that has gone away.
|
|
12
12
|
* Each ends it normally. Tests hand in `signal` instead of process-wide handlers.
|
|
13
13
|
*/
|
|
14
|
-
export declare const listenUntilStopped: (command: Command, context: MessengerContext, messenger: Messenger, onEvent: (event: MessageEvent) => void, { stop, pipe, catchUp }: {
|
|
14
|
+
export declare const listenUntilStopped: (command: Command, context: MessengerContext, messenger: Messenger, onEvent: (event: MessageEvent) => void, { stop, pipe, catchUp, onReady, }: {
|
|
15
15
|
stop: AbortController;
|
|
16
16
|
pipe?: boolean;
|
|
17
17
|
catchUp?: boolean;
|
|
18
|
+
onReady?: () => void;
|
|
18
19
|
}) => Promise<void>;
|
|
19
20
|
//# sourceMappingURL=watch-command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/watch-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,wBAAwB,CAAA;AAGtE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAoB,MAAM,cAAc,CAAA;AAEtF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAe,SAAS,KAAG,OAiC9C,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,YACpB,OAAO,WACP,gBAAgB,aACd,SAAS,WACX,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"watch-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/watch-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,wBAAwB,CAAA;AAGtE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAoB,MAAM,cAAc,CAAA;AAEtF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAe,SAAS,KAAG,OAiC9C,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,YACpB,OAAO,WACP,gBAAgB,aACd,SAAS,WACX,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,qCAMnC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,KACpF,OAAO,CAAC,IAAI,CA6Bd,CAAA"}
|