agl 1.0.17 → 21.0.2
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/.smartconfig.json +55 -0
- package/changelog.md +1026 -0
- package/cli.js +14 -0
- package/dist_serve/bundle.js +44778 -0
- package/dist_serve/index.html +13 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.authmodels.d.ts +126 -0
- package/dist_ts/classes.authmodels.js +1422 -0
- package/dist_ts/classes.authstore.d.ts +160 -0
- package/dist_ts/classes.authstore.js +2483 -0
- package/dist_ts/classes.browserresourcehost.d.ts +85 -0
- package/dist_ts/classes.browserresourcehost.js +912 -0
- package/dist_ts/classes.cli.d.ts +21 -0
- package/dist_ts/classes.cli.js +1082 -0
- package/dist_ts/classes.config.d.ts +23 -0
- package/dist_ts/classes.config.js +267 -0
- package/dist_ts/classes.controller.d.ts +523 -0
- package/dist_ts/classes.controller.js +10611 -0
- package/dist_ts/classes.controllermanagement.d.ts +32 -0
- package/dist_ts/classes.controllermanagement.js +222 -0
- package/dist_ts/classes.draftmanager.d.ts +30 -0
- package/dist_ts/classes.draftmanager.js +179 -0
- package/dist_ts/classes.embeddeddb.d.ts +30 -0
- package/dist_ts/classes.embeddeddb.js +159 -0
- package/dist_ts/classes.flexframedtransport.d.ts +56 -0
- package/dist_ts/classes.flexframedtransport.js +275 -0
- package/dist_ts/classes.flexmodels.private.d.ts +231 -0
- package/dist_ts/classes.flexmodels.private.js +985 -0
- package/dist_ts/classes.flexmodels.public.d.ts +207 -0
- package/dist_ts/classes.flexmodels.public.js +885 -0
- package/dist_ts/classes.flexprojectionreader.d.ts +89 -0
- package/dist_ts/classes.flexprojectionreader.js +580 -0
- package/dist_ts/classes.flexservice.d.ts +196 -0
- package/dist_ts/classes.flexservice.js +3704 -0
- package/dist_ts/classes.flexstore.d.ts +174 -0
- package/dist_ts/classes.flexstore.js +3400 -0
- package/dist_ts/classes.flexsupervisor.d.ts +105 -0
- package/dist_ts/classes.flexsupervisor.js +1191 -0
- package/dist_ts/classes.gitreversion.d.ts +431 -0
- package/dist_ts/classes.gitreversion.js +10592 -0
- package/dist_ts/classes.harnessoperationmanager.d.ts +113 -0
- package/dist_ts/classes.harnessoperationmanager.js +602 -0
- package/dist_ts/classes.opencodeclient.d.ts +146 -0
- package/dist_ts/classes.opencodeclient.js +3003 -0
- package/dist_ts/classes.opencodesupervisor.d.ts +60 -0
- package/dist_ts/classes.opencodesupervisor.js +1003 -0
- package/dist_ts/classes.passkeymanager.d.ts +34 -0
- package/dist_ts/classes.passkeymanager.js +456 -0
- package/dist_ts/classes.processinspection.d.ts +50 -0
- package/dist_ts/classes.processinspection.js +484 -0
- package/dist_ts/classes.resourcecoordinator.d.ts +64 -0
- package/dist_ts/classes.resourcecoordinator.js +294 -0
- package/dist_ts/classes.sessionintelligencereader.d.ts +13 -0
- package/dist_ts/classes.sessionintelligencereader.js +40 -0
- package/dist_ts/classes.systemmetricssampler.d.ts +53 -0
- package/dist_ts/classes.systemmetricssampler.js +168 -0
- package/dist_ts/classes.terminalmanager.d.ts +95 -0
- package/dist_ts/classes.terminalmanager.js +981 -0
- package/dist_ts/classes.terminalresourcehost.d.ts +20 -0
- package/dist_ts/classes.terminalresourcehost.js +84 -0
- package/dist_ts/classes.upgradecoordinator.d.ts +244 -0
- package/dist_ts/classes.upgradecoordinator.js +2155 -0
- package/dist_ts/classes.upgradetransaction.d.ts +92 -0
- package/dist_ts/classes.upgradetransaction.js +2125 -0
- package/dist_ts/classes.uploadmanager.d.ts +24 -0
- package/dist_ts/classes.uploadmanager.js +210 -0
- package/dist_ts/classes.validation.d.ts +91 -0
- package/dist_ts/classes.validation.js +1087 -0
- package/dist_ts/flexharness.child.d.ts +1 -0
- package/dist_ts/flexharness.child.js +28 -0
- package/dist_ts/functions.canonicaldirectory.d.ts +21 -0
- package/dist_ts/functions.canonicaldirectory.js +144 -0
- package/dist_ts/functions.controllerdataroot.d.ts +15 -0
- package/dist_ts/functions.controllerdataroot.js +76 -0
- package/dist_ts/functions.embeddeddb.d.ts +2 -0
- package/dist_ts/functions.embeddeddb.js +21 -0
- package/dist_ts/functions.flexcredentialstore.d.ts +16 -0
- package/dist_ts/functions.flexcredentialstore.js +93 -0
- package/dist_ts/functions.opencodeauth.d.ts +3 -0
- package/dist_ts/functions.opencodeauth.js +31 -0
- package/dist_ts/functions.runtimeenvironment.d.ts +2 -0
- package/dist_ts/functions.runtimeenvironment.js +79 -0
- package/dist_ts/functions.upgradefollower.d.ts +3 -0
- package/dist_ts/functions.upgradefollower.js +95 -0
- package/dist_ts/index.d.ts +24 -0
- package/dist_ts/index.js +25 -0
- package/dist_ts/interfaces.auth.d.ts +181 -0
- package/dist_ts/interfaces.auth.js +82 -0
- package/dist_ts/interfaces.config.d.ts +34 -0
- package/dist_ts/interfaces.config.js +2 -0
- package/dist_ts/interfaces.flexipc.d.ts +939 -0
- package/dist_ts/interfaces.flexipc.js +1492 -0
- package/dist_ts/interfaces.gitreversion.d.ts +246 -0
- package/dist_ts/interfaces.gitreversion.js +2 -0
- package/dist_ts/interfaces.lifecycle.d.ts +37 -0
- package/dist_ts/interfaces.lifecycle.js +2 -0
- package/dist_ts/interfaces.opencode.d.ts +101 -0
- package/dist_ts/interfaces.opencode.js +3 -0
- package/dist_ts/interfaces.projects.d.ts +156 -0
- package/dist_ts/interfaces.projects.js +5 -0
- package/dist_ts/plugins.d.ts +36 -0
- package/dist_ts/plugins.js +40 -0
- package/dist_ts_interfaces/index.d.ts +2 -0
- package/dist_ts_interfaces/index.js +3 -0
- package/dist_ts_interfaces/interfaces.d.ts +747 -0
- package/dist_ts_interfaces/interfaces.js +47 -0
- package/dist_ts_interfaces/plugins.d.ts +4 -0
- package/dist_ts_interfaces/plugins.js +3 -0
- package/dist_ts_interfaces/requests.d.ts +806 -0
- package/dist_ts_interfaces/requests.js +2 -0
- package/dist_ts_migration/classes.documentmigrationrunner.d.ts +8 -0
- package/dist_ts_migration/classes.documentmigrationrunner.js +24 -0
- package/dist_ts_migration/classes.flexmigrationrunner.d.ts +11 -0
- package/dist_ts_migration/classes.flexmigrationrunner.js +25 -0
- package/dist_ts_migration/classes.flexpostharnessmigrationrunner.d.ts +10 -0
- package/dist_ts_migration/classes.flexpostharnessmigrationrunner.js +15 -0
- package/dist_ts_migration/classes.migrationrunner.d.ts +8 -0
- package/dist_ts_migration/classes.migrationrunner.js +34 -0
- package/dist_ts_migration/index.d.ts +12 -0
- package/dist_ts_migration/index.js +13 -0
- package/dist_ts_migration/v10_flexharnessv3migration.d.ts +11 -0
- package/dist_ts_migration/v10_flexharnessv3migration.js +23 -0
- package/dist_ts_migration/v13_flexprojectionorder.d.ts +11 -0
- package/dist_ts_migration/v13_flexprojectionorder.js +23 -0
- package/dist_ts_migration/v16_flexprovidercredentials.d.ts +22 -0
- package/dist_ts_migration/v16_flexprovidercredentials.js +149 -0
- package/dist_ts_migration/v18_resourcelayout.d.ts +22 -0
- package/dist_ts_migration/v18_resourcelayout.js +23 -0
- package/dist_ts_migration/v18_resourcelayoutmigration.d.ts +6 -0
- package/dist_ts_migration/v18_resourcelayoutmigration.js +61 -0
- package/dist_ts_migration/v19_flexprojectmanagement.d.ts +11 -0
- package/dist_ts_migration/v19_flexprojectmanagement.js +21 -0
- package/dist_ts_migration/v1_embeddeddatabaselocation.d.ts +28 -0
- package/dist_ts_migration/v1_embeddeddatabaselocation.js +415 -0
- package/dist_ts_migration/v22_projectfilesystemidentitymigration.d.ts +7 -0
- package/dist_ts_migration/v22_projectfilesystemidentitymigration.js +105 -0
- package/dist_ts_migration/v2_controllerdataroot.d.ts +130 -0
- package/dist_ts_migration/v2_controllerdataroot.js +1887 -0
- package/dist_ts_migration/v6_protocoldocumentmigration.d.ts +7 -0
- package/dist_ts_migration/v6_protocoldocumentmigration.js +100 -0
- package/dist_ts_migration/v6_protocoldocuments.d.ts +7 -0
- package/dist_ts_migration/v6_protocoldocuments.js +138 -0
- package/html/index.html +13 -0
- package/{LICENSE → license.md} +2 -2
- package/package.json +86 -48
- package/readme.md +480 -0
- package/readme.plan.md +188 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.authmodels.ts +1245 -0
- package/ts/classes.authstore.ts +3274 -0
- package/ts/classes.browserresourcehost.ts +1205 -0
- package/ts/classes.cli.ts +1254 -0
- package/ts/classes.config.ts +351 -0
- package/ts/classes.controller.ts +14426 -0
- package/ts/classes.controllermanagement.ts +330 -0
- package/ts/classes.draftmanager.ts +232 -0
- package/ts/classes.embeddeddb.ts +166 -0
- package/ts/classes.flexframedtransport.ts +283 -0
- package/ts/classes.flexmodels.private.ts +823 -0
- package/ts/classes.flexmodels.public.ts +732 -0
- package/ts/classes.flexprojectionreader.ts +816 -0
- package/ts/classes.flexservice.ts +4302 -0
- package/ts/classes.flexstore.ts +4565 -0
- package/ts/classes.flexsupervisor.ts +1453 -0
- package/ts/classes.gitreversion.ts +13353 -0
- package/ts/classes.harnessoperationmanager.ts +870 -0
- package/ts/classes.opencodeclient.ts +4110 -0
- package/ts/classes.opencodesupervisor.ts +1280 -0
- package/ts/classes.passkeymanager.ts +570 -0
- package/ts/classes.processinspection.ts +623 -0
- package/ts/classes.resourcecoordinator.ts +436 -0
- package/ts/classes.sessionintelligencereader.ts +52 -0
- package/ts/classes.systemmetricssampler.ts +215 -0
- package/ts/classes.terminalmanager.ts +1207 -0
- package/ts/classes.terminalresourcehost.ts +122 -0
- package/ts/classes.upgradecoordinator.ts +2675 -0
- package/ts/classes.upgradetransaction.ts +2900 -0
- package/ts/classes.uploadmanager.ts +240 -0
- package/ts/classes.validation.ts +1409 -0
- package/ts/flexharness.child.ts +35 -0
- package/ts/functions.canonicaldirectory.ts +213 -0
- package/ts/functions.controllerdataroot.ts +107 -0
- package/ts/functions.embeddeddb.ts +22 -0
- package/ts/functions.flexcredentialstore.ts +128 -0
- package/ts/functions.opencodeauth.ts +34 -0
- package/ts/functions.runtimeenvironment.ts +90 -0
- package/ts/functions.upgradefollower.ts +115 -0
- package/ts/index.ts +36 -6
- package/ts/interfaces.auth.ts +316 -0
- package/ts/interfaces.config.ts +37 -0
- package/ts/interfaces.flexipc.ts +2586 -0
- package/ts/interfaces.gitreversion.ts +336 -0
- package/ts/interfaces.lifecycle.ts +46 -0
- package/ts/interfaces.opencode.ts +153 -0
- package/ts/interfaces.projects.ts +182 -0
- package/ts/plugins.ts +64 -0
- package/ts_interfaces/index.ts +2 -0
- package/ts_interfaces/interfaces.ts +827 -0
- package/ts_interfaces/plugins.ts +15 -0
- package/ts_interfaces/requests.ts +1186 -0
- package/ts_migration/classes.documentmigrationrunner.ts +32 -0
- package/ts_migration/classes.flexmigrationrunner.ts +33 -0
- package/ts_migration/classes.flexpostharnessmigrationrunner.ts +22 -0
- package/ts_migration/classes.migrationrunner.ts +40 -0
- package/ts_migration/index.ts +12 -0
- package/ts_migration/v10_flexharnessv3migration.ts +35 -0
- package/ts_migration/v13_flexprojectionorder.ts +33 -0
- package/ts_migration/v16_flexprovidercredentials.ts +196 -0
- package/ts_migration/v18_resourcelayout.ts +55 -0
- package/ts_migration/v18_resourcelayoutmigration.ts +68 -0
- package/ts_migration/v19_flexprojectmanagement.ts +28 -0
- package/ts_migration/v1_embeddeddatabaselocation.ts +560 -0
- package/ts_migration/v22_projectfilesystemidentitymigration.ts +121 -0
- package/ts_migration/v2_controllerdataroot.ts +2349 -0
- package/ts_migration/v6_protocoldocumentmigration.ts +144 -0
- package/ts_migration/v6_protocoldocuments.ts +198 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/classes.controllersocketclient.ts +517 -0
- package/ts_web/classes.sessiondraftsync.ts +390 -0
- package/ts_web/elements.harnesscontrollerapp.ts +11494 -0
- package/ts_web/index.ts +2 -0
- package/ts_web/plugins.ts +31 -0
- package/.gitlab-ci.yml +0 -71
- package/.npmignore +0 -5
- package/README.md +0 -40
- package/dist/cli.js +0 -2
- package/dist/index.d.ts +0 -0
- package/dist/index.js +0 -9
- package/dist/mod_bundle/index.d.ts +0 -1
- package/dist/mod_bundle/index.js +0 -18
- package/dist/mod_bundle/mod.plugins.d.ts +0 -4
- package/dist/mod_bundle/mod.plugins.js +0 -11
- package/dist/mod_install/index.d.ts +0 -4
- package/dist/mod_install/index.js +0 -21
- package/dist/mod_install/mod.plugins.d.ts +0 -1
- package/dist/mod_install/mod.plugins.js +0 -7
- package/dist/mod_standard/index.d.ts +0 -4
- package/dist/mod_standard/index.js +0 -21
- package/dist/mod_standard/mod.browser.d.ts +0 -6
- package/dist/mod_standard/mod.browser.js +0 -14
- package/dist/mod_standard/mod.clean.d.ts +0 -4
- package/dist/mod_standard/mod.clean.js +0 -12
- package/dist/mod_standard/mod.compile.d.ts +0 -4
- package/dist/mod_standard/mod.compile.js +0 -21
- package/dist/mod_standard/mod.plugins.d.ts +0 -8
- package/dist/mod_standard/mod.plugins.js +0 -19
- package/dist/mod_standard/mod.test.d.ts +0 -4
- package/dist/mod_standard/mod.test.js +0 -12
- package/dist/plr.cli.d.ts +0 -3
- package/dist/plr.cli.js +0 -57
- package/dist/plr.config.d.ts +0 -11
- package/dist/plr.config.js +0 -26
- package/dist/plr.mods.d.ts +0 -17
- package/dist/plr.mods.js +0 -17
- package/dist/plr.paths.d.ts +0 -19
- package/dist/plr.paths.js +0 -26
- package/dist/plr.plugins.d.ts +0 -8
- package/dist/plr.plugins.js +0 -16
- package/npmextra.json +0 -10
- package/ts/mod_bundle/index.ts +0 -20
- package/ts/mod_bundle/mod.plugins.ts +0 -9
- package/ts/mod_install/index.ts +0 -20
- package/ts/mod_install/mod.plugins.ts +0 -1
- package/ts/mod_standard/index.ts +0 -23
- package/ts/mod_standard/mod.browser.ts +0 -17
- package/ts/mod_standard/mod.clean.ts +0 -13
- package/ts/mod_standard/mod.compile.ts +0 -23
- package/ts/mod_standard/mod.plugins.ts +0 -17
- package/ts/mod_standard/mod.test.ts +0 -13
- package/ts/plr.cli.ts +0 -60
- package/ts/plr.config.ts +0 -36
- package/ts/plr.mods.ts +0 -25
- package/ts/plr.paths.ts +0 -29
- package/ts/plr.plugins.ts +0 -17
- package/tslint.json +0 -3
- package/yarn.lock +0 -3464
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { EmbeddedDatabaseMigrationRunner, } from '../dist_ts_migration/classes.migrationrunner.js';
|
|
3
|
+
import { embeddedDatabaseSocketPath, isSocketListening, } from './functions.embeddeddb.js';
|
|
4
|
+
export { embeddedDatabaseSocketPath } from './functions.embeddeddb.js';
|
|
5
|
+
const lstatDirectory = async (directoryArg) => {
|
|
6
|
+
try {
|
|
7
|
+
const stats = await plugins.fs.promises.lstat(directoryArg);
|
|
8
|
+
if (!stats.isDirectory()) {
|
|
9
|
+
throw new Error(`Controller database path must be a real directory: ${directoryArg}`);
|
|
10
|
+
}
|
|
11
|
+
return stats;
|
|
12
|
+
}
|
|
13
|
+
catch (errorArg) {
|
|
14
|
+
if (errorArg.code === 'ENOENT')
|
|
15
|
+
return undefined;
|
|
16
|
+
throw errorArg;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* The controller's embedded database engine: a @push.rocks/smartdb
|
|
21
|
+
* LocalSmartDb over a unix socket inside the data directory. The socket
|
|
22
|
+
* path is deterministic so a second controller process (e.g. the
|
|
23
|
+
* temp-password CLI) attaches to the running daemon's engine instead of
|
|
24
|
+
* opening the storage files a second time; only the process that booted
|
|
25
|
+
* the engine stops it.
|
|
26
|
+
*/
|
|
27
|
+
export class EmbeddedControllerDatabase {
|
|
28
|
+
options;
|
|
29
|
+
localDb;
|
|
30
|
+
connectionUri;
|
|
31
|
+
startPromise;
|
|
32
|
+
migrationRunner;
|
|
33
|
+
constructor(options) {
|
|
34
|
+
this.options = options;
|
|
35
|
+
}
|
|
36
|
+
get socketPath() {
|
|
37
|
+
// Unix socket paths are capped near 108 bytes (SUN_LEN), so the socket
|
|
38
|
+
// lives in tmpdir under a short name derived from the data directory —
|
|
39
|
+
// deterministic, so a second controller process attaches to the same
|
|
40
|
+
// engine, and independent of how deep the data directory is nested.
|
|
41
|
+
return embeddedDatabaseSocketPath(this.options.dataDirectory);
|
|
42
|
+
}
|
|
43
|
+
get ownsEngine() {
|
|
44
|
+
return this.localDb !== undefined;
|
|
45
|
+
}
|
|
46
|
+
/** Starts (or attaches to) the engine and returns the smartdata-ready URI. */
|
|
47
|
+
async start() {
|
|
48
|
+
if (this.connectionUri)
|
|
49
|
+
return this.connectionUri;
|
|
50
|
+
if (this.startPromise)
|
|
51
|
+
return this.startPromise;
|
|
52
|
+
const startPromise = this.startOnce();
|
|
53
|
+
this.startPromise = startPromise;
|
|
54
|
+
try {
|
|
55
|
+
return await startPromise;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
if (this.startPromise === startPromise)
|
|
59
|
+
this.startPromise = undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async startOnce() {
|
|
63
|
+
if (this.localDb || this.migrationRunner?.hasOwnedResources) {
|
|
64
|
+
throw new Error('Embedded database startup cleanup must complete before retrying.');
|
|
65
|
+
}
|
|
66
|
+
if (this.options.legacyDataDirectory) {
|
|
67
|
+
const migrationRunner = new EmbeddedDatabaseMigrationRunner({
|
|
68
|
+
sourceDirectory: this.options.legacyDataDirectory,
|
|
69
|
+
destinationDirectory: this.options.dataDirectory,
|
|
70
|
+
sourceSocketPath: embeddedDatabaseSocketPath(this.options.legacyDataDirectory),
|
|
71
|
+
destinationSocketPath: this.socketPath,
|
|
72
|
+
});
|
|
73
|
+
this.migrationRunner = migrationRunner;
|
|
74
|
+
try {
|
|
75
|
+
const result = await migrationRunner.run();
|
|
76
|
+
if (result) {
|
|
77
|
+
this.localDb = result.localDb;
|
|
78
|
+
this.connectionUri = result.connectionUri;
|
|
79
|
+
return result.connectionUri;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
if (!migrationRunner.hasOwnedResources && this.migrationRunner === migrationRunner) {
|
|
84
|
+
this.migrationRunner = undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
await plugins.fs.promises.mkdir(this.options.dataDirectory, {
|
|
89
|
+
recursive: true,
|
|
90
|
+
mode: 0o700,
|
|
91
|
+
});
|
|
92
|
+
await lstatDirectory(this.options.dataDirectory);
|
|
93
|
+
const socketUri = `mongodb://${encodeURIComponent(this.socketPath)}/?directConnection=true`;
|
|
94
|
+
if (await this.isSocketListening()) {
|
|
95
|
+
this.connectionUri = socketUri;
|
|
96
|
+
return socketUri;
|
|
97
|
+
}
|
|
98
|
+
const localDb = new plugins.smartdb.LocalSmartDb({
|
|
99
|
+
folderPath: this.options.dataDirectory,
|
|
100
|
+
socketPath: this.socketPath,
|
|
101
|
+
});
|
|
102
|
+
this.localDb = localDb;
|
|
103
|
+
try {
|
|
104
|
+
await localDb.start();
|
|
105
|
+
}
|
|
106
|
+
catch (errorArg) {
|
|
107
|
+
try {
|
|
108
|
+
await localDb.stop();
|
|
109
|
+
if (this.localDb === localDb)
|
|
110
|
+
this.localDb = undefined;
|
|
111
|
+
}
|
|
112
|
+
catch (cleanupErrorArg) {
|
|
113
|
+
throw new AggregateError([errorArg, cleanupErrorArg], 'Embedded database startup failed and cleanup was incomplete.', { cause: errorArg });
|
|
114
|
+
}
|
|
115
|
+
throw errorArg;
|
|
116
|
+
}
|
|
117
|
+
this.connectionUri = socketUri;
|
|
118
|
+
return socketUri;
|
|
119
|
+
}
|
|
120
|
+
async stop() {
|
|
121
|
+
if (this.startPromise) {
|
|
122
|
+
await this.startPromise.catch(() => undefined);
|
|
123
|
+
}
|
|
124
|
+
const localDb = this.localDb;
|
|
125
|
+
const migrationRunner = this.migrationRunner;
|
|
126
|
+
const errors = [];
|
|
127
|
+
if (localDb) {
|
|
128
|
+
try {
|
|
129
|
+
await localDb.stop();
|
|
130
|
+
if (this.localDb === localDb)
|
|
131
|
+
this.localDb = undefined;
|
|
132
|
+
}
|
|
133
|
+
catch (errorArg) {
|
|
134
|
+
errors.push(errorArg);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (migrationRunner) {
|
|
138
|
+
try {
|
|
139
|
+
await migrationRunner.stop();
|
|
140
|
+
if (this.migrationRunner === migrationRunner)
|
|
141
|
+
this.migrationRunner = undefined;
|
|
142
|
+
}
|
|
143
|
+
catch (errorArg) {
|
|
144
|
+
errors.push(errorArg);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (errors.length === 0)
|
|
148
|
+
this.connectionUri = undefined;
|
|
149
|
+
if (errors.length === 1)
|
|
150
|
+
throw errors[0];
|
|
151
|
+
if (errors.length > 1) {
|
|
152
|
+
throw new AggregateError(errors, 'Embedded database shutdown was incomplete.');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
isSocketListening() {
|
|
156
|
+
return isSocketListening(this.socketPath);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lbWJlZGRlZGRiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xhc3Nlcy5lbWJlZGRlZGRiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCwrQkFBK0IsR0FDaEMsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLGlCQUFpQixHQUNsQixNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBU3ZFLE1BQU0sY0FBYyxHQUFHLEtBQUssRUFBRSxZQUFvQixFQUF5QyxFQUFFO0lBQzNGLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFBQyxPQUFPLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLElBQUssUUFBa0MsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzVFLE1BQU0sUUFBUSxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLDBCQUEwQjtJQU1SO0lBTHJCLE9BQU8sQ0FBZ0M7SUFDdkMsYUFBYSxDQUFVO0lBQ3ZCLFlBQVksQ0FBbUI7SUFDL0IsZUFBZSxDQUFtQztJQUUxRCxZQUE2QixPQUEyQztRQUEzQyxZQUFPLEdBQVAsT0FBTyxDQUFvQztJQUFHLENBQUM7SUFFNUUsSUFB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
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export interface IFlexFramedTransportOptions<TIncoming, TOutgoing> {
|
|
3
|
+
readable: plugins.stream.Readable;
|
|
4
|
+
writable: plugins.stream.Writable;
|
|
5
|
+
parseIncoming: (valueArg: unknown) => TIncoming;
|
|
6
|
+
validateOutgoing?: (valueArg: unknown) => TOutgoing;
|
|
7
|
+
maximumFrameBytes?: number;
|
|
8
|
+
}
|
|
9
|
+
type TMessageListener<TMessage> = (messageArg: TMessage) => void;
|
|
10
|
+
type TErrorListener = (errorArg: Error) => void;
|
|
11
|
+
type TCloseListener = () => void;
|
|
12
|
+
export declare const flexIpcMaximumQueuedFrames = 128;
|
|
13
|
+
export declare const flexIpcMaximumQueuedFrameBytes: number;
|
|
14
|
+
export declare const encodeFlexFrame: (valueArg: unknown, maximumFrameBytesArg?: number) => Buffer;
|
|
15
|
+
/**
|
|
16
|
+
* A single-reader/single-writer JSON transport. The body buffer is allocated
|
|
17
|
+
* only after the fixed header has passed the configured length limit.
|
|
18
|
+
*/
|
|
19
|
+
export declare class FlexFramedTransport<TIncoming, TOutgoing> {
|
|
20
|
+
private readonly readable;
|
|
21
|
+
private readonly writable;
|
|
22
|
+
private readonly parseIncoming;
|
|
23
|
+
private readonly validateOutgoing?;
|
|
24
|
+
private readonly maximumFrameBytes;
|
|
25
|
+
private readonly header;
|
|
26
|
+
private headerOffset;
|
|
27
|
+
private body?;
|
|
28
|
+
private bodyOffset;
|
|
29
|
+
private messageListeners;
|
|
30
|
+
private errorListeners;
|
|
31
|
+
private closeListeners;
|
|
32
|
+
private writeTail;
|
|
33
|
+
private queuedFrames;
|
|
34
|
+
private queuedFrameBytes;
|
|
35
|
+
private failed;
|
|
36
|
+
private closed;
|
|
37
|
+
private closePromise?;
|
|
38
|
+
constructor(optionsArg: IFlexFramedTransportOptions<TIncoming, TOutgoing>);
|
|
39
|
+
onMessage(listenerArg: TMessageListener<TIncoming>): () => void;
|
|
40
|
+
onError(listenerArg: TErrorListener): () => void;
|
|
41
|
+
onClose(listenerArg: TCloseListener): () => void;
|
|
42
|
+
send(messageArg: TOutgoing): Promise<void>;
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
private closeTransport;
|
|
45
|
+
private readonly onData;
|
|
46
|
+
private finishBody;
|
|
47
|
+
private writeFrame;
|
|
48
|
+
private readonly onReadError;
|
|
49
|
+
private readonly onWriteError;
|
|
50
|
+
private readonly onReadableClosed;
|
|
51
|
+
private readonly onWritableClosed;
|
|
52
|
+
private fail;
|
|
53
|
+
private detachStreams;
|
|
54
|
+
private emitClose;
|
|
55
|
+
}
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { flexIpcMaximumFrameBytes } from './interfaces.flexipc.js';
|
|
3
|
+
export const flexIpcMaximumQueuedFrames = 128;
|
|
4
|
+
export const flexIpcMaximumQueuedFrameBytes = 64 * 1024 * 1024;
|
|
5
|
+
const flexIpcCloseDrainTimeoutMs = 2_000;
|
|
6
|
+
const normalizeMaximumFrameBytes = (valueArg) => {
|
|
7
|
+
const selected = valueArg ?? flexIpcMaximumFrameBytes;
|
|
8
|
+
if (!Number.isSafeInteger(selected) || selected < 1 || selected > flexIpcMaximumFrameBytes) {
|
|
9
|
+
throw new Error(`maximumFrameBytes must be between 1 and ${flexIpcMaximumFrameBytes}.`);
|
|
10
|
+
}
|
|
11
|
+
return selected;
|
|
12
|
+
};
|
|
13
|
+
export const encodeFlexFrame = (valueArg, maximumFrameBytesArg = flexIpcMaximumFrameBytes) => {
|
|
14
|
+
const serialized = Buffer.from(JSON.stringify(valueArg), 'utf8');
|
|
15
|
+
try {
|
|
16
|
+
if (serialized.byteLength > maximumFrameBytesArg) {
|
|
17
|
+
throw new Error('Flex IPC frame exceeds its size limit.');
|
|
18
|
+
}
|
|
19
|
+
const frame = Buffer.allocUnsafe(4 + serialized.byteLength);
|
|
20
|
+
frame.writeUInt32BE(serialized.byteLength, 0);
|
|
21
|
+
serialized.copy(frame, 4);
|
|
22
|
+
return frame;
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
serialized.fill(0);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* A single-reader/single-writer JSON transport. The body buffer is allocated
|
|
30
|
+
* only after the fixed header has passed the configured length limit.
|
|
31
|
+
*/
|
|
32
|
+
export class FlexFramedTransport {
|
|
33
|
+
readable;
|
|
34
|
+
writable;
|
|
35
|
+
parseIncoming;
|
|
36
|
+
validateOutgoing;
|
|
37
|
+
maximumFrameBytes;
|
|
38
|
+
header = Buffer.allocUnsafe(4);
|
|
39
|
+
headerOffset = 0;
|
|
40
|
+
body;
|
|
41
|
+
bodyOffset = 0;
|
|
42
|
+
messageListeners = new Set();
|
|
43
|
+
errorListeners = new Set();
|
|
44
|
+
closeListeners = new Set();
|
|
45
|
+
writeTail = Promise.resolve();
|
|
46
|
+
queuedFrames = 0;
|
|
47
|
+
queuedFrameBytes = 0;
|
|
48
|
+
failed = false;
|
|
49
|
+
closed = false;
|
|
50
|
+
closePromise;
|
|
51
|
+
constructor(optionsArg) {
|
|
52
|
+
this.readable = optionsArg.readable;
|
|
53
|
+
this.writable = optionsArg.writable;
|
|
54
|
+
this.parseIncoming = optionsArg.parseIncoming;
|
|
55
|
+
this.validateOutgoing = optionsArg.validateOutgoing;
|
|
56
|
+
this.maximumFrameBytes = normalizeMaximumFrameBytes(optionsArg.maximumFrameBytes);
|
|
57
|
+
this.readable.on('data', this.onData);
|
|
58
|
+
this.readable.once('error', this.onReadError);
|
|
59
|
+
this.readable.once('end', this.onReadableClosed);
|
|
60
|
+
this.readable.once('close', this.onReadableClosed);
|
|
61
|
+
this.writable.once('error', this.onWriteError);
|
|
62
|
+
this.writable.once('finish', this.onWritableClosed);
|
|
63
|
+
this.writable.once('close', this.onWritableClosed);
|
|
64
|
+
}
|
|
65
|
+
onMessage(listenerArg) {
|
|
66
|
+
this.messageListeners.add(listenerArg);
|
|
67
|
+
return () => this.messageListeners.delete(listenerArg);
|
|
68
|
+
}
|
|
69
|
+
onError(listenerArg) {
|
|
70
|
+
this.errorListeners.add(listenerArg);
|
|
71
|
+
return () => this.errorListeners.delete(listenerArg);
|
|
72
|
+
}
|
|
73
|
+
onClose(listenerArg) {
|
|
74
|
+
this.closeListeners.add(listenerArg);
|
|
75
|
+
return () => this.closeListeners.delete(listenerArg);
|
|
76
|
+
}
|
|
77
|
+
async send(messageArg) {
|
|
78
|
+
if (this.closed || this.failed)
|
|
79
|
+
throw new Error('Flex IPC transport is closed.');
|
|
80
|
+
this.validateOutgoing?.(messageArg);
|
|
81
|
+
const frame = encodeFlexFrame(messageArg, this.maximumFrameBytes);
|
|
82
|
+
if (this.queuedFrames >= flexIpcMaximumQueuedFrames
|
|
83
|
+
|| this.queuedFrameBytes + frame.byteLength > flexIpcMaximumQueuedFrameBytes)
|
|
84
|
+
throw new Error('Flex IPC outbound queue limit exceeded.');
|
|
85
|
+
this.queuedFrames++;
|
|
86
|
+
this.queuedFrameBytes += frame.byteLength;
|
|
87
|
+
const write = this.writeTail.then(() => this.writeFrame(frame));
|
|
88
|
+
this.writeTail = write.catch(() => undefined);
|
|
89
|
+
try {
|
|
90
|
+
await write;
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
this.queuedFrames--;
|
|
94
|
+
this.queuedFrameBytes -= frame.byteLength;
|
|
95
|
+
frame.fill(0);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
close() {
|
|
99
|
+
if (this.closePromise)
|
|
100
|
+
return this.closePromise;
|
|
101
|
+
if (this.closed)
|
|
102
|
+
return Promise.resolve();
|
|
103
|
+
this.closePromise = this.closeTransport();
|
|
104
|
+
return this.closePromise;
|
|
105
|
+
}
|
|
106
|
+
async closeTransport() {
|
|
107
|
+
this.closed = true;
|
|
108
|
+
this.detachStreams();
|
|
109
|
+
let drainTimer;
|
|
110
|
+
const drainTimeout = new Promise((resolve) => {
|
|
111
|
+
drainTimer = setTimeout(() => resolve('timeout'), flexIpcCloseDrainTimeoutMs);
|
|
112
|
+
drainTimer.unref?.();
|
|
113
|
+
});
|
|
114
|
+
const gracefulClose = this.writeTail.then(async () => {
|
|
115
|
+
if (!this.writable.destroyed && !this.writable.writableEnded) {
|
|
116
|
+
await new Promise((resolve) => {
|
|
117
|
+
this.writable.end(resolve);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return 'drained';
|
|
121
|
+
});
|
|
122
|
+
const drainResult = await Promise.race([
|
|
123
|
+
gracefulClose,
|
|
124
|
+
drainTimeout,
|
|
125
|
+
]);
|
|
126
|
+
if (drainTimer)
|
|
127
|
+
clearTimeout(drainTimer);
|
|
128
|
+
if (drainResult === 'timeout') {
|
|
129
|
+
if (!this.writable.destroyed)
|
|
130
|
+
this.writable.destroy();
|
|
131
|
+
if (!this.readable.destroyed)
|
|
132
|
+
this.readable.destroy();
|
|
133
|
+
this.emitClose();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (!this.readable.destroyed)
|
|
137
|
+
this.readable.destroy();
|
|
138
|
+
this.emitClose();
|
|
139
|
+
}
|
|
140
|
+
onData = (chunkArg) => {
|
|
141
|
+
if (this.closed || this.failed)
|
|
142
|
+
return;
|
|
143
|
+
const chunk = typeof chunkArg === 'string'
|
|
144
|
+
? Buffer.from(chunkArg, 'utf8')
|
|
145
|
+
: chunkArg instanceof Uint8Array
|
|
146
|
+
? Buffer.from(chunkArg.buffer, chunkArg.byteOffset, chunkArg.byteLength)
|
|
147
|
+
: undefined;
|
|
148
|
+
if (!chunk) {
|
|
149
|
+
this.fail(new Error('Flex IPC received a non-byte chunk.'));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
let chunkOffset = 0;
|
|
153
|
+
try {
|
|
154
|
+
while (chunkOffset < chunk.byteLength) {
|
|
155
|
+
if (!this.body) {
|
|
156
|
+
const headerBytes = Math.min(4 - this.headerOffset, chunk.byteLength - chunkOffset);
|
|
157
|
+
chunk.copy(this.header, this.headerOffset, chunkOffset, chunkOffset + headerBytes);
|
|
158
|
+
this.headerOffset += headerBytes;
|
|
159
|
+
chunkOffset += headerBytes;
|
|
160
|
+
if (this.headerOffset < 4)
|
|
161
|
+
continue;
|
|
162
|
+
const bodyLength = this.header.readUInt32BE(0);
|
|
163
|
+
if (bodyLength > this.maximumFrameBytes) {
|
|
164
|
+
throw new Error('Flex IPC frame exceeds its size limit.');
|
|
165
|
+
}
|
|
166
|
+
this.body = Buffer.allocUnsafe(bodyLength);
|
|
167
|
+
this.bodyOffset = 0;
|
|
168
|
+
if (bodyLength === 0)
|
|
169
|
+
this.finishBody();
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const bodyBytes = Math.min(this.body.byteLength - this.bodyOffset, chunk.byteLength - chunkOffset);
|
|
173
|
+
chunk.copy(this.body, this.bodyOffset, chunkOffset, chunkOffset + bodyBytes);
|
|
174
|
+
this.bodyOffset += bodyBytes;
|
|
175
|
+
chunkOffset += bodyBytes;
|
|
176
|
+
if (this.bodyOffset === this.body.byteLength)
|
|
177
|
+
this.finishBody();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (errorArg) {
|
|
181
|
+
this.fail(errorArg instanceof Error ? errorArg : new Error('Flex IPC framing failed.'));
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
finishBody() {
|
|
185
|
+
const completedBody = this.body;
|
|
186
|
+
this.body = undefined;
|
|
187
|
+
this.bodyOffset = 0;
|
|
188
|
+
this.headerOffset = 0;
|
|
189
|
+
if (!completedBody)
|
|
190
|
+
throw new Error('Flex IPC body state was lost.');
|
|
191
|
+
let parsed;
|
|
192
|
+
try {
|
|
193
|
+
parsed = JSON.parse(completedBody.toString('utf8'));
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
throw new Error('Flex IPC frame contains invalid JSON.');
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
completedBody.fill(0);
|
|
200
|
+
}
|
|
201
|
+
const message = this.parseIncoming(parsed);
|
|
202
|
+
for (const listener of [...this.messageListeners])
|
|
203
|
+
listener(message);
|
|
204
|
+
}
|
|
205
|
+
writeFrame(frameArg) {
|
|
206
|
+
if (this.closed || this.failed || this.writable.destroyed || this.writable.writableEnded) {
|
|
207
|
+
throw new Error('Flex IPC transport is closed.');
|
|
208
|
+
}
|
|
209
|
+
return new Promise((resolve, reject) => {
|
|
210
|
+
this.writable.write(frameArg, (errorArg) => {
|
|
211
|
+
if (errorArg)
|
|
212
|
+
reject(errorArg);
|
|
213
|
+
else
|
|
214
|
+
resolve();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
onReadError = (errorArg) => this.fail(errorArg);
|
|
219
|
+
onWriteError = (errorArg) => this.fail(errorArg);
|
|
220
|
+
onReadableClosed = () => {
|
|
221
|
+
if (this.closed)
|
|
222
|
+
return;
|
|
223
|
+
if (this.headerOffset !== 0 || this.body) {
|
|
224
|
+
this.fail(new Error('Flex IPC stream ended within a frame.'));
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
this.closed = true;
|
|
228
|
+
this.detachStreams();
|
|
229
|
+
if (!this.readable.destroyed)
|
|
230
|
+
this.readable.destroy();
|
|
231
|
+
if (!this.writable.destroyed)
|
|
232
|
+
this.writable.destroy();
|
|
233
|
+
this.emitClose();
|
|
234
|
+
};
|
|
235
|
+
onWritableClosed = () => {
|
|
236
|
+
if (this.closed)
|
|
237
|
+
return;
|
|
238
|
+
this.closed = true;
|
|
239
|
+
this.detachStreams();
|
|
240
|
+
if (!this.readable.destroyed)
|
|
241
|
+
this.readable.destroy();
|
|
242
|
+
if (!this.writable.destroyed)
|
|
243
|
+
this.writable.destroy();
|
|
244
|
+
this.emitClose();
|
|
245
|
+
};
|
|
246
|
+
fail(errorArg) {
|
|
247
|
+
if (this.failed || this.closed)
|
|
248
|
+
return;
|
|
249
|
+
this.failed = true;
|
|
250
|
+
this.detachStreams();
|
|
251
|
+
if (!this.readable.destroyed)
|
|
252
|
+
this.readable.destroy();
|
|
253
|
+
if (!this.writable.destroyed)
|
|
254
|
+
this.writable.destroy();
|
|
255
|
+
for (const listener of [...this.errorListeners])
|
|
256
|
+
listener(errorArg);
|
|
257
|
+
this.emitClose();
|
|
258
|
+
}
|
|
259
|
+
detachStreams() {
|
|
260
|
+
this.readable.removeListener('data', this.onData);
|
|
261
|
+
this.readable.removeListener('error', this.onReadError);
|
|
262
|
+
this.readable.removeListener('end', this.onReadableClosed);
|
|
263
|
+
this.readable.removeListener('close', this.onReadableClosed);
|
|
264
|
+
this.writable.removeListener('error', this.onWriteError);
|
|
265
|
+
this.writable.removeListener('finish', this.onWritableClosed);
|
|
266
|
+
this.writable.removeListener('close', this.onWritableClosed);
|
|
267
|
+
}
|
|
268
|
+
emitClose() {
|
|
269
|
+
const listeners = [...this.closeListeners];
|
|
270
|
+
this.closeListeners.clear();
|
|
271
|
+
for (const listener of listeners)
|
|
272
|
+
listener();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4ZnJhbWVkdHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xhc3Nlcy5mbGV4ZnJhbWVkdHJhbnNwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBY25FLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEdBQUcsQ0FBQztBQUM5QyxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMvRCxNQUFNLDBCQUEwQixHQUFHLEtBQUssQ0FBQztBQUV6QyxNQUFNLDBCQUEwQixHQUFHLENBQUMsUUFBNEIsRUFBVSxFQUFFO0lBQzFFLE1BQU0sUUFBUSxHQUFHLFFBQVEsSUFBSSx3QkFBd0IsQ0FBQztJQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxJQUFJLFFBQVEsR0FBRyx3QkFBd0IsRUFBRSxDQUFDO1FBQzNGLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLHdCQUF3QixHQUFHLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQzdCLFFBQWlCLEVBQ2pCLG9CQUFvQixHQUFHLHdCQUF3QixFQUN2QyxFQUFFO0lBQ1YsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pFLElBQUksQ0FBQztRQUNILElBQUksVUFBVSxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxL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
|