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.
Files changed (277) hide show
  1. package/.smartconfig.json +55 -0
  2. package/changelog.md +1026 -0
  3. package/cli.js +14 -0
  4. package/dist_serve/bundle.js +44778 -0
  5. package/dist_serve/index.html +13 -0
  6. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  7. package/dist_ts/00_commitinfo_data.js +9 -0
  8. package/dist_ts/classes.authmodels.d.ts +126 -0
  9. package/dist_ts/classes.authmodels.js +1422 -0
  10. package/dist_ts/classes.authstore.d.ts +160 -0
  11. package/dist_ts/classes.authstore.js +2483 -0
  12. package/dist_ts/classes.browserresourcehost.d.ts +85 -0
  13. package/dist_ts/classes.browserresourcehost.js +912 -0
  14. package/dist_ts/classes.cli.d.ts +21 -0
  15. package/dist_ts/classes.cli.js +1082 -0
  16. package/dist_ts/classes.config.d.ts +23 -0
  17. package/dist_ts/classes.config.js +267 -0
  18. package/dist_ts/classes.controller.d.ts +523 -0
  19. package/dist_ts/classes.controller.js +10611 -0
  20. package/dist_ts/classes.controllermanagement.d.ts +32 -0
  21. package/dist_ts/classes.controllermanagement.js +222 -0
  22. package/dist_ts/classes.draftmanager.d.ts +30 -0
  23. package/dist_ts/classes.draftmanager.js +179 -0
  24. package/dist_ts/classes.embeddeddb.d.ts +30 -0
  25. package/dist_ts/classes.embeddeddb.js +159 -0
  26. package/dist_ts/classes.flexframedtransport.d.ts +56 -0
  27. package/dist_ts/classes.flexframedtransport.js +275 -0
  28. package/dist_ts/classes.flexmodels.private.d.ts +231 -0
  29. package/dist_ts/classes.flexmodels.private.js +985 -0
  30. package/dist_ts/classes.flexmodels.public.d.ts +207 -0
  31. package/dist_ts/classes.flexmodels.public.js +885 -0
  32. package/dist_ts/classes.flexprojectionreader.d.ts +89 -0
  33. package/dist_ts/classes.flexprojectionreader.js +580 -0
  34. package/dist_ts/classes.flexservice.d.ts +196 -0
  35. package/dist_ts/classes.flexservice.js +3704 -0
  36. package/dist_ts/classes.flexstore.d.ts +174 -0
  37. package/dist_ts/classes.flexstore.js +3400 -0
  38. package/dist_ts/classes.flexsupervisor.d.ts +105 -0
  39. package/dist_ts/classes.flexsupervisor.js +1191 -0
  40. package/dist_ts/classes.gitreversion.d.ts +431 -0
  41. package/dist_ts/classes.gitreversion.js +10592 -0
  42. package/dist_ts/classes.harnessoperationmanager.d.ts +113 -0
  43. package/dist_ts/classes.harnessoperationmanager.js +602 -0
  44. package/dist_ts/classes.opencodeclient.d.ts +146 -0
  45. package/dist_ts/classes.opencodeclient.js +3003 -0
  46. package/dist_ts/classes.opencodesupervisor.d.ts +60 -0
  47. package/dist_ts/classes.opencodesupervisor.js +1003 -0
  48. package/dist_ts/classes.passkeymanager.d.ts +34 -0
  49. package/dist_ts/classes.passkeymanager.js +456 -0
  50. package/dist_ts/classes.processinspection.d.ts +50 -0
  51. package/dist_ts/classes.processinspection.js +484 -0
  52. package/dist_ts/classes.resourcecoordinator.d.ts +64 -0
  53. package/dist_ts/classes.resourcecoordinator.js +294 -0
  54. package/dist_ts/classes.sessionintelligencereader.d.ts +13 -0
  55. package/dist_ts/classes.sessionintelligencereader.js +40 -0
  56. package/dist_ts/classes.systemmetricssampler.d.ts +53 -0
  57. package/dist_ts/classes.systemmetricssampler.js +168 -0
  58. package/dist_ts/classes.terminalmanager.d.ts +95 -0
  59. package/dist_ts/classes.terminalmanager.js +981 -0
  60. package/dist_ts/classes.terminalresourcehost.d.ts +20 -0
  61. package/dist_ts/classes.terminalresourcehost.js +84 -0
  62. package/dist_ts/classes.upgradecoordinator.d.ts +244 -0
  63. package/dist_ts/classes.upgradecoordinator.js +2155 -0
  64. package/dist_ts/classes.upgradetransaction.d.ts +92 -0
  65. package/dist_ts/classes.upgradetransaction.js +2125 -0
  66. package/dist_ts/classes.uploadmanager.d.ts +24 -0
  67. package/dist_ts/classes.uploadmanager.js +210 -0
  68. package/dist_ts/classes.validation.d.ts +91 -0
  69. package/dist_ts/classes.validation.js +1087 -0
  70. package/dist_ts/flexharness.child.d.ts +1 -0
  71. package/dist_ts/flexharness.child.js +28 -0
  72. package/dist_ts/functions.canonicaldirectory.d.ts +21 -0
  73. package/dist_ts/functions.canonicaldirectory.js +144 -0
  74. package/dist_ts/functions.controllerdataroot.d.ts +15 -0
  75. package/dist_ts/functions.controllerdataroot.js +76 -0
  76. package/dist_ts/functions.embeddeddb.d.ts +2 -0
  77. package/dist_ts/functions.embeddeddb.js +21 -0
  78. package/dist_ts/functions.flexcredentialstore.d.ts +16 -0
  79. package/dist_ts/functions.flexcredentialstore.js +93 -0
  80. package/dist_ts/functions.opencodeauth.d.ts +3 -0
  81. package/dist_ts/functions.opencodeauth.js +31 -0
  82. package/dist_ts/functions.runtimeenvironment.d.ts +2 -0
  83. package/dist_ts/functions.runtimeenvironment.js +79 -0
  84. package/dist_ts/functions.upgradefollower.d.ts +3 -0
  85. package/dist_ts/functions.upgradefollower.js +95 -0
  86. package/dist_ts/index.d.ts +24 -0
  87. package/dist_ts/index.js +25 -0
  88. package/dist_ts/interfaces.auth.d.ts +181 -0
  89. package/dist_ts/interfaces.auth.js +82 -0
  90. package/dist_ts/interfaces.config.d.ts +34 -0
  91. package/dist_ts/interfaces.config.js +2 -0
  92. package/dist_ts/interfaces.flexipc.d.ts +939 -0
  93. package/dist_ts/interfaces.flexipc.js +1492 -0
  94. package/dist_ts/interfaces.gitreversion.d.ts +246 -0
  95. package/dist_ts/interfaces.gitreversion.js +2 -0
  96. package/dist_ts/interfaces.lifecycle.d.ts +37 -0
  97. package/dist_ts/interfaces.lifecycle.js +2 -0
  98. package/dist_ts/interfaces.opencode.d.ts +101 -0
  99. package/dist_ts/interfaces.opencode.js +3 -0
  100. package/dist_ts/interfaces.projects.d.ts +156 -0
  101. package/dist_ts/interfaces.projects.js +5 -0
  102. package/dist_ts/plugins.d.ts +36 -0
  103. package/dist_ts/plugins.js +40 -0
  104. package/dist_ts_interfaces/index.d.ts +2 -0
  105. package/dist_ts_interfaces/index.js +3 -0
  106. package/dist_ts_interfaces/interfaces.d.ts +747 -0
  107. package/dist_ts_interfaces/interfaces.js +47 -0
  108. package/dist_ts_interfaces/plugins.d.ts +4 -0
  109. package/dist_ts_interfaces/plugins.js +3 -0
  110. package/dist_ts_interfaces/requests.d.ts +806 -0
  111. package/dist_ts_interfaces/requests.js +2 -0
  112. package/dist_ts_migration/classes.documentmigrationrunner.d.ts +8 -0
  113. package/dist_ts_migration/classes.documentmigrationrunner.js +24 -0
  114. package/dist_ts_migration/classes.flexmigrationrunner.d.ts +11 -0
  115. package/dist_ts_migration/classes.flexmigrationrunner.js +25 -0
  116. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.d.ts +10 -0
  117. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.js +15 -0
  118. package/dist_ts_migration/classes.migrationrunner.d.ts +8 -0
  119. package/dist_ts_migration/classes.migrationrunner.js +34 -0
  120. package/dist_ts_migration/index.d.ts +12 -0
  121. package/dist_ts_migration/index.js +13 -0
  122. package/dist_ts_migration/v10_flexharnessv3migration.d.ts +11 -0
  123. package/dist_ts_migration/v10_flexharnessv3migration.js +23 -0
  124. package/dist_ts_migration/v13_flexprojectionorder.d.ts +11 -0
  125. package/dist_ts_migration/v13_flexprojectionorder.js +23 -0
  126. package/dist_ts_migration/v16_flexprovidercredentials.d.ts +22 -0
  127. package/dist_ts_migration/v16_flexprovidercredentials.js +149 -0
  128. package/dist_ts_migration/v18_resourcelayout.d.ts +22 -0
  129. package/dist_ts_migration/v18_resourcelayout.js +23 -0
  130. package/dist_ts_migration/v18_resourcelayoutmigration.d.ts +6 -0
  131. package/dist_ts_migration/v18_resourcelayoutmigration.js +61 -0
  132. package/dist_ts_migration/v19_flexprojectmanagement.d.ts +11 -0
  133. package/dist_ts_migration/v19_flexprojectmanagement.js +21 -0
  134. package/dist_ts_migration/v1_embeddeddatabaselocation.d.ts +28 -0
  135. package/dist_ts_migration/v1_embeddeddatabaselocation.js +415 -0
  136. package/dist_ts_migration/v22_projectfilesystemidentitymigration.d.ts +7 -0
  137. package/dist_ts_migration/v22_projectfilesystemidentitymigration.js +105 -0
  138. package/dist_ts_migration/v2_controllerdataroot.d.ts +130 -0
  139. package/dist_ts_migration/v2_controllerdataroot.js +1887 -0
  140. package/dist_ts_migration/v6_protocoldocumentmigration.d.ts +7 -0
  141. package/dist_ts_migration/v6_protocoldocumentmigration.js +100 -0
  142. package/dist_ts_migration/v6_protocoldocuments.d.ts +7 -0
  143. package/dist_ts_migration/v6_protocoldocuments.js +138 -0
  144. package/html/index.html +13 -0
  145. package/{LICENSE → license.md} +2 -2
  146. package/package.json +86 -48
  147. package/readme.md +480 -0
  148. package/readme.plan.md +188 -0
  149. package/ts/00_commitinfo_data.ts +8 -0
  150. package/ts/classes.authmodels.ts +1245 -0
  151. package/ts/classes.authstore.ts +3274 -0
  152. package/ts/classes.browserresourcehost.ts +1205 -0
  153. package/ts/classes.cli.ts +1254 -0
  154. package/ts/classes.config.ts +351 -0
  155. package/ts/classes.controller.ts +14426 -0
  156. package/ts/classes.controllermanagement.ts +330 -0
  157. package/ts/classes.draftmanager.ts +232 -0
  158. package/ts/classes.embeddeddb.ts +166 -0
  159. package/ts/classes.flexframedtransport.ts +283 -0
  160. package/ts/classes.flexmodels.private.ts +823 -0
  161. package/ts/classes.flexmodels.public.ts +732 -0
  162. package/ts/classes.flexprojectionreader.ts +816 -0
  163. package/ts/classes.flexservice.ts +4302 -0
  164. package/ts/classes.flexstore.ts +4565 -0
  165. package/ts/classes.flexsupervisor.ts +1453 -0
  166. package/ts/classes.gitreversion.ts +13353 -0
  167. package/ts/classes.harnessoperationmanager.ts +870 -0
  168. package/ts/classes.opencodeclient.ts +4110 -0
  169. package/ts/classes.opencodesupervisor.ts +1280 -0
  170. package/ts/classes.passkeymanager.ts +570 -0
  171. package/ts/classes.processinspection.ts +623 -0
  172. package/ts/classes.resourcecoordinator.ts +436 -0
  173. package/ts/classes.sessionintelligencereader.ts +52 -0
  174. package/ts/classes.systemmetricssampler.ts +215 -0
  175. package/ts/classes.terminalmanager.ts +1207 -0
  176. package/ts/classes.terminalresourcehost.ts +122 -0
  177. package/ts/classes.upgradecoordinator.ts +2675 -0
  178. package/ts/classes.upgradetransaction.ts +2900 -0
  179. package/ts/classes.uploadmanager.ts +240 -0
  180. package/ts/classes.validation.ts +1409 -0
  181. package/ts/flexharness.child.ts +35 -0
  182. package/ts/functions.canonicaldirectory.ts +213 -0
  183. package/ts/functions.controllerdataroot.ts +107 -0
  184. package/ts/functions.embeddeddb.ts +22 -0
  185. package/ts/functions.flexcredentialstore.ts +128 -0
  186. package/ts/functions.opencodeauth.ts +34 -0
  187. package/ts/functions.runtimeenvironment.ts +90 -0
  188. package/ts/functions.upgradefollower.ts +115 -0
  189. package/ts/index.ts +36 -6
  190. package/ts/interfaces.auth.ts +316 -0
  191. package/ts/interfaces.config.ts +37 -0
  192. package/ts/interfaces.flexipc.ts +2586 -0
  193. package/ts/interfaces.gitreversion.ts +336 -0
  194. package/ts/interfaces.lifecycle.ts +46 -0
  195. package/ts/interfaces.opencode.ts +153 -0
  196. package/ts/interfaces.projects.ts +182 -0
  197. package/ts/plugins.ts +64 -0
  198. package/ts_interfaces/index.ts +2 -0
  199. package/ts_interfaces/interfaces.ts +827 -0
  200. package/ts_interfaces/plugins.ts +15 -0
  201. package/ts_interfaces/requests.ts +1186 -0
  202. package/ts_migration/classes.documentmigrationrunner.ts +32 -0
  203. package/ts_migration/classes.flexmigrationrunner.ts +33 -0
  204. package/ts_migration/classes.flexpostharnessmigrationrunner.ts +22 -0
  205. package/ts_migration/classes.migrationrunner.ts +40 -0
  206. package/ts_migration/index.ts +12 -0
  207. package/ts_migration/v10_flexharnessv3migration.ts +35 -0
  208. package/ts_migration/v13_flexprojectionorder.ts +33 -0
  209. package/ts_migration/v16_flexprovidercredentials.ts +196 -0
  210. package/ts_migration/v18_resourcelayout.ts +55 -0
  211. package/ts_migration/v18_resourcelayoutmigration.ts +68 -0
  212. package/ts_migration/v19_flexprojectmanagement.ts +28 -0
  213. package/ts_migration/v1_embeddeddatabaselocation.ts +560 -0
  214. package/ts_migration/v22_projectfilesystemidentitymigration.ts +121 -0
  215. package/ts_migration/v2_controllerdataroot.ts +2349 -0
  216. package/ts_migration/v6_protocoldocumentmigration.ts +144 -0
  217. package/ts_migration/v6_protocoldocuments.ts +198 -0
  218. package/ts_web/00_commitinfo_data.ts +8 -0
  219. package/ts_web/classes.controllersocketclient.ts +517 -0
  220. package/ts_web/classes.sessiondraftsync.ts +390 -0
  221. package/ts_web/elements.harnesscontrollerapp.ts +11494 -0
  222. package/ts_web/index.ts +2 -0
  223. package/ts_web/plugins.ts +31 -0
  224. package/.gitlab-ci.yml +0 -71
  225. package/.npmignore +0 -5
  226. package/README.md +0 -40
  227. package/dist/cli.js +0 -2
  228. package/dist/index.d.ts +0 -0
  229. package/dist/index.js +0 -9
  230. package/dist/mod_bundle/index.d.ts +0 -1
  231. package/dist/mod_bundle/index.js +0 -18
  232. package/dist/mod_bundle/mod.plugins.d.ts +0 -4
  233. package/dist/mod_bundle/mod.plugins.js +0 -11
  234. package/dist/mod_install/index.d.ts +0 -4
  235. package/dist/mod_install/index.js +0 -21
  236. package/dist/mod_install/mod.plugins.d.ts +0 -1
  237. package/dist/mod_install/mod.plugins.js +0 -7
  238. package/dist/mod_standard/index.d.ts +0 -4
  239. package/dist/mod_standard/index.js +0 -21
  240. package/dist/mod_standard/mod.browser.d.ts +0 -6
  241. package/dist/mod_standard/mod.browser.js +0 -14
  242. package/dist/mod_standard/mod.clean.d.ts +0 -4
  243. package/dist/mod_standard/mod.clean.js +0 -12
  244. package/dist/mod_standard/mod.compile.d.ts +0 -4
  245. package/dist/mod_standard/mod.compile.js +0 -21
  246. package/dist/mod_standard/mod.plugins.d.ts +0 -8
  247. package/dist/mod_standard/mod.plugins.js +0 -19
  248. package/dist/mod_standard/mod.test.d.ts +0 -4
  249. package/dist/mod_standard/mod.test.js +0 -12
  250. package/dist/plr.cli.d.ts +0 -3
  251. package/dist/plr.cli.js +0 -57
  252. package/dist/plr.config.d.ts +0 -11
  253. package/dist/plr.config.js +0 -26
  254. package/dist/plr.mods.d.ts +0 -17
  255. package/dist/plr.mods.js +0 -17
  256. package/dist/plr.paths.d.ts +0 -19
  257. package/dist/plr.paths.js +0 -26
  258. package/dist/plr.plugins.d.ts +0 -8
  259. package/dist/plr.plugins.js +0 -16
  260. package/npmextra.json +0 -10
  261. package/ts/mod_bundle/index.ts +0 -20
  262. package/ts/mod_bundle/mod.plugins.ts +0 -9
  263. package/ts/mod_install/index.ts +0 -20
  264. package/ts/mod_install/mod.plugins.ts +0 -1
  265. package/ts/mod_standard/index.ts +0 -23
  266. package/ts/mod_standard/mod.browser.ts +0 -17
  267. package/ts/mod_standard/mod.clean.ts +0 -13
  268. package/ts/mod_standard/mod.compile.ts +0 -23
  269. package/ts/mod_standard/mod.plugins.ts +0 -17
  270. package/ts/mod_standard/mod.test.ts +0 -13
  271. package/ts/plr.cli.ts +0 -60
  272. package/ts/plr.config.ts +0 -36
  273. package/ts/plr.mods.ts +0 -25
  274. package/ts/plr.paths.ts +0 -29
  275. package/ts/plr.plugins.ts +0 -17
  276. package/tslint.json +0 -3
  277. package/yarn.lock +0 -3464
