swarm-deploy 0.1.0 → 0.3.0
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/CHANGELOG.md +60 -0
- package/README.md +780 -50
- package/RELEASING.md +2 -2
- package/SECURITY.md +2 -3
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +182 -25
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +32 -27
- package/dist/client.js +103 -54
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +6 -0
- package/dist/errors.js +6 -0
- package/dist/errors.js.map +1 -1
- package/dist/files.d.ts +13 -28
- package/dist/files.js +13 -78
- package/dist/files.js.map +1 -1
- package/dist/hooks-module.d.ts +9 -0
- package/dist/hooks-module.js +118 -0
- package/dist/hooks-module.js.map +1 -0
- package/dist/hooks.d.ts +69 -0
- package/dist/hooks.js +88 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +8 -4
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/release.d.ts +26 -0
- package/dist/release.js +419 -0
- package/dist/release.js.map +1 -0
- package/dist/server.d.ts +97 -0
- package/dist/server.js +527 -53
- package/dist/server.js.map +1 -1
- package/dist/storage/commit-journal.d.ts +39 -2
- package/dist/storage/commit-journal.js +140 -2
- package/dist/storage/commit-journal.js.map +1 -1
- package/dist/storage/commit-store.d.ts +69 -8
- package/dist/storage/commit-store.js +374 -22
- package/dist/storage/commit-store.js.map +1 -1
- package/dist/storage/layout.js +7 -1
- package/dist/storage/layout.js.map +1 -1
- package/dist/storage/link-store.d.ts +88 -0
- package/dist/storage/link-store.js +448 -0
- package/dist/storage/link-store.js.map +1 -0
- package/dist/storage/recovery.d.ts +2 -1
- package/dist/storage/recovery.js +8 -1
- package/dist/storage/recovery.js.map +1 -1
- package/dist/storage/retention.d.ts +41 -21
- package/dist/storage/retention.js +162 -8
- package/dist/storage/retention.js.map +1 -1
- package/dist/storage/tar-session-store.d.ts +36 -5
- package/dist/storage/tar-session-store.js +283 -55
- package/dist/storage/tar-session-store.js.map +1 -1
- package/dist/storage/tree-fs.d.ts +44 -0
- package/dist/storage/tree-fs.js +580 -0
- package/dist/storage/tree-fs.js.map +1 -0
- package/dist/storage/tree-staging.d.ts +9 -0
- package/dist/storage/tree-staging.js +64 -0
- package/dist/storage/tree-staging.js.map +1 -0
- package/dist/storage/types.d.ts +15 -0
- package/dist/symlinks.d.ts +44 -0
- package/dist/symlinks.js +153 -0
- package/dist/symlinks.js.map +1 -0
- package/dist/tar-protocol/controls.d.ts +52 -0
- package/dist/tar-protocol/controls.js +160 -2
- package/dist/tar-protocol/controls.js.map +1 -1
- package/dist/tar-protocol/direct-wire.d.ts +8 -3
- package/dist/tar-protocol/direct-wire.js +14 -3
- package/dist/tar-protocol/direct-wire.js.map +1 -1
- package/dist/tar-protocol/manifest.d.ts +13 -1
- package/dist/tar-protocol/manifest.js +26 -1
- package/dist/tar-protocol/manifest.js.map +1 -1
- package/dist/tar-protocol/tree-extract.d.ts +37 -0
- package/dist/tar-protocol/tree-extract.js +240 -0
- package/dist/tar-protocol/tree-extract.js.map +1 -0
- package/dist/tar-protocol/tree-manifest.d.ts +45 -0
- package/dist/tar-protocol/tree-manifest.js +277 -0
- package/dist/tar-protocol/tree-manifest.js.map +1 -0
- package/dist/tar-protocol/tree-path.d.ts +15 -0
- package/dist/tar-protocol/tree-path.js +68 -0
- package/dist/tar-protocol/tree-path.js.map +1 -0
- package/dist/tar-protocol/tree.d.ts +68 -0
- package/dist/tar-protocol/tree.js +269 -0
- package/dist/tar-protocol/tree.js.map +1 -0
- package/dist/tar-protocol/ustar.d.ts +14 -0
- package/dist/tar-protocol/ustar.js +81 -1
- package/dist/tar-protocol/ustar.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/package.json +3 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTreeStagingTarget = createTreeStagingTarget;
|
|
4
|
+
const errors_js_1 = require("../errors.js");
|
|
5
|
+
const tree_fs_js_1 = require("./tree-fs.js");
|
|
6
|
+
/**
|
|
7
|
+
* Writes an extracted tree into `treePath`, which must live directly under
|
|
8
|
+
* `parent`. Every path is created exclusively, with no-follow opens, from
|
|
9
|
+
* validated components only, and every call carries the storage layout so the
|
|
10
|
+
* protected directories are refused by identity.
|
|
11
|
+
*/
|
|
12
|
+
function createTreeStagingTarget(treePath, parent, storage, layout) {
|
|
13
|
+
const options = { layout };
|
|
14
|
+
let created = false;
|
|
15
|
+
const ensureRoot = async () => {
|
|
16
|
+
if (created)
|
|
17
|
+
return;
|
|
18
|
+
await (0, tree_fs_js_1.createTreeRoot)(treePath, parent, storage, options);
|
|
19
|
+
created = true;
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
async createDirectory(relativePath) {
|
|
23
|
+
await ensureRoot();
|
|
24
|
+
await (0, tree_fs_js_1.createTreeSubdirectory)(treePath, relativePath, storage, options);
|
|
25
|
+
},
|
|
26
|
+
async createFile(relativePath) {
|
|
27
|
+
await ensureRoot();
|
|
28
|
+
const handle = await (0, tree_fs_js_1.openTreeFile)(treePath, relativePath, storage, options);
|
|
29
|
+
let position = 0;
|
|
30
|
+
return {
|
|
31
|
+
async write(chunk) {
|
|
32
|
+
let offset = 0;
|
|
33
|
+
while (offset < chunk.byteLength) {
|
|
34
|
+
const written = await handle.write(chunk, offset, chunk.byteLength - offset, position + offset);
|
|
35
|
+
const count = typeof written === 'number' ? written : written.bytesWritten;
|
|
36
|
+
if (!Number.isSafeInteger(count) || count <= 0) {
|
|
37
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, 'Unable to write staged tree file');
|
|
38
|
+
}
|
|
39
|
+
offset += count;
|
|
40
|
+
}
|
|
41
|
+
position += chunk.byteLength;
|
|
42
|
+
},
|
|
43
|
+
async close() {
|
|
44
|
+
try {
|
|
45
|
+
await handle.sync();
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
await handle.close();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
async complete() {
|
|
54
|
+
await ensureRoot();
|
|
55
|
+
await (0, tree_fs_js_1.syncTreeDirectories)(treePath, storage);
|
|
56
|
+
},
|
|
57
|
+
async abort() {
|
|
58
|
+
if (!created)
|
|
59
|
+
return;
|
|
60
|
+
await (0, tree_fs_js_1.removeTree)(treePath, parent, storage, options).catch(() => { });
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=tree-staging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-staging.js","sourceRoot":"","sources":["../../src/storage/tree-staging.ts"],"names":[],"mappings":";;;AAAA,4CAAuD;AAEvD,6CAMqB;AAGrB;;;;;GAKG;AACH,iCACE,QAAgB,EAChB,MAAc,EACd,OAAuB,EACvB,MAAqB;IAErB,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,CAAA;IAC1B,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;QAC3C,IAAI,OAAO;YAAE,OAAM;QACnB,MAAM,IAAA,2BAAc,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACxD,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC,CAAA;IACD,OAAO;QACL,KAAK,CAAC,eAAe,CAAC,YAAoB;YACxC,MAAM,UAAU,EAAE,CAAA;YAClB,MAAM,IAAA,mCAAsB,EAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACxE,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,YAAoB;YACnC,MAAM,UAAU,EAAE,CAAA;YAClB,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAY,EAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YAC3E,IAAI,QAAQ,GAAG,CAAC,CAAA;YAChB,OAAO;gBACL,KAAK,CAAC,KAAK,CAAC,KAAiB;oBAC3B,IAAI,MAAM,GAAG,CAAC,CAAA;oBACd,OAAO,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;wBACjC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAChC,KAAK,EACL,MAAM,EACN,KAAK,CAAC,UAAU,GAAG,MAAM,EACzB,QAAQ,GAAG,MAAM,CAClB,CAAA;wBACD,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAA;wBAC1E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;4BAC/C,MAAM,IAAI,4BAAgB,CACxB,kBAAM,CAAC,gBAAgB,EACvB,kCAAkC,CACnC,CAAA;wBACH,CAAC;wBACD,MAAM,IAAI,KAAK,CAAA;oBACjB,CAAC;oBACD,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAA;gBAC9B,CAAC;gBACD,KAAK,CAAC,KAAK;oBACT,IAAI,CAAC;wBACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;oBACrB,CAAC;4BAAS,CAAC;wBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;oBACtB,CAAC;gBACH,CAAC;aACF,CAAA;QACH,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,MAAM,UAAU,EAAE,CAAA;YAClB,MAAM,IAAA,gCAAmB,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,CAAC,KAAK;YACT,IAAI,CAAC,OAAO;gBAAE,OAAM;YACpB,MAAM,IAAA,uBAAU,EAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACtE,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/storage/types.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ export interface StorageStats {
|
|
|
2
2
|
dev: number | bigint;
|
|
3
3
|
ino: number | bigint;
|
|
4
4
|
size: number;
|
|
5
|
+
/** Hard-link count; tree primitives reject any file reporting more than one. */
|
|
6
|
+
nlink?: number;
|
|
7
|
+
/** Modification time, compared across hashing when the adapter reports it. */
|
|
8
|
+
mtimeMs?: number;
|
|
5
9
|
isSymbolicLink(): boolean;
|
|
6
10
|
isDirectory(): boolean;
|
|
7
11
|
isFile(): boolean;
|
|
@@ -44,7 +48,14 @@ export interface StorageAdapter {
|
|
|
44
48
|
rmdir(path: string): Promise<void>;
|
|
45
49
|
readdir(path: string): Promise<string[]>;
|
|
46
50
|
statfs?(path: string): Promise<StorageStatFs>;
|
|
51
|
+
/** Required only when symlink rules are configured. */
|
|
52
|
+
symlink?(target: string, path: string): Promise<void>;
|
|
53
|
+
readlink?(path: string): Promise<string>;
|
|
47
54
|
}
|
|
55
|
+
export type SymlinkCapableStorage = StorageAdapter & {
|
|
56
|
+
symlink(target: string, path: string): Promise<void>;
|
|
57
|
+
readlink(path: string): Promise<string>;
|
|
58
|
+
};
|
|
48
59
|
export interface StorageLayout {
|
|
49
60
|
root: string;
|
|
50
61
|
internal: string;
|
|
@@ -54,6 +65,10 @@ export interface StorageLayout {
|
|
|
54
65
|
journals: string;
|
|
55
66
|
/** Private destinations for replacement publications before they are visible. */
|
|
56
67
|
publications: string;
|
|
68
|
+
/** Private managed-symlink ownership records. */
|
|
69
|
+
links: string;
|
|
70
|
+
/** Private destination a managed directory is renamed into before deletion. */
|
|
71
|
+
trash: string;
|
|
57
72
|
lock: string;
|
|
58
73
|
}
|
|
59
74
|
export interface StorageIdentity {
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type CommitRecord } from './storage/commit-journal.js';
|
|
2
|
+
import type { ArtifactKind } from './types.js';
|
|
3
|
+
export declare const MAX_SYMLINK_SELECTOR_BYTES = 200;
|
|
4
|
+
export type SymlinkRule =
|
|
5
|
+
/** An exact managed artifact basename, or `/pattern/` with no flags. */
|
|
6
|
+
{
|
|
7
|
+
selector: string;
|
|
8
|
+
/** The safe basename of an automatically reconciled managed link. */
|
|
9
|
+
name: string;
|
|
10
|
+
} | {
|
|
11
|
+
selector: string;
|
|
12
|
+
/** An omitted name makes this a client-selected target-authorization rule. */
|
|
13
|
+
name?: never;
|
|
14
|
+
};
|
|
15
|
+
export interface CompiledSymlinkRule {
|
|
16
|
+
readonly selector: string;
|
|
17
|
+
/** `null` for a manual target-authorization rule. */
|
|
18
|
+
readonly name: string | null;
|
|
19
|
+
/** The exact target basename, or `null` for a regular-expression selector. */
|
|
20
|
+
readonly exact: string | null;
|
|
21
|
+
matches(name: string): boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface DesiredLink {
|
|
24
|
+
name: string;
|
|
25
|
+
/** Always exactly the selected record's basename. */
|
|
26
|
+
target: string;
|
|
27
|
+
transferId: string;
|
|
28
|
+
targetKind: ArtifactKind;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validates and snapshots operator symlink rules. The regex source is bounded,
|
|
32
|
+
* has no flags, and runs only against validated 100-byte artifact basenames; it
|
|
33
|
+
* is trusted operator configuration, and an invalid one is a startup error.
|
|
34
|
+
*/
|
|
35
|
+
export declare function compileSymlinkRules(rules: Iterable<SymlinkRule> | null | undefined): readonly CompiledSymlinkRule[];
|
|
36
|
+
export declare function symlinkRuleNames(rules: readonly CompiledSymlinkRule[]): ReadonlySet<string>;
|
|
37
|
+
/** Returns whether a safe managed target is authorized by a manual rule. */
|
|
38
|
+
export declare function isManualSymlinkTargetAllowed(rules: readonly CompiledSymlinkRule[], target: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Computes the desired links from validated commit records only. A rule with no
|
|
41
|
+
* match is dormant. Replacement history names never match, and a candidate
|
|
42
|
+
* whose name equals its own link name is skipped.
|
|
43
|
+
*/
|
|
44
|
+
export declare function selectDesiredLinks(rules: readonly CompiledSymlinkRule[], records: readonly CommitRecord[]): DesiredLink[];
|
package/dist/symlinks.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MAX_SYMLINK_SELECTOR_BYTES = void 0;
|
|
7
|
+
exports.compileSymlinkRules = compileSymlinkRules;
|
|
8
|
+
exports.symlinkRuleNames = symlinkRuleNames;
|
|
9
|
+
exports.isManualSymlinkTargetAllowed = isManualSymlinkTargetAllowed;
|
|
10
|
+
exports.selectDesiredLinks = selectDesiredLinks;
|
|
11
|
+
const b4a_1 = __importDefault(require("b4a"));
|
|
12
|
+
const errors_js_1 = require("./errors.js");
|
|
13
|
+
const files_js_1 = require("./files.js");
|
|
14
|
+
const commit_journal_js_1 = require("./storage/commit-journal.js");
|
|
15
|
+
exports.MAX_SYMLINK_SELECTOR_BYTES = 200;
|
|
16
|
+
function invalid(message, cause = null) {
|
|
17
|
+
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, message, cause);
|
|
18
|
+
}
|
|
19
|
+
function assertLinkName(value) {
|
|
20
|
+
if (typeof value !== 'string') {
|
|
21
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.INVALID_FILENAME, 'Invalid symlink name');
|
|
22
|
+
}
|
|
23
|
+
const name = (0, files_js_1.validateBasename)(value);
|
|
24
|
+
if ((0, files_js_1.isReservedHistoryName)(name)) {
|
|
25
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.INVALID_FILENAME, 'Reserved symlink name');
|
|
26
|
+
}
|
|
27
|
+
return name;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validates and snapshots operator symlink rules. The regex source is bounded,
|
|
31
|
+
* has no flags, and runs only against validated 100-byte artifact basenames; it
|
|
32
|
+
* is trusted operator configuration, and an invalid one is a startup error.
|
|
33
|
+
*/
|
|
34
|
+
function compileSymlinkRules(rules) {
|
|
35
|
+
if (rules === null || rules === undefined)
|
|
36
|
+
return Object.freeze([]);
|
|
37
|
+
if (typeof rules === 'string' ||
|
|
38
|
+
typeof rules !== 'object' ||
|
|
39
|
+
typeof rules[Symbol.iterator] !== 'function') {
|
|
40
|
+
throw invalid('Invalid symlink rules');
|
|
41
|
+
}
|
|
42
|
+
const compiled = [];
|
|
43
|
+
const names = new Set();
|
|
44
|
+
const manualSelectors = new Set();
|
|
45
|
+
for (const rule of rules) {
|
|
46
|
+
if (!rule || typeof rule !== 'object' || Array.isArray(rule)) {
|
|
47
|
+
throw invalid('Invalid symlink rule');
|
|
48
|
+
}
|
|
49
|
+
const keys = Object.keys(rule).sort();
|
|
50
|
+
const automatic = keys.length === 2 && keys[0] === 'name' && keys[1] === 'selector';
|
|
51
|
+
const manual = keys.length === 1 && keys[0] === 'selector';
|
|
52
|
+
if (!automatic && !manual) {
|
|
53
|
+
throw invalid('Invalid symlink rule');
|
|
54
|
+
}
|
|
55
|
+
const { selector } = rule;
|
|
56
|
+
if (typeof selector !== 'string' || selector.length === 0) {
|
|
57
|
+
throw invalid('Invalid symlink selector');
|
|
58
|
+
}
|
|
59
|
+
if (b4a_1.default.from(selector).byteLength > exports.MAX_SYMLINK_SELECTOR_BYTES) {
|
|
60
|
+
throw invalid('Invalid symlink selector');
|
|
61
|
+
}
|
|
62
|
+
const name = automatic ? assertLinkName(rule.name) : null;
|
|
63
|
+
if (name === null) {
|
|
64
|
+
if (manualSelectors.has(selector))
|
|
65
|
+
throw invalid('Duplicate symlink rule');
|
|
66
|
+
manualSelectors.add(selector);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
if (names.has(name))
|
|
70
|
+
throw invalid('Duplicate symlink name');
|
|
71
|
+
names.add(name);
|
|
72
|
+
}
|
|
73
|
+
if (selector.length >= 2 && selector.startsWith('/') && selector.endsWith('/')) {
|
|
74
|
+
const source = selector.slice(1, -1);
|
|
75
|
+
if (source.length === 0)
|
|
76
|
+
throw invalid('Invalid symlink selector');
|
|
77
|
+
let pattern;
|
|
78
|
+
try {
|
|
79
|
+
pattern = new RegExp(source);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw invalid('Invalid symlink selector', error);
|
|
83
|
+
}
|
|
84
|
+
compiled.push(Object.freeze({
|
|
85
|
+
selector,
|
|
86
|
+
name,
|
|
87
|
+
exact: null,
|
|
88
|
+
matches: (candidate) => pattern.test(candidate)
|
|
89
|
+
}));
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const exact = (0, files_js_1.validateBasename)(selector);
|
|
93
|
+
if ((0, files_js_1.isReservedHistoryName)(exact))
|
|
94
|
+
throw invalid('Reserved symlink selector');
|
|
95
|
+
if (name !== null && exact === name)
|
|
96
|
+
throw invalid('Symlink selector equals its own name');
|
|
97
|
+
compiled.push(Object.freeze({
|
|
98
|
+
selector,
|
|
99
|
+
name,
|
|
100
|
+
exact,
|
|
101
|
+
matches: (candidate) => candidate === exact
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
return Object.freeze(compiled);
|
|
105
|
+
}
|
|
106
|
+
function symlinkRuleNames(rules) {
|
|
107
|
+
return new Set(rules.flatMap((rule) => (rule.name === null ? [] : [rule.name])));
|
|
108
|
+
}
|
|
109
|
+
/** Returns whether a safe managed target is authorized by a manual rule. */
|
|
110
|
+
function isManualSymlinkTargetAllowed(rules, target) {
|
|
111
|
+
try {
|
|
112
|
+
(0, files_js_1.validateBasename)(target);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
if ((0, files_js_1.isReservedHistoryName)(target))
|
|
118
|
+
return false;
|
|
119
|
+
return rules.some((rule) => rule.name === null && rule.matches(target));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Computes the desired links from validated commit records only. A rule with no
|
|
123
|
+
* match is dormant. Replacement history names never match, and a candidate
|
|
124
|
+
* whose name equals its own link name is skipped.
|
|
125
|
+
*/
|
|
126
|
+
function selectDesiredLinks(rules, records) {
|
|
127
|
+
const desired = [];
|
|
128
|
+
for (const rule of rules) {
|
|
129
|
+
if (rule.name === null)
|
|
130
|
+
continue;
|
|
131
|
+
let selected = null;
|
|
132
|
+
for (const record of records) {
|
|
133
|
+
if ((0, files_js_1.isReservedHistoryName)(record.name))
|
|
134
|
+
continue;
|
|
135
|
+
if (record.name === rule.name)
|
|
136
|
+
continue;
|
|
137
|
+
if (!rule.matches(record.name))
|
|
138
|
+
continue;
|
|
139
|
+
if (selected === null || (0, commit_journal_js_1.compareCommitOrder)(record, selected) < 0)
|
|
140
|
+
selected = record;
|
|
141
|
+
}
|
|
142
|
+
if (selected === null)
|
|
143
|
+
continue;
|
|
144
|
+
desired.push({
|
|
145
|
+
name: rule.name,
|
|
146
|
+
target: selected.name,
|
|
147
|
+
transferId: selected.transferId,
|
|
148
|
+
targetKind: (0, commit_journal_js_1.commitRecordKind)(selected)
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return desired;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=symlinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symlinks.js","sourceRoot":"","sources":["../src/symlinks.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ export declare const MAX_CONTROL_RECORD_BYTES: number;
|
|
|
4
4
|
export interface MetadataRecord {
|
|
5
5
|
v: typeof CONTROL_VERSION;
|
|
6
6
|
name: string;
|
|
7
|
+
sourceParent?: string;
|
|
7
8
|
fileSize: number;
|
|
8
9
|
fileSha256: string;
|
|
9
10
|
tarSize: number;
|
|
@@ -11,6 +12,47 @@ export interface MetadataRecord {
|
|
|
11
12
|
transferId: string;
|
|
12
13
|
reset: boolean;
|
|
13
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* A recursive directory offer. The key set is disjoint from the file record's,
|
|
17
|
+
* so an older server's `exactKeys()` check rejects it before touching storage.
|
|
18
|
+
*/
|
|
19
|
+
export interface TreeMetadataRecord {
|
|
20
|
+
v: typeof CONTROL_VERSION;
|
|
21
|
+
kind: 'directory';
|
|
22
|
+
name: string;
|
|
23
|
+
sourceParent?: string;
|
|
24
|
+
entryCount: number;
|
|
25
|
+
payloadBytes: number;
|
|
26
|
+
treeSha256: string;
|
|
27
|
+
tarSize: number;
|
|
28
|
+
tarSha256: string;
|
|
29
|
+
transferId: string;
|
|
30
|
+
reset: boolean;
|
|
31
|
+
}
|
|
32
|
+
export type AnyMetadataRecord = MetadataRecord | TreeMetadataRecord;
|
|
33
|
+
export declare function isTreeMetadata(value: AnyMetadataRecord): value is TreeMetadataRecord;
|
|
34
|
+
export interface LinkRequestRecord {
|
|
35
|
+
v: typeof CONTROL_VERSION;
|
|
36
|
+
kind: 'link';
|
|
37
|
+
target: string;
|
|
38
|
+
name: string;
|
|
39
|
+
}
|
|
40
|
+
export type LinkResultRecord = {
|
|
41
|
+
v: typeof CONTROL_VERSION;
|
|
42
|
+
status: 'LINKED';
|
|
43
|
+
} | {
|
|
44
|
+
v: typeof CONTROL_VERSION;
|
|
45
|
+
status: 'UNCHANGED';
|
|
46
|
+
} | {
|
|
47
|
+
v: typeof CONTROL_VERSION;
|
|
48
|
+
status: 'FAILED';
|
|
49
|
+
code: ErrorCode;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* The first direct control frame may be an upload offer or a link request.
|
|
53
|
+
* Upload-specific readers remain strict and reject link records.
|
|
54
|
+
*/
|
|
55
|
+
export type FirstControlRecord = AnyMetadataRecord | LinkRequestRecord;
|
|
14
56
|
export type AdmissionRecord = {
|
|
15
57
|
v: typeof CONTROL_VERSION;
|
|
16
58
|
status: 'ACCEPT';
|
|
@@ -39,10 +81,20 @@ export type FinalRecord = {
|
|
|
39
81
|
status: 'FAILED';
|
|
40
82
|
code: ErrorCode;
|
|
41
83
|
};
|
|
84
|
+
export declare function assertSourceParent(value: unknown): asserts value is string;
|
|
42
85
|
export declare function encodeMetadataRecord(value: MetadataRecord): Buffer;
|
|
43
86
|
export declare function decodeMetadataRecord(bytes: Uint8Array): MetadataRecord;
|
|
87
|
+
export declare function encodeTreeMetadataRecord(value: TreeMetadataRecord): Buffer;
|
|
88
|
+
export declare function decodeTreeMetadataRecord(bytes: Uint8Array): TreeMetadataRecord;
|
|
89
|
+
export declare function encodeAnyMetadataRecord(value: AnyMetadataRecord): Buffer;
|
|
90
|
+
export declare function decodeAnyMetadataRecord(bytes: Uint8Array): AnyMetadataRecord;
|
|
91
|
+
export declare function encodeLinkRequestRecord(value: LinkRequestRecord): Buffer;
|
|
92
|
+
export declare function decodeLinkRequestRecord(bytes: Uint8Array): LinkRequestRecord;
|
|
93
|
+
export declare function decodeFirstControlRecord(bytes: Uint8Array): FirstControlRecord;
|
|
44
94
|
export declare function encodeAdmissionRecord(value: AdmissionRecord): Buffer;
|
|
45
95
|
export declare function decodeAdmissionRecord(bytes: Uint8Array): AdmissionRecord;
|
|
46
96
|
export declare function encodeFinalRecord(value: FinalRecord): Buffer;
|
|
47
97
|
export declare function decodeFinalRecord(bytes: Uint8Array): FinalRecord;
|
|
98
|
+
export declare function encodeLinkResultRecord(value: LinkResultRecord): Buffer;
|
|
99
|
+
export declare function decodeLinkResultRecord(bytes: Uint8Array): LinkResultRecord;
|
|
48
100
|
export declare function encodeControlFrame(record: Uint8Array): Buffer;
|
|
@@ -4,22 +4,38 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.MAX_CONTROL_RECORD_BYTES = exports.CONTROL_VERSION = void 0;
|
|
7
|
+
exports.isTreeMetadata = isTreeMetadata;
|
|
8
|
+
exports.assertSourceParent = assertSourceParent;
|
|
7
9
|
exports.encodeMetadataRecord = encodeMetadataRecord;
|
|
8
10
|
exports.decodeMetadataRecord = decodeMetadataRecord;
|
|
11
|
+
exports.encodeTreeMetadataRecord = encodeTreeMetadataRecord;
|
|
12
|
+
exports.decodeTreeMetadataRecord = decodeTreeMetadataRecord;
|
|
13
|
+
exports.encodeAnyMetadataRecord = encodeAnyMetadataRecord;
|
|
14
|
+
exports.decodeAnyMetadataRecord = decodeAnyMetadataRecord;
|
|
15
|
+
exports.encodeLinkRequestRecord = encodeLinkRequestRecord;
|
|
16
|
+
exports.decodeLinkRequestRecord = decodeLinkRequestRecord;
|
|
17
|
+
exports.decodeFirstControlRecord = decodeFirstControlRecord;
|
|
9
18
|
exports.encodeAdmissionRecord = encodeAdmissionRecord;
|
|
10
19
|
exports.decodeAdmissionRecord = decodeAdmissionRecord;
|
|
11
20
|
exports.encodeFinalRecord = encodeFinalRecord;
|
|
12
21
|
exports.decodeFinalRecord = decodeFinalRecord;
|
|
22
|
+
exports.encodeLinkResultRecord = encodeLinkResultRecord;
|
|
23
|
+
exports.decodeLinkResultRecord = decodeLinkResultRecord;
|
|
13
24
|
exports.encodeControlFrame = encodeControlFrame;
|
|
14
25
|
const b4a_1 = __importDefault(require("b4a"));
|
|
15
26
|
const errors_js_1 = require("../errors.js");
|
|
27
|
+
const tree_path_js_1 = require("./tree-path.js");
|
|
16
28
|
const ustar_js_1 = require("./ustar.js");
|
|
17
29
|
exports.CONTROL_VERSION = 1;
|
|
18
30
|
exports.MAX_CONTROL_RECORD_BYTES = 4 * 1024;
|
|
19
31
|
const HEX_32 = /^[0-9a-f]{64}$/;
|
|
20
32
|
const SAFE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,199}$/;
|
|
33
|
+
const SAFE_SOURCE_PARENT = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,199}$/;
|
|
21
34
|
const HISTORY_PREFIX = 'history-';
|
|
22
35
|
const STABLE_CODES = new Set(Object.values(errors_js_1.ERRORS));
|
|
36
|
+
function isTreeMetadata(value) {
|
|
37
|
+
return value.kind === 'directory';
|
|
38
|
+
}
|
|
23
39
|
function invalid(message, cause = null) {
|
|
24
40
|
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, message, cause);
|
|
25
41
|
}
|
|
@@ -54,6 +70,13 @@ function assertName(value) {
|
|
|
54
70
|
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.INVALID_FILENAME, 'Invalid TAR filename');
|
|
55
71
|
}
|
|
56
72
|
}
|
|
73
|
+
function assertSourceParent(value) {
|
|
74
|
+
if (typeof value !== 'string' ||
|
|
75
|
+
!SAFE_SOURCE_PARENT.test(value) ||
|
|
76
|
+
b4a_1.default.from(value).byteLength > 100) {
|
|
77
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.INVALID_FILENAME, 'Invalid source parent');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
57
80
|
function assertStableCode(value) {
|
|
58
81
|
if (typeof value !== 'string' || !STABLE_CODES.has(value))
|
|
59
82
|
throw invalid('Invalid error code');
|
|
@@ -84,7 +107,7 @@ function encodeRecord(value, validate) {
|
|
|
84
107
|
function validateMetadata(value) {
|
|
85
108
|
if (!isRecord(value))
|
|
86
109
|
throw invalid('Metadata record must be an object');
|
|
87
|
-
|
|
110
|
+
const expected = [
|
|
88
111
|
'v',
|
|
89
112
|
'name',
|
|
90
113
|
'fileSize',
|
|
@@ -93,9 +116,16 @@ function validateMetadata(value) {
|
|
|
93
116
|
'tarSha256',
|
|
94
117
|
'transferId',
|
|
95
118
|
'reset'
|
|
96
|
-
]
|
|
119
|
+
];
|
|
120
|
+
if (Object.prototype.hasOwnProperty.call(value, 'sourceParent')) {
|
|
121
|
+
expected.push('sourceParent');
|
|
122
|
+
}
|
|
123
|
+
exactKeys(value, expected);
|
|
97
124
|
assertVersion(value.v);
|
|
98
125
|
assertName(value.name);
|
|
126
|
+
if (Object.prototype.hasOwnProperty.call(value, 'sourceParent')) {
|
|
127
|
+
assertSourceParent(value.sourceParent);
|
|
128
|
+
}
|
|
99
129
|
assertSafeUint(value.fileSize, 'file size');
|
|
100
130
|
assertHex32(value.fileSha256, 'file digest');
|
|
101
131
|
assertSafeUint(value.tarSize, 'TAR size');
|
|
@@ -107,6 +137,91 @@ function validateMetadata(value) {
|
|
|
107
137
|
throw invalid('Invalid reset flag');
|
|
108
138
|
return value;
|
|
109
139
|
}
|
|
140
|
+
const TAR_END_BLOCKS = 2 * ustar_js_1.TAR_BLOCK_BYTES;
|
|
141
|
+
/**
|
|
142
|
+
* The exact set of TAR sizes a canonical generator can produce for these counts.
|
|
143
|
+
*
|
|
144
|
+
* Every entry owns one header block and the archive ends with two zero blocks. Only files carry
|
|
145
|
+
* payload, and each non-empty file pads to a block boundary with at most 511 bytes. At least one
|
|
146
|
+
* file exists when there is any payload, so the unpadded total is `minimum`, and at most
|
|
147
|
+
* `min(entryCount, payloadBytes)` files can each hold a padded tail. Real archives are whole blocks,
|
|
148
|
+
* so the window is the whole-block sizes from `minimum` rounded up to `maximum` rounded down.
|
|
149
|
+
*/
|
|
150
|
+
function assertTreeTarSize(entryCount, payloadBytes, tarSize) {
|
|
151
|
+
if (payloadBytes > entryCount * ustar_js_1.MAX_USTAR_FILE_BYTES)
|
|
152
|
+
throw invalid('Invalid tree payload size');
|
|
153
|
+
if (payloadBytes > 0 && entryCount === 0)
|
|
154
|
+
throw invalid('Invalid tree payload size');
|
|
155
|
+
const base = TAR_END_BLOCKS + ustar_js_1.TAR_BLOCK_BYTES * entryCount;
|
|
156
|
+
const minimum = base + payloadBytes;
|
|
157
|
+
const maximum = minimum + (ustar_js_1.TAR_BLOCK_BYTES - 1) * Math.min(entryCount, payloadBytes);
|
|
158
|
+
const lowest = Math.ceil(minimum / ustar_js_1.TAR_BLOCK_BYTES) * ustar_js_1.TAR_BLOCK_BYTES;
|
|
159
|
+
const highest = Math.floor(maximum / ustar_js_1.TAR_BLOCK_BYTES) * ustar_js_1.TAR_BLOCK_BYTES;
|
|
160
|
+
if (tarSize % ustar_js_1.TAR_BLOCK_BYTES !== 0 || tarSize < lowest || tarSize > highest) {
|
|
161
|
+
throw invalid('Noncanonical TAR size');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function validateTreeMetadata(value) {
|
|
165
|
+
if (!isRecord(value))
|
|
166
|
+
throw invalid('Metadata record must be an object');
|
|
167
|
+
const expected = [
|
|
168
|
+
'v',
|
|
169
|
+
'kind',
|
|
170
|
+
'name',
|
|
171
|
+
'entryCount',
|
|
172
|
+
'payloadBytes',
|
|
173
|
+
'treeSha256',
|
|
174
|
+
'tarSize',
|
|
175
|
+
'tarSha256',
|
|
176
|
+
'transferId',
|
|
177
|
+
'reset'
|
|
178
|
+
];
|
|
179
|
+
if (Object.prototype.hasOwnProperty.call(value, 'sourceParent'))
|
|
180
|
+
expected.push('sourceParent');
|
|
181
|
+
exactKeys(value, expected);
|
|
182
|
+
assertVersion(value.v);
|
|
183
|
+
if (value.kind !== 'directory')
|
|
184
|
+
throw invalid('Invalid artifact kind');
|
|
185
|
+
assertName(value.name);
|
|
186
|
+
if (Object.prototype.hasOwnProperty.call(value, 'sourceParent')) {
|
|
187
|
+
assertSourceParent(value.sourceParent);
|
|
188
|
+
}
|
|
189
|
+
assertSafeUint(value.entryCount, 'tree entry count');
|
|
190
|
+
if (value.entryCount > tree_path_js_1.MAX_TREE_ENTRIES)
|
|
191
|
+
throw invalid('Invalid tree entry count');
|
|
192
|
+
assertSafeUint(value.payloadBytes, 'tree payload size');
|
|
193
|
+
assertHex32(value.treeSha256, 'tree digest');
|
|
194
|
+
assertSafeUint(value.tarSize, 'TAR size');
|
|
195
|
+
assertHex32(value.tarSha256, 'TAR digest');
|
|
196
|
+
assertHex32(value.transferId, 'transfer ID');
|
|
197
|
+
if (typeof value.reset !== 'boolean')
|
|
198
|
+
throw invalid('Invalid reset flag');
|
|
199
|
+
assertTreeTarSize(value.entryCount, value.payloadBytes, value.tarSize);
|
|
200
|
+
return value;
|
|
201
|
+
}
|
|
202
|
+
function validateAnyMetadata(value) {
|
|
203
|
+
if (!isRecord(value))
|
|
204
|
+
throw invalid('Metadata record must be an object');
|
|
205
|
+
return Object.prototype.hasOwnProperty.call(value, 'kind')
|
|
206
|
+
? validateTreeMetadata(value)
|
|
207
|
+
: validateMetadata(value);
|
|
208
|
+
}
|
|
209
|
+
function validateLinkRequest(value) {
|
|
210
|
+
if (!isRecord(value))
|
|
211
|
+
throw invalid('Link request record must be an object');
|
|
212
|
+
exactKeys(value, ['v', 'kind', 'target', 'name']);
|
|
213
|
+
assertVersion(value.v);
|
|
214
|
+
if (value.kind !== 'link')
|
|
215
|
+
throw invalid('Invalid control request kind');
|
|
216
|
+
assertName(value.target);
|
|
217
|
+
assertName(value.name);
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
function validateFirstControl(value) {
|
|
221
|
+
if (!isRecord(value))
|
|
222
|
+
throw invalid('Control record must be an object');
|
|
223
|
+
return value.kind === 'link' ? validateLinkRequest(value) : validateAnyMetadata(value);
|
|
224
|
+
}
|
|
110
225
|
function validateAdmission(value) {
|
|
111
226
|
if (!isRecord(value))
|
|
112
227
|
throw invalid('Admission record must be an object');
|
|
@@ -151,12 +266,49 @@ function validateFinal(value) {
|
|
|
151
266
|
}
|
|
152
267
|
return value;
|
|
153
268
|
}
|
|
269
|
+
function validateLinkResult(value) {
|
|
270
|
+
if (!isRecord(value))
|
|
271
|
+
throw invalid('Link result record must be an object');
|
|
272
|
+
assertVersion(value.v);
|
|
273
|
+
if (value.status === 'LINKED' || value.status === 'UNCHANGED') {
|
|
274
|
+
exactKeys(value, ['v', 'status']);
|
|
275
|
+
}
|
|
276
|
+
else if (value.status === 'FAILED') {
|
|
277
|
+
exactKeys(value, ['v', 'status', 'code']);
|
|
278
|
+
assertStableCode(value.code);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
throw invalid('Invalid link result status');
|
|
282
|
+
}
|
|
283
|
+
return value;
|
|
284
|
+
}
|
|
154
285
|
function encodeMetadataRecord(value) {
|
|
155
286
|
return encodeRecord(value, validateMetadata);
|
|
156
287
|
}
|
|
157
288
|
function decodeMetadataRecord(bytes) {
|
|
158
289
|
return validateMetadata(parseRecord(bytes));
|
|
159
290
|
}
|
|
291
|
+
function encodeTreeMetadataRecord(value) {
|
|
292
|
+
return encodeRecord(value, validateTreeMetadata);
|
|
293
|
+
}
|
|
294
|
+
function decodeTreeMetadataRecord(bytes) {
|
|
295
|
+
return validateTreeMetadata(parseRecord(bytes));
|
|
296
|
+
}
|
|
297
|
+
function encodeAnyMetadataRecord(value) {
|
|
298
|
+
return encodeRecord(value, validateAnyMetadata);
|
|
299
|
+
}
|
|
300
|
+
function decodeAnyMetadataRecord(bytes) {
|
|
301
|
+
return validateAnyMetadata(parseRecord(bytes));
|
|
302
|
+
}
|
|
303
|
+
function encodeLinkRequestRecord(value) {
|
|
304
|
+
return encodeRecord(value, validateLinkRequest);
|
|
305
|
+
}
|
|
306
|
+
function decodeLinkRequestRecord(bytes) {
|
|
307
|
+
return validateLinkRequest(parseRecord(bytes));
|
|
308
|
+
}
|
|
309
|
+
function decodeFirstControlRecord(bytes) {
|
|
310
|
+
return validateFirstControl(parseRecord(bytes));
|
|
311
|
+
}
|
|
160
312
|
function encodeAdmissionRecord(value) {
|
|
161
313
|
return encodeRecord(value, validateAdmission);
|
|
162
314
|
}
|
|
@@ -169,6 +321,12 @@ function encodeFinalRecord(value) {
|
|
|
169
321
|
function decodeFinalRecord(bytes) {
|
|
170
322
|
return validateFinal(parseRecord(bytes));
|
|
171
323
|
}
|
|
324
|
+
function encodeLinkResultRecord(value) {
|
|
325
|
+
return encodeRecord(value, validateLinkResult);
|
|
326
|
+
}
|
|
327
|
+
function decodeLinkResultRecord(bytes) {
|
|
328
|
+
return validateLinkResult(parseRecord(bytes));
|
|
329
|
+
}
|
|
172
330
|
function encodeControlFrame(record) {
|
|
173
331
|
if (!b4a_1.default.isBuffer(record) || record.byteLength === 0)
|
|
174
332
|
throw invalid('Invalid control record');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controls.js","sourceRoot":"","sources":["../../src/tar-protocol/controls.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"controls.js","sourceRoot":"","sources":["../../src/tar-protocol/controls.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAqB;AACrB,4CAAuE;AACvE,iDAAiD;AACjD,yCAAwF;AAE3E,QAAA,eAAe,GAAG,CAAC,CAAA;AACnB,QAAA,wBAAwB,GAAG,CAAC,GAAG,IAAI,CAAA;AAChD,MAAM,MAAM,GAAG,gBAAgB,CAAA;AAC/B,MAAM,SAAS,GAAG,oCAAoC,CAAA;AACtD,MAAM,kBAAkB,GAAG,qCAAqC,CAAA;AAChE,MAAM,cAAc,GAAG,UAAU,CAAA;AACjC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,kBAAM,CAAC,CAAC,CAAA;AAkC3D,wBAA+B,KAAwB;IACrD,OAAQ,KAA4B,CAAC,IAAI,KAAK,WAAW,CAAA;AAC3D,CAAC;AAoCD,SAAS,OAAO,CAAC,OAAe,EAAE,KAAK,GAAY,IAAI;IACrD,OAAO,IAAI,4BAAgB,CAAC,kBAAM,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;AACtE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,SAAS,CAAC,KAA8B,EAAE,QAA2B;IAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IACxC,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAA;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,OAAO,CAAC,kCAAkC,CAAC,CAAA;IACnD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,QAAA,eAAe;QAAE,MAAM,OAAO,CAAC,oCAAoC,CAAC,CAAA;AACpF,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,IAAY;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3E,MAAM,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,IAAY;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAA;AACxF,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QACtB,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;QAChC,aAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,GAAG,EAChC,CAAC;QACD,MAAM,IAAI,4BAAgB,CAAC,kBAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC;AAED,4BAAmC,KAAc;IAC/C,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,aAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,GAAG,EAChC,CAAC;QACD,MAAM,IAAI,4BAAgB,CAAC,kBAAM,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAChG,CAAC;AAED,SAAS,WAAW,CAAC,KAAiB;IACpC,IAAI,CAAC,aAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAC3F,IAAI,KAAK,CAAC,UAAU,GAAG,QAAA,wBAAwB;QAAE,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC1F,IAAI,KAAc,CAAA;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;IAClD,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,kCAAkC,CAAC,CAAA;IACvE,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,YAAY,CAAI,KAAQ,EAAE,QAA+B;IAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,aAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACjD,IAAI,OAAO,CAAC,UAAU,GAAG,QAAA,wBAAwB;QAAE,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC5F,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,mCAAmC,CAAC,CAAA;IACxE,MAAM,QAAQ,GAAG;QACf,GAAG;QACH,MAAM;QACN,UAAU;QACV,YAAY;QACZ,SAAS;QACT,WAAW;QACX,YAAY;QACZ,OAAO;KACR,CAAA;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC/B,CAAC;IACD,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC1B,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;QAChE,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACxC,CAAC;IACD,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAC3C,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAC5C,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACzC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAA,+BAAoB,EAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAA;IAClG,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAC1C,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAC5C,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACzE,OAAO,KAAkC,CAAA;AAC3C,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,GAAG,0BAAe,CAAA;AAE1C;;;;;;;;GAQG;AACH,SAAS,iBAAiB,CAAC,UAAkB,EAAE,YAAoB,EAAE,OAAe;IAClF,IAAI,YAAY,GAAG,UAAU,GAAG,+BAAoB;QAAE,MAAM,OAAO,CAAC,2BAA2B,CAAC,CAAA;IAChG,IAAI,YAAY,GAAG,CAAC,IAAI,UAAU,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,2BAA2B,CAAC,CAAA;IACpF,MAAM,IAAI,GAAG,cAAc,GAAG,0BAAe,GAAG,UAAU,CAAA;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,YAAY,CAAA;IACnC,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,0BAAe,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IACpF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,0BAAe,CAAC,GAAG,0BAAe,CAAA;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,0BAAe,CAAC,GAAG,0BAAe,CAAA;IACvE,IAAI,OAAO,GAAG,0BAAe,KAAK,CAAC,IAAI,OAAO,GAAG,MAAM,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;QAC7E,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACxC,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,mCAAmC,CAAC,CAAA;IACxE,MAAM,QAAQ,GAAG;QACf,GAAG;QACH,MAAM;QACN,MAAM;QACN,YAAY;QACZ,cAAc;QACd,YAAY;QACZ,SAAS;QACT,WAAW;QACX,YAAY;QACZ,OAAO;KACR,CAAA;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9F,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC1B,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;QAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAA;IACtE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;QAChE,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACxC,CAAC;IACD,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;IACpD,IAAI,KAAK,CAAC,UAAU,GAAG,+BAAgB;QAAE,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAClF,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAA;IACvD,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAC5C,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACzC,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAC1C,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;IAC5C,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACzE,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACtE,OAAO,KAAsC,CAAA;AAC/C,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,mCAAmC,CAAC,CAAA;IACxE,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;QACxD,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAC7B,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,uCAAuC,CAAC,CAAA;IAC5E,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAA;IACxE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACxB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACtB,OAAO,KAAqC,CAAA;AAC9C,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,kCAAkC,CAAC,CAAA;IACvE,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;AACxF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,oCAAoC,CAAC,CAAA;IACzE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9B,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAA;IAChE,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAA;QAC3D,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;QAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC9D,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,CAAA;IAClD,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,KAAK,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QAC/E,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAA;IACnC,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACvC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;QACzC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,KAAmC,CAAA;AAC5C,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,gCAAgC,CAAC,CAAA;IACrE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACjC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAA;IACnC,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;QACzC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,KAA+B,CAAA;AACxC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,sCAAsC,CAAC,CAAA;IAC3E,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC9D,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAA;IACnC,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;QACzC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC,4BAA4B,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,KAAoC,CAAA;AAC7C,CAAC;AAED,8BAAqC,KAAqB;IACxD,OAAO,YAAY,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;AAC9C,CAAC;AAED,8BAAqC,KAAiB;IACpD,OAAO,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AAC7C,CAAC;AAED,kCAAyC,KAAyB;IAChE,OAAO,YAAY,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAA;AAClD,CAAC;AAED,kCAAyC,KAAiB;IACxD,OAAO,oBAAoB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,iCAAwC,KAAwB;IAC9D,OAAO,YAAY,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;AACjD,CAAC;AAED,iCAAwC,KAAiB;IACvD,OAAO,mBAAmB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AAChD,CAAC;AAED,iCAAwC,KAAwB;IAC9D,OAAO,YAAY,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;AACjD,CAAC;AAED,iCAAwC,KAAiB;IACvD,OAAO,mBAAmB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AAChD,CAAC;AAED,kCAAyC,KAAiB;IACxD,OAAO,oBAAoB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,+BAAsC,KAAsB;IAC1D,OAAO,YAAY,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;AAC/C,CAAC;AAED,+BAAsC,KAAiB;IACrD,OAAO,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED,2BAAkC,KAAkB;IAClD,OAAO,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;AAC3C,CAAC;AAED,2BAAkC,KAAiB;IACjD,OAAO,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,gCAAuC,KAAuB;IAC5D,OAAO,YAAY,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAA;AAChD,CAAC;AAED,gCAAuC,KAAiB;IACtD,OAAO,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED,4BAAmC,MAAkB;IACnD,IAAI,CAAC,aAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAA;IAC7F,IAAI,MAAM,CAAC,UAAU,GAAG,QAAA,wBAAwB;QAAE,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC3F,MAAM,KAAK,GAAG,aAAG,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;IAC9C,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC,GAAG,IAAI,CAAA;IAC3C,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAA;IACnC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACpB,OAAO,KAAK,CAAA;AACd,CAAC"}
|