@bluewombat/integrator 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SPECS.md +17 -11
- package/dist/fold/backend.d.ts +7 -5
- package/dist/fold/backend.d.ts.map +1 -1
- package/dist/fold/fold.d.ts.map +1 -1
- package/dist/fold/fold.js +11 -2
- package/dist/fold/fold.js.map +1 -1
- package/dist/fold/working-files.d.ts +4 -1
- package/dist/fold/working-files.d.ts.map +1 -1
- package/dist/fold/working-files.js +36 -5
- package/dist/fold/working-files.js.map +1 -1
- package/package.json +1 -1
package/SPECS.md
CHANGED
|
@@ -151,7 +151,8 @@ A **conflict** is when the fold cannot complete without choosing a side.
|
|
|
151
151
|
|
|
152
152
|
On git, that is an overlapping independent change on the same path (both sides
|
|
153
153
|
edited it, or the types cannot be combined). Different bytes on a path is not
|
|
154
|
-
by itself a conflict: a change that exists on only one side is applied.
|
|
154
|
+
by itself a conflict: a change that exists on only one side is applied. The
|
|
155
|
+
report of a git conflict names the paths in conflict (`merge-tree --name-only`).
|
|
155
156
|
|
|
156
157
|
On copy, that is an incompatible type at the same path (file vs directory vs
|
|
157
158
|
symlink). Copy has no third tree, so it cannot see overlapping independent
|
|
@@ -224,15 +225,20 @@ start.
|
|
|
224
225
|
"What they were" is the Parent's whole tree unless the backend narrows it.
|
|
225
226
|
Before the fold, Integrator copies the Parent's working files aside so it can
|
|
226
227
|
put them back. A backend may offer `snapshotPaths(directory)`: the `/`-separated
|
|
227
|
-
paths, from the root, of the working files
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
228
|
+
paths, from the root, of the working files it lists for a directory. The set a
|
|
229
|
+
failed fold has to restore is the Parent's list united with the Child's list,
|
|
230
|
+
because the incoming tree is the Child's working tree: those are the only paths
|
|
231
|
+
a fold can write. Only those are copied aside, and on a failure only those are
|
|
232
|
+
put back (what the fold created among them is removed, and so are the
|
|
233
|
+
directories that leaves empty and the Parent did not have). A path in neither
|
|
234
|
+
list is neither read nor restored: leaving it out is the backend's promise that
|
|
235
|
+
the fold never writes there. A listed path that is a directory (a git submodule's
|
|
236
|
+
gitlink) is neither copied nor restored nor removed: a submodule's contents are
|
|
237
|
+
its own repository. A backend without `snapshotPaths`, or one that returns
|
|
238
|
+
`undefined` for either directory, gets the whole Parent. `@bluewombat/isolation-git`
|
|
239
|
+
lists what git sees (tracked, plus untracked and not ignored), so a `node_modules/`
|
|
240
|
+
that only the Parent holds is not copied, while an ignored Parent file the Child
|
|
241
|
+
tracks is; `@bluewombat/isolation-copy` lists nothing and gets the whole tree.
|
|
236
242
|
|
|
237
243
|
If Integrator began to write and then hit `conflict`, `failed`, or
|
|
238
244
|
`interrupted`, it restores Parent before returning. A leftover merge in
|
|
@@ -391,7 +397,7 @@ either what they were at invocation start, or the complete `integrated` result.
|
|
|
391
397
|
17. `@bluewombat/isolation-copy` → copy inside; a same-type bytes difference is taken from the Child, not `conflict`.
|
|
392
398
|
18. `@bluewombat/isolation-git` and git cannot complete for a reason that is not a merge conflict → `failed`, not a copy, not `conflict`.
|
|
393
399
|
19. The CLI requires `--strategy <specifier>`; `runIntegrator` never chooses a strategy.
|
|
394
|
-
20. A backend with `snapshotPaths` and a fold that fails → Parent's
|
|
400
|
+
20. A backend with `snapshotPaths` and a fold that fails → the Parent's working files listed for the Parent or the Child are as they were (an ignored Parent file the Child holds included), what the fold created among them is gone with the directories it created, a path in neither list is not read (an unreadable one does not fail the Integration), and a listed directory path (a gitlink) is not touched.
|
|
395
401
|
21. A backend without `snapshotPaths`, or whose `snapshotPaths` returns `undefined` → the whole Parent is restored.
|
|
396
402
|
22. `@bluewombat/isolation-git` and a `conflict` with an ignored `node_modules/` in Parent → Parent restored; the ignored directory is not read and is still there.
|
|
397
403
|
|
package/dist/fold/backend.d.ts
CHANGED
|
@@ -24,11 +24,13 @@ export type FoldBackendResult =
|
|
|
24
24
|
*/
|
|
25
25
|
export type FoldBackend = {
|
|
26
26
|
/**
|
|
27
|
-
* The working files of `directory` a failed fold
|
|
28
|
-
* `/`-separated paths from its root.
|
|
29
|
-
* the
|
|
30
|
-
*
|
|
31
|
-
*
|
|
27
|
+
* The working files of `directory` a failed fold may have to put back, as
|
|
28
|
+
* `/`-separated paths from its root. Integrator asks for the Parent and for
|
|
29
|
+
* the Child and restores the union: the incoming tree is the Child's working
|
|
30
|
+
* tree, so a fold writes only paths one of them lists. Absent, or `undefined`
|
|
31
|
+
* for either directory the backend cannot list: all of the Parent. A path in
|
|
32
|
+
* neither list is never copied. A listed path that is a directory (a
|
|
33
|
+
* submodule) is neither copied nor restored.
|
|
32
34
|
*/
|
|
33
35
|
snapshotPaths?(directory: string): Promise<readonly string[] | undefined>;
|
|
34
36
|
fold(input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/fold/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,iBAAiB;AAC3B;;;GAGG;AACD;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/fold/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,iBAAiB;AAC3B;;;GAGG;AACD;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;;;;OAQG;IACH,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAC1E,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,OAAO,CAAC;QAC/B,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC;KACxC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAChC,CAAC"}
|
package/dist/fold/fold.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../../src/fold/fold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;IACrB,gDAAgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../../src/fold/fold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,KAAK,QAAQ,EAId,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;IACrB,gDAAgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC,GAAG,OAAO,CAAC,UAAU,CAAC,CA0DtB"}
|
package/dist/fold/fold.js
CHANGED
|
@@ -5,7 +5,16 @@ import { removeSnapshot, restoreWorkingFiles, snapshotWorkingFiles, } from "./wo
|
|
|
5
5
|
*/
|
|
6
6
|
export async function fold(input) {
|
|
7
7
|
const { parent, child, backend, id, subject, mergeSubject, deadlineMs, now, shouldInterrupt } = input;
|
|
8
|
-
|
|
8
|
+
// The incoming tree is the Child's working tree, so a fold can write a Parent
|
|
9
|
+
// path only if the Parent or the Child lists it.
|
|
10
|
+
const listed = async () => {
|
|
11
|
+
const own = await backend.snapshotPaths?.(parent);
|
|
12
|
+
const incoming = own === undefined ? undefined : await backend.snapshotPaths?.(child);
|
|
13
|
+
return own === undefined || incoming === undefined
|
|
14
|
+
? undefined
|
|
15
|
+
: [...new Set([...own, ...incoming])];
|
|
16
|
+
};
|
|
17
|
+
const saved = await listed();
|
|
9
18
|
const backup = await snapshotWorkingFiles(parent, saved);
|
|
10
19
|
const shouldStop = () => {
|
|
11
20
|
if (shouldInterrupt()) {
|
|
@@ -18,7 +27,7 @@ export async function fold(input) {
|
|
|
18
27
|
};
|
|
19
28
|
const fail = async (result) => {
|
|
20
29
|
// What is in scope now includes what the fold created.
|
|
21
|
-
const current = saved === undefined ? undefined : await
|
|
30
|
+
const current = saved === undefined ? undefined : await listed();
|
|
22
31
|
await restoreWorkingFiles(parent, backup, saved, current);
|
|
23
32
|
await removeSnapshot(backup);
|
|
24
33
|
return result;
|
package/dist/fold/fold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../../src/fold/fold.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,cAAc,EACd,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAQ5B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,KAW1B;IACC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,EAAE,GAC3F,KAAK,CAAC;IACR,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../../src/fold/fold.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,10 @@ export declare function snapshotWorkingFiles(directory: string, paths?: readonly
|
|
|
31
31
|
* Put `directory` back as the snapshot found it. Given `saved` (the paths the
|
|
32
32
|
* snapshot was limited to), only working files in scope are touched: those
|
|
33
33
|
* listed now (`current`, which includes what the fold created) are removed,
|
|
34
|
-
*
|
|
34
|
+
* the directories that leaves empty and the snapshot does not have are
|
|
35
|
+
* removed, then `saved` is copied back. Whatever the backend left out is not
|
|
36
|
+
* touched. A path that is a directory (a submodule) is neither removed nor
|
|
37
|
+
* copied back.
|
|
35
38
|
*/
|
|
36
39
|
export declare function restoreWorkingFiles(directory: string, backup: string, saved?: readonly string[], current?: readonly string[]): Promise<void>;
|
|
37
40
|
export declare function removeSnapshot(backup: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working-files.d.ts","sourceRoot":"","sources":["../../src/fold/working-files.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"working-files.d.ts","sourceRoot":"","sources":["../../src/fold/working-files.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;AAE7C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;gBAEZ,IAAI,EAAE,QAAQ;CAS3B;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,cAAc,IAAI,OAAO,CAAC;IAC1B,WAAW,IAAI,OAAO,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC;CACnB,GAAG,QAAQ,GAAG,OAAO,CAWrB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,CAmBxE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,CAAC;CACxC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,QAAQ,GAAG,SAAS,GACrC,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,EACzB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAuDD,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { copyFile, lstat, mkdir, mkdtemp, readdir, readlink, rm, symlink } from "node:fs/promises";
|
|
1
|
+
import { copyFile, lstat, mkdir, mkdtemp, readdir, readlink, rm, rmdir, symlink, } from "node:fs/promises";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
|
-
import { dirname, join } from "node:path";
|
|
3
|
+
import { dirname, join, sep } from "node:path";
|
|
4
4
|
export class IntegrationStoppedError extends Error {
|
|
5
5
|
stop;
|
|
6
6
|
constructor(stop) {
|
|
@@ -90,13 +90,20 @@ export async function snapshotWorkingFiles(directory, paths) {
|
|
|
90
90
|
* Put `directory` back as the snapshot found it. Given `saved` (the paths the
|
|
91
91
|
* snapshot was limited to), only working files in scope are touched: those
|
|
92
92
|
* listed now (`current`, which includes what the fold created) are removed,
|
|
93
|
-
*
|
|
93
|
+
* the directories that leaves empty and the snapshot does not have are
|
|
94
|
+
* removed, then `saved` is copied back. Whatever the backend left out is not
|
|
95
|
+
* touched. A path that is a directory (a submodule) is neither removed nor
|
|
96
|
+
* copied back.
|
|
94
97
|
*/
|
|
95
98
|
export async function restoreWorkingFiles(directory, backup, saved, current) {
|
|
96
99
|
if (saved !== undefined) {
|
|
97
|
-
|
|
98
|
-
|
|
100
|
+
const listed = current ?? saved;
|
|
101
|
+
for (const path of listed) {
|
|
102
|
+
if ((await pathKind(join(directory, path))) !== "directory") {
|
|
103
|
+
await rm(join(directory, path), { force: true });
|
|
104
|
+
}
|
|
99
105
|
}
|
|
106
|
+
await removeCreatedDirectories(directory, backup, listed);
|
|
100
107
|
await copyPaths(backup, directory, saved);
|
|
101
108
|
return;
|
|
102
109
|
}
|
|
@@ -108,6 +115,30 @@ export async function restoreWorkingFiles(directory, backup, saved, current) {
|
|
|
108
115
|
shouldStop: () => undefined,
|
|
109
116
|
});
|
|
110
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Remove the directories above `paths` that are empty and not in `backup`,
|
|
120
|
+
* deepest first. Only ancestors of listed paths are candidates.
|
|
121
|
+
*/
|
|
122
|
+
async function removeCreatedDirectories(directory, backup, paths) {
|
|
123
|
+
const candidates = new Set();
|
|
124
|
+
for (const path of paths) {
|
|
125
|
+
const parts = path.split("/").slice(0, -1);
|
|
126
|
+
for (let depth = parts.length; depth > 0; depth--) {
|
|
127
|
+
candidates.add(parts.slice(0, depth).join(sep));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const deepestFirst = [...candidates].sort((a, b) => b.split(sep).length - a.split(sep).length);
|
|
131
|
+
for (const relative of deepestFirst) {
|
|
132
|
+
const path = join(directory, relative);
|
|
133
|
+
if ((await pathKind(path)) !== "directory" ||
|
|
134
|
+
(await pathKind(join(backup, relative))) === "directory") {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if ((await readdir(path)).length === 0) {
|
|
138
|
+
await rmdir(path);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
111
142
|
/**
|
|
112
143
|
* Copy each of `paths` from `from` to `to`, creating directories as needed. A
|
|
113
144
|
* path that is not there, or is a directory (a submodule), is skipped: the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working-files.js","sourceRoot":"","sources":["../../src/fold/working-files.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"working-files.js","sourceRoot":"","sources":["../../src/fold/working-files.ts"],"names":[],"mappings":"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"}
|