@@ -0,0 +1,28 @@
1
+ import * as plugins from '../dist_ts/plugins.js';
2
+ export interface IEmbeddedDatabaseLocationMigrationOptions {
3
+ sourceDirectory: string;
4
+ destinationDirectory: string;
5
+ sourceSocketPath: string;
6
+ destinationSocketPath: string;
7
+ }
8
+ export interface IEmbeddedDatabaseLocationMigrationResult {
9
+ localDb: plugins.smartdb.LocalSmartDb;
10
+ connectionUri: string;
11
+ }
12
+ export interface IRebaseCompletedEmbeddedDatabaseLocationMigrationOptions {
13
+ sourceDirectory: string;
14
+ previousDestinationDirectory: string;
15
+ destinationDirectory: string;
16
+ }
17
+ export declare const rebaseCompletedEmbeddedDatabaseLocationMigration: (optionsArg: IRebaseCompletedEmbeddedDatabaseLocationMigrationOptions) => Promise<void>;
18
+ export declare class EmbeddedDatabaseLocationMigration {
19
+ private readonly options;
20
+ private readonly journalPath;
21
+ private sourceDb?;
22
+ private importDestinationDb?;
23
+ private operationalDestinationDb?;
24
+ constructor(options: IEmbeddedDatabaseLocationMigrationOptions);
25
+ get hasOwnedResources(): boolean;
26
+ stop(): Promise<void>;
27
+ run(): Promise<IEmbeddedDatabaseLocationMigrationResult | undefined>;
28
+ }
@@ -0,0 +1,415 @@
1
+ import * as plugins from '../dist_ts/plugins.js';
2
+ import { isSocketListening, } from '../dist_ts/functions.embeddeddb.js';
3
+ const migrationVersion = 1;
4
+ const journalFileName = '.smartdb-location-migration.json';
5
+ const maximumJournalBytes = 16 * 1024;
6
+ const directoryIdentity = async (directoryArg) => {
7
+ try {
8
+ const stats = await plugins.fs.promises.lstat(directoryArg, { bigint: true });
9
+ if (!stats.isDirectory() || stats.isSymbolicLink()) {
10
+ throw new Error(`Controller database path must be a real directory: ${directoryArg}`);
11
+ }
12
+ return {
13
+ device: stats.dev.toString(10),
14
+ inode: stats.ino.toString(10),
15
+ };
16
+ }
17
+ catch (errorArg) {
18
+ if (errorArg.code === 'ENOENT')
19
+ return undefined;
20
+ throw errorArg;
21
+ }
22
+ };
23
+ const identitiesEqual = (leftArg, rightArg) => leftArg.device === rightArg.device && leftArg.inode === rightArg.inode;
24
+ const assertExactKeys = (valueArg, expectedArg) => {
25
+ const actual = Object.keys(valueArg).sort();
26
+ const expected = [...expectedArg].sort();
27
+ if (actual.length !== expected.length || actual.some((key, index) => key !== expected[index])) {
28
+ throw new Error('The embedded database migration journal has unexpected fields.');
29
+ }
30
+ };
31
+ const parseJournal = (valueArg) => {
32
+ if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg)) {
33
+ throw new Error('The embedded database migration journal is malformed.');
34
+ }
35
+ const value = valueArg;
36
+ if (value.version !== migrationVersion) {
37
+ throw new Error('The embedded database migration journal version is unsupported.');
38
+ }
39
+ if (value.phase !== 'prepared' && value.phase !== 'completed') {
40
+ throw new Error('The embedded database migration journal phase is invalid.');
41
+ }
42
+ assertExactKeys(value, [
43
+ 'version',
44
+ 'phase',
45
+ 'sourceDirectory',
46
+ 'destinationDirectory',
47
+ 'device',
48
+ 'inode',
49
+ ...(value.phase === 'completed'
50
+ ? ['destinationDevice', 'destinationInode', 'contentDigestSha256']
51
+ : []),
52
+ ]);
53
+ for (const key of ['sourceDirectory', 'destinationDirectory', 'device', 'inode']) {
54
+ if (typeof value[key] !== 'string' || value[key].length === 0) {
55
+ throw new Error(`The embedded database migration journal ${key} is invalid.`);
56
+ }
57
+ }
58
+ if (!/^\d+$/.test(value.device)
59
+ || !/^\d+$/.test(value.inode)) {
60
+ throw new Error('The embedded database migration journal source identity is invalid.');
61
+ }
62
+ if (value.phase === 'completed') {
63
+ if (typeof value.destinationDevice !== 'string'
64
+ || !/^\d+$/.test(value.destinationDevice)
65
+ || typeof value.destinationInode !== 'string'
66
+ || !/^\d+$/.test(value.destinationInode)
67
+ || typeof value.contentDigestSha256 !== 'string'
68
+ || !/^[a-f0-9]{64}$/.test(value.contentDigestSha256)) {
69
+ throw new Error('The embedded database migration journal completion is invalid.');
70
+ }
71
+ }
72
+ return value;
73
+ };
74
+ const readJournal = async (journalPathArg) => {
75
+ let handle;
76
+ try {
77
+ handle = await plugins.fs.promises.open(journalPathArg, plugins.fs.constants.O_RDONLY | plugins.fs.constants.O_NOFOLLOW);
78
+ }
79
+ catch (errorArg) {
80
+ if (errorArg.code === 'ENOENT')
81
+ return undefined;
82
+ throw errorArg;
83
+ }
84
+ try {
85
+ const stats = await handle.stat();
86
+ if (!stats.isFile() || stats.size < 2 || stats.size > maximumJournalBytes) {
87
+ throw new Error('The embedded database migration journal is not a bounded regular file.');
88
+ }
89
+ if (typeof process.getuid === 'function' && stats.uid !== process.getuid()) {
90
+ throw new Error('The embedded database migration journal is not owned by the current user.');
91
+ }
92
+ if ((stats.mode & 0o077) !== 0) {
93
+ throw new Error('The embedded database migration journal must not be group or world accessible.');
94
+ }
95
+ return parseJournal(JSON.parse(await handle.readFile('utf8')));
96
+ }
97
+ finally {
98
+ await handle.close();
99
+ }
100
+ };
101
+ const syncDirectory = async (directoryArg) => {
102
+ const handle = await plugins.fs.promises.open(directoryArg, plugins.fs.constants.O_RDONLY);
103
+ try {
104
+ await handle.sync();
105
+ }
106
+ finally {
107
+ await handle.close();
108
+ }
109
+ };
110
+ const writeJournal = async (journalPathArg, journalArg) => {
111
+ const parentDirectory = plugins.path.dirname(journalPathArg);
112
+ await plugins.fs.promises.mkdir(parentDirectory, { recursive: true, mode: 0o700 });
113
+ const parentStats = await plugins.fs.promises.lstat(parentDirectory);
114
+ if (!parentStats.isDirectory() || parentStats.isSymbolicLink()) {
115
+ throw new Error(`Controller data path must be a real directory: ${parentDirectory}`);
116
+ }
117
+ const temporaryPath = `${journalPathArg}.${process.pid}-${plugins.crypto.randomBytes(8).toString('hex')}.tmp`;
118
+ let handle;
119
+ try {
120
+ handle = await plugins.fs.promises.open(temporaryPath, plugins.fs.constants.O_WRONLY
121
+ | plugins.fs.constants.O_CREAT
122
+ | plugins.fs.constants.O_EXCL
123
+ | plugins.fs.constants.O_NOFOLLOW, 0o600);
124
+ await handle.writeFile(`${JSON.stringify(journalArg)}\n`, 'utf8');
125
+ await handle.sync();
126
+ await handle.close();
127
+ handle = undefined;
128
+ await plugins.fs.promises.rename(temporaryPath, journalPathArg);
129
+ await syncDirectory(parentDirectory);
130
+ }
131
+ catch (errorArg) {
132
+ if (handle)
133
+ await handle.close().catch(() => undefined);
134
+ await plugins.fs.promises.unlink(temporaryPath).catch(() => undefined);
135
+ throw errorArg;
136
+ }
137
+ };
138
+ const assertJournalMatches = (journalArg, optionsArg) => {
139
+ if (journalArg.sourceDirectory !== optionsArg.sourceDirectory
140
+ || journalArg.destinationDirectory !== optionsArg.destinationDirectory) {
141
+ throw new Error('The embedded database migration journal belongs to another migration.');
142
+ }
143
+ };
144
+ export const rebaseCompletedEmbeddedDatabaseLocationMigration = async (optionsArg) => {
145
+ const sourceDirectory = plugins.path.resolve(optionsArg.sourceDirectory);
146
+ const previousDestinationDirectory = plugins.path.resolve(optionsArg.previousDestinationDirectory);
147
+ const destinationDirectory = plugins.path.resolve(optionsArg.destinationDirectory);
148
+ const previousJournalPath = plugins.path.join(plugins.path.dirname(previousDestinationDirectory), journalFileName);
149
+ const destinationJournalPath = plugins.path.join(plugins.path.dirname(destinationDirectory), journalFileName);
150
+ const previous = await readJournal(previousJournalPath);
151
+ if (!previous || previous.phase !== 'completed') {
152
+ throw new Error('The embedded database migration journal is not completed for rebasing.');
153
+ }
154
+ assertJournalMatches(previous, {
155
+ sourceDirectory,
156
+ destinationDirectory: previousDestinationDirectory,
157
+ sourceSocketPath: '',
158
+ destinationSocketPath: '',
159
+ });
160
+ const destinationIdentity = await directoryIdentity(destinationDirectory);
161
+ if (!destinationIdentity || !identitiesEqual(destinationIdentity, {
162
+ device: previous.destinationDevice,
163
+ inode: previous.destinationInode,
164
+ })) {
165
+ throw new Error('The rebased embedded database directory identity does not match its journal.');
166
+ }
167
+ const rebased = {
168
+ ...previous,
169
+ destinationDirectory,
170
+ destinationDevice: destinationIdentity.device,
171
+ destinationInode: destinationIdentity.inode,
172
+ };
173
+ const existing = await readJournal(destinationJournalPath);
174
+ if (existing) {
175
+ if (existing.phase !== 'completed'
176
+ || existing.sourceDirectory !== rebased.sourceDirectory
177
+ || existing.destinationDirectory !== rebased.destinationDirectory
178
+ || existing.device !== rebased.device
179
+ || existing.inode !== rebased.inode
180
+ || existing.destinationDevice !== rebased.destinationDevice
181
+ || existing.destinationInode !== rebased.destinationInode
182
+ || existing.contentDigestSha256 !== rebased.contentDigestSha256) {
183
+ throw new Error('The rebased embedded database migration journal conflicts with its source.');
184
+ }
185
+ return;
186
+ }
187
+ await writeJournal(destinationJournalPath, rebased);
188
+ const persisted = await readJournal(destinationJournalPath);
189
+ if (!persisted
190
+ || persisted.phase !== 'completed'
191
+ || persisted.sourceDirectory !== rebased.sourceDirectory
192
+ || persisted.destinationDirectory !== rebased.destinationDirectory
193
+ || persisted.destinationDevice !== rebased.destinationDevice
194
+ || persisted.destinationInode !== rebased.destinationInode
195
+ || persisted.contentDigestSha256 !== rebased.contentDigestSha256) {
196
+ throw new Error('The rebased embedded database migration journal was not persisted.');
197
+ }
198
+ };
199
+ const databaseNamesFromCollections = (collectionsArg) => [...new Set(collectionsArg.map((collection) => collection.db))].sort();
200
+ const assertDatabaseNamesMatch = (sourceArg, destinationArg) => {
201
+ if (sourceArg.length !== destinationArg.length
202
+ || sourceArg.some((databaseName, index) => databaseName !== destinationArg[index])) {
203
+ throw new Error('The migrated SmartDB root contains a different logical database set.');
204
+ }
205
+ };
206
+ const aggregateContentDigests = (digestsArg) => {
207
+ const hash = plugins.crypto.createHash('sha256');
208
+ for (const [databaseName, digest] of [...digestsArg.entries()].sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))) {
209
+ hash.update(databaseName, 'utf8');
210
+ hash.update('\0');
211
+ hash.update(digest.sha256, 'ascii');
212
+ hash.update('\0');
213
+ }
214
+ return hash.digest('hex');
215
+ };
216
+ const assertCurrentStorageFormat = async (directoryArg) => {
217
+ const databaseEntries = await plugins.fs.promises.readdir(directoryArg, { withFileTypes: true });
218
+ for (const databaseEntry of databaseEntries) {
219
+ if (!databaseEntry.isDirectory() || databaseEntry.name.startsWith('.__rustdb_'))
220
+ continue;
221
+ const collectionEntries = await plugins.fs.promises.readdir(plugins.path.join(directoryArg, databaseEntry.name), { withFileTypes: true });
222
+ if (collectionEntries.some((entry) => (entry.isFile()
223
+ && entry.name.endsWith('.json')
224
+ && !entry.name.endsWith('.indexes.json')))) {
225
+ throw new Error(`The legacy controller database uses an old SmartDB storage format at ${directoryArg}. `
226
+ + 'Start it once with the previous controller version before upgrading.');
227
+ }
228
+ }
229
+ };
230
+ const assertDigestMatch = (sourceArg, destinationArg) => {
231
+ if (sourceArg.format !== destinationArg.format
232
+ || sourceArg.algorithm !== destinationArg.algorithm
233
+ || sourceArg.sha256 !== destinationArg.sha256
234
+ || sourceArg.scannedBsonBytes !== destinationArg.scannedBsonBytes
235
+ || sourceArg.collections !== destinationArg.collections
236
+ || sourceArg.documents !== destinationArg.documents
237
+ || sourceArg.indexes !== destinationArg.indexes) {
238
+ throw new Error('The migrated controller database content digest does not match its source.');
239
+ }
240
+ };
241
+ export class EmbeddedDatabaseLocationMigration {
242
+ options;
243
+ journalPath;
244
+ sourceDb;
245
+ importDestinationDb;
246
+ operationalDestinationDb;
247
+ constructor(options) {
248
+ this.options = options;
249
+ this.options = {
250
+ ...options,
251
+ sourceDirectory: plugins.path.resolve(options.sourceDirectory),
252
+ destinationDirectory: plugins.path.resolve(options.destinationDirectory),
253
+ };
254
+ this.journalPath = plugins.path.join(plugins.path.dirname(this.options.destinationDirectory), journalFileName);
255
+ }
256
+ get hasOwnedResources() {
257
+ return Boolean(this.sourceDb || this.importDestinationDb || this.operationalDestinationDb);
258
+ }
259
+ async stop() {
260
+ const errors = [];
261
+ for (const entry of [
262
+ ['operationalDestinationDb', this.operationalDestinationDb],
263
+ ['importDestinationDb', this.importDestinationDb],
264
+ ['sourceDb', this.sourceDb],
265
+ ]) {
266
+ const [key, database] = entry;
267
+ if (!database)
268
+ continue;
269
+ try {
270
+ await database.stop();
271
+ if (this[key] === database)
272
+ this[key] = undefined;
273
+ }
274
+ catch (errorArg) {
275
+ errors.push(errorArg);
276
+ }
277
+ }
278
+ if (errors.length === 1)
279
+ throw errors[0];
280
+ if (errors.length > 1) {
281
+ throw new AggregateError(errors, 'Embedded database migration cleanup failed.');
282
+ }
283
+ }
284
+ async run() {
285
+ if (this.options.sourceDirectory === this.options.destinationDirectory)
286
+ return undefined;
287
+ let journal = await readJournal(this.journalPath);
288
+ if (journal)
289
+ assertJournalMatches(journal, this.options);
290
+ const sourceIdentity = await directoryIdentity(this.options.sourceDirectory);
291
+ const destinationIdentity = await directoryIdentity(this.options.destinationDirectory);
292
+ if (journal?.phase === 'completed') {
293
+ if (!destinationIdentity) {
294
+ throw new Error(`The migrated controller database is missing at ${this.options.destinationDirectory}. `
295
+ + `The retained legacy backup at ${this.options.sourceDirectory} was not restored automatically.`);
296
+ }
297
+ if (!identitiesEqual(destinationIdentity, {
298
+ device: journal.destinationDevice,
299
+ inode: journal.destinationInode,
300
+ })) {
301
+ throw new Error('The migrated controller database directory identity has changed.');
302
+ }
303
+ return undefined;
304
+ }
305
+ if (!journal) {
306
+ if (!sourceIdentity)
307
+ return undefined;
308
+ if (destinationIdentity) {
309
+ throw new Error(`Both the legacy and current controller database directories exist: `
310
+ + `${this.options.sourceDirectory} and ${this.options.destinationDirectory}. `
311
+ + 'Refusing to choose between them without a migration journal.');
312
+ }
313
+ journal = {
314
+ version: migrationVersion,
315
+ phase: 'prepared',
316
+ sourceDirectory: this.options.sourceDirectory,
317
+ destinationDirectory: this.options.destinationDirectory,
318
+ ...sourceIdentity,
319
+ };
320
+ await writeJournal(this.journalPath, journal);
321
+ journal = await readJournal(this.journalPath);
322
+ if (!journal)
323
+ throw new Error('The embedded database migration journal was not persisted.');
324
+ assertJournalMatches(journal, this.options);
325
+ }
326
+ if (journal.phase !== 'prepared') {
327
+ throw new Error('The embedded database migration journal is not resumable.');
328
+ }
329
+ if (!sourceIdentity || !identitiesEqual(sourceIdentity, journal)) {
330
+ throw new Error('The legacy controller database directory identity has changed.');
331
+ }
332
+ if (await isSocketListening(this.options.sourceSocketPath)) {
333
+ throw new Error(`The legacy controller database is still in use at ${this.options.sourceDirectory}. `
334
+ + 'Stop the old controller before starting this version so its data can be migrated safely.');
335
+ }
336
+ await assertCurrentStorageFormat(this.options.sourceDirectory);
337
+ try {
338
+ this.sourceDb = new plugins.smartdb.LocalSmartDb({
339
+ folderPath: this.options.sourceDirectory,
340
+ });
341
+ await this.sourceDb.start();
342
+ const sourceServer = this.sourceDb.getServer();
343
+ const sourceDatabaseNames = databaseNamesFromCollections(await sourceServer.getCollections());
344
+ const sourceDigests = new Map();
345
+ this.importDestinationDb = new plugins.smartdb.LocalSmartDb({
346
+ folderPath: this.options.destinationDirectory,
347
+ });
348
+ await this.importDestinationDb.start();
349
+ const destinationServer = this.importDestinationDb.getServer();
350
+ for (const databaseName of sourceDatabaseNames) {
351
+ const exported = await sourceServer.exportDatabase({ databaseName });
352
+ const sourceDigest = await sourceServer.getDatabaseContentDigest({ databaseName });
353
+ const importResult = await destinationServer.importDatabase({
354
+ databaseName,
355
+ source: exported,
356
+ });
357
+ const destinationDigest = await destinationServer.getDatabaseContentDigest({ databaseName });
358
+ assertDigestMatch(sourceDigest, destinationDigest);
359
+ const exportedDocuments = exported.collections.reduce((sum, collection) => sum + collection.documents.length, 0);
360
+ const exportedIndexes = exported.collections.reduce((sum, collection) => sum + collection.indexes.length, 0);
361
+ if (importResult.collections !== exported.collections.length
362
+ || importResult.documents !== exportedDocuments
363
+ || sourceDigest.collections !== exported.collections.length
364
+ || sourceDigest.documents !== exportedDocuments
365
+ || sourceDigest.indexes !== exportedIndexes) {
366
+ throw new Error(`The migrated database '${databaseName}' counts do not match its export.`);
367
+ }
368
+ sourceDigests.set(databaseName, sourceDigest);
369
+ }
370
+ assertDatabaseNamesMatch(sourceDatabaseNames, databaseNamesFromCollections(await destinationServer.getCollections()));
371
+ await this.importDestinationDb.stop();
372
+ this.importDestinationDb = undefined;
373
+ this.operationalDestinationDb = new plugins.smartdb.LocalSmartDb({
374
+ folderPath: this.options.destinationDirectory,
375
+ socketPath: this.options.destinationSocketPath,
376
+ });
377
+ const operationalConnection = await this.operationalDestinationDb.start();
378
+ const operationalServer = this.operationalDestinationDb.getServer();
379
+ assertDatabaseNamesMatch(sourceDatabaseNames, databaseNamesFromCollections(await operationalServer.getCollections()));
380
+ for (const [databaseName, sourceDigest] of sourceDigests) {
381
+ assertDigestMatch(sourceDigest, await operationalServer.getDatabaseContentDigest({ databaseName }));
382
+ }
383
+ const completedDestinationIdentity = await directoryIdentity(this.options.destinationDirectory);
384
+ if (!completedDestinationIdentity) {
385
+ throw new Error('The migrated controller database directory disappeared before completion.');
386
+ }
387
+ const completed = {
388
+ ...journal,
389
+ phase: 'completed',
390
+ destinationDevice: completedDestinationIdentity.device,
391
+ destinationInode: completedDestinationIdentity.inode,
392
+ contentDigestSha256: aggregateContentDigests(sourceDigests),
393
+ };
394
+ await writeJournal(this.journalPath, completed);
395
+ await this.sourceDb.stop();
396
+ this.sourceDb = undefined;
397
+ const result = {
398
+ localDb: this.operationalDestinationDb,
399
+ connectionUri: operationalConnection.connectionUri,
400
+ };
401
+ this.operationalDestinationDb = undefined;
402
+ return result;
403
+ }
404
+ catch (errorArg) {
405
+ try {
406
+ await this.stop();
407
+ }
408
+ catch (cleanupErrorArg) {
409
+ throw new AggregateError([errorArg, cleanupErrorArg], 'Embedded database migration failed and cleanup was incomplete.', { cause: errorArg });
410
+ }
411
+ throw errorArg;
412
+ }
413
+ }
414
+ }
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjFfZW1iZWRkZWRkYXRhYmFzZWxvY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfbWlncmF0aW9uL3YxX2VtYmVkZGVkZGF0YWJhc2Vsb2NhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxpQkFBaUIsR0FDbEIsTUFBTSwrQkFBK0IsQ0FBQztBQUV2QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsQ0FBQztBQUMzRCxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUE0Q3RDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUM3QixZQUFvQixFQUNxQixFQUFFO0lBQzNDLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDOUIsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sUUFBUSxFQUFFLENBQUM7UUFDbEIsSUFBSyxRQUFrQyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDNUUsTUFBTSxRQUFRLENBQUM7SUFDakIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLENBQ3RCLE9BQTJCLEVBQzNCLFFBQTRCLEVBQ25CLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDO0FBRXJGLE1BQU0sZUFBZSxHQUFHLENBQ3RCLFFBQWlDLEVBQ2pDLFdBQXFCLEVBQ2YsRUFBRTtJQUNSLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5RixNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBaUIsRUFBcUIsRUFBRTtJQUM1RCxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDekUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxRQUFtQyxDQUFDO0lBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFVBQVUsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsZUFBZSxDQUFDLEtBQUssRUFBRTtRQUNyQixTQUFTO1FBQ1QsT0FBTztRQUNQLGlCQUFpQjtRQUNqQixzQkFBc0I7UUFDdEIsUUFBUTtRQUNSLE9BQU87UUFDUCxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxXQUFXO1lBQzdCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDO1lBQ2xFLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDLENBQUM7SUFDSCxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDakYsSUFBSSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFDRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQWdCLENBQUM7V0FDbEMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFlLENBQUMsRUFDdkMsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLElBQ0UsT0FBTyxLQUFLLENBQUMsaUJBQWlCLEtBQUssUUFBUTtlQUN4QyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDO2VBQ3RDLE9BQU8sS0FBSyxDQUFDLGdCQUFnQixLQUFLLFFBQVE7ZUFDMUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztlQUNyQyxPQUFPLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxRQUFRO2VBQzdDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxFQUNwRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFxQyxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUVGLE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxjQUFzQixFQUEwQyxFQUFFO0lBQzNGLElBQUksTUFBc0MsQ0FBQztJQUMzQyxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ3JDLGNBQWMsRUFDZCxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUNoRSxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sUUFBUSxFQUFFLENBQUM7UUFDbEIsSUFBSyxRQUFrQyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDNUUsTUFBTSxRQUFRLENBQUM7SUFDakIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1lBQzFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0VBQXdFLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDM0UsTUFBTSxJQUFJLEtBQUssQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGdGQUFnRixDQUFDLENBQUM7UUFDcEcsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFZLENBQUMsQ0FBQztJQUM1RSxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsWUFBb0IsRUFBaUIsRUFBRTtJQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0YsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUN4QixjQUFzQixFQUN0QixVQUE2QixFQUNkLEVBQUU7SUFDakIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDN0QsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNuRixNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1FBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLEdBQUcsY0FBYyxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDOUcsSUFBSSxNQUFrRCxDQUFDO0lBQ3ZELElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDckMsYUFBYSxFQUNiLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVE7Y0FDM0IsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTztjQUM1QixPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNO2NBQzNCLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFDakMsS0FBSyxDQUNOLENBQUM7UUFDRixNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEUsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEIsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckIsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNuQixNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEUsTUFBTSxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUFDLE9BQU8sUUFBUSxFQUFFLENBQUM7UUFDbEIsSUFBSSxNQUFNO1lBQUUsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RSxNQUFNLFFBQVEsQ0FBQztJQUNqQixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxDQUMzQixVQUE2QixFQUM3QixVQUFxRCxFQUMvQyxFQUFFO0lBQ1IsSUFDRSxVQUFVLENBQUMsZUFBZSxLQUFLLFVBQVUsQ0FBQyxlQUFlO1dBQ3RELFVBQVUsQ0FBQyxvQkFBb0IsS0FBSyxVQUFVLENBQUMsb0JBQW9CLEVBQ3RFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUM7SUFDM0YsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdEQUFnRCxHQUFHLEtBQUssRUFDbkUsVUFBb0UsRUFDckQsRUFBRTtJQUNqQixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekUsTUFBTSw0QkFBNEIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FDdkQsVUFBVSxDQUFDLDRCQUE0QixDQUN4QyxDQUFDO0lBQ0YsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNuRixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxFQUNsRCxlQUFlLENBQ2hCLENBQUM7SUFDRixNQUFNLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUMxQyxlQUFlLENBQ2hCLENBQUM7SUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLHdFQUF3RSxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELG9CQUFvQixDQUFDLFFBQVEsRUFBRTtRQUM3QixlQUFlO1FBQ2Ysb0JBQW9CLEVBQUUsNEJBQTRCO1FBQ2xELGdCQUFnQixFQUFFLEVBQUU7UUFDcEIscUJBQXFCLEVBQUUsRUFBRTtLQUMxQixDQUFDLENBQUM7SUFDSCxNQUFNLG1CQUFtQixHQUFHLE1BQU0saUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUMxRSxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEVBQUU7UUFDaEUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7UUFDbEMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0I7S0FDakMsQ0FBQyxFQUFFLENBQUM7UUFDSCxNQUFNLElBQUksS0FBSyxDQUFDLDhFQUE4RSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUErQjtRQUMxQyxHQUFHLFFBQVE7UUFDWCxvQkFBb0I7UUFDcEIsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUMsTUFBTTtRQUM3QyxnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLO0tBQzVDLENBQUM7SUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzNELElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixJQUNFLFFBQVEsQ0FBQyxLQUFLLEtBQUssV0FBVztlQUMzQixRQUFRLENBQUMsZUFBZSxLQUFLLE9BQU8sQ0FBQyxlQUFlO2VBQ3BELFFBQVEsQ0FBQyxvQkFBb0IsS0FBSyxPQUFPLENBQUMsb0JBQW9CO2VBQzlELFFBQVEsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU07ZUFDbEMsUUFBUSxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsS0FBSztlQUNoQyxRQUFRLENBQUMsaUJBQWlCLEtBQUssT0FBTyxDQUFDLGlCQUFpQjtlQUN4RCxRQUFRLENBQUMsZ0JBQWdCLEtBQUssT0FBTyxDQUFDLGdCQUFnQjtlQUN0RCxRQUFRLENBQUMsbUJBQW1CLEtBQUssT0FBTyxDQUFDLG1CQUFtQixFQUMvRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sWUFBWSxDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELE1BQU0sU0FBUyxHQUFHLE1BQU0sV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDNUQsSUFDRSxDQUFDLFNBQVM7V0FDUCxTQUFTLENBQUMsS0FBSyxLQUFLLFdBQVc7V0FDL0IsU0FBUyxDQUFDLGVBQWUsS0FBSyxPQUFPLENBQUMsZUFBZTtXQUNyRCxTQUFTLENBQUMsb0JBQW9CLEtBQUssT0FBTyxDQUFDLG9CQUFvQjtXQUMvRCxTQUFTLENBQUMsaUJBQWlCLEtBQUssT0FBTyxDQUFDLGlCQUFpQjtXQUN6RCxTQUFTLENBQUMsZ0JBQWdCLEtBQUssT0FBTyxDQUFDLGdCQUFnQjtXQUN2RCxTQUFTLENBQUMsbUJBQW1CLEtBQUssT0FBTyxDQUFDLG1CQUFtQixFQUNoRSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLDRCQUE0QixHQUFHLENBQ25DLGNBQWlELEVBQ3ZDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUV0RixNQUFNLHdCQUF3QixHQUFHLENBQy9CLFNBQW1CLEVBQ25CLGNBQXdCLEVBQ2xCLEVBQUU7SUFDUixJQUNFLFNBQVMsQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLE1BQU07V0FDdkMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFlBQVksS0FBSyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDbEYsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsc0VBQXNFLENBQUMsQ0FBQztJQUMxRixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxDQUM5QixVQUFzRSxFQUM5RCxFQUFFO0lBQ1YsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakQsS0FBSyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ3ZGLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDekMsQ0FBQyxFQUFFLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBRUYsTUFBTSwwQkFBMEIsR0FBRyxLQUFLLEVBQUUsWUFBb0IsRUFBaUIsRUFBRTtJQUMvRSxNQUFNLGVBQWUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqRyxLQUFLLE1BQU0sYUFBYSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQUUsU0FBUztRQUMxRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUNuRCxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FDeEIsQ0FBQztRQUNGLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUNwQyxLQUFLLENBQUMsTUFBTSxFQUFFO2VBQ1gsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO2VBQzVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQ3pDLENBQUMsRUFBRSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEtBQUssQ0FDYix3RUFBd0UsWUFBWSxJQUFJO2tCQUN0RixzRUFBc0UsQ0FDekUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxpQkFBaUIsR0FBRyxDQUN4QixTQUF3RCxFQUN4RCxjQUE2RCxFQUN2RCxFQUFFO0lBQ1IsSUFDRSxTQUFTLENBQUMsTUFBTSxLQUFLLGNBQWMsQ0FBQyxNQUFNO1dBQ3ZDLFNBQVMsQ0FBQyxTQUFTLEtBQUssY0FBYyxDQUFDLFNBQVM7V0FDaEQsU0FBUyxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsTUFBTTtXQUMxQyxTQUFTLENBQUMsZ0JBQWdCLEtBQUssY0FBYyxDQUFDLGdCQUFnQjtXQUM5RCxTQUFTLENBQUMsV0FBVyxLQUFLLGNBQWMsQ0FBQyxXQUFXO1dBQ3BELFNBQVMsQ0FBQyxTQUFTLEtBQUssY0FBYyxDQUFDLFNBQVM7V0FDaEQsU0FBUyxDQUFDLE9BQU8sS0FBSyxjQUFjLENBQUMsT0FBTyxFQUMvQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLE9BQU8saUNBQWlDO0lBTWY7SUFMWixXQUFXLENBQVM7SUFDN0IsUUFBUSxDQUFnQztJQUN4QyxtQkFBbUIsQ0FBZ0M7SUFDbkQsd0JBQXdCLENBQWdDO0lBRWhFLFlBQTZCLE9BQWtEO1FBQWxELFlBQU8sR0FBUCxPQUFPLENBQTJDO1FBQzdFLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixHQUFHLE9BQU87WUFDVixlQUFlLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUM5RCxvQkFBb0IsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7U0FDekUsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFDdkQsZUFBZSxDQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVELElBQVcsaUJBQWlCO1FBQzFCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSTtRQUNmLE1BQU0sTUFBTSxHQUFjLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sS0FBSyxJQUFJO1lBQ2xCLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQzNELENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQ2pELENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDbkIsRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsU0FBUztZQUN4QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVE7b0JBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUNwRCxDQUFDO1lBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDbEYsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRztRQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0I7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUV6RixJQUFJLE9BQU8sR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEQsSUFBSSxPQUFPO1lBQUUsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxNQUFNLGNBQWMsR0FBRyxNQUFNLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0UsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUV2RixJQUFJLE9BQU8sRUFBRSxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtELElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLElBQUk7c0JBQ3JGLGlDQUFpQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsa0NBQWtDLENBQ2xHLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsRUFBRTtnQkFDeEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7Z0JBQ2pDLEtBQUssRUFBRSxPQUFPLENBQUMsZ0JBQWdCO2FBQ2hDLENBQUMsRUFBRSxDQUFDO2dCQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztZQUN0RixDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxjQUFjO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQ3RDLElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDYixxRUFBcUU7c0JBQ25FLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSTtzQkFDNUUsOERBQThELENBQ2pFLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxHQUFHO2dCQUNSLE9BQU8sRUFBRSxnQkFBZ0I7Z0JBQ3pCLEtBQUssRUFBRSxVQUFVO2dCQUNqQixlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO2dCQUM3QyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQjtnQkFDdkQsR0FBRyxjQUFjO2FBQ2xCLENBQUM7WUFDRixNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLE9BQU8sR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1lBQzVGLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxJQUFJLE1BQU0saUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FDYixxREFBcUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLElBQUk7a0JBQ25GLDBGQUEwRixDQUM3RixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sMEJBQTBCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7Z0JBQy9DLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWU7YUFDekMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0MsTUFBTSxtQkFBbUIsR0FBRyw0QkFBNEIsQ0FDdEQsTUFBTSxZQUFZLENBQUMsY0FBYyxFQUFFLENBQ3BDLENBQUM7WUFDRixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBeUQsQ0FBQztZQUV2RixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztnQkFDMUQsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CO2FBQzlDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQy9ELEtBQUssTUFBTSxZQUFZLElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDckUsTUFBTSxZQUFZLEdBQUcsTUFBTSxZQUFZLENBQUMsd0JBQXdCLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLFlBQVksR0FBRyxNQUFNLGlCQUFpQixDQUFDLGNBQWMsQ0FBQztvQkFDMUQsWUFBWTtvQkFDWixNQUFNLEVBQUUsUUFBUTtpQkFDakIsQ0FBQyxDQUFDO2dCQUNILE1BQU0saUJBQWlCLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7Z0JBQzdGLGlCQUFpQixDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUNuRCxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFDdEQsQ0FBQyxDQUNGLENBQUM7Z0JBQ0YsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQ2pELENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUNwRCxDQUFDLENBQ0YsQ0FBQztnQkFDRixJQUNFLFlBQVksQ0FBQyxXQUFXLEtBQUssUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNO3VCQUNyRCxZQUFZLENBQUMsU0FBUyxLQUFLLGlCQUFpQjt1QkFDNUMsWUFBWSxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU07dUJBQ3hELFlBQVksQ0FBQyxTQUFTLEtBQUssaUJBQWlCO3VCQUM1QyxZQUFZLENBQUMsT0FBTyxLQUFLLGVBQWUsRUFDM0MsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixZQUFZLG1DQUFtQyxDQUFDLENBQUM7Z0JBQzdGLENBQUM7Z0JBQ0QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELHdCQUF3QixDQUN0QixtQkFBbUIsRUFDbkIsNEJBQTRCLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUN2RSxDQUFDO1lBRUYsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztZQUNyQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztnQkFDL0QsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CO2dCQUM3QyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUI7YUFDL0MsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxRSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwRSx3QkFBd0IsQ0FDdEIsbUJBQW1CLEVBQ25CLDRCQUE0QixDQUFDLE1BQU0saUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FDdkUsQ0FBQztZQUNGLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDekQsaUJBQWlCLENBQ2YsWUFBWSxFQUNaLE1BQU0saUJBQWlCLENBQUMsd0JBQXdCLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUNuRSxDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDaEcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQztZQUMvRixDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQStCO2dCQUM1QyxHQUFHLE9BQU87Z0JBQ1YsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLGlCQUFpQixFQUFFLDRCQUE0QixDQUFDLE1BQU07Z0JBQ3RELGdCQUFnQixFQUFFLDRCQUE0QixDQUFDLEtBQUs7Z0JBQ3BELG1CQUFtQixFQUFFLHVCQUF1QixDQUFDLGFBQWEsQ0FBQzthQUM1RCxDQUFDO1lBQ0YsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNoRCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDMUIsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyx3QkFBd0I7Z0JBQ3RDLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQyxhQUFhO2FBQ25ELENBQUM7WUFDRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxDQUFDO1lBQzFDLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFBQyxPQUFPLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixDQUFDO1lBQUMsT0FBTyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxJQUFJLGNBQWMsQ0FDdEIsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLEVBQzNCLGdFQUFnRSxFQUNoRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FDcEIsQ0FBQztZQUNKLENBQUM7WUFDRCxNQUFNLFFBQVEsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
@@ -0,0 +1,7 @@
1
+ import * as plugins from '../dist_ts/plugins.js';
2
+ export declare class ProtocolV22ProjectFilesystemIdentityMigration {
3
+ private readonly database;
4
+ private readonly controllerId;
5
+ constructor(database: plugins.smartdata.SmartdataDb | undefined, controllerId: string);
6
+ run(): Promise<void>;
7
+ }
@@ -0,0 +1,105 @@
1
+ import * as plugins from '../dist_ts/plugins.js';
2
+ import { assertControllerProjectDocument, ControllerProjectModel, } from '../dist_ts/classes.authmodels.js';
3
+ import { CanonicalDirectoryError, resolveCanonicalDirectory, } from '../dist_ts/functions.canonicaldirectory.js';
4
+ import { AuthError } from '../dist_ts/interfaces.auth.js';
5
+ const migrationPageLimit = 128;
6
+ const persistedBodyFromRawDocument = (valueArg) => {
7
+ const body = { ...valueArg };
8
+ delete body._id;
9
+ delete body._smartdataRevision;
10
+ return body;
11
+ };
12
+ const hasIdentityState = (valueArg) => Object.hasOwn(valueArg, 'directoryIdentityState');
13
+ export class ProtocolV22ProjectFilesystemIdentityMigration {
14
+ database;
15
+ controllerId;
16
+ constructor(database, controllerId) {
17
+ this.database = database;
18
+ this.controllerId = controllerId;
19
+ }
20
+ async run() {
21
+ if (!this.database) {
22
+ throw new AuthError('not_initialized', 'The authentication store database is unavailable.');
23
+ }
24
+ const collection = ControllerProjectModel.collection.mongoDbCollection;
25
+ let lastId;
26
+ while (true) {
27
+ const cursor = collection.find({
28
+ controllerId: this.controllerId,
29
+ ...(lastId ? { _id: { $gt: lastId } } : {}),
30
+ }).sort({ _id: 1 }).limit(migrationPageLimit);
31
+ let documents;
32
+ try {
33
+ documents = await cursor.toArray();
34
+ }
35
+ finally {
36
+ await cursor.close();
37
+ }
38
+ for (const raw of documents) {
39
+ const body = persistedBodyFromRawDocument(raw);
40
+ if (body.directoryIdentityState === 'unbound')
41
+ continue;
42
+ if (body.directoryIdentityState === 'bound'
43
+ && Object.hasOwn(body, 'directoryIdentity')) {
44
+ try {
45
+ assertControllerProjectDocument(body);
46
+ continue;
47
+ }
48
+ catch {
49
+ // Pre-release leaf-only or incomplete bindings are terminally unbound below.
50
+ }
51
+ }
52
+ const trulyLegacy = !hasIdentityState(body);
53
+ let identity;
54
+ if (trulyLegacy) {
55
+ try {
56
+ identity = await resolveCanonicalDirectory(String(body.directory));
57
+ }
58
+ catch (errorArg) {
59
+ if (!(errorArg instanceof CanonicalDirectoryError))
60
+ throw errorArg;
61
+ identity = undefined;
62
+ }
63
+ }
64
+ const migratedBody = { ...body };
65
+ delete migratedBody.directoryDevice;
66
+ delete migratedBody.directoryInode;
67
+ delete migratedBody.directoryIdentity;
68
+ const migrated = {
69
+ ...migratedBody,
70
+ directoryIdentityState: identity ? 'bound' : 'unbound',
71
+ ...(identity ? { directoryIdentity: { ancestry: identity.ancestry } } : {}),
72
+ };
73
+ assertControllerProjectDocument(migrated);
74
+ const selector = raw._smartdataRevision === undefined
75
+ ? { _id: raw._id, _smartdataRevision: { $exists: false } }
76
+ : { _id: raw._id, _smartdataRevision: raw._smartdataRevision };
77
+ const replaced = await collection.findOneAndReplace(selector, { _id: raw._id, ...migrated, _smartdataRevision: plugins.crypto.randomUUID() }, { returnDocument: 'after', includeResultMetadata: false, upsert: false });
78
+ if (!replaced) {
79
+ const concurrent = await collection.findOne({ _id: raw._id });
80
+ const concurrentBody = concurrent
81
+ ? persistedBodyFromRawDocument(concurrent)
82
+ : undefined;
83
+ let concurrentlyMigrated = false;
84
+ if (concurrentBody && hasIdentityState(concurrentBody)) {
85
+ try {
86
+ assertControllerProjectDocument(concurrentBody);
87
+ concurrentlyMigrated = true;
88
+ }
89
+ catch {
90
+ concurrentlyMigrated = false;
91
+ }
92
+ }
93
+ if (!concurrentlyMigrated) {
94
+ throw new AuthError('concurrent_change', 'The project filesystem identity migration changed concurrently.');
95
+ }
96
+ }
97
+ }
98
+ const last = documents.at(-1);
99
+ if (!last || documents.length < migrationPageLimit)
100
+ break;
101
+ lastId = last._id;
102
+ }
103
+ }
104
+ }
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjIyX3Byb2plY3RmaWxlc3lzdGVtaWRlbnRpdHltaWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19taWdyYXRpb24vdjIyX3Byb2plY3RmaWxlc3lzdGVtaWRlbnRpdHltaWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLHNCQUFzQixHQUN2QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIseUJBQXlCLEdBQzFCLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3JELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBRS9CLE1BQU0sNEJBQTRCLEdBQUcsQ0FDbkMsUUFBaUMsRUFDUixFQUFFO0lBQzNCLE1BQU0sSUFBSSxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztJQUM3QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDaEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDL0IsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBaUMsRUFBVyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FDcEYsUUFBUSxFQUNSLHdCQUF3QixDQUN6QixDQUFDO0FBRUYsTUFBTSxPQUFPLDZDQUE2QztJQUVyQztJQUNBO0lBRm5CLFlBQ21CLFFBQW1ELEVBQ25ELFlBQW9CO1FBRHBCLGFBQVEsR0FBUixRQUFRLENBQTJDO1FBQ25ELGlCQUFZLEdBQVosWUFBWSxDQUFRO0lBQ3BDLENBQUM7SUFFRyxLQUFLLENBQUMsR0FBRztRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJ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