spindb 0.46.5 → 0.47.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/dist/cli/commands/info.js +12 -2
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/link.js +6 -0
- package/dist/cli/commands/link.js.map +1 -1
- package/dist/cli/commands/list.js +4 -1
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/menu/container-handlers.js +25 -7
- package/dist/cli/commands/menu/container-handlers.js.map +1 -1
- package/dist/config/backup-formats.js +11 -11
- package/dist/config/backup-formats.js.map +1 -1
- package/dist/config/version.js +1 -1
- package/dist/core/credential-manager.js +34 -11
- package/dist/core/credential-manager.js.map +1 -1
- package/dist/core/query-parser.js +55 -1
- package/dist/core/query-parser.js.map +1 -1
- package/dist/core/remote-container.js +11 -0
- package/dist/core/remote-container.js.map +1 -1
- package/dist/engines/clickhouse/backup.js +42 -10
- package/dist/engines/clickhouse/backup.js.map +1 -1
- package/dist/engines/clickhouse/restore.js +41 -10
- package/dist/engines/clickhouse/restore.js.map +1 -1
- package/dist/engines/cockroachdb/backup.js +18 -22
- package/dist/engines/cockroachdb/backup.js.map +1 -1
- package/dist/engines/cockroachdb/cli-utils.js +66 -0
- package/dist/engines/cockroachdb/cli-utils.js.map +1 -1
- package/dist/engines/cockroachdb/index.js +199 -116
- package/dist/engines/cockroachdb/index.js.map +1 -1
- package/dist/engines/cockroachdb/restore.js +19 -26
- package/dist/engines/cockroachdb/restore.js.map +1 -1
- package/dist/engines/couchdb/backup.js +13 -4
- package/dist/engines/couchdb/backup.js.map +1 -1
- package/dist/engines/couchdb/index.js +93 -25
- package/dist/engines/couchdb/index.js.map +1 -1
- package/dist/engines/couchdb/restore.js +15 -4
- package/dist/engines/couchdb/restore.js.map +1 -1
- package/dist/engines/ferretdb/backup.js +88 -91
- package/dist/engines/ferretdb/backup.js.map +1 -1
- package/dist/engines/ferretdb/index.js +182 -227
- package/dist/engines/ferretdb/index.js.map +1 -1
- package/dist/engines/ferretdb/restore.js +223 -20
- package/dist/engines/ferretdb/restore.js.map +1 -1
- package/dist/engines/influxdb/api-client.js +1 -1
- package/dist/engines/influxdb/api-client.js.map +1 -1
- package/dist/engines/influxdb/backup.js +25 -5
- package/dist/engines/influxdb/backup.js.map +1 -1
- package/dist/engines/influxdb/index.js +165 -43
- package/dist/engines/influxdb/index.js.map +1 -1
- package/dist/engines/influxdb/restore.js +22 -2
- package/dist/engines/influxdb/restore.js.map +1 -1
- package/dist/engines/mariadb/backup.js +24 -15
- package/dist/engines/mariadb/backup.js.map +1 -1
- package/dist/engines/mariadb/env.js +11 -0
- package/dist/engines/mariadb/env.js.map +1 -0
- package/dist/engines/mariadb/index.js +192 -113
- package/dist/engines/mariadb/index.js.map +1 -1
- package/dist/engines/mariadb/restore.js +28 -5
- package/dist/engines/mariadb/restore.js.map +1 -1
- package/dist/engines/meilisearch/backup.js +8 -4
- package/dist/engines/meilisearch/backup.js.map +1 -1
- package/dist/engines/meilisearch/index.js +55 -58
- package/dist/engines/meilisearch/index.js.map +1 -1
- package/dist/engines/mongo-uri.js +11 -0
- package/dist/engines/mongo-uri.js.map +1 -0
- package/dist/engines/mongodb/backup.js +62 -13
- package/dist/engines/mongodb/backup.js.map +1 -1
- package/dist/engines/mongodb/index.js +170 -108
- package/dist/engines/mongodb/index.js.map +1 -1
- package/dist/engines/mongodb/restore.js +21 -1
- package/dist/engines/mongodb/restore.js.map +1 -1
- package/dist/engines/mysql/backup.js +24 -7
- package/dist/engines/mysql/backup.js.map +1 -1
- package/dist/engines/mysql/index.js +154 -89
- package/dist/engines/mysql/index.js.map +1 -1
- package/dist/engines/mysql/restore.js +14 -4
- package/dist/engines/mysql/restore.js.map +1 -1
- package/dist/engines/postgresql/backup.js +9 -2
- package/dist/engines/postgresql/backup.js.map +1 -1
- package/dist/engines/postgresql/index.js +45 -17
- package/dist/engines/postgresql/index.js.map +1 -1
- package/dist/engines/postgresql/restore.js +7 -3
- package/dist/engines/postgresql/restore.js.map +1 -1
- package/dist/engines/qdrant/backup.js +5 -1
- package/dist/engines/qdrant/backup.js.map +1 -1
- package/dist/engines/qdrant/index.js +31 -2
- package/dist/engines/qdrant/index.js.map +1 -1
- package/dist/engines/qdrant/restore.js +5 -3
- package/dist/engines/qdrant/restore.js.map +1 -1
- package/dist/engines/questdb/auth.js +26 -0
- package/dist/engines/questdb/auth.js.map +1 -0
- package/dist/engines/questdb/backup.js +10 -8
- package/dist/engines/questdb/backup.js.map +1 -1
- package/dist/engines/questdb/index.js +16 -8
- package/dist/engines/questdb/index.js.map +1 -1
- package/dist/engines/questdb/restore.js +7 -5
- package/dist/engines/questdb/restore.js.map +1 -1
- package/dist/engines/redis/backup.js +45 -16
- package/dist/engines/redis/backup.js.map +1 -1
- package/dist/engines/redis/cli-common.js +62 -0
- package/dist/engines/redis/cli-common.js.map +1 -0
- package/dist/engines/redis/index.js +31 -8
- package/dist/engines/redis/index.js.map +1 -1
- package/dist/engines/redis/restore.js +59 -9
- package/dist/engines/redis/restore.js.map +1 -1
- package/dist/engines/surrealdb/auth.js +98 -0
- package/dist/engines/surrealdb/auth.js.map +1 -0
- package/dist/engines/surrealdb/backup.js +72 -9
- package/dist/engines/surrealdb/backup.js.map +1 -1
- package/dist/engines/surrealdb/index.js +84 -144
- package/dist/engines/surrealdb/index.js.map +1 -1
- package/dist/engines/surrealdb/restore.js +32 -31
- package/dist/engines/surrealdb/restore.js.map +1 -1
- package/dist/engines/typedb/backup.js +9 -1
- package/dist/engines/typedb/backup.js.map +1 -1
- package/dist/engines/typedb/cli-utils.js +3 -3
- package/dist/engines/typedb/cli-utils.js.map +1 -1
- package/dist/engines/typedb/index.js +9 -2
- package/dist/engines/typedb/index.js.map +1 -1
- package/dist/engines/typedb/restore.js +19 -7
- package/dist/engines/typedb/restore.js.map +1 -1
- package/dist/engines/valkey/backup.js +37 -13
- package/dist/engines/valkey/backup.js.map +1 -1
- package/dist/engines/valkey/index.js +207 -58
- package/dist/engines/valkey/index.js.map +1 -1
- package/dist/engines/valkey/restore.js +21 -2
- package/dist/engines/valkey/restore.js.map +1 -1
- package/dist/engines/weaviate/backup.js +7 -2
- package/dist/engines/weaviate/backup.js.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,72 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FerretDB backup module
|
|
3
3
|
*
|
|
4
|
-
* Creates backups using
|
|
5
|
-
* This
|
|
4
|
+
* Creates backups using mongodump on the MongoDB-compatible proxy.
|
|
5
|
+
* This preserves FerretDB's document model correctly and works when SCRAM auth
|
|
6
|
+
* is enabled, unlike the old pg_dump-based backend backup.
|
|
6
7
|
*/
|
|
7
8
|
import { spawn } from 'child_process';
|
|
8
9
|
import { stat } from 'fs/promises';
|
|
9
10
|
import { existsSync } from 'fs';
|
|
10
|
-
import {
|
|
11
|
+
import { dirname, join } from 'path';
|
|
11
12
|
import { mkdir } from 'fs/promises';
|
|
12
13
|
import { logDebug } from '../../core/error-handler.js';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
* 1. Container's specific backend binary directory
|
|
23
|
-
* 2. Any installed PostgreSQL version (newest first) — pg_dump is forward-compatible
|
|
24
|
-
* 3. System binary registered via `spindb config set pg_dump`
|
|
25
|
-
*/
|
|
26
|
-
async function getPgDumpPath(container) {
|
|
27
|
-
const { version, backendVersion } = container;
|
|
28
|
-
const { platform, arch } = platformService.getPlatformInfo();
|
|
29
|
-
const v1 = isV1(version);
|
|
30
|
-
const ext = platformService.getExecutableExtension();
|
|
31
|
-
const effectiveBackendVersion = v1
|
|
32
|
-
? backendVersion || DEFAULT_V1_POSTGRESQL_VERSION
|
|
33
|
-
: backendVersion || DEFAULT_DOCUMENTDB_VERSION;
|
|
34
|
-
// 1. Try the container's own backend path
|
|
35
|
-
const backendPath = ferretdbBinaryManager.getBackendBinaryPath(version, effectiveBackendVersion, platform, arch);
|
|
36
|
-
const primaryPath = join(backendPath, 'bin', `pg_dump${ext}`);
|
|
37
|
-
if (existsSync(primaryPath)) {
|
|
38
|
-
return primaryPath;
|
|
39
|
-
}
|
|
40
|
-
logDebug(`pg_dump not found at ${primaryPath}, searching other installed PostgreSQL versions`);
|
|
41
|
-
// 2. Search all installed PostgreSQL versions (newest first)
|
|
42
|
-
const installed = paths.findInstalledBinaries('postgresql', platform, arch);
|
|
43
|
-
for (const entry of installed) {
|
|
44
|
-
const candidate = join(entry.path, 'bin', `pg_dump${ext}`);
|
|
45
|
-
if (existsSync(candidate)) {
|
|
46
|
-
logDebug(`Found pg_dump in PostgreSQL ${entry.version}`);
|
|
47
|
-
return candidate;
|
|
14
|
+
import { getDefaultUsername, loadCredentials } from '../../core/credential-manager.js';
|
|
15
|
+
import { buildMongoUri } from '../mongo-uri.js';
|
|
16
|
+
import { getMongodumpPath, MONGODUMP_NOT_FOUND_ERROR } from '../mongodb/cli-utils.js';
|
|
17
|
+
import { Engine } from '../../types/index.js';
|
|
18
|
+
function redactMongoUri(uri) {
|
|
19
|
+
try {
|
|
20
|
+
const url = new URL(uri);
|
|
21
|
+
if (!url.username && !url.password) {
|
|
22
|
+
return uri;
|
|
48
23
|
}
|
|
24
|
+
return `${url.protocol}//<redacted>@${url.host}${url.pathname}${url.search}`;
|
|
49
25
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
for (const entry of documentdbInstalled) {
|
|
53
|
-
const candidate = join(entry.path, 'bin', `pg_dump${ext}`);
|
|
54
|
-
if (existsSync(candidate)) {
|
|
55
|
-
logDebug(`Found pg_dump in postgresql-documentdb ${entry.version}`);
|
|
56
|
-
return candidate;
|
|
57
|
-
}
|
|
26
|
+
catch {
|
|
27
|
+
return 'mongodb://<redacted>';
|
|
58
28
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
29
|
+
}
|
|
30
|
+
function sanitizeMongoArgs(args) {
|
|
31
|
+
const sanitized = [...args];
|
|
32
|
+
const uriIndex = sanitized.indexOf('--uri');
|
|
33
|
+
if (uriIndex >= 0 && uriIndex + 1 < sanitized.length) {
|
|
34
|
+
sanitized[uriIndex + 1] = redactMongoUri(sanitized[uriIndex + 1]);
|
|
63
35
|
}
|
|
64
|
-
|
|
65
|
-
throw new Error(`pg_dump not found. The ${backendName} installation at ${backendPath} does not include client tools.\n` +
|
|
66
|
-
'Install PostgreSQL client tools:\n' +
|
|
67
|
-
' macOS: brew install libpq && brew link --force libpq\n' +
|
|
68
|
-
' Ubuntu/Debian: apt install postgresql-client\n\n' +
|
|
69
|
-
'Or configure manually: spindb config set pg_dump /path/to/pg_dump');
|
|
36
|
+
return sanitized;
|
|
70
37
|
}
|
|
71
38
|
/**
|
|
72
39
|
* Create a backup of a FerretDB database using pg_dump
|
|
@@ -76,46 +43,58 @@ async function getPgDumpPath(container) {
|
|
|
76
43
|
* - 'custom' (default): PostgreSQL custom format (.dump)
|
|
77
44
|
*/
|
|
78
45
|
export async function createBackup(container, outputPath, options) {
|
|
79
|
-
const {
|
|
80
|
-
const database = options.database || '
|
|
81
|
-
|
|
82
|
-
|
|
46
|
+
const { name, port, version } = container;
|
|
47
|
+
const database = options.database || container.database || 'test';
|
|
48
|
+
const mongodump = await getMongodumpPath(version);
|
|
49
|
+
if (!mongodump) {
|
|
50
|
+
throw new Error(MONGODUMP_NOT_FOUND_ERROR);
|
|
83
51
|
}
|
|
84
|
-
const pgDump = await getPgDumpPath(container);
|
|
85
52
|
// Ensure output directory exists
|
|
86
53
|
const outputDir = dirname(outputPath);
|
|
87
54
|
if (!existsSync(outputDir)) {
|
|
88
55
|
await mkdir(outputDir, { recursive: true });
|
|
89
56
|
}
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
57
|
+
const savedCreds = await loadCredentials(name, Engine.FerretDB, getDefaultUsername(Engine.FerretDB));
|
|
58
|
+
const args = savedCreds
|
|
59
|
+
? [
|
|
60
|
+
'--uri',
|
|
61
|
+
buildMongoUri(port, database, {
|
|
62
|
+
username: savedCreds.username,
|
|
63
|
+
password: savedCreds.password,
|
|
64
|
+
authDatabase: savedCreds.database || 'admin',
|
|
65
|
+
}, container.bindAddress ?? '127.0.0.1'),
|
|
66
|
+
'--db',
|
|
67
|
+
database,
|
|
68
|
+
]
|
|
69
|
+
: [
|
|
70
|
+
'--host',
|
|
71
|
+
'127.0.0.1',
|
|
72
|
+
'--port',
|
|
73
|
+
String(port),
|
|
74
|
+
'--db',
|
|
75
|
+
database,
|
|
76
|
+
];
|
|
77
|
+
// FerretDB now uses Mongo-compatible backup formats under the hood:
|
|
78
|
+
// - archive: single compressed file
|
|
79
|
+
// - bson: directory dump
|
|
80
|
+
const format = options.format ?? 'archive';
|
|
81
|
+
if (format === 'archive') {
|
|
82
|
+
args.push('--archive=' + outputPath, '--gzip');
|
|
106
83
|
}
|
|
107
84
|
else {
|
|
108
|
-
|
|
109
|
-
args.push('-f', outputPath);
|
|
85
|
+
args.push('--out', outputPath);
|
|
110
86
|
}
|
|
111
|
-
logDebug(`Running
|
|
87
|
+
logDebug(`Running mongodump with args: ${sanitizeMongoArgs(args).join(' ')}`);
|
|
112
88
|
const spawnOptions = {
|
|
113
|
-
stdio: ['pipe', '
|
|
89
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
114
90
|
};
|
|
115
91
|
return new Promise((resolve, reject) => {
|
|
116
|
-
const proc = spawn(
|
|
92
|
+
const proc = spawn(mongodump, args, spawnOptions);
|
|
117
93
|
let stderr = '';
|
|
118
94
|
let finished = false;
|
|
95
|
+
proc.stdout?.on('data', () => {
|
|
96
|
+
// mongodump typically writes progress to stderr
|
|
97
|
+
});
|
|
119
98
|
proc.stderr?.on('data', (data) => {
|
|
120
99
|
stderr += data.toString();
|
|
121
100
|
});
|
|
@@ -131,12 +110,33 @@ export async function createBackup(container, outputPath, options) {
|
|
|
131
110
|
finished = true;
|
|
132
111
|
if (code === 0) {
|
|
133
112
|
// Get backup size
|
|
134
|
-
|
|
135
|
-
|
|
113
|
+
const getBackupSize = async () => {
|
|
114
|
+
if (format !== 'bson') {
|
|
115
|
+
return (await stat(outputPath)).size;
|
|
116
|
+
}
|
|
117
|
+
const { readdir, stat: fileStat } = await import('fs/promises');
|
|
118
|
+
const sumDirectory = async (dirPath) => {
|
|
119
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
120
|
+
let total = 0;
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
const entryPath = join(dirPath, entry.name);
|
|
123
|
+
if (entry.isDirectory()) {
|
|
124
|
+
total += await sumDirectory(entryPath);
|
|
125
|
+
}
|
|
126
|
+
else if (entry.isFile()) {
|
|
127
|
+
total += (await fileStat(entryPath)).size;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return total;
|
|
131
|
+
};
|
|
132
|
+
return sumDirectory(outputPath);
|
|
133
|
+
};
|
|
134
|
+
getBackupSize()
|
|
135
|
+
.then((size) => {
|
|
136
136
|
resolve({
|
|
137
137
|
path: outputPath,
|
|
138
138
|
format,
|
|
139
|
-
size
|
|
139
|
+
size,
|
|
140
140
|
});
|
|
141
141
|
})
|
|
142
142
|
.catch(() => {
|
|
@@ -149,7 +149,7 @@ export async function createBackup(container, outputPath, options) {
|
|
|
149
149
|
});
|
|
150
150
|
}
|
|
151
151
|
else {
|
|
152
|
-
reject(new Error(stderr || `
|
|
152
|
+
reject(new Error(stderr || `mongodump exited with code ${code}`));
|
|
153
153
|
}
|
|
154
154
|
});
|
|
155
155
|
});
|
|
@@ -159,12 +159,9 @@ export async function createBackup(container, outputPath, options) {
|
|
|
159
159
|
* Uses custom format by default for reliability and smaller size
|
|
160
160
|
*/
|
|
161
161
|
export async function createCloneBackup(container, outputPath) {
|
|
162
|
-
// FerretDB stores all MongoDB-compatible document data in a PostgreSQL database
|
|
163
|
-
// named 'ferretdb'. This is the backend database that pg_dump targets.
|
|
164
|
-
// See CLAUDE.md "FerretDB (Composite Engine)" section for architecture details.
|
|
165
162
|
return createBackup(container, outputPath, {
|
|
166
|
-
database:
|
|
167
|
-
format: '
|
|
163
|
+
database: container.database,
|
|
164
|
+
format: 'archive',
|
|
168
165
|
});
|
|
169
166
|
}
|
|
170
167
|
//# sourceMappingURL=backup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../engines/ferretdb/backup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../engines/ferretdb/backup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAClF,OAAO,EAAE,MAAM,EAA+D,MAAM,aAAa,CAAA;AAEjG,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACnC,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,OAAO,GAAG,GAAG,CAAC,QAAQ,gBAAgB,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,CAAA;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,sBAAsB,CAAA;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc;IACvC,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QACrD,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAA;IACnE,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAA0B,EAC1B,UAAkB,EAClB,OAAsB;IAEtB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,CAAA;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,IAAI,MAAM,CAAA;IACjE,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACrC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,eAAe,CACtC,IAAI,EACJ,MAAM,CAAC,QAAQ,EACf,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CACpC,CAAA;IAED,MAAM,IAAI,GAAa,UAAU;QAC/B,CAAC,CAAC;YACE,OAAO;YACP,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE;gBAC5B,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,YAAY,EAAE,UAAU,CAAC,QAAQ,IAAI,OAAO;aAC7C,EAAE,SAAS,CAAC,WAAW,IAAI,WAAW,CAAC;YACxC,MAAM;YACN,QAAQ;SACT;QACH,CAAC,CAAC;YACE,QAAQ;YACR,WAAW;YACX,QAAQ;YACR,MAAM,CAAC,IAAI,CAAC;YACZ,MAAM;YACN,QAAQ;SACT,CAAA;IAEL,oEAAoE;IACpE,oCAAoC;IACpC,yBAAyB;IACzB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAA;IAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,UAAU,EAAE,QAAQ,CAAC,CAAA;IAChD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAChC,CAAC;IAED,QAAQ,CAAC,gCAAgC,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAE7E,MAAM,YAAY,GAAiB;QACjC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CAAA;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;QAEjD,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,QAAQ,GAAG,KAAK,CAAA;QAEpB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YAC3B,gDAAgD;QAClD,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,QAAQ;gBAAE,OAAM;YACpB,QAAQ,GAAG,IAAI,CAAA;YACf,MAAM,CAAC,GAAG,CAAC,CAAA;QACb,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,QAAQ;gBAAE,OAAM;YACpB,QAAQ,GAAG,IAAI,CAAA;YAEf,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,kBAAkB;gBAClB,MAAM,aAAa,GAAG,KAAK,IAAqB,EAAE;oBAChD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;wBACtB,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAA;oBACtC,CAAC;oBAED,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;oBAC/D,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAmB,EAAE;wBAC9D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;wBAC/D,IAAI,KAAK,GAAG,CAAC,CAAA;wBACb,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;4BAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;4BAC3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gCACxB,KAAK,IAAI,MAAM,YAAY,CAAC,SAAS,CAAC,CAAA;4BACxC,CAAC;iCAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gCAC1B,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;4BAC3C,CAAC;wBACH,CAAC;wBACD,OAAO,KAAK,CAAA;oBACd,CAAC,CAAA;oBAED,OAAO,YAAY,CAAC,UAAU,CAAC,CAAA;gBACjC,CAAC,CAAA;gBAED,aAAa,EAAE;qBACZ,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oBACb,OAAO,CAAC;wBACN,IAAI,EAAE,UAAU;wBAChB,MAAM;wBACN,IAAI;qBACL,CAAC,CAAA;gBACJ,CAAC,CAAC;qBACD,KAAK,CAAC,GAAG,EAAE;oBACV,iCAAiC;oBACjC,OAAO,CAAC;wBACN,IAAI,EAAE,UAAU;wBAChB,MAAM;wBACN,IAAI,EAAE,CAAC;qBACR,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAA;YACN,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,8BAA8B,IAAI,EAAE,CAAC,CAAC,CAAA;YACnE,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAA0B,EAC1B,UAAkB;IAElB,OAAO,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE;QACzC,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,MAAM,EAAE,SAAS;KAClB,CAAC,CAAA;AACJ,CAAC"}
|