@graftsync/adapter-fork 0.0.0-stage → 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Brandon Roberts
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,22 @@
1
+ import { type MechanismAdapter } from '@graftsync/core';
2
+ export declare const MECHANISM = "fork";
3
+ export interface ForkVariant {
4
+ /**
5
+ * Fork branch, fork tag, or commit holding the modification; or `@worktree`: the project's own
6
+ * checkout, uncommitted changes included (repo mode, with the graft living in the fork).
7
+ */
8
+ ref: string;
9
+ /**
10
+ * Upstream version whose tag the modification's commits are based on. In repo mode
11
+ * (`fork.install: none`) it may also be any upstream commit, tag or branch, or `@verified`:
12
+ * the graft's `rootstock.verified` (a version or `version+commit`).
13
+ */
14
+ base: string;
15
+ }
16
+ /** Variant ref: the project's checkout, working tree included (the graft lives in the fork). */
17
+ export declare const WORKTREE = "@worktree";
18
+ /** Variant base: the upstream at `rootstock.verified`. */
19
+ export declare const VERIFIED = "@verified";
20
+ export declare function createForkAdapter(): MechanismAdapter;
21
+ export declare const forkAdapter: MechanismAdapter;
22
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAsBA,OAAO,EAgBL,KAAK,gBAAgB,EAMtB,MAAM,iBAAiB,CAAC;AAoBzB,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gGAAgG;AAChG,eAAO,MAAM,QAAQ,cAAc,CAAC;AACpC,0DAA0D;AAC1D,eAAO,MAAM,QAAQ,cAAc,CAAC;AA8UpC,wBAAgB,iBAAiB,IAAI,gBAAgB,CAyTpD;AAED,eAAO,MAAM,WAAW,kBAAsB,CAAC"}
@@ -0,0 +1,655 @@
1
+ // The fork mechanism: a graft whose modification lives as commits on a fork of the upstream
2
+ // source repository, on top of an upstream release tag.
3
+ //
4
+ // A variant is a small JSON file `{ "ref": "<fork branch, tag or sha>", "base": "<upstream
5
+ // version the commits sit on>" }`. The graft's change is the fork's diff `tag(base)..ref`; every
6
+ // hunk is an anchor, located in the upstream *source* at `tag(target)` (fuzz 0). For a version,
7
+ // Graft rebases that diff onto the target tag, runs the optional build, packs the package with
8
+ // `npm pack`, and installs it through the vendored-tarball override (lockfile-recorded, works
9
+ // with every package manager). Graft never pushes to the fork.
10
+ //
11
+ // Repo mode (`fork.install: none`): the fork is the product itself (a translated docs site, a
12
+ // patched tool run from source), not a dependency. Nothing is installed; the graft is
13
+ // standalone, and its oracle runs in the rebased checkout, which is kept as the local branch
14
+ // `graft/<id>/<version>` in the cache clone. `base` may then also be any upstream commit or ref,
15
+ // since such forks often sit on a commit between releases.
16
+ import { spawnSync } from 'node:child_process';
17
+ import { existsSync, realpathSync } from 'node:fs';
18
+ import { chmod, cp, mkdir, mkdtemp, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
19
+ import os from 'node:os';
20
+ import path from 'node:path';
21
+ import { applyPatch, reversePatch } from 'diff';
22
+ import semver from 'semver';
23
+ import { distinctiveText, GraftError, rankFilesByContent, readInstalledFiles, renderPatch, runCommand, scopeFileDiff, updateGraft, Project, } from '@graftsync/core';
24
+ import { applyToInstalledCopy, describeHunk, installVendoredTarball, locateHunk, manifestRoot, parsePatchFile, patchTarget, tarballContents, vendoredTarballProblems, vendorFileName, VENDOR_DIR, } from '@graftsync/adapter-patch';
25
+ import { binaryChanges, blobId, checkout, commitTo, diff, ensureRepo, git, mergeToBranch, modeChanges, readBlob, replaceSubtree, upstreamTags, resolveForkRef, resolveTag, resolveUpstreamRef, showFile } from './git.js';
26
+ export const MECHANISM = 'fork';
27
+ /** Variant ref: the project's checkout, working tree included (the graft lives in the fork). */
28
+ export const WORKTREE = '@worktree';
29
+ /** Variant base: the upstream at `rootstock.verified`. */
30
+ export const VERIFIED = '@verified';
31
+ function forkConfig(graft) {
32
+ const cfg = graft.frontmatter.fork;
33
+ if (!cfg)
34
+ throw new GraftError(`graft "${graft.id}": mechanism "fork" needs a \`fork:\` block ({ repo, upstream, tag })`, 'fork/config');
35
+ return cfg;
36
+ }
37
+ const tagFor = (cfg, version) => cfg.tag.replaceAll('{version}', version);
38
+ /**
39
+ * The upstream commit a target version names through semver build metadata, e.g.
40
+ * `22.3.0-next.3+57905ca4e6` (version 22.3.0-next.3 for variant ranges, at commit 57905ca4e6):
41
+ * repo mode can then sync to any upstream commit, not just release tags.
42
+ */
43
+ const commitOf = (version) => {
44
+ const build = semver.parse(version)?.build ?? [];
45
+ return build.length === 1 && /^[0-9a-f]{7,40}$/i.test(build[0]) ? build[0] : undefined;
46
+ };
47
+ /** How a target version is shown: its tag, or the commit it names. */
48
+ const targetLabel = (cfg, version) => {
49
+ const sha = commitOf(version);
50
+ return sha ? `commit ${sha}` : tagFor(cfg, version);
51
+ };
52
+ const inPkg = (cfg, file) => (cfg.dir ? `${cfg.dir.replace(/\/+$/, '')}/${file}` : file);
53
+ const repoDir = (project, graft) => path.join(project.cacheDir, 'fork', graft.id);
54
+ const isStandalone = (graft) => graft.frontmatter.fork?.install === 'none';
55
+ const resultBranch = (graft, version) => `graft/${graft.id}/${version}`;
56
+ /** A git URL as is; anything else is a local path, resolved against the project root. */
57
+ const remoteUrl = (project, url) => /^[a-z][a-z0-9+.-]*:\/\//i.test(url) || /^[^/\s]+@[^/\s:]+:/.test(url) ? url : path.resolve(project.root, url);
58
+ /** True when `fork.repo` is the project's own checkout (`repo: .`): the graft lives in the fork. */
59
+ function graftLivesInFork(project, graft) {
60
+ const url = remoteUrl(project, forkConfig(graft).repo);
61
+ if (!path.isAbsolute(url))
62
+ return false;
63
+ try {
64
+ return realpathSync(url) === realpathSync(project.root);
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ /** The project's graft files (without caches and reports), relative to the grafts directory. */
71
+ async function graftFiles(project) {
72
+ const skip = new Set(['.cache', '.report', '.vendor']);
73
+ const out = [];
74
+ const walk = async (dir, rel) => {
75
+ for (const e of await readdir(dir, { withFileTypes: true })) {
76
+ if (!rel && skip.has(e.name))
77
+ continue;
78
+ const abs = path.join(dir, e.name);
79
+ const r = rel ? `${rel}/${e.name}` : e.name;
80
+ if (e.isDirectory())
81
+ await walk(abs, r);
82
+ else if (e.isFile())
83
+ out.push({ rel: r, abs, executable: ((await stat(abs)).mode & 0o111) !== 0 });
84
+ }
85
+ };
86
+ await walk(project.graftsDir, '');
87
+ return out;
88
+ }
89
+ /**
90
+ * `@worktree`: commit the project's working tree (tracked and new files, minus `.grafts/` and
91
+ * ignored files) as an unreferenced snapshot on top of HEAD, without touching the index or
92
+ * HEAD, and fetch it into the cache clone.
93
+ */
94
+ async function snapshotWorktree(project, graft, dir) {
95
+ if (!graftLivesInFork(project, graft)) {
96
+ throw new GraftError(`graft "${graft.id}": "${WORKTREE}" needs the graft to live in the fork (fork.repo: ".")`, 'variant/invalid');
97
+ }
98
+ const root = project.root;
99
+ const tmp = await mkdtemp(path.join(os.tmpdir(), 'graft-snapshot-'));
100
+ const env = { GIT_INDEX_FILE: path.join(tmp, 'index') };
101
+ try {
102
+ const head = (await git(root, ['rev-parse', '--verify', '--quiet', 'HEAD'], { allowFail: true })).stdout.trim();
103
+ if (head)
104
+ await git(root, ['read-tree', head], { env });
105
+ await git(root, ['add', '-A', '--', '.', ':(top,exclude).grafts'], { env });
106
+ const tree = (await git(root, ['write-tree'], { env })).stdout.trim();
107
+ const commit = (await git(root, ['-c', 'user.name=graft', '-c', 'user.email=graft@localhost', 'commit-tree', tree, ...(head ? ['-p', head] : []), '-m', 'graft: working tree snapshot'])).stdout.trim();
108
+ const ref = `refs/graft/worktree/${graft.id}`;
109
+ await git(root, ['update-ref', ref, commit]);
110
+ await git(dir, ['fetch', '--quiet', '--force', 'fork', `+${ref}:refs/graft-worktree/${graft.id}`]);
111
+ return commit;
112
+ }
113
+ finally {
114
+ await rm(tmp, { recursive: true, force: true });
115
+ }
116
+ }
117
+ /** True when the variant selected for `version` is relative to `rootstock.verified` in the graft's own fork. */
118
+ async function relativeToVerified(project, graft, version) {
119
+ if (!isStandalone(graft) || !graftLivesInFork(project, graft))
120
+ return false;
121
+ const ref = project.selectVariant(graft, version);
122
+ return !!ref && (await loadVariant(graft, ref).catch(() => undefined))?.base === VERIFIED;
123
+ }
124
+ /**
125
+ * The project's graft files with `update` applied to `graft`'s graft.md, in a scratch copy (the
126
+ * project itself is untouched). The caller disposes the copy.
127
+ */
128
+ async function updatedGraftFiles(project, graft, adapter, update) {
129
+ if (!update)
130
+ return { files: await graftFiles(project), dispose: async () => { } };
131
+ const tmp = await mkdtemp(path.join(os.tmpdir(), 'graft-copy-'));
132
+ const rel = path.relative(project.root, project.graftsDir);
133
+ for (const f of await graftFiles(project)) {
134
+ const dest = path.join(tmp, rel, f.rel);
135
+ await mkdir(path.dirname(dest), { recursive: true });
136
+ await cp(f.abs, dest);
137
+ }
138
+ const copy = await Project.open({ root: tmp, adapters: [adapter] });
139
+ await updateGraft(copy, graft.id, update);
140
+ return { files: await graftFiles(copy), dispose: () => rm(tmp, { recursive: true, force: true }) };
141
+ }
142
+ async function fetchRepos(project, graft) {
143
+ const cfg = forkConfig(graft);
144
+ const dir = repoDir(project, graft);
145
+ await ensureRepo(dir, remoteUrl(project, cfg.repo), remoteUrl(project, cfg.upstream));
146
+ return dir;
147
+ }
148
+ async function loadVariant(graft, variant) {
149
+ const standalone = isStandalone(graft);
150
+ if (!existsSync(variant.path))
151
+ throw new GraftError(`graft "${graft.id}": variant ${variant.module} not found`, 'variant/not-found');
152
+ let v;
153
+ try {
154
+ v = JSON.parse(await readFile(variant.path, 'utf8'));
155
+ }
156
+ catch (err) {
157
+ throw new GraftError(`graft "${graft.id}": ${variant.module} is not valid JSON: ${err.message}`, 'variant/invalid');
158
+ }
159
+ if (typeof v.ref !== 'string' || !v.ref || v.ref === 'TODO') {
160
+ throw new GraftError(`graft "${graft.id}": ${variant.module} must name the fork ref holding the modification ("ref")`, 'variant/invalid');
161
+ }
162
+ if (!standalone && (v.ref === WORKTREE || v.base === VERIFIED)) {
163
+ throw new GraftError(`graft "${graft.id}": ${variant.module}: "${WORKTREE}" and "${VERIFIED}" are for repo mode (fork.install: none)`, 'variant/invalid');
164
+ }
165
+ if (typeof v.base !== 'string' || !v.base || v.base === 'TODO' || (!standalone && !semver.valid(v.base))) {
166
+ throw new GraftError(`graft "${graft.id}": ${variant.module} must give "base", the upstream version${standalone ? ' (or commit)' : ''} the fork's commits sit on`, 'variant/invalid');
167
+ }
168
+ return { ref: v.ref, base: v.base };
169
+ }
170
+ async function upstreamRev(dir, cfg, version) {
171
+ const sha = commitOf(version);
172
+ if (sha) {
173
+ const rev = await resolveUpstreamRef(dir, sha);
174
+ if (!rev)
175
+ throw new GraftError(`upstream commit ${sha} (from version ${version}) not found in ${cfg.upstream}`, 'fork/no-commit');
176
+ return rev;
177
+ }
178
+ const tag = tagFor(cfg, version);
179
+ const rev = await resolveTag(dir, tag);
180
+ if (!rev) {
181
+ throw new GraftError(`upstream tag "${tag}" not found in ${cfg.upstream} for version ${version}` +
182
+ (cfg.tag === 'v{version}' ? ' (if upstream tags releases without a "v", set fork.tag: "{version}")' : ''), 'fork/no-tag');
183
+ }
184
+ return rev;
185
+ }
186
+ /** The upstream commit a variant's base names: a version's tag, or (repo mode) any upstream ref. */
187
+ async function baseRevision(dir, graft, base) {
188
+ const cfg = forkConfig(graft);
189
+ if (base === VERIFIED) {
190
+ const verified = graft.frontmatter.rootstock.verified;
191
+ return { rev: await upstreamRev(dir, cfg, verified), label: `${targetLabel(cfg, verified)} (verified)` };
192
+ }
193
+ if (semver.valid(base) && (!isStandalone(graft) || (await resolveTag(dir, tagFor(cfg, base))))) {
194
+ return { rev: await upstreamRev(dir, cfg, base), label: tagFor(cfg, base) };
195
+ }
196
+ const rev = await resolveUpstreamRef(dir, base);
197
+ if (!rev)
198
+ throw new GraftError(`graft "${graft.id}": base "${base}" is neither a tag nor a commit in ${cfg.upstream}`, 'fork/no-base');
199
+ return { rev, label: base };
200
+ }
201
+ /** The graft's change: the fork's diff from its base tag to its ref, as file patches. */
202
+ async function forkChange(project, graft, ref) {
203
+ const cfg = forkConfig(graft);
204
+ const variant = await loadVariant(graft, ref);
205
+ const dir = await fetchRepos(project, graft);
206
+ const base = await baseRevision(dir, graft, variant.base);
207
+ const refRev = variant.ref === WORKTREE ? await snapshotWorktree(project, graft, dir) : await resolveForkRef(dir, variant.ref);
208
+ if (!refRev)
209
+ throw new GraftError(`graft "${graft.id}": fork ref "${variant.ref}" not found in ${cfg.repo}`, 'fork/no-ref');
210
+ const binaryFiles = new Set(await binaryChanges(dir, base.rev, refRev, cfg.dir));
211
+ const patches = parsePatchFile(await diff(dir, base.rev, refRev, cfg.dir)).filter((p) => !binaryFiles.has(patchTarget(p)) && (p.hunks.length > 0 || p.oldFile === null || p.newFile === null));
212
+ const binaries = [];
213
+ for (const file of binaryFiles) {
214
+ binaries.push({ file, baseOid: await blobId(dir, base.rev, inPkg(cfg, file)), refOid: await blobId(dir, refRev, inPkg(cfg, file)) });
215
+ }
216
+ const modes = await modeChanges(dir, base.rev, refRev, cfg.dir);
217
+ if (!patches.length && !binaries.length && !modes.length) {
218
+ throw new GraftError(`graft "${graft.id}": fork ref "${variant.ref}" has no changes on top of ${base.label}; a graft must never apply nothing`, 'fork/empty');
219
+ }
220
+ return { variant, patches, binaries, modes, refRev, baseTag: base.label };
221
+ }
222
+ /** Rebase the fork's change onto the target tag in a fresh checkout (the caller disposes it). */
223
+ async function materialize(project, graft, version, change) {
224
+ const cfg = forkConfig(graft);
225
+ const dir = repoDir(project, graft);
226
+ const targetRev = await upstreamRev(dir, cfg, version);
227
+ const co = await checkout(dir, targetRev);
228
+ const pkgDir = cfg.dir ? path.join(co.path, cfg.dir) : co.path;
229
+ const fail = async (reason) => {
230
+ await co.dispose();
231
+ throw new GraftError(`graft "${graft.id}": the fork's change (${change.variant.ref} on ${change.baseTag}) does not rebase onto ${targetLabel(cfg, version)}: ${reason}`, 'fork/rebase');
232
+ };
233
+ const files = [];
234
+ if (change.patches.length) {
235
+ const r = await applyToInstalledCopy({ dir: pkgDir, version }, change.patches);
236
+ if (r.action !== 'patched')
237
+ await fail(r.reason ?? r.action);
238
+ files.push(...r.files);
239
+ }
240
+ for (const b of change.binaries) {
241
+ if ((await blobId(dir, targetRev, inPkg(cfg, b.file))) !== b.baseOid)
242
+ await fail(`${b.file}: binary file changed upstream since the base`);
243
+ const dest = path.join(pkgDir, b.file);
244
+ if (b.refOid) {
245
+ await mkdir(path.dirname(dest), { recursive: true });
246
+ await writeFile(dest, await readBlob(dir, change.refRev, inPkg(cfg, b.file)));
247
+ }
248
+ else {
249
+ await rm(dest, { force: true });
250
+ }
251
+ files.push(b.file);
252
+ }
253
+ for (const m of change.modes) {
254
+ const file = path.join(pkgDir, m.file);
255
+ if (!existsSync(file))
256
+ continue;
257
+ const mode = (await stat(file)).mode;
258
+ await chmod(file, m.executable ? mode | 0o111 : mode & ~0o111);
259
+ if (!files.includes(m.file))
260
+ files.push(m.file);
261
+ }
262
+ return { root: co.path, pkgDir, files, dispose: co.dispose };
263
+ }
264
+ /** A builder that rebases, builds and packs the fork for `version` into a temp dir. */
265
+ function tarballBuilder(project, graft, version, change) {
266
+ return async () => {
267
+ const cfg = forkConfig(graft);
268
+ const tree = await materialize(project, graft, version, change);
269
+ const tmp = await mkdtemp(path.join(os.tmpdir(), 'graft-fork-pack-'));
270
+ try {
271
+ if (cfg.build) {
272
+ const b = await runCommand(cfg.build, { cwd: tree.pkgDir, timeoutMs: (cfg.timeout ?? 1800) * 1000 });
273
+ if (!b.passed)
274
+ throw new GraftError(`graft "${graft.id}": fork build \`${cfg.build}\` failed (exit ${b.exitCode}):\n${b.output.slice(-3000)}`, 'fork/build');
275
+ }
276
+ // Scripts are not run: `fork.build` is where building happens, explicitly.
277
+ const pack = await runCommand(`npm pack --ignore-scripts --json --pack-destination '${tmp.replaceAll("'", "'\\''")}'`, { cwd: tree.pkgDir, timeoutMs: 10 * 60_000, maxOutput: 2_000_000 });
278
+ if (!pack.passed)
279
+ throw new GraftError(`graft "${graft.id}": npm pack failed:\n${pack.output.slice(-3000)}`, 'fork/pack');
280
+ const json = pack.output.slice(pack.output.indexOf('['));
281
+ const [info] = JSON.parse(json);
282
+ if (!info)
283
+ throw new GraftError(`graft "${graft.id}": npm pack printed no package`, 'fork/pack');
284
+ const pkg = graft.frontmatter.rootstock.package;
285
+ if (info.name !== pkg || info.version !== version) {
286
+ throw new GraftError(`graft "${graft.id}": ${tagFor(cfg, version)} packs as ${info.name}@${info.version}, not ${pkg}@${version}; check fork.tag and fork.dir`, 'fork/pack-mismatch');
287
+ }
288
+ return { file: path.join(tmp, info.filename.replace(/^@/, '').replace('/', '-')), tmp };
289
+ }
290
+ catch (err) {
291
+ await rm(tmp, { recursive: true, force: true });
292
+ throw err;
293
+ }
294
+ finally {
295
+ await tree.dispose();
296
+ }
297
+ };
298
+ }
299
+ const vendorContext = (project) => ({ graftRoot: project.root, installRoot: manifestRoot(project.root) });
300
+ /**
301
+ * A hunk whose change is the very first or last line of the file at the base (no context on
302
+ * that side) gives no evidence about lines upstream has since added there: they sit right
303
+ * against the change (e.g. the fork rewrote a whole page and upstream appended a section).
304
+ * git's merge treats such touching edits as a conflict; so does this. Returns where the new
305
+ * lines are, or undefined.
306
+ */
307
+ function touchesNewUpstreamLines(content, hunk, line) {
308
+ const body = hunk.lines.filter((l) => l[0] !== '\\');
309
+ if (!body.some((l) => l[0] !== ' '))
310
+ return undefined;
311
+ if (body[0][0] !== ' ' && hunk.oldStart <= 1 && line > 1)
312
+ return 'before';
313
+ const oldLen = body.filter((l) => l[0] === ' ' || l[0] === '-').length;
314
+ const total = content.split('\n').length - (content.endsWith('\n') ? 1 : 0);
315
+ if (body.at(-1)[0] !== ' ' && line + oldLen - 1 < total)
316
+ return 'after';
317
+ return undefined;
318
+ }
319
+ /** Anchors for one file patch against the target tag's source. */
320
+ function hunkAnchors(patch, content) {
321
+ const file = patchTarget(patch);
322
+ if (patch.oldFile === null) {
323
+ return [{ name: `${file}#create`, file, description: `creates ${file}`, matched: content === undefined, error: content === undefined ? undefined : 'file already exists upstream' }];
324
+ }
325
+ return patch.hunks.map((hunk, i) => {
326
+ const base = { name: `${file}#${i + 1}`, file, description: describeHunk(hunk) };
327
+ if (content === undefined)
328
+ return { ...base, matched: false, error: 'file missing upstream' };
329
+ const m = locateHunk(content, hunk);
330
+ if (!m.occurrences)
331
+ return { ...base, matched: false, error: 'context or removed lines not found' };
332
+ const edge = touchesNewUpstreamLines(content, hunk, m.line);
333
+ if (edge)
334
+ return { ...base, matched: false, error: `upstream added lines right ${edge} the change`, location: { line: m.line, column: 1, start: 0, end: 0 } };
335
+ return { ...base, matched: true, location: { line: m.line, column: 1, start: 0, end: 0 } };
336
+ });
337
+ }
338
+ export function createForkAdapter() {
339
+ const adapter = {
340
+ name: MECHANISM,
341
+ variantExtension: '.json',
342
+ exclusivePerPackage: true,
343
+ async checkAnchors(ctx, version) {
344
+ const { project, graft } = ctx;
345
+ const pkg = graft.frontmatter.rootstock.package;
346
+ const report = { graft: graft.id, package: pkg, version, variant: null, anchors: [], errors: [], ok: false };
347
+ report.variant = project.selectVariant(graft, version);
348
+ if (!report.variant) {
349
+ report.errors.push(`no variant covers ${pkg}@${version}`);
350
+ return report;
351
+ }
352
+ let change;
353
+ let targetRev;
354
+ try {
355
+ change = await forkChange(project, graft, report.variant);
356
+ targetRev = await upstreamRev(repoDir(project, graft), forkConfig(graft), version);
357
+ }
358
+ catch (err) {
359
+ report.errors.push(err.message);
360
+ return report;
361
+ }
362
+ const cfg = forkConfig(graft);
363
+ const evidence = [];
364
+ let absorbed = true;
365
+ for (const p of change.patches) {
366
+ const file = patchTarget(p);
367
+ const content = await showFile(repoDir(project, graft), targetRev, inPkg(cfg, file));
368
+ const anchors = hunkAnchors(p, content);
369
+ report.anchors.push(...anchors);
370
+ if (content !== undefined && p.oldFile && anchors.every((a) => a.matched) && applyPatch(content, p.raw, { fuzzFactor: 0 }) === false) {
371
+ report.errors.push(`${file}: hunks match individually but the change does not apply as a whole`);
372
+ }
373
+ // Upstream already contains this file's change?
374
+ if (p.oldFile === null)
375
+ absorbed &&= content !== undefined && applyPatch('', p.raw, { fuzzFactor: 0 }) === content;
376
+ else if (p.newFile === null)
377
+ absorbed &&= content === undefined;
378
+ else
379
+ absorbed &&= content !== undefined && applyPatch(content, reversePatch(p.raw), { fuzzFactor: 0 }) !== false;
380
+ if (absorbed)
381
+ evidence.push(`${file}: upstream ${targetLabel(cfg, version)} already contains the fork's change`);
382
+ }
383
+ for (const b of change.binaries) {
384
+ const oid = await blobId(repoDir(project, graft), targetRev, inPkg(cfg, b.file));
385
+ const matched = oid === b.baseOid;
386
+ report.anchors.push({
387
+ name: `${b.file}#binary`,
388
+ file: b.file,
389
+ description: b.refOid ? (b.baseOid ? `replaces binary ${b.file}` : `creates binary ${b.file}`) : `deletes binary ${b.file}`,
390
+ matched,
391
+ ...(matched ? {} : { error: 'binary file changed upstream since the base' }),
392
+ });
393
+ absorbed &&= oid === b.refOid;
394
+ if (oid === b.refOid)
395
+ evidence.push(`${b.file}: upstream ${targetLabel(cfg, version)} already has the fork's version`);
396
+ }
397
+ if (absorbed && report.anchors.some((a) => !a.matched))
398
+ report.upstreamed = { evidence };
399
+ const installed = isStandalone(graft) ? undefined : await project.upstream.installed(pkg);
400
+ if (installed?.version === version && report.anchors.every((a) => a.matched)) {
401
+ const vctx = vendorContext(project);
402
+ report.errors.push(...(await vendoredTarballProblems(vctx, pkg, version, tarballBuilder(project, graft, version, change), `the fork's ${change.variant.ref} rebased onto ${targetLabel(cfg, version)}`)));
403
+ // Whatever the configuration says, the installed files must be the vendored package's.
404
+ const tarball = path.join(vctx.graftRoot, VENDOR_DIR, vendorFileName(pkg, version));
405
+ if (existsSync(tarball)) {
406
+ const expected = await tarballContents(tarball);
407
+ // package.json is skipped: some package managers rewrite it on install (the version is
408
+ // already checked); every other packed file must be byte-identical.
409
+ const files = [...expected.keys()]
410
+ .filter((k) => k.startsWith('package/') && k !== 'package/package.json')
411
+ .map((k) => k.slice('package/'.length));
412
+ const actual = await readInstalledFiles(installed, files);
413
+ for (const f of files) {
414
+ if (actual[f] !== expected.get(`package/${f}`).toString('utf8')) {
415
+ report.errors.push(`installed ${pkg}@${version} ${f} is not the vendored fork build; run \`graft apply\` (or reinstall)`);
416
+ }
417
+ }
418
+ }
419
+ }
420
+ report.ok = report.errors.length === 0 && report.anchors.every((a) => a.matched);
421
+ return report;
422
+ },
423
+ async apply(ctx, options = {}) {
424
+ const { project, graft } = ctx;
425
+ const pkg = graft.frontmatter.rootstock.package;
426
+ const version = options.version ?? (await project.currentVersion(graft));
427
+ const result = { graft: graft.id, version: version ?? '?', variant: null, files: [], errors: [], ok: false };
428
+ if (!version) {
429
+ result.errors.push(`${pkg} is not installed`);
430
+ return result;
431
+ }
432
+ result.variant = project.selectVariant(graft, version);
433
+ if (!result.variant) {
434
+ result.errors.push(`no variant covers ${pkg}@${version}`);
435
+ return result;
436
+ }
437
+ try {
438
+ const change = await forkChange(project, graft, result.variant);
439
+ const tree = await materialize(project, graft, version, change);
440
+ try {
441
+ for (const file of tree.files) {
442
+ const entry = { file, changed: true };
443
+ if (options.outDir && existsSync(path.join(tree.pkgDir, file))) {
444
+ entry.outputPath = path.join(options.outDir, file);
445
+ await mkdir(path.dirname(entry.outputPath), { recursive: true });
446
+ await cp(path.join(tree.pkgDir, file), entry.outputPath);
447
+ }
448
+ result.files.push(entry);
449
+ }
450
+ }
451
+ finally {
452
+ await tree.dispose();
453
+ }
454
+ }
455
+ catch (err) {
456
+ result.errors.push(err.message);
457
+ }
458
+ result.ok = result.errors.length === 0 && result.files.length > 0;
459
+ return result;
460
+ },
461
+ async scopeDiff(ctx, from, to) {
462
+ const { project, graft } = ctx;
463
+ const cfg = forkConfig(graft);
464
+ const pkg = graft.frontmatter.rootstock.package;
465
+ const dir = await fetchRepos(project, graft);
466
+ const label = (v) => `${pkg}@${v} (${targetLabel(cfg, v)})`;
467
+ const fromVariant = project.selectVariant(graft, from);
468
+ const fromChange = fromVariant ? await forkChange(project, graft, fromVariant).catch(() => undefined) : undefined;
469
+ const patches = fromChange?.patches ?? [];
470
+ // Upstream's changes are diffed from the fork's base, which is what the change's hunks are
471
+ // relative to (in repo mode often a commit, not the verified version's tag).
472
+ const fromBase = fromChange ? await baseRevision(dir, graft, fromChange.variant.base) : undefined;
473
+ const fromRev = fromBase?.rev ?? (await upstreamRev(dir, cfg, from));
474
+ const fromLabel = fromBase ? `${pkg} fork base (${fromBase.label})` : label(from);
475
+ const toRev = await upstreamRev(dir, cfg, to);
476
+ const touched = new Set([...(graft.frontmatter.targets ?? []), ...patches.map((p) => p.oldFile).filter((f) => !!f)]);
477
+ const files = [];
478
+ let toTree;
479
+ try {
480
+ for (const file of touched) {
481
+ const [oldText, newText] = [await showFile(dir, fromRev, inPkg(cfg, file)), await showFile(dir, toRev, inPkg(cfg, file))];
482
+ const filePatch = patches.find((p) => p.oldFile === file);
483
+ const regions = (filePatch?.hunks ?? []).map((h, i) => ({
484
+ name: `${file}#${i + 1}`,
485
+ old: [h.oldStart, h.oldStart + Math.max(h.oldLines - 1, 0)],
486
+ }));
487
+ const scoped = scopeFileDiff({ file, oldText, newText, regions, window: 10 });
488
+ if (scoped.status === 'removed' && filePatch?.hunks.length) {
489
+ toTree ??= await checkout(dir, toRev);
490
+ const text = distinctiveText(filePatch.hunks.flatMap((h) => h.lines.filter((l) => l[0] === ' ' || l[0] === '-').map((l) => l.slice(1))));
491
+ const candidates = await rankFilesByContent(cfg.dir ? path.join(toTree.path, cfg.dir) : toTree.path, { ...text });
492
+ if (candidates.length)
493
+ scoped.candidates = candidates;
494
+ }
495
+ files.push(scoped);
496
+ }
497
+ }
498
+ finally {
499
+ await toTree?.dispose();
500
+ }
501
+ return { graft: graft.id, package: pkg, from, to, files, patch: renderPatch(files, { from: fromLabel, to: label(to) }) };
502
+ },
503
+ standalone: isStandalone,
504
+ async workspace(ctx, version) {
505
+ const { project, graft } = ctx;
506
+ const variant = project.selectVariant(graft, version);
507
+ if (!variant)
508
+ throw new GraftError(`graft "${graft.id}": no variant covers ${version}`, 'variant/none');
509
+ const change = await forkChange(project, graft, variant);
510
+ const tree = await materialize(project, graft, version, change);
511
+ const branch = resultBranch(graft, version);
512
+ try {
513
+ await commitTo(tree.root, branch, `${graft.id}: ${change.variant.ref} (on ${change.baseTag}) rebased onto ${targetLabel(forkConfig(graft), version)}\n\nMaterialized by graft; not pushed.`);
514
+ }
515
+ catch (err) {
516
+ await tree.dispose();
517
+ throw err;
518
+ }
519
+ const cache = path.relative(project.root, repoDir(project, graft)) || '.';
520
+ return {
521
+ dir: tree.pkgDir,
522
+ result: `branch \`${branch}\` in ${cache} (\`git fetch ${cache} ${branch}\`)`,
523
+ fetch: { repo: cache, ref: branch },
524
+ dispose: tree.dispose,
525
+ };
526
+ },
527
+ async recordsInResult(ctx, version) {
528
+ return relativeToVerified(ctx.project, ctx.graft, version);
529
+ },
530
+ async afterVerified(ctx, version, update) {
531
+ // Repo mode with the graft living in the fork: the result carries the graft's own files
532
+ // (with the verification recorded), so adopting it keeps them, and keeps them true.
533
+ const { project, graft } = ctx;
534
+ if (!isStandalone(graft) || !graftLivesInFork(project, graft))
535
+ return;
536
+ const dir = repoDir(project, graft);
537
+ const branch = resultBranch(graft, version);
538
+ if (!(await resolveForkRef(dir, `refs/heads/${branch}`)))
539
+ return;
540
+ const copy = await updatedGraftFiles(project, graft, adapter, update);
541
+ try {
542
+ await replaceSubtree(dir, branch, path.relative(project.root, project.graftsDir).split(path.sep).join('/'), copy.files);
543
+ }
544
+ finally {
545
+ await copy.dispose();
546
+ }
547
+ },
548
+ async prepareAgent(ctx, version) {
549
+ const { project, graft } = ctx;
550
+ const variant = project.selectVariant(graft, version) ?? project.selectVariant(graft, graft.frontmatter.rootstock.verified);
551
+ if (!variant)
552
+ return undefined;
553
+ const change = await forkChange(project, graft, variant);
554
+ const dir = repoDir(project, graft);
555
+ const target = await upstreamRev(dir, forkConfig(graft), version);
556
+ const base = await baseRevision(dir, graft, change.variant.base);
557
+ const branch = `${resultBranch(graft, version)}-agent`;
558
+ const label = targetLabel(forkConfig(graft), version);
559
+ const conflicts = await mergeToBranch(dir, base.rev, target, change.refRev, branch, `${graft.id}: ${change.variant.ref} (on ${change.baseTag}) merged onto ${label} for an agent\n\nPrepared by graft; not pushed.`);
560
+ if (await relativeToVerified(project, graft, version)) {
561
+ // The branch is the fork at the new upstream: its graft.md says so (status conflicted until
562
+ // the agent resolves it), so `graft sync` on it verifies the agent's work in place.
563
+ const copy = await updatedGraftFiles(project, graft, adapter, {
564
+ verified: version,
565
+ status: conflicts.length ? 'conflicted' : graft.frontmatter.status,
566
+ history: `Merged onto ${label} by \`graft sync\`${conflicts.length ? `; conflicts to resolve in ${conflicts.join(', ')}` : ''}.`,
567
+ });
568
+ try {
569
+ await replaceSubtree(dir, branch, path.relative(project.root, project.graftsDir).split(path.sep).join('/'), copy.files);
570
+ }
571
+ finally {
572
+ await copy.dispose();
573
+ }
574
+ }
575
+ const cache = path.relative(project.root, dir) || '.';
576
+ const where = `branch \`${branch}\` in ${cache} (\`git fetch ${cache} ${branch}\`): git's merge of the fork's change onto ${label}`;
577
+ return {
578
+ repo: cache,
579
+ ref: branch,
580
+ conflicts,
581
+ description: conflicts.length
582
+ ? `${where}, with conflict markers in ${conflicts.length} file(s): ${conflicts.join(', ')}`
583
+ : `${where}; it merges without conflicts, so check the oracle output and the anchors that missed`,
584
+ };
585
+ },
586
+ async newerVersion(ctx) {
587
+ const { project, graft } = ctx;
588
+ if (!isStandalone(graft))
589
+ return undefined;
590
+ const cfg = forkConfig(graft);
591
+ const dir = await fetchRepos(project, graft);
592
+ const verified = graft.frontmatter.rootstock.verified;
593
+ const verifiedRev = await upstreamRev(dir, cfg, verified).catch(() => undefined);
594
+ if (cfg.track) {
595
+ // Follow a branch: its tip, labelled with the version in its package.json (else the newest tag).
596
+ const tip = await resolveUpstreamRef(dir, cfg.track);
597
+ if (!tip || tip === verifiedRev)
598
+ return undefined;
599
+ let version = semver.valid(JSON.parse((await showFile(dir, tip, inPkg(cfg, 'package.json')).catch(() => undefined)) ?? '{}').version ?? '');
600
+ version ??= (await upstreamTags(dir, cfg.tag)).at(-1) ?? semver.parse(verified).version;
601
+ return { version: `${version}+${tip.slice(0, 12)}`, tag: `branch ${cfg.track}` };
602
+ }
603
+ const newer = (await upstreamTags(dir, cfg.tag)).filter((v) => semver.gt(v, verified));
604
+ const version = newer.at(-1);
605
+ return version ? { version, tag: tagFor(cfg, version) } : undefined;
606
+ },
607
+ async beforeInstall(ctx, version) {
608
+ const { project, graft } = ctx;
609
+ if (isStandalone(graft))
610
+ throw new GraftError(`graft "${graft.id}": fork.install is "none"; nothing is installed`, 'fork/standalone');
611
+ if (commitOf(version))
612
+ throw new GraftError(`graft "${graft.id}": commit targets (${version}) are only for repo mode (fork.install: none); installs need a release tag`, 'fork/commit-target');
613
+ const variant = project.selectVariant(graft, version);
614
+ if (!variant)
615
+ throw new GraftError(`graft "${graft.id}": no variant covers ${version}`, 'variant/none');
616
+ const change = await forkChange(project, graft, variant);
617
+ await installVendoredTarball(vendorContext(project), graft.frontmatter.rootstock.package, version, tarballBuilder(project, graft, version, change));
618
+ // A targeted `add <pkg>@<version>` would replace the vendored override.
619
+ return { install: 'reinstall' };
620
+ },
621
+ async validateVariant(ctx, variant) {
622
+ await forkChange(ctx.project, ctx.graft, variant);
623
+ },
624
+ variantTemplate({ options }) {
625
+ // In place, the variant never changes: this checkout against the upstream it last verified.
626
+ const variant = options.inPlace ? { ref: WORKTREE, base: VERIFIED } : { ref: 'TODO', base: 'TODO' };
627
+ return `${JSON.stringify(variant, null, 2)}\n`;
628
+ },
629
+ scaffoldFrontmatter({ id, root, modes, options }) {
630
+ const inPlace = options.inPlace === true;
631
+ const str = (k) => (typeof options[k] === 'string' ? options[k] : undefined);
632
+ // In place, the fork is this checkout: its `upstream` git remote (if any) names the upstream.
633
+ const upstreamRemote = inPlace ? spawnSync('git', ['remote', 'get-url', 'upstream'], { cwd: root, encoding: 'utf8' }) : undefined;
634
+ const upstream = str('upstream') ?? (upstreamRemote?.status === 0 ? upstreamRemote.stdout.trim() : undefined) ?? 'TODO: git URL of the upstream repo';
635
+ const fork = {
636
+ repo: str('repo') ?? (inPlace ? '.' : 'TODO: git URL of your fork'),
637
+ upstream,
638
+ tag: str('tag') ?? 'v{version}',
639
+ };
640
+ if (inPlace || options.repoMode === true)
641
+ fork.install = 'none';
642
+ if (str('track'))
643
+ fork.track = str('track');
644
+ return {
645
+ fork,
646
+ // A standalone graft's oracle runs in the rebased checkout, which has no .grafts/: point at
647
+ // the graft directory instead.
648
+ ...(fork.install === 'none' ? { oracle: { command: `node "$GRAFT_DIR/oracle.mjs"${modes.length > 1 ? ' {mode}' : ''}`, modes } } : {}),
649
+ };
650
+ },
651
+ };
652
+ return adapter;
653
+ }
654
+ export const forkAdapter = createForkAdapter();
655
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,wDAAwD;AACxD,EAAE;AACF,2FAA2F;AAC3F,iGAAiG;AACjG,gGAAgG;AAChG,+FAA+F;AAC/F,8FAA8F;AAC9F,+DAA+D;AAC/D,EAAE;AACF,8FAA8F;AAC9F,sFAAsF;AACtF,6FAA6F;AAC7F,iGAAiG;AACjG,2DAA2D;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrG,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EASX,OAAO,GAKR,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,eAAe,EACf,uBAAuB,EACvB,cAAc,EACd,UAAU,GAIX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE1N,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC;AAgBhC,gGAAgG;AAChG,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AACpC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AAEpC,SAAS,UAAU,CAAC,KAAY;IAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;IACnC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,uEAAuE,EAAE,aAAa,CAAC,CAAC;IACzI,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,GAAe,EAAE,OAAe,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAE9F;;;;GAIG;AACH,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAsB,EAAE;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IACjD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC,CAAC;AACF,sEAAsE;AACtE,MAAM,WAAW,GAAG,CAAC,GAAe,EAAE,OAAe,EAAE,EAAE;IACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,GAAe,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7G,MAAM,OAAO,GAAG,CAAC,OAAgB,EAAE,KAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;AAClG,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;AAClF,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,OAAe,EAAE,EAAE,CAAC,SAAS,KAAK,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC;AAEvF,yFAAyF;AACzF,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAE,GAAW,EAAE,EAAE,CAClD,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAEjH,oGAAoG;AACpG,SAAS,gBAAgB,CAAC,OAAgB,EAAE,KAAY;IACtD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,KAAK,UAAU,UAAU,CAAC,OAAgB;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IACvD,MAAM,GAAG,GAAwD,EAAE,CAAC;IACpE,MAAM,IAAI,GAAG,KAAK,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE;QAC9C,KAAK,MAAM,CAAC,IAAI,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAS;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5C,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;iBACnC,IAAI,CAAC,CAAC,MAAM,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC,CAAC;IACF,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,gBAAgB,CAAC,OAAgB,EAAE,KAAY,EAAE,GAAW;IACzE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,OAAO,QAAQ,wDAAwD,EAAE,iBAAiB,CAAC,CAAC;IACrI,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAChH,IAAI,IAAI;YAAE,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACxD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,CACb,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,4BAA4B,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,CAAC,CAAC,CACzK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,uBAAuB,KAAK,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7C,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,GAAG,wBAAwB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACnG,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,gHAAgH;AAChH,KAAK,UAAU,kBAAkB,CAAC,OAAgB,EAAE,KAAY,EAAE,OAAe;IAC/E,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5E,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC;AAC5F,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAAC,OAAgB,EAAE,KAAY,EAAE,OAAyB,EAAE,MAA+B;IACzH,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,CAAC;IAClF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpE,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACrG,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAgB,EAAE,KAAY;IACtD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAY,EAAE,OAAwB;IAC/D,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,cAAc,OAAO,CAAC,MAAM,YAAY,EAAE,mBAAmB,CAAC,CAAC;IACrI,IAAI,CAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAyB,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,uBAAwB,GAAa,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACjI,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;QAC5D,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,0DAA0D,EAAE,iBAAiB,CAAC,CAAC;IAC5I,CAAC;IACD,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,MAAM,QAAQ,UAAU,QAAQ,0CAA0C,EAAE,iBAAiB,CAAC,CAAC;IAC5J,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACzG,MAAM,IAAI,UAAU,CAClB,UAAU,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,0CAA0C,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,4BAA4B,EAC5I,iBAAiB,CAClB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,GAAe,EAAE,OAAe;IACtE,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,UAAU,CAAC,mBAAmB,GAAG,kBAAkB,OAAO,kBAAkB,GAAG,CAAC,QAAQ,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAClI,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,UAAU,CAClB,iBAAiB,GAAG,kBAAkB,GAAG,CAAC,QAAQ,gBAAgB,OAAO,EAAE;YACzE,CAAC,GAAG,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,uEAAuE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3G,aAAa,CACd,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAsBD,oGAAoG;AACpG,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,KAAY,EAAE,IAAY;IACjE,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC;QACtD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC;IAC3G,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;IAC9E,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,YAAY,IAAI,sCAAsC,GAAG,CAAC,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAC;IACvI,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,yFAAyF;AACzF,KAAK,UAAU,UAAU,CAAC,OAAgB,EAAE,KAAY,EAAE,GAAoB;IAC5E,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/H,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,gBAAgB,OAAO,CAAC,GAAG,kBAAkB,GAAG,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;IAC5H,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAC/E,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAC5G,CAAC;IACF,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IACvI,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAChE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACzD,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,gBAAgB,OAAO,CAAC,GAAG,8BAA8B,IAAI,CAAC,KAAK,oCAAoC,EAAE,YAAY,CAAC,CAAC;IAChK,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AAC5E,CAAC;AAED,iGAAiG;AACjG,KAAK,UAAU,WAAW,CAAC,OAAgB,EAAE,KAAY,EAAE,OAAe,EAAE,MAAkB;IAC5F,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;IAC/D,MAAM,IAAI,GAAG,KAAK,EAAE,MAAc,EAAkB,EAAE;QACpD,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAClB,UAAU,KAAK,CAAC,EAAE,yBAAyB,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,MAAM,CAAC,OAAO,0BAA0B,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,MAAM,EAAE,EAClJ,aAAa,CACd,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,oBAAoB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/E,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,+CAA+C,CAAC,CAAC;QAC3I,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;AAC/D,CAAC;AAED,uFAAuF;AACvF,SAAS,cAAc,CAAC,OAAgB,EAAE,KAAY,EAAE,OAAe,EAAE,MAAkB;IACzF,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;gBACrG,IAAI,CAAC,CAAC,CAAC,MAAM;oBAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,mBAAmB,GAAG,CAAC,KAAK,mBAAmB,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YAC/J,CAAC;YACD,2EAA2E;YAC3E,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,wDAAwD,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3L,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,wBAAwB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAC1H,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0D,CAAC;YACzF,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,gCAAgC,EAAE,WAAW,CAAC,CAAC;YACjG,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC;YAChD,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAClD,MAAM,IAAI,UAAU,CAClB,UAAU,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,SAAS,GAAG,IAAI,OAAO,+BAA+B,EACxI,oBAAoB,CACrB,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QAC1F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAiB,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAElI;;;;;;GAMG;AACH,SAAS,uBAAuB,CAAC,OAAe,EAAE,IAAgC,EAAE,IAAY;IAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK;QAAE,OAAO,OAAO,CAAC;IACzE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kEAAkE;AAClE,SAAS,WAAW,CAAC,KAAgB,EAAE,OAA2B;IAChE,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,SAAS,EAAE,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,8BAA8B,EAAE,CAAC,CAAC;IACvL,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACjF,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC9F,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,WAAW;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC;QACpG,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAK,CAAC,CAAC;QAC7D,IAAI,IAAI;YAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,8BAA8B,IAAI,aAAa,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/J,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAqB;QAChC,IAAI,EAAE,SAAS;QACf,gBAAgB,EAAE,OAAO;QACzB,mBAAmB,EAAE,IAAI;QAEzB,KAAK,CAAC,YAAY,CAAC,GAAiB,EAAE,OAAe;YACnD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC;YAChD,MAAM,MAAM,GAAiB,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAC3H,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC;gBAC1D,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,MAAkB,CAAC;YACvB,IAAI,SAAiB,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC1D,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YACrF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;gBAC3C,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;gBACrF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACxC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;gBAChC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;oBACrI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,qEAAqE,CAAC,CAAC;gBACnG,CAAC;gBACD,gDAAgD;gBAChD,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI;oBAAE,QAAQ,KAAK,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;qBAC9G,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI;oBAAE,QAAQ,KAAK,OAAO,KAAK,SAAS,CAAC;;oBAC3D,QAAQ,KAAK,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC;gBACjH,IAAI,QAAQ;oBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,cAAc,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,qCAAqC,CAAC,CAAC;YACnH,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjF,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC;gBAClC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;oBAClB,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,SAAS;oBACxB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE;oBAC3H,OAAO;oBACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC;iBAC7E,CAAC,CAAC;gBACH,QAAQ,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC;gBAC9B,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM;oBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,cAAc,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,iCAAiC,CAAC,CAAC;YACzH,CAAC;YACD,IAAI,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBAAE,MAAM,CAAC,UAAU,GAAG,EAAE,QAAQ,EAAE,CAAC;YAEzF,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC1F,IAAI,SAAS,EAAE,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7E,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,GAAG,CAAC,MAAM,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,cAAc,MAAM,CAAC,OAAO,CAAC,GAAG,iBAAiB,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CACtL,CAAC;gBACF,uFAAuF;gBACvF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpF,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;oBAChD,uFAAuF;oBACvF,oEAAoE;oBACpE,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;yBAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,sBAAsB,CAAC;yBACvE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC1C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;oBAC1D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;wBACtB,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;4BACjE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,OAAO,IAAI,CAAC,qEAAqE,CAAC,CAAC;wBAC5H,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACjF,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,GAAiB,EAAE,OAAO,GAAG,EAAE;YACzC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC;YAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,MAAM,MAAM,GAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAC1H,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC;gBAC9C,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC;gBAC1D,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAChE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAChE,IAAI,CAAC;oBACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBAC9B,MAAM,KAAK,GAAiC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;wBACpE,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;4BAC/D,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;4BACnD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;4BACjE,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;wBAC3D,CAAC;wBACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAClE,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,GAAiB,EAAE,IAAY,EAAE,EAAU;YACzD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;YAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC;YAChD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;YACpE,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAClH,MAAM,OAAO,GAAG,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC;YAC1C,2FAA2F;YAC3F,6EAA6E;YAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAClG,MAAM,OAAO,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;YACrE,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,eAAe,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClF,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1I,MAAM,KAAK,GAAqB,EAAE,CAAC;YACnC,IAAI,MAAwD,CAAC;YAC7D,IAAI,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;oBAC3B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC1H,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;oBAC1D,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;wBACtD,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE;wBACxB,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,CAAqB;qBAChF,CAAC,CAAC,CAAC;oBACJ,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;wBAC3D,MAAM,KAAK,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;wBACtC,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACzI,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;wBAClH,IAAI,UAAU,CAAC,MAAM;4BAAE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;oBACxD,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC;YAC1B,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3H,CAAC;QAED,UAAU,EAAE,YAAY;QAExB,KAAK,CAAC,SAAS,CAAC,GAAiB,EAAE,OAAe;YAChD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,wBAAwB,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;YACxG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,MAAM,CAAC,OAAO,kBAAkB,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,wCAAwC,CAAC,CAAC;YAC/L,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrB,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC;YAC1E,OAAO;gBACL,GAAG,EAAE,IAAI,CAAC,MAAM;gBAChB,MAAM,EAAE,YAAY,MAAM,SAAS,KAAK,iBAAiB,KAAK,IAAI,MAAM,KAAK;gBAC7E,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,GAAiB,EAAE,OAAe;YACtD,OAAO,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,GAAiB,EAAE,OAAe,EAAE,MAAoB;YAC1E,wFAAwF;YACxF,oFAAoF;YACpF,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC;gBAAE,OAAO;YACtE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,GAAG,EAAE,cAAc,MAAM,EAAE,CAAC,CAAC;gBAAE,OAAO;YACjE,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACtE,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1H,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,GAAiB,EAAE,OAAe;YACnD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC5H,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC;YACvD,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,GAAG,EACH,IAAI,CAAC,GAAG,EACR,MAAM,EACN,MAAM,CAAC,MAAM,EACb,MAAM,EACN,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,MAAM,CAAC,OAAO,iBAAiB,KAAK,iDAAiD,CAChI,CAAC;YACF,IAAI,MAAM,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;gBACtD,4FAA4F;gBAC5F,oFAAoF;gBACpF,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;oBAC5D,QAAQ,EAAE,OAAO;oBACjB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM;oBAClE,OAAO,EAAE,eAAe,KAAK,qBAAqB,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,6BAA6B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;iBACjI,CAAC,CAAC;gBACH,IAAI,CAAC;oBACH,MAAM,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1H,CAAC;wBAAS,CAAC;oBACT,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC;YACtD,MAAM,KAAK,GAAG,YAAY,MAAM,SAAS,KAAK,iBAAiB,KAAK,IAAI,MAAM,8CAA8C,KAAK,EAAE,CAAC;YACpI,OAAO;gBACL,IAAI,EAAE,KAAK;gBACX,GAAG,EAAE,MAAM;gBACX,SAAS;gBACT,WAAW,EAAE,SAAS,CAAC,MAAM;oBAC3B,CAAC,CAAC,GAAG,KAAK,8BAA8B,SAAS,CAAC,MAAM,aAAa,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAC3F,CAAC,CAAC,GAAG,KAAK,uFAAuF;aACpG,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,GAAiB;YAClC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC3C,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC;YACtD,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACjF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,iGAAiG;gBACjG,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBACrD,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,WAAW;oBAAE,OAAO,SAAS,CAAC;gBAClD,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC5I,OAAO,KAAK,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC,OAAO,CAAC;gBACzF,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;YACnF,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;YACvF,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,GAAiB,EAAE,OAAe;YACpD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;YAC/B,IAAI,YAAY,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,iDAAiD,EAAE,iBAAiB,CAAC,CAAC;YACtI,IAAI,QAAQ,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,sBAAsB,OAAO,4EAA4E,EAAE,oBAAoB,CAAC,CAAC;YAC/L,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,UAAU,CAAC,UAAU,KAAK,CAAC,EAAE,wBAAwB,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;YACxG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACpJ,wEAAwE;YACxE,OAAO,EAAE,OAAO,EAAE,WAAoB,EAAE,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,GAAiB,EAAE,OAAwB;YAC/D,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,eAAe,CAAC,EAAE,OAAO,EAAE;YACzB,4FAA4F;YAC5F,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACpG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QACjD,CAAC;QAED,mBAAmB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;YAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;YACzC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,OAAO,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACjG,8FAA8F;YAC9F,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAClI,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,oCAAoC,CAAC;YACtJ,MAAM,IAAI,GAA4B;gBACpC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,4BAA4B,CAAC;gBACnE,QAAQ;gBACR,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY;aAChC,CAAC;YACF,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI;gBAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YAChE,IAAI,GAAG,CAAC,OAAO,CAAC;gBAAE,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO;gBACL,IAAI;gBACJ,4FAA4F;gBAC5F,+BAA+B;gBAC/B,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,+BAA+B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvI,CAAC;QACJ,CAAC;KACF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,58 @@
1
+ export declare function git(cwd: string, args: string[], options?: {
2
+ allowFail?: boolean;
3
+ env?: Record<string, string>;
4
+ }): Promise<{
5
+ ok: boolean;
6
+ stdout: string;
7
+ stderr: string;
8
+ }>;
9
+ /** Ensure the cache clone exists with `fork` and `upstream` remotes, fetched (tags + branches). */
10
+ export declare function ensureRepo(dir: string, forkUrl: string, upstreamUrl: string): Promise<void>;
11
+ /** Forget fetch state (tests, or after the fork was updated). */
12
+ export declare function resetFetchCache(): void;
13
+ /** Resolve a commit for a fork ref (branch on the fork, fork tag, or any sha/ref). */
14
+ export declare function resolveForkRef(dir: string, ref: string): Promise<string | undefined>;
15
+ /** Resolve any upstream ref (tag, branch, or commit) to a commit, or undefined. */
16
+ export declare function resolveUpstreamRef(dir: string, ref: string): Promise<string | undefined>;
17
+ /** Resolve an upstream tag to a commit, or undefined. */
18
+ export declare function resolveTag(dir: string, tag: string): Promise<string | undefined>;
19
+ /** Contents of `file` at commit `rev`, or undefined if it doesn't exist there. */
20
+ export declare function showFile(dir: string, rev: string, file: string): Promise<string | undefined>;
21
+ /** Unified diff between two commits, limited to `sub` and with paths relative to it. */
22
+ export declare function diff(dir: string, from: string, to: string, sub?: string): Promise<string>;
23
+ /** Commit everything in worktree `wt` on top of its HEAD and point `branch` (in the cache clone) at it. */
24
+ export declare function commitTo(wt: string, branch: string, message: string): Promise<string>;
25
+ /** Check out `rev` into a fresh temporary directory (a detached worktree). */
26
+ export declare function checkout(dir: string, rev: string): Promise<{
27
+ path: string;
28
+ dispose: () => Promise<void>;
29
+ }>;
30
+ /** Files whose change between two commits is binary (no text hunks), limited to `sub`. */
31
+ export declare function binaryChanges(dir: string, from: string, to: string, sub?: string): Promise<string[]>;
32
+ /** Object id of `file` at `rev`, or undefined when it doesn't exist there. */
33
+ export declare function blobId(dir: string, rev: string, file: string): Promise<string | undefined>;
34
+ /** Raw bytes of `file` at `rev`. */
35
+ export declare function readBlob(dir: string, rev: string, file: string): Promise<Buffer>;
36
+ /** Files whose executable bit the fork sets or clears (including files it creates executable). */
37
+ export declare function modeChanges(dir: string, from: string, to: string, sub?: string): Promise<{
38
+ file: string;
39
+ executable: boolean;
40
+ }[]>;
41
+ /**
42
+ * git's own three-way merge of `theirs` onto `ours` with `base` as the merge base (a rebase of
43
+ * the change base..theirs onto ours), written as a commit on top of `ours` and pointed at by
44
+ * `branch`. Conflicting files keep git's conflict markers. Returns the conflicted paths.
45
+ */
46
+ export declare function mergeToBranch(dir: string, base: string, ours: string, theirs: string, branch: string, message: string): Promise<string[]>;
47
+ /**
48
+ * Replace `prefix/` in the tip commit of `branch` with the files of `srcDir` (amending it, same
49
+ * parent and message). Used to carry the graft's own `.grafts/` into a repo-mode result.
50
+ */
51
+ export declare function replaceSubtree(dir: string, branch: string, prefix: string, files: {
52
+ rel: string;
53
+ abs: string;
54
+ executable: boolean;
55
+ }[]): Promise<void>;
56
+ /** Versions of the upstream tags matching `pattern` (e.g. `v{version}`), ascending. */
57
+ export declare function upstreamTags(dir: string, pattern: string): Promise<string[]>;
58
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
package/dist/git.js ADDED
@@ -0,0 +1,207 @@
1
+ // Minimal git plumbing for the fork mechanism. Everything runs in a cache clone per graft under
2
+ // .grafts/.cache/fork/<id>/, with two remotes: `fork` (the modification) and `upstream`.
3
+ import { execFile } from 'node:child_process';
4
+ import { existsSync } from 'node:fs';
5
+ import { mkdir, mkdtemp, rm } from 'node:fs/promises';
6
+ import os from 'node:os';
7
+ import path from 'node:path';
8
+ import semver from 'semver';
9
+ import { GraftError } from '@graftsync/core';
10
+ const semverValid = (v) => semver.valid(v) !== null;
11
+ const semverCompare = (a, b) => semver.compare(a, b);
12
+ export async function git(cwd, args, options = {}) {
13
+ return new Promise((resolve, reject) => {
14
+ execFile('git', args, { cwd, maxBuffer: 256 * 1024 * 1024, env: { ...process.env, GIT_TERMINAL_PROMPT: '0', ...options.env } }, (err, stdout, stderr) => {
15
+ if (err && !options.allowFail) {
16
+ reject(new GraftError(`git ${args.join(' ')} failed: ${String(stderr || err.message).trim().split('\n').slice(-3).join(' ')}`, 'fork/git'));
17
+ return;
18
+ }
19
+ resolve({ ok: !err, stdout: String(stdout), stderr: String(stderr) });
20
+ });
21
+ });
22
+ }
23
+ /** Fetch both remotes at most once per process per cache dir (agents and sync call this repeatedly). */
24
+ const fetched = new Map();
25
+ /** Ensure the cache clone exists with `fork` and `upstream` remotes, fetched (tags + branches). */
26
+ export async function ensureRepo(dir, forkUrl, upstreamUrl) {
27
+ const key = `${dir}\n${forkUrl}\n${upstreamUrl}`;
28
+ if (!fetched.has(key)) {
29
+ fetched.set(key, (async () => {
30
+ if (!existsSync(path.join(dir, '.git'))) {
31
+ await mkdir(dir, { recursive: true });
32
+ await git(dir, ['init', '--quiet']);
33
+ }
34
+ for (const [name, url] of [['fork', forkUrl], ['upstream', upstreamUrl]]) {
35
+ const has = await git(dir, ['remote', 'get-url', name], { allowFail: true });
36
+ if (!has.ok)
37
+ await git(dir, ['remote', 'add', name, url]);
38
+ else if (has.stdout.trim() !== url)
39
+ await git(dir, ['remote', 'set-url', name, url]);
40
+ }
41
+ await git(dir, ['fetch', '--quiet', '--tags', '--force', 'upstream']);
42
+ await git(dir, ['fetch', '--quiet', '--force', 'fork', '+refs/heads/*:refs/remotes/fork/*', '+refs/tags/*:refs/fork-tags/*']);
43
+ })().catch((err) => {
44
+ fetched.delete(key);
45
+ throw err;
46
+ }));
47
+ }
48
+ return fetched.get(key);
49
+ }
50
+ /** Forget fetch state (tests, or after the fork was updated). */
51
+ export function resetFetchCache() {
52
+ fetched.clear();
53
+ }
54
+ /** Resolve a commit for a fork ref (branch on the fork, fork tag, or any sha/ref). */
55
+ export async function resolveForkRef(dir, ref) {
56
+ for (const candidate of [`refs/remotes/fork/${ref}`, `refs/fork-tags/${ref}`, ref]) {
57
+ const r = await git(dir, ['rev-parse', '--verify', '--quiet', `${candidate}^{commit}`], { allowFail: true });
58
+ if (r.ok && r.stdout.trim())
59
+ return r.stdout.trim();
60
+ }
61
+ return undefined;
62
+ }
63
+ /** Resolve any upstream ref (tag, branch, or commit) to a commit, or undefined. */
64
+ export async function resolveUpstreamRef(dir, ref) {
65
+ for (const candidate of [`refs/tags/${ref}`, `refs/remotes/upstream/${ref}`, ref]) {
66
+ const r = await git(dir, ['rev-parse', '--verify', '--quiet', `${candidate}^{commit}`], { allowFail: true });
67
+ if (r.ok && r.stdout.trim())
68
+ return r.stdout.trim();
69
+ }
70
+ return undefined;
71
+ }
72
+ /** Resolve an upstream tag to a commit, or undefined. */
73
+ export async function resolveTag(dir, tag) {
74
+ const r = await git(dir, ['rev-parse', '--verify', '--quiet', `refs/tags/${tag}^{commit}`], { allowFail: true });
75
+ return r.ok && r.stdout.trim() ? r.stdout.trim() : undefined;
76
+ }
77
+ /** Contents of `file` at commit `rev`, or undefined if it doesn't exist there. */
78
+ export async function showFile(dir, rev, file) {
79
+ const r = await git(dir, ['show', `${rev}:${file}`], { allowFail: true });
80
+ return r.ok ? r.stdout : undefined;
81
+ }
82
+ /** Unified diff between two commits, limited to `sub` and with paths relative to it. */
83
+ export async function diff(dir, from, to, sub) {
84
+ // `.grafts/` is excluded: a fork may carry its own graft definitions (repo mode).
85
+ const args = ['diff', '--no-color', '--no-ext-diff', '--no-renames', '--full-index', from, to, '--', '.', ':(top,exclude).grafts'];
86
+ if (sub)
87
+ args.splice(1, 0, `--relative=${sub}`);
88
+ return (await git(dir, args)).stdout;
89
+ }
90
+ /** Commit everything in worktree `wt` on top of its HEAD and point `branch` (in the cache clone) at it. */
91
+ export async function commitTo(wt, branch, message) {
92
+ await git(wt, ['add', '-A']);
93
+ await git(wt, ['-c', 'user.name=graft', '-c', 'user.email=graft@localhost', '-c', 'commit.gpgsign=false', 'commit', '--quiet', '--no-verify', '--allow-empty', '-m', message]);
94
+ const sha = (await git(wt, ['rev-parse', 'HEAD'])).stdout.trim();
95
+ await git(wt, ['branch', '--force', branch, sha]);
96
+ return sha;
97
+ }
98
+ /** Check out `rev` into a fresh temporary directory (a detached worktree). */
99
+ export async function checkout(dir, rev) {
100
+ const tmp = await mkdtemp(path.join(os.tmpdir(), 'graft-fork-'));
101
+ const wt = path.join(tmp, 'src');
102
+ await git(dir, ['worktree', 'add', '--quiet', '--detach', '--force', wt, rev]);
103
+ return {
104
+ path: wt,
105
+ dispose: async () => {
106
+ await git(dir, ['worktree', 'remove', '--force', wt], { allowFail: true });
107
+ await rm(tmp, { recursive: true, force: true });
108
+ await git(dir, ['worktree', 'prune'], { allowFail: true });
109
+ },
110
+ };
111
+ }
112
+ /** Files whose change between two commits is binary (no text hunks), limited to `sub`. */
113
+ export async function binaryChanges(dir, from, to, sub) {
114
+ const args = ['diff', '--numstat', '--no-renames', '-z', from, to, '--', '.', ':(top,exclude).grafts'];
115
+ if (sub)
116
+ args.splice(1, 0, `--relative=${sub}`);
117
+ const out = (await git(dir, args)).stdout;
118
+ return out
119
+ .split('\0')
120
+ .filter((entry) => entry.startsWith('-\t-\t'))
121
+ .map((entry) => entry.slice(4));
122
+ }
123
+ /** Object id of `file` at `rev`, or undefined when it doesn't exist there. */
124
+ export async function blobId(dir, rev, file) {
125
+ const r = await git(dir, ['rev-parse', '--verify', '--quiet', `${rev}:${file}`], { allowFail: true });
126
+ return r.ok && r.stdout.trim() ? r.stdout.trim() : undefined;
127
+ }
128
+ /** Raw bytes of `file` at `rev`. */
129
+ export async function readBlob(dir, rev, file) {
130
+ return new Promise((resolve, reject) => {
131
+ execFile('git', ['show', `${rev}:${file}`], { cwd: dir, encoding: 'buffer', maxBuffer: 512 * 1024 * 1024 }, (err, stdout) => {
132
+ if (err)
133
+ reject(new GraftError(`git show ${rev}:${file} failed: ${err.message}`, 'fork/git'));
134
+ else
135
+ resolve(stdout);
136
+ });
137
+ });
138
+ }
139
+ /** Files whose executable bit the fork sets or clears (including files it creates executable). */
140
+ export async function modeChanges(dir, from, to, sub) {
141
+ const args = ['diff', '--raw', '--no-renames', '-z', from, to, '--', '.', ':(top,exclude).grafts'];
142
+ if (sub)
143
+ args.splice(1, 0, `--relative=${sub}`);
144
+ const parts = (await git(dir, args)).stdout.split('\0');
145
+ const out = [];
146
+ for (let i = 0; i + 1 < parts.length; i += 2) {
147
+ const [oldMode, newMode, , , status] = parts[i].replace(/^:/, '').split(' ');
148
+ const file = parts[i + 1];
149
+ if (status === 'D' || !newMode || !/^100(644|755)$/.test(newMode))
150
+ continue;
151
+ if (newMode !== oldMode && (status !== 'A' || newMode === '100755'))
152
+ out.push({ file, executable: newMode === '100755' });
153
+ }
154
+ return out;
155
+ }
156
+ const IDENTITY = ['-c', 'user.name=graft', '-c', 'user.email=graft@localhost'];
157
+ /**
158
+ * git's own three-way merge of `theirs` onto `ours` with `base` as the merge base (a rebase of
159
+ * the change base..theirs onto ours), written as a commit on top of `ours` and pointed at by
160
+ * `branch`. Conflicting files keep git's conflict markers. Returns the conflicted paths.
161
+ */
162
+ export async function mergeToBranch(dir, base, ours, theirs, branch, message) {
163
+ const r = await git(dir, ['merge-tree', '--write-tree', '--name-only', '--no-messages', `--merge-base=${base}`, ours, theirs], { allowFail: true });
164
+ const [tree, ...rest] = r.stdout.split('\n');
165
+ if (!tree || !/^[0-9a-f]{40,64}$/.test(tree.trim()))
166
+ throw new GraftError(`git merge-tree failed: ${r.stderr.trim() || r.stdout.trim()}`, 'fork/git');
167
+ const conflicted = r.ok ? [] : [...new Set(rest.map((l) => l.trim()).filter(Boolean))];
168
+ const full = conflicted.length ? `${message}\n\nConflicts (git markers left in place):\n${conflicted.map((f) => `- ${f}`).join('\n')}\n` : message;
169
+ const commit = (await git(dir, [...IDENTITY, 'commit-tree', tree.trim(), '-p', ours, '-m', full])).stdout.trim();
170
+ await git(dir, ['update-ref', `refs/heads/${branch}`, commit]);
171
+ return conflicted;
172
+ }
173
+ /**
174
+ * Replace `prefix/` in the tip commit of `branch` with the files of `srcDir` (amending it, same
175
+ * parent and message). Used to carry the graft's own `.grafts/` into a repo-mode result.
176
+ */
177
+ export async function replaceSubtree(dir, branch, prefix, files) {
178
+ const index = path.join(await mkdtemp(path.join(os.tmpdir(), 'graft-index-')), 'index');
179
+ const env = { GIT_INDEX_FILE: index };
180
+ try {
181
+ await git(dir, ['read-tree', `refs/heads/${branch}`], { env });
182
+ await git(dir, ['rm', '-r', '--cached', '--quiet', '--ignore-unmatch', '--', prefix], { env });
183
+ for (const f of files) {
184
+ const oid = (await git(dir, ['hash-object', '-w', '--', f.abs])).stdout.trim();
185
+ await git(dir, ['update-index', '--add', '--cacheinfo', `${f.executable ? '100755' : '100644'},${oid},${prefix}/${f.rel}`], { env });
186
+ }
187
+ const tree = (await git(dir, ['write-tree'], { env })).stdout.trim();
188
+ const parent = (await git(dir, ['rev-parse', `refs/heads/${branch}^`])).stdout.trim();
189
+ const message = (await git(dir, ['log', '-1', '--format=%B', `refs/heads/${branch}`])).stdout;
190
+ const commit = (await git(dir, [...IDENTITY, 'commit-tree', tree, '-p', parent, '-m', message.trimEnd()])).stdout.trim();
191
+ await git(dir, ['update-ref', `refs/heads/${branch}`, commit]);
192
+ }
193
+ finally {
194
+ await rm(path.dirname(index), { recursive: true, force: true });
195
+ }
196
+ }
197
+ /** Versions of the upstream tags matching `pattern` (e.g. `v{version}`), ascending. */
198
+ export async function upstreamTags(dir, pattern) {
199
+ const [prefix, suffix] = pattern.split('{version}');
200
+ const out = (await git(dir, ['for-each-ref', '--format=%(refname:strip=2)', 'refs/tags'])).stdout.split('\n');
201
+ const versions = out
202
+ .filter((t) => t.startsWith(prefix) && t.endsWith(suffix) && t.length > prefix.length + suffix.length)
203
+ .map((t) => t.slice(prefix.length, t.length - suffix.length))
204
+ .filter((v) => semverValid(v));
205
+ return versions.sort(semverCompare);
206
+ }
207
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { createForkAdapter, forkAdapter, MECHANISM, type ForkVariant } from './adapter.js';
2
+ export { resetFetchCache } from './git.js';
3
+ export { forkAdapter as default } from './adapter.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { createForkAdapter, forkAdapter, MECHANISM } from './adapter.js';
2
+ export { resetFetchCache } from './git.js';
3
+ export { forkAdapter as default } from './adapter.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,48 @@
1
1
  {
2
2
  "name": "@graftsync/adapter-fork",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "description": "Graft fork mechanism: modifications kept as commits on a fork of the upstream repo, rebased and packed per upstream version.",
7
+ "keywords": [
8
+ "graft",
9
+ "fork",
10
+ "git",
11
+ "npm",
12
+ "dependencies"
13
+ ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/brandonroberts/graft.git",
17
+ "directory": "packages/adapters/fork"
18
+ },
19
+ "homepage": "https://github.com/brandonroberts/graft#readme",
20
+ "bugs": "https://github.com/brandonroberts/graft/issues",
21
+ "engines": {
22
+ "node": "^22.22.2 || ^24.15.0 || >=26.0.0"
23
+ },
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js"
28
+ },
29
+ "./package.json": "./package.json"
30
+ },
31
+ "types": "./dist/index.d.ts",
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "dependencies": {
39
+ "diff": "^9.0.0",
40
+ "semver": "^7.8.6",
41
+ "@graftsync/spec": "0.1.1",
42
+ "@graftsync/core": "0.1.1",
43
+ "@graftsync/adapter-patch": "0.1.1"
44
+ },
45
+ "devDependencies": {
46
+ "@types/semver": "^7.8.0"
47
+ }
6
48
  }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.