semantifold 0.9.0 → 0.11.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/README.md +6 -3
- package/bin/semantifold.js +6 -0
- package/build/bin/semantifold.d.ts +3 -0
- package/build/bin/semantifold.d.ts.map +1 -0
- package/build/bin/semantifold.js +5 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +9 -1
- package/build/src/artifact-path.d.ts +16 -0
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +29 -3
- package/build/src/backends/c-check.d.ts +7 -0
- package/build/src/backends/c-check.d.ts.map +1 -0
- package/build/src/backends/c-check.js +65 -0
- package/build/src/backends/check-plan.d.ts +96 -0
- package/build/src/backends/check-plan.d.ts.map +1 -0
- package/build/src/backends/check-plan.js +135 -0
- package/build/src/backends/cpp-check.d.ts +7 -0
- package/build/src/backends/cpp-check.d.ts.map +1 -0
- package/build/src/backends/cpp-check.js +59 -0
- package/build/src/backends/csharp-check.d.ts +7 -0
- package/build/src/backends/csharp-check.d.ts.map +1 -0
- package/build/src/backends/csharp-check.js +125 -0
- package/build/src/backends/csharp.d.ts +1 -0
- package/build/src/backends/csharp.d.ts.map +1 -1
- package/build/src/backends/csharp.js +5 -4
- package/build/src/backends/dart-check.d.ts +7 -0
- package/build/src/backends/dart-check.d.ts.map +1 -0
- package/build/src/backends/dart-check.js +103 -0
- package/build/src/backends/dart.d.ts +2 -0
- package/build/src/backends/dart.d.ts.map +1 -1
- package/build/src/backends/dart.js +5 -5
- package/build/src/backends/go-check.d.ts +7 -0
- package/build/src/backends/go-check.d.ts.map +1 -0
- package/build/src/backends/go-check.js +77 -0
- package/build/src/backends/go.d.ts +1 -0
- package/build/src/backends/go.d.ts.map +1 -1
- package/build/src/backends/go.js +3 -3
- package/build/src/backends/java-check.d.ts +21 -0
- package/build/src/backends/java-check.d.ts.map +1 -0
- package/build/src/backends/java-check.js +73 -0
- package/build/src/backends/javascript-check.d.ts +7 -0
- package/build/src/backends/javascript-check.d.ts.map +1 -0
- package/build/src/backends/javascript-check.js +29 -0
- package/build/src/backends/kotlin-check.d.ts +7 -0
- package/build/src/backends/kotlin-check.d.ts.map +1 -0
- package/build/src/backends/kotlin-check.js +31 -0
- package/build/src/backends/kotlin.d.ts +1 -1
- package/build/src/backends/kotlin.js +2 -2
- package/build/src/backends/php-check.d.ts +7 -0
- package/build/src/backends/php-check.d.ts.map +1 -0
- package/build/src/backends/php-check.js +21 -0
- package/build/src/backends/program.d.ts +7 -0
- package/build/src/backends/program.d.ts.map +1 -1
- package/build/src/backends/program.js +16 -1
- package/build/src/backends/python-check.d.ts +7 -0
- package/build/src/backends/python-check.d.ts.map +1 -0
- package/build/src/backends/python-check.js +28 -0
- package/build/src/backends/ruby-check.d.ts +7 -0
- package/build/src/backends/ruby-check.d.ts.map +1 -0
- package/build/src/backends/ruby-check.js +21 -0
- package/build/src/backends/rust-check.d.ts +7 -0
- package/build/src/backends/rust-check.d.ts.map +1 -0
- package/build/src/backends/rust-check.js +65 -0
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +29 -1
- package/build/src/backends/swift-check.d.ts +7 -0
- package/build/src/backends/swift-check.d.ts.map +1 -0
- package/build/src/backends/swift-check.js +77 -0
- package/build/src/backends/typescript-check.d.ts +7 -0
- package/build/src/backends/typescript-check.d.ts.map +1 -0
- package/build/src/backends/typescript-check.js +33 -0
- package/build/src/backends/zig-check.d.ts +7 -0
- package/build/src/backends/zig-check.d.ts.map +1 -0
- package/build/src/backends/zig-check.js +70 -0
- package/build/src/diagnostic.d.ts +13 -1
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +14 -2
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +23 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +45 -4
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +54 -3
- package/build/src/frontends/program.d.ts +6 -0
- package/build/src/frontends/program.d.ts.map +1 -1
- package/build/src/frontends/program.js +9 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +55 -5
- package/build/src/language-registry.d.ts +54 -0
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +124 -10
- package/build/src/project-build.d.ts +172 -0
- package/build/src/project-build.d.ts.map +1 -0
- package/build/src/project-build.js +320 -0
- package/build/src/project-cli.d.ts +40 -0
- package/build/src/project-cli.d.ts.map +1 -0
- package/build/src/project-cli.js +145 -0
- package/build/src/project-manifest.d.ts +148 -0
- package/build/src/project-manifest.d.ts.map +1 -0
- package/build/src/project-manifest.js +432 -0
- package/build/src/project-reporter.d.ts +81 -0
- package/build/src/project-reporter.d.ts.map +1 -0
- package/build/src/project-reporter.js +293 -0
- package/build/src/project-snapshot.d.ts +129 -0
- package/build/src/project-snapshot.d.ts.map +1 -0
- package/build/src/project-snapshot.js +362 -0
- package/build/src/project-watch-reporter.d.ts +125 -0
- package/build/src/project-watch-reporter.d.ts.map +1 -0
- package/build/src/project-watch-reporter.js +280 -0
- package/build/src/project-watch.d.ts +133 -0
- package/build/src/project-watch.d.ts.map +1 -0
- package/build/src/project-watch.js +839 -0
- package/build/src/publication.d.ts +69 -5
- package/build/src/publication.d.ts.map +1 -1
- package/build/src/publication.js +246 -57
- package/build/src/semantic/effects.js +3 -1
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +11 -1
- package/build/src/semantic/types.d.ts +355 -4
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +92 -3
- package/build/src/semantic/validate.js +18 -1
- package/build/src/subprocess.d.ts +8 -0
- package/build/src/subprocess.d.ts.map +1 -1
- package/build/src/subprocess.js +50 -9
- package/build/src/target-check.d.ts +52 -0
- package/build/src/target-check.d.ts.map +1 -0
- package/build/src/target-check.js +796 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +3 -3
- package/docs/adr-expression-breadth.md +186 -0
- package/docs/architecture.md +3 -1
- package/docs/c.md +4 -0
- package/docs/cpp.md +4 -0
- package/docs/dart.md +4 -0
- package/docs/generated-artifact-publication.md +11 -8
- package/docs/kotlin.md +2 -2
- package/docs/language-support.md +40 -6
- package/docs/parser-qualification.md +1 -1
- package/docs/project-build-cli.md +147 -0
- package/docs/project-watch.md +60 -0
- package/docs/rust.md +4 -0
- package/docs/swift.md +2 -0
- package/docs/testing.md +70 -3
- package/docs/watch-build-pipeline.md +39 -23
- package/docs/zig.md +2 -0
- package/examples/jsdoc-java-watch/expected-output.txt +3 -0
- package/examples/jsdoc-java-watch/semantifold.json +23 -0
- package/examples/jsdoc-java-watch/src/main.js +21 -0
- package/index.js +8 -0
- package/package.json +6 -1
- package/src/artifact-path.js +31 -2
- package/src/backends/c-check.js +80 -0
- package/src/backends/check-plan.js +147 -0
- package/src/backends/cpp-check.js +73 -0
- package/src/backends/csharp-check.js +139 -0
- package/src/backends/csharp.js +4 -3
- package/src/backends/dart-check.js +117 -0
- package/src/backends/dart.js +4 -4
- package/src/backends/go-check.js +89 -0
- package/src/backends/go.js +2 -2
- package/src/backends/java-check.js +77 -0
- package/src/backends/javascript-check.js +33 -0
- package/src/backends/kotlin-check.js +41 -0
- package/src/backends/kotlin.js +1 -1
- package/src/backends/php-check.js +23 -0
- package/src/backends/program.js +17 -0
- package/src/backends/python-check.js +30 -0
- package/src/backends/ruby-check.js +23 -0
- package/src/backends/rust-check.js +78 -0
- package/src/backends/shared.js +30 -0
- package/src/backends/swift-check.js +89 -0
- package/src/backends/typescript-check.js +37 -0
- package/src/backends/zig-check.js +81 -0
- package/src/diagnostic.js +9 -1
- package/src/frontends/java.js +24 -0
- package/src/frontends/javascript-typescript.js +49 -2
- package/src/frontends/php.js +61 -2
- package/src/frontends/program.js +9 -0
- package/src/frontends/ruby.js +62 -2
- package/src/language-registry.js +130 -9
- package/src/project-build.js +353 -0
- package/src/project-cli.js +155 -0
- package/src/project-manifest.js +479 -0
- package/src/project-reporter.js +320 -0
- package/src/project-snapshot.js +403 -0
- package/src/project-watch-reporter.js +303 -0
- package/src/project-watch.js +870 -0
- package/src/publication.js +275 -58
- package/src/semantic/effects.js +1 -0
- package/src/semantic/provenance.js +8 -0
- package/src/semantic/types.js +101 -2
- package/src/semantic/validate.js +26 -0
- package/src/subprocess.js +49 -8
- package/src/target-check.js +844 -0
- package/src/toolchains.js +3 -2
- package/tsconfig.json +1 -1
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* @param {Readonly<Record<string, string>>} input.environment - Exact environment.
|
|
7
7
|
* @param {string} input.executable - Exact executable path.
|
|
8
8
|
* @param {number} input.maxBuffer - Maximum bytes captured per output stream.
|
|
9
|
+
* @param {AbortSignal} [input.signal] - Optional owned cancellation signal.
|
|
9
10
|
* @param {number} input.timeoutMs - Deadline before termination begins.
|
|
10
11
|
* @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
|
|
11
12
|
*/
|
|
@@ -15,6 +16,7 @@ export declare function executeFileWithDeadline(input: {
|
|
|
15
16
|
environment: Readonly<Record<string, string>>;
|
|
16
17
|
executable: string;
|
|
17
18
|
maxBuffer: number;
|
|
19
|
+
signal?: AbortSignal;
|
|
18
20
|
timeoutMs: number;
|
|
19
21
|
}): Promise<{
|
|
20
22
|
stderr: string;
|
|
@@ -35,4 +37,10 @@ export declare function createExecuteFileWithDeadline({ registerSpawnListener }:
|
|
|
35
37
|
* @returns {boolean} Whether the failure belongs to an owned deadline.
|
|
36
38
|
*/
|
|
37
39
|
export declare function exceededOwnedDeadline(error: unknown): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Reports whether this module's cancellation signal initiated termination.
|
|
42
|
+
* @param {unknown} error - Subprocess failure.
|
|
43
|
+
* @returns {boolean} Whether the failure belongs to owned cancellation.
|
|
44
|
+
*/
|
|
45
|
+
export declare function cancelledOwnedProcess(error: unknown): boolean;
|
|
38
46
|
//# sourceMappingURL=subprocess.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/subprocess.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/subprocess.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAT1C;IAAiC,SAAS,EAAlC,SAAS,MAAM,EAAE,CACzB;IAAuB,GAAG,AAA1B,CACA,EADQ,MAAM,CACd;IAAgD,WAAW,EAAnD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACxC;IAAsB,UAAU,EAAxB,MAAM,CACd;IAAsB,SAAS,EAAvB,MAAM,CACd;IAA4B,MAAM,AAAlC,CACA,EADQ,WAAW,CACnB;IAAsB,SAAS,EAAvB,MAAM,CACd;CAE0C,GAFhC,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC,CAIrD;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,EAAC,qBAAqB,EAAC,EAHlE;IAAuG,qBAAqB,EAApH,CAAC,KAAK,EAAE,OAAO,oBAAoB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CACxF;CAEkE,GAFxD,OAAO,uBAAuB,CAI1C;AA8ND;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAHhC,OAGgC,GAF9B,OAAO,CAInB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAHhC,OAGgC,GAF9B,OAAO,CAInB"}
|
package/build/src/subprocess.js
CHANGED
|
@@ -4,6 +4,7 @@ import { StringDecoder } from "node:string_decoder";
|
|
|
4
4
|
const forcedTerminationGraceMs = 250;
|
|
5
5
|
const retainedPipeGraceMs = 250;
|
|
6
6
|
const deadlineFailures = new WeakSet();
|
|
7
|
+
const cancellationFailures = new WeakSet();
|
|
7
8
|
/**
|
|
8
9
|
* Executes one exact file while owning its complete bounded lifecycle.
|
|
9
10
|
* @param {object} input - Process request.
|
|
@@ -12,6 +13,7 @@ const deadlineFailures = new WeakSet();
|
|
|
12
13
|
* @param {Readonly<Record<string, string>>} input.environment - Exact environment.
|
|
13
14
|
* @param {string} input.executable - Exact executable path.
|
|
14
15
|
* @param {number} input.maxBuffer - Maximum bytes captured per output stream.
|
|
16
|
+
* @param {AbortSignal} [input.signal] - Optional owned cancellation signal.
|
|
15
17
|
* @param {number} input.timeoutMs - Deadline before termination begins.
|
|
16
18
|
* @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
|
|
17
19
|
*/
|
|
@@ -33,7 +35,7 @@ export function createExecuteFileWithDeadline({ registerSpawnListener }) {
|
|
|
33
35
|
* @param {(child: import("node:child_process").ChildProcess, listener: () => void) => void} registerSpawnListener - Registers deadline initialization.
|
|
34
36
|
* @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
|
|
35
37
|
*/
|
|
36
|
-
function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, environment, executable, maxBuffer, timeoutMs }, registerSpawnListener) {
|
|
38
|
+
function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, environment, executable, maxBuffer, signal, timeoutMs }, registerSpawnListener) {
|
|
37
39
|
if (process.platform == "win32") {
|
|
38
40
|
return Promise.reject(Object.assign(new Error("Owned process-tree termination is unavailable on this platform."), {
|
|
39
41
|
code: "ENOTSUP",
|
|
@@ -41,6 +43,11 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
|
|
|
41
43
|
stdout: ""
|
|
42
44
|
}));
|
|
43
45
|
}
|
|
46
|
+
if (signal?.aborted) {
|
|
47
|
+
const cancellationError = Object.assign(new Error("Subprocess was cancelled before launch."), { stderr: "", stdout: "" });
|
|
48
|
+
cancellationFailures.add(cancellationError);
|
|
49
|
+
return Promise.reject(cancellationError);
|
|
50
|
+
}
|
|
44
51
|
return new Promise((resolve, reject) => {
|
|
45
52
|
/** @type {ReturnType<typeof setTimeout> | undefined} */
|
|
46
53
|
let deadlineTimer;
|
|
@@ -50,8 +57,10 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
|
|
|
50
57
|
let pipeTimer;
|
|
51
58
|
/** @type {Error | undefined} */
|
|
52
59
|
let launchError;
|
|
60
|
+
let cancellationRequested = false;
|
|
53
61
|
let deadlineExceeded = false;
|
|
54
62
|
let outputExceeded = false;
|
|
63
|
+
let processGroupOwned = false;
|
|
55
64
|
let settled = false;
|
|
56
65
|
const stderr = outputCapture(maxBuffer, () => terminateForOutputLimit());
|
|
57
66
|
const stdout = outputCapture(maxBuffer, () => terminateForOutputLimit());
|
|
@@ -62,8 +71,16 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
|
|
|
62
71
|
stdio: ["ignore", "pipe", "pipe"]
|
|
63
72
|
});
|
|
64
73
|
const processGroupId = child.pid;
|
|
74
|
+
const cancel = () => {
|
|
75
|
+
if (settled || cancellationRequested || deadlineExceeded || outputExceeded)
|
|
76
|
+
return;
|
|
77
|
+
cancellationRequested = true;
|
|
78
|
+
if (processGroupOwned && processGroupId != undefined)
|
|
79
|
+
beginTermination(processGroupId);
|
|
80
|
+
};
|
|
65
81
|
child.stderr.on("data", stderr.receive);
|
|
66
82
|
child.stdout.on("data", stdout.receive);
|
|
83
|
+
signal?.addEventListener("abort", cancel, { once: true });
|
|
67
84
|
child.once("error", (error) => {
|
|
68
85
|
launchError = error;
|
|
69
86
|
});
|
|
@@ -73,14 +90,19 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
|
|
|
73
90
|
child.kill("SIGKILL");
|
|
74
91
|
return;
|
|
75
92
|
}
|
|
93
|
+
processGroupOwned = true;
|
|
94
|
+
if (cancellationRequested) {
|
|
95
|
+
beginTermination(processGroupId);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
76
98
|
deadlineTimer = setTimeout(() => {
|
|
77
|
-
if (settled)
|
|
99
|
+
if (settled || cancellationRequested || deadlineExceeded || outputExceeded)
|
|
78
100
|
return;
|
|
79
101
|
deadlineExceeded = true;
|
|
80
102
|
beginTermination(processGroupId);
|
|
81
103
|
}, timeoutMs);
|
|
82
104
|
});
|
|
83
|
-
child.once("close", (code,
|
|
105
|
+
child.once("close", (code, closeSignal) => {
|
|
84
106
|
settled = true;
|
|
85
107
|
if (deadlineTimer != undefined)
|
|
86
108
|
clearTimeout(deadlineTimer);
|
|
@@ -88,6 +110,7 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
|
|
|
88
110
|
clearTimeout(forceTimer);
|
|
89
111
|
if (pipeTimer != undefined)
|
|
90
112
|
clearTimeout(pipeTimer);
|
|
113
|
+
signal?.removeEventListener("abort", cancel);
|
|
91
114
|
const capturedStderr = stderr.finish();
|
|
92
115
|
const capturedStdout = stdout.finish();
|
|
93
116
|
if (launchError) {
|
|
@@ -96,25 +119,35 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
|
|
|
96
119
|
else if (outputExceeded) {
|
|
97
120
|
reject(Object.assign(new Error(`Subprocess exceeded its ${maxBuffer}-byte output capture limit.`), {
|
|
98
121
|
code: "ERR_CHILD_PROCESS_STDIO_MAXBUFFER",
|
|
99
|
-
signal,
|
|
122
|
+
signal: closeSignal,
|
|
100
123
|
stderr: capturedStderr,
|
|
101
124
|
stdout: capturedStdout
|
|
102
125
|
}));
|
|
103
126
|
}
|
|
127
|
+
else if (cancellationRequested) {
|
|
128
|
+
const cancellationError = Object.assign(new Error("Subprocess was cancelled."), {
|
|
129
|
+
code,
|
|
130
|
+
signal: closeSignal,
|
|
131
|
+
stderr: capturedStderr,
|
|
132
|
+
stdout: capturedStdout
|
|
133
|
+
});
|
|
134
|
+
cancellationFailures.add(cancellationError);
|
|
135
|
+
reject(cancellationError);
|
|
136
|
+
}
|
|
104
137
|
else if (deadlineExceeded) {
|
|
105
138
|
const timeoutError = Object.assign(new Error("Subprocess exceeded its owned deadline."), {
|
|
106
139
|
code,
|
|
107
|
-
signal,
|
|
140
|
+
signal: closeSignal,
|
|
108
141
|
stderr: capturedStderr,
|
|
109
142
|
stdout: capturedStdout
|
|
110
143
|
});
|
|
111
144
|
deadlineFailures.add(timeoutError);
|
|
112
145
|
reject(timeoutError);
|
|
113
146
|
}
|
|
114
|
-
else if (code != 0 ||
|
|
147
|
+
else if (code != 0 || closeSignal != null) {
|
|
115
148
|
reject(Object.assign(new Error("Subprocess failed after launch."), {
|
|
116
149
|
code,
|
|
117
|
-
signal,
|
|
150
|
+
signal: closeSignal,
|
|
118
151
|
stderr: capturedStderr,
|
|
119
152
|
stdout: capturedStdout
|
|
120
153
|
}));
|
|
@@ -124,7 +157,7 @@ function executeFileWithDeadlineUsing({ arguments: processArguments, cwd, enviro
|
|
|
124
157
|
});
|
|
125
158
|
/** Begins bounded termination after output capture crosses its limit. */
|
|
126
159
|
function terminateForOutputLimit() {
|
|
127
|
-
if (
|
|
160
|
+
if (settled || cancellationRequested || deadlineExceeded || outputExceeded)
|
|
128
161
|
return;
|
|
129
162
|
outputExceeded = true;
|
|
130
163
|
if (processGroupId != undefined)
|
|
@@ -230,4 +263,12 @@ function signalOwnedProcessGroup(processGroupId, signal) {
|
|
|
230
263
|
export function exceededOwnedDeadline(error) {
|
|
231
264
|
return typeof error == "object" && error != null && deadlineFailures.has(error);
|
|
232
265
|
}
|
|
233
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VicHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdWJwcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFBO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFBO0FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQUs7SUFDM0MsT0FBTyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxxQkFBcUIsRUFBQztJQUNuRSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQTtBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDRCQUE0QixDQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsRUFBRSxxQkFBcUI7SUFDNUksSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLEVBQUU7WUFDaEgsSUFBSSxFQUFFLFNBQVM7WUFDZixNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQyxD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QixDQUFDLGNBQWMsRUFBRSxNQUFNO0lBQ3JELElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUM7WUFBRSxNQUFNLEtBQUssQ0FBQTtJQUN4RixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBSztJQUN6QyxPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNqRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7c3Bhd259IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IHtTdHJpbmdEZWNvZGVyfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiXG5cbmNvbnN0IGZvcmNlZFRlcm1pbmF0aW9uR3JhY2VNcyA9IDI1MFxuY29uc3QgcmV0YWluZWRQaXBlR3JhY2VNcyA9IDI1MFxuY29uc3QgZGVhZGxpbmVGYWlsdXJlcyA9IG5ldyBXZWFrU2V0KClcblxuLyoqXG4gKiBFeGVjdXRlcyBvbmUgZXhhY3QgZmlsZSB3aGlsZSBvd25pbmcgaXRzIGNvbXBsZXRlIGJvdW5kZWQgbGlmZWN5Y2xlLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gUHJvY2VzcyByZXF1ZXN0LlxuICogQHBhcmFtIHtyZWFkb25seSBzdHJpbmdbXX0gaW5wdXQuYXJndW1lbnRzIC0gRXhhY3QgYXJndW1lbnQgYXJyYXkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0LmN3ZF0gLSBXb3JraW5nIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IGlucHV0LmVudmlyb25tZW50IC0gRXhhY3QgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuZXhlY3V0YWJsZSAtIEV4YWN0IGV4ZWN1dGFibGUgcGF0aC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dC5tYXhCdWZmZXIgLSBNYXhpbXVtIGJ5dGVzIGNhcHR1cmVkIHBlciBvdXRwdXQgc3RyZWFtLlxuICogQHBhcmFtIHtudW1iZXJ9IGlucHV0LnRpbWVvdXRNcyAtIERlYWRsaW5lIGJlZm9yZSB0ZXJtaW5hdGlvbiBiZWdpbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RkZXJyOiBzdHJpbmcsIHN0ZG91dDogc3RyaW5nfT59IE91dHB1dCBhZnRlciB0aGUgb3duZWQgcHJvY2VzcyBncm91cCBjbG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlRmlsZVdpdGhEZWFkbGluZShpbnB1dCkge1xuICByZXR1cm4gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmVVc2luZyhpbnB1dCwgcmVnaXN0ZXJDaGlsZFNwYXduKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXhlY3V0b3Igd2hvc2Ugc3Bhd24gb2JzZXJ2YXRpb24gYmVsb25ncyBvbmx5IHRvIHRoYXQgZXhlY3V0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gZGVwZW5kZW5jaWVzIC0gSW50ZXJuYWwgbGlmZWN5Y2xlIGRlcGVuZGVuY2llcy5cbiAqIEBwYXJhbSB7KGNoaWxkOiBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIikuQ2hpbGRQcm9jZXNzLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCkgPT4gdm9pZH0gZGVwZW5kZW5jaWVzLnJlZ2lzdGVyU3Bhd25MaXN0ZW5lciAtIFJlZ2lzdGVycyBkZWFkbGluZSBpbml0aWFsaXphdGlvbi5cbiAqIEByZXR1cm5zIHt0eXBlb2YgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmV9IE93bmVkIHN1YnByb2Nlc3MgZXhlY3V0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRlRmlsZVdpdGhEZWFkbGluZSh7cmVnaXN0ZXJTcGF3bkxpc3RlbmVyfSkge1xuICByZXR1cm4gKGlucHV0KSA9PiBleGVjdXRlRmlsZVdpdGhEZWFkbGluZVVzaW5nKGlucHV0LCByZWdpc3RlclNwYXduTGlzdGVuZXIpXG59XG5cbi8qKlxuICogRXhlY3V0ZXMgd2l0aCBleGFjdCBpbnN0YW5jZS1vd25lZCBzcGF3biBvYnNlcnZhdGlvbi5cbiAqIEBwYXJhbSB7UGFyYW1ldGVyczx0eXBlb2YgZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmU+WzBdfSBpbnB1dCAtIFByb2Nlc3MgcmVxdWVzdC5cbiAqIEBwYXJhbSB7KGNoaWxkOiBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIikuQ2hpbGRQcm9jZXNzLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCkgPT4gdm9pZH0gcmVnaXN0ZXJTcGF3bkxpc3RlbmVyIC0gUmVnaXN0ZXJzIGRlYWRsaW5lIGluaXRpYWxpemF0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8e3N0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ30+fSBPdXRwdXQgYWZ0ZXIgdGhlIG93bmVkIHByb2Nlc3MgZ3JvdXAgY2xvc2VzLlxuICovXG5mdW5jdGlvbiBleGVjdXRlRmlsZVdpdGhEZWFkbGluZVVzaW5nKHthcmd1bWVudHM6IHByb2Nlc3NBcmd1bWVudHMsIGN3ZCwgZW52aXJvbm1lbnQsIGV4ZWN1dGFibGUsIG1heEJ1ZmZlciwgdGltZW91dE1zfSwgcmVnaXN0ZXJTcGF3bkxpc3RlbmVyKSB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09IFwid2luMzJcIikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIk93bmVkIHByb2Nlc3MtdHJlZSB0ZXJtaW5hdGlvbiBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLlwiKSwge1xuICAgICAgY29kZTogXCJFTk9UU1VQXCIsXG4gICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICBzdGRvdXQ6IFwiXCJcbiAgICB9KSlcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgZGVhZGxpbmVUaW1lclxuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGZvcmNlVGltZXJcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBwaXBlVGltZXJcbiAgICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBsYXVuY2hFcnJvclxuICAgIGxldCBkZWFkbGluZUV4Y2VlZGVkID0gZmFsc2VcbiAgICBsZXQgb3V0cHV0RXhjZWVkZWQgPSBmYWxzZVxuICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICBjb25zdCBzdGRlcnIgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBzdGRvdXQgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGV4ZWN1dGFibGUsIFsuLi5wcm9jZXNzQXJndW1lbnRzXSwge1xuICAgICAgY3dkLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdXG4gICAgfSlcbiAgICBjb25zdCBwcm9jZXNzR3JvdXBJZCA9IGNoaWxkLnBpZFxuXG4gICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCBzdGRlcnIucmVjZWl2ZSlcbiAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIHN0ZG91dC5yZWNlaXZlKVxuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxhdW5jaEVycm9yID0gZXJyb3JcbiAgICB9KVxuICAgIHJlZ2lzdGVyU3Bhd25MaXN0ZW5lcihjaGlsZCwgKCkgPT4ge1xuICAgICAgaWYgKHByb2Nlc3NHcm91cElkID09IHVuZGVmaW5lZCB8fCAhdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpKSB7XG4gICAgICAgIGxhdW5jaEVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTcGF3bmVkIHN1YnByb2Nlc3MgZGlkIG5vdCBlc3RhYmxpc2ggaXRzIHJlcXVpcmVkIHByb2Nlc3MgZ3JvdXAuXCIpLCB7Y29kZTogXCJFTk9UU1VQXCJ9KVxuICAgICAgICBjaGlsZC5raWxsKFwiU0lHS0lMTFwiKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZGVhZGxpbmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgIGRlYWRsaW5lRXhjZWVkZWQgPSB0cnVlXG4gICAgICAgIGJlZ2luVGVybWluYXRpb24ocHJvY2Vzc0dyb3VwSWQpXG4gICAgICB9LCB0aW1lb3V0TXMpXG4gICAgfSlcbiAgICBjaGlsZC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgIGlmIChkZWFkbGluZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KGRlYWRsaW5lVGltZXIpXG4gICAgICBpZiAoZm9yY2VUaW1lciAhPSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChmb3JjZVRpbWVyKVxuICAgICAgaWYgKHBpcGVUaW1lciAhPSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChwaXBlVGltZXIpXG4gICAgICBjb25zdCBjYXB0dXJlZFN0ZGVyciA9IHN0ZGVyci5maW5pc2goKVxuICAgICAgY29uc3QgY2FwdHVyZWRTdGRvdXQgPSBzdGRvdXQuZmluaXNoKClcblxuICAgICAgaWYgKGxhdW5jaEVycm9yKSB7XG4gICAgICAgIHJlamVjdChPYmplY3QuYXNzaWduKGxhdW5jaEVycm9yLCB7c3RkZXJyOiBjYXB0dXJlZFN0ZGVyciwgc3Rkb3V0OiBjYXB0dXJlZFN0ZG91dH0pKVxuICAgICAgfSBlbHNlIGlmIChvdXRwdXRFeGNlZWRlZCkge1xuICAgICAgICByZWplY3QoT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYFN1YnByb2Nlc3MgZXhjZWVkZWQgaXRzICR7bWF4QnVmZmVyfS1ieXRlIG91dHB1dCBjYXB0dXJlIGxpbWl0LmApLCB7XG4gICAgICAgICAgY29kZTogXCJFUlJfQ0hJTERfUFJPQ0VTU19TVERJT19NQVhCVUZGRVJcIixcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIGlmIChkZWFkbGluZUV4Y2VlZGVkKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRFcnJvciA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiU3VicHJvY2VzcyBleGNlZWRlZCBpdHMgb3duZWQgZGVhZGxpbmUuXCIpLCB7XG4gICAgICAgICAgY29kZSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVhZGxpbmVGYWlsdXJlcy5hZGQodGltZW91dEVycm9yKVxuICAgICAgICByZWplY3QodGltZW91dEVycm9yKVxuICAgICAgfSBlbHNlIGlmIChjb2RlICE9IDAgfHwgc2lnbmFsICE9IG51bGwpIHtcbiAgICAgICAgcmVqZWN0KE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiU3VicHJvY2VzcyBmYWlsZWQgYWZ0ZXIgbGF1bmNoLlwiKSwge1xuICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIHN0ZGVycjogY2FwdHVyZWRTdGRlcnIsXG4gICAgICAgICAgc3Rkb3V0OiBjYXB0dXJlZFN0ZG91dFxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSByZXNvbHZlKHtzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLCBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0fSlcbiAgICB9KVxuXG4gICAgLyoqIEJlZ2lucyBib3VuZGVkIHRlcm1pbmF0aW9uIGFmdGVyIG91dHB1dCBjYXB0dXJlIGNyb3NzZXMgaXRzIGxpbWl0LiAqL1xuICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZUZvck91dHB1dExpbWl0KCkge1xuICAgICAgaWYgKG91dHB1dEV4Y2VlZGVkIHx8IHNldHRsZWQpIHJldHVyblxuICAgICAgb3V0cHV0RXhjZWVkZWQgPSB0cnVlXG4gICAgICBpZiAocHJvY2Vzc0dyb3VwSWQgIT0gdW5kZWZpbmVkKSBiZWdpblRlcm1pbmF0aW9uKHByb2Nlc3NHcm91cElkKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgdGhlIG93bmVkIGdyb3VwIG5vdyBhbmQgZXNjYWxhdGVzIGlmIGl0cyBpbmhlcml0ZWQgcGlwZXMgcmVtYWluIG9wZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG93bmVkR3JvdXBJZCAtIFNwYXduLXZlcmlmaWVkIHByb2Nlc3MtZ3JvdXAgaWRlbnRpdHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVnaW5UZXJtaW5hdGlvbihvd25lZEdyb3VwSWQpIHtcbiAgICAgIHNpZ25hbE93bmVkUHJvY2Vzc0dyb3VwKG93bmVkR3JvdXBJZCwgXCJTSUdURVJNXCIpXG4gICAgICBpZiAoIXNldHRsZWQgJiYgZm9yY2VUaW1lciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgICBzaWduYWxPd25lZFByb2Nlc3NHcm91cChvd25lZEdyb3VwSWQsIFwiU0lHS0lMTFwiKVxuICAgICAgICAgIHBpcGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LmRlc3Ryb3koKVxuICAgICAgICAgICAgY2hpbGQuc3RkZXJyLmRlc3Ryb3koKVxuICAgICAgICAgIH0sIHJldGFpbmVkUGlwZUdyYWNlTXMpXG4gICAgICAgIH0sIGZvcmNlZFRlcm1pbmF0aW9uR3JhY2VNcylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2R1Y3Rpb24gZGVhZGxpbmUgaW5pdGlhbGl6YXRpb24gb24gdGhlIGNoaWxkJ3MgcmVhbCBzcGF3biBldmVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc30gY2hpbGQgLSBFeGFjdCBzcGF3bmVkIGNoaWxkLlxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBsaXN0ZW5lciAtIERlYWRsaW5lIGluaXRpYWxpemF0aW9uLlxuICovXG5mdW5jdGlvbiByZWdpc3RlckNoaWxkU3Bhd24oY2hpbGQsIGxpc3RlbmVyKSB7XG4gIGNoaWxkLm9uY2UoXCJzcGF3blwiLCBsaXN0ZW5lcilcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG9uZSBieXRlLWJvdW5kZWQgVVRGLTggc3RyZWFtIGNhcHR1cmUuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4aW11bUJ5dGVzIC0gTWF4aW11bSBjYXB0dXJlZCBieXRlcy5cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gb25FeGNlZWRlZCAtIEZpcnN0LW92ZXJmbG93IGNhbGxiYWNrLlxuICogQHJldHVybnMge3tmaW5pc2g6ICgpID0+IHN0cmluZywgcmVjZWl2ZTogKGNodW5rOiBCdWZmZXIpID0+IHZvaWR9fSBDYXB0dXJlIGNhbGxiYWNrcy5cbiAqL1xuZnVuY3Rpb24gb3V0cHV0Q2FwdHVyZShtYXhpbXVtQnl0ZXMsIG9uRXhjZWVkZWQpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcbiAgbGV0IGNvbnRlbnQgPSBcIlwiXG4gIGxldCBleGNlZWRlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBmaW5pc2goKSB7XG4gICAgICByZXR1cm4gY29udGVudCArIGRlY29kZXIuZW5kKClcbiAgICB9LFxuICAgIHJlY2VpdmUoY2h1bmspIHtcbiAgICAgIGlmIChleGNlZWRlZCkgcmV0dXJuXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBtYXhpbXVtQnl0ZXMgLSBieXRlTGVuZ3RoXG5cbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuay5zdWJhcnJheSgwLCByZW1haW5pbmcpKVxuICAgICAgICBleGNlZWRlZCA9IHRydWVcbiAgICAgICAgb25FeGNlZWRlZCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnl0ZUxlbmd0aCArPSBjaHVuay5sZW5ndGhcbiAgICAgIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBzcGF3bmVkIGNoaWxkIGlzIHRoZSBsaXZlIGxlYWRlciBvZiBpdHMgZGlzdGluY3QgUE9TSVggZ3JvdXAuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIHJlcXVpcmVkIGdyb3VwIElELlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG93bmVkIGdyb3VwIGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXByb2Nlc3NHcm91cElkLCAwKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PSBcIkVTUkNIXCIpIHJldHVybiBmYWxzZVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBTaWduYWxzIG9ubHkgdGhlIHZlcmlmaWVkIHByb2Nlc3MgZ3JvdXAgY3JlYXRlZCBmb3IgdGhlIGV4YWN0IHNwYXduZWQgY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIFBPU0lYIHByb2Nlc3MtZ3JvdXAgSUQuXG4gKiBAcGFyYW0ge1wiU0lHS0lMTFwiIHwgXCJTSUdURVJNXCJ9IHNpZ25hbCAtIExpZmVjeWNsZSBzaWduYWwuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gc2lnbmFsT3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQsIHNpZ25hbCkge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcHJvY2Vzc0dyb3VwSWQsIHNpZ25hbClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT0gXCJFU1JDSFwiKSkgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGlzIG1vZHVsZSdzIGRlYWRsaW5lIHRpbWVyIGluaXRpYXRlZCB0ZXJtaW5hdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBTdWJwcm9jZXNzIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmFpbHVyZSBiZWxvbmdzIHRvIGFuIG93bmVkIGRlYWRsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPSBudWxsICYmIGRlYWRsaW5lRmFpbHVyZXMuaGFzKGVycm9yKVxufVxuIl19
|
|
266
|
+
/**
|
|
267
|
+
* Reports whether this module's cancellation signal initiated termination.
|
|
268
|
+
* @param {unknown} error - Subprocess failure.
|
|
269
|
+
* @returns {boolean} Whether the failure belongs to owned cancellation.
|
|
270
|
+
*/
|
|
271
|
+
export function cancelledOwnedProcess(error) {
|
|
272
|
+
return typeof error == "object" && error != null && cancellationFailures.has(error);
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VicHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdWJwcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFBO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFBO0FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUN0QyxNQUFNLG9CQUFvQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFMUM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsS0FBSztJQUMzQyxPQUFPLDRCQUE0QixDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0FBQ2hFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxFQUFDLHFCQUFxQixFQUFDO0lBQ25FLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFBO0FBQzlFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsNEJBQTRCLENBQUMsRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsRUFBRSxxQkFBcUI7SUFDcEosSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLEVBQUU7WUFDaEgsSUFBSSxFQUFFLFNB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LyBAdHMtY2hlY2tcblxuaW1wb3J0IHtzcGF3bn0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQge1N0cmluZ0RlY29kZXJ9IGZyb20gXCJub2RlOnN0cmluZ19kZWNvZGVyXCJcblxuY29uc3QgZm9yY2VkVGVybWluYXRpb25HcmFjZU1zID0gMjUwXG5jb25zdCByZXRhaW5lZFBpcGVHcmFjZU1zID0gMjUwXG5jb25zdCBkZWFkbGluZUZhaWx1cmVzID0gbmV3IFdlYWtTZXQoKVxuY29uc3QgY2FuY2VsbGF0aW9uRmFpbHVyZXMgPSBuZXcgV2Vha1NldCgpXG5cbi8qKlxuICogRXhlY3V0ZXMgb25lIGV4YWN0IGZpbGUgd2hpbGUgb3duaW5nIGl0cyBjb21wbGV0ZSBib3VuZGVkIGxpZmVjeWNsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFByb2Nlc3MgcmVxdWVzdC5cbiAqIEBwYXJhbSB7cmVhZG9ubHkgc3RyaW5nW119IGlucHV0LmFyZ3VtZW50cyAtIEV4YWN0IGFyZ3VtZW50IGFycmF5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5jd2RdIC0gV29ya2luZyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+fSBpbnB1dC5lbnZpcm9ubWVudCAtIEV4YWN0IGVudmlyb25tZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHBhdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaW5wdXQubWF4QnVmZmVyIC0gTWF4aW11bSBieXRlcyBjYXB0dXJlZCBwZXIgb3V0cHV0IHN0cmVhbS5cbiAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IFtpbnB1dC5zaWduYWxdIC0gT3B0aW9uYWwgb3duZWQgY2FuY2VsbGF0aW9uIHNpZ25hbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dC50aW1lb3V0TXMgLSBEZWFkbGluZSBiZWZvcmUgdGVybWluYXRpb24gYmVnaW5zLlxuICogQHJldHVybnMge1Byb21pc2U8e3N0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ30+fSBPdXRwdXQgYWZ0ZXIgdGhlIG93bmVkIHByb2Nlc3MgZ3JvdXAgY2xvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmUoaW5wdXQpIHtcbiAgcmV0dXJuIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lVXNpbmcoaW5wdXQsIHJlZ2lzdGVyQ2hpbGRTcGF3bilcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGV4ZWN1dG9yIHdob3NlIHNwYXduIG9ic2VydmF0aW9uIGJlbG9uZ3Mgb25seSB0byB0aGF0IGV4ZWN1dG9yIGluc3RhbmNlLlxuICogQHBhcmFtIHtvYmplY3R9IGRlcGVuZGVuY2llcyAtIEludGVybmFsIGxpZmVjeWNsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcGFyYW0geyhjaGlsZDogaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2VzcywgbGlzdGVuZXI6ICgpID0+IHZvaWQpID0+IHZvaWR9IGRlcGVuZGVuY2llcy5yZWdpc3RlclNwYXduTGlzdGVuZXIgLSBSZWdpc3RlcnMgZGVhZGxpbmUgaW5pdGlhbGl6YXRpb24uXG4gKiBAcmV0dXJucyB7dHlwZW9mIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lfSBPd25lZCBzdWJwcm9jZXNzIGV4ZWN1dG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmUoe3JlZ2lzdGVyU3Bhd25MaXN0ZW5lcn0pIHtcbiAgcmV0dXJuIChpbnB1dCkgPT4gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmVVc2luZyhpbnB1dCwgcmVnaXN0ZXJTcGF3bkxpc3RlbmVyKVxufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHdpdGggZXhhY3QgaW5zdGFuY2Utb3duZWQgc3Bhd24gb2JzZXJ2YXRpb24uXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lPlswXX0gaW5wdXQgLSBQcm9jZXNzIHJlcXVlc3QuXG4gKiBAcGFyYW0geyhjaGlsZDogaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2VzcywgbGlzdGVuZXI6ICgpID0+IHZvaWQpID0+IHZvaWR9IHJlZ2lzdGVyU3Bhd25MaXN0ZW5lciAtIFJlZ2lzdGVycyBkZWFkbGluZSBpbml0aWFsaXphdGlvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtzdGRlcnI6IHN0cmluZywgc3Rkb3V0OiBzdHJpbmd9Pn0gT3V0cHV0IGFmdGVyIHRoZSBvd25lZCBwcm9jZXNzIGdyb3VwIGNsb3Nlcy5cbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmVVc2luZyh7YXJndW1lbnRzOiBwcm9jZXNzQXJndW1lbnRzLCBjd2QsIGVudmlyb25tZW50LCBleGVjdXRhYmxlLCBtYXhCdWZmZXIsIHNpZ25hbCwgdGltZW91dE1zfSwgcmVnaXN0ZXJTcGF3bkxpc3RlbmVyKSB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09IFwid2luMzJcIikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIk93bmVkIHByb2Nlc3MtdHJlZSB0ZXJtaW5hdGlvbiBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLlwiKSwge1xuICAgICAgY29kZTogXCJFTk9UU1VQXCIsXG4gICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICBzdGRvdXQ6IFwiXCJcbiAgICB9KSlcbiAgfVxuICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uRXJyb3IgPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIlN1YnByb2Nlc3Mgd2FzIGNhbmNlbGxlZCBiZWZvcmUgbGF1bmNoLlwiKSwge3N0ZGVycjogXCJcIiwgc3Rkb3V0OiBcIlwifSlcblxuICAgIGNhbmNlbGxhdGlvbkZhaWx1cmVzLmFkZChjYW5jZWxsYXRpb25FcnJvcilcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY2FuY2VsbGF0aW9uRXJyb3IpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGRlYWRsaW5lVGltZXJcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmb3JjZVRpbWVyXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgcGlwZVRpbWVyXG4gICAgLyoqIEB0eXBlIHtFcnJvciB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgbGF1bmNoRXJyb3JcbiAgICBsZXQgY2FuY2VsbGF0aW9uUmVxdWVzdGVkID0gZmFsc2VcbiAgICBsZXQgZGVhZGxpbmVFeGNlZWRlZCA9IGZhbHNlXG4gICAgbGV0IG91dHB1dEV4Y2VlZGVkID0gZmFsc2VcbiAgICBsZXQgcHJvY2Vzc0dyb3VwT3duZWQgPSBmYWxzZVxuICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICBjb25zdCBzdGRlcnIgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBzdGRvdXQgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGV4ZWN1dGFibGUsIFsuLi5wcm9jZXNzQXJndW1lbnRzXSwge1xuICAgICAgY3dkLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdXG4gICAgfSlcbiAgICBjb25zdCBwcm9jZXNzR3JvdXBJZCA9IGNoaWxkLnBpZFxuICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkIHx8IGNhbmNlbGxhdGlvblJlcXVlc3RlZCB8fCBkZWFkbGluZUV4Y2VlZGVkIHx8IG91dHB1dEV4Y2VlZGVkKSByZXR1cm5cbiAgICAgIGNhbmNlbGxhdGlvblJlcXVlc3RlZCA9IHRydWVcbiAgICAgIGlmIChwcm9jZXNzR3JvdXBPd25lZCAmJiBwcm9jZXNzR3JvdXBJZCAhPSB1bmRlZmluZWQpIGJlZ2luVGVybWluYXRpb24ocHJvY2Vzc0dyb3VwSWQpXG4gICAgfVxuXG4gICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCBzdGRlcnIucmVjZWl2ZSlcbiAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIHN0ZG91dC5yZWNlaXZlKVxuICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGNhbmNlbCwge29uY2U6IHRydWV9KVxuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxhdW5jaEVycm9yID0gZXJyb3JcbiAgICB9KVxuICAgIHJlZ2lzdGVyU3Bhd25MaXN0ZW5lcihjaGlsZCwgKCkgPT4ge1xuICAgICAgaWYgKHByb2Nlc3NHcm91cElkID09IHVuZGVmaW5lZCB8fCAhdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpKSB7XG4gICAgICAgIGxhdW5jaEVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTcGF3bmVkIHN1YnByb2Nlc3MgZGlkIG5vdCBlc3RhYmxpc2ggaXRzIHJlcXVpcmVkIHByb2Nlc3MgZ3JvdXAuXCIpLCB7Y29kZTogXCJFTk9UU1VQXCJ9KVxuICAgICAgICBjaGlsZC5raWxsKFwiU0lHS0lMTFwiKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHByb2Nlc3NHcm91cE93bmVkID0gdHJ1ZVxuICAgICAgaWYgKGNhbmNlbGxhdGlvblJlcXVlc3RlZCkge1xuICAgICAgICBiZWdpblRlcm1pbmF0aW9uKHByb2Nlc3NHcm91cElkKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZGVhZGxpbmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCB8fCBjYW5jZWxsYXRpb25SZXF1ZXN0ZWQgfHwgZGVhZGxpbmVFeGNlZWRlZCB8fCBvdXRwdXRFeGNlZWRlZCkgcmV0dXJuXG4gICAgICAgIGRlYWRsaW5lRXhjZWVkZWQgPSB0cnVlXG4gICAgICAgIGJlZ2luVGVybWluYXRpb24ocHJvY2Vzc0dyb3VwSWQpXG4gICAgICB9LCB0aW1lb3V0TXMpXG4gICAgfSlcbiAgICBjaGlsZC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIGNsb3NlU2lnbmFsKSA9PiB7XG4gICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgaWYgKGRlYWRsaW5lVGltZXIgIT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQoZGVhZGxpbmVUaW1lcilcbiAgICAgIGlmIChmb3JjZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KGZvcmNlVGltZXIpXG4gICAgICBpZiAocGlwZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHBpcGVUaW1lcilcbiAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGNhbmNlbClcbiAgICAgIGNvbnN0IGNhcHR1cmVkU3RkZXJyID0gc3RkZXJyLmZpbmlzaCgpXG4gICAgICBjb25zdCBjYXB0dXJlZFN0ZG91dCA9IHN0ZG91dC5maW5pc2goKVxuXG4gICAgICBpZiAobGF1bmNoRXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KE9iamVjdC5hc3NpZ24obGF1bmNoRXJyb3IsIHtzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLCBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0fSkpXG4gICAgICB9IGVsc2UgaWYgKG91dHB1dEV4Y2VlZGVkKSB7XG4gICAgICAgIHJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU3VicHJvY2VzcyBleGNlZWRlZCBpdHMgJHttYXhCdWZmZXJ9LWJ5dGUgb3V0cHV0IGNhcHR1cmUgbGltaXQuYCksIHtcbiAgICAgICAgICBjb2RlOiBcIkVSUl9DSElMRF9QUk9DRVNTX1NURElPX01BWEJVRkZFUlwiLFxuICAgICAgICAgIHNpZ25hbDogY2xvc2VTaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIGlmIChjYW5jZWxsYXRpb25SZXF1ZXN0ZWQpIHtcbiAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uRXJyb3IgPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIlN1YnByb2Nlc3Mgd2FzIGNhbmNlbGxlZC5cIiksIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHNpZ25hbDogY2xvc2VTaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pXG5cbiAgICAgICAgY2FuY2VsbGF0aW9uRmFpbHVyZXMuYWRkKGNhbmNlbGxhdGlvbkVycm9yKVxuICAgICAgICByZWplY3QoY2FuY2VsbGF0aW9uRXJyb3IpXG4gICAgICB9IGVsc2UgaWYgKGRlYWRsaW5lRXhjZWVkZWQpIHtcbiAgICAgICAgY29uc3QgdGltZW91dEVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTdWJwcm9jZXNzIGV4Y2VlZGVkIGl0cyBvd25lZCBkZWFkbGluZS5cIiksIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHNpZ25hbDogY2xvc2VTaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pXG5cbiAgICAgICAgZGVhZGxpbmVGYWlsdXJlcy5hZGQodGltZW91dEVycm9yKVxuICAgICAgICByZWplY3QodGltZW91dEVycm9yKVxuICAgICAgfSBlbHNlIGlmIChjb2RlICE9IDAgfHwgY2xvc2VTaWduYWwgIT0gbnVsbCkge1xuICAgICAgICByZWplY3QoT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTdWJwcm9jZXNzIGZhaWxlZCBhZnRlciBsYXVuY2guXCIpLCB7XG4gICAgICAgICAgY29kZSxcbiAgICAgICAgICBzaWduYWw6IGNsb3NlU2lnbmFsLFxuICAgICAgICAgIHN0ZGVycjogY2FwdHVyZWRTdGRlcnIsXG4gICAgICAgICAgc3Rkb3V0OiBjYXB0dXJlZFN0ZG91dFxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSByZXNvbHZlKHtzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLCBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0fSlcbiAgICB9KVxuXG4gICAgLyoqIEJlZ2lucyBib3VuZGVkIHRlcm1pbmF0aW9uIGFmdGVyIG91dHB1dCBjYXB0dXJlIGNyb3NzZXMgaXRzIGxpbWl0LiAqL1xuICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZUZvck91dHB1dExpbWl0KCkge1xuICAgICAgaWYgKHNldHRsZWQgfHwgY2FuY2VsbGF0aW9uUmVxdWVzdGVkIHx8IGRlYWRsaW5lRXhjZWVkZWQgfHwgb3V0cHV0RXhjZWVkZWQpIHJldHVyblxuICAgICAgb3V0cHV0RXhjZWVkZWQgPSB0cnVlXG4gICAgICBpZiAocHJvY2Vzc0dyb3VwSWQgIT0gdW5kZWZpbmVkKSBiZWdpblRlcm1pbmF0aW9uKHByb2Nlc3NHcm91cElkKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpZ25hbHMgdGhlIG93bmVkIGdyb3VwIG5vdyBhbmQgZXNjYWxhdGVzIGlmIGl0cyBpbmhlcml0ZWQgcGlwZXMgcmVtYWluIG9wZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG93bmVkR3JvdXBJZCAtIFNwYXduLXZlcmlmaWVkIHByb2Nlc3MtZ3JvdXAgaWRlbnRpdHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVnaW5UZXJtaW5hdGlvbihvd25lZEdyb3VwSWQpIHtcbiAgICAgIHNpZ25hbE93bmVkUHJvY2Vzc0dyb3VwKG93bmVkR3JvdXBJZCwgXCJTSUdURVJNXCIpXG4gICAgICBpZiAoIXNldHRsZWQgJiYgZm9yY2VUaW1lciA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgICBzaWduYWxPd25lZFByb2Nlc3NHcm91cChvd25lZEdyb3VwSWQsIFwiU0lHS0lMTFwiKVxuICAgICAgICAgIHBpcGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LmRlc3Ryb3koKVxuICAgICAgICAgICAgY2hpbGQuc3RkZXJyLmRlc3Ryb3koKVxuICAgICAgICAgIH0sIHJldGFpbmVkUGlwZUdyYWNlTXMpXG4gICAgICAgIH0sIGZvcmNlZFRlcm1pbmF0aW9uR3JhY2VNcylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2R1Y3Rpb24gZGVhZGxpbmUgaW5pdGlhbGl6YXRpb24gb24gdGhlIGNoaWxkJ3MgcmVhbCBzcGF3biBldmVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc30gY2hpbGQgLSBFeGFjdCBzcGF3bmVkIGNoaWxkLlxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBsaXN0ZW5lciAtIERlYWRsaW5lIGluaXRpYWxpemF0aW9uLlxuICovXG5mdW5jdGlvbiByZWdpc3RlckNoaWxkU3Bhd24oY2hpbGQsIGxpc3RlbmVyKSB7XG4gIGNoaWxkLm9uY2UoXCJzcGF3blwiLCBsaXN0ZW5lcilcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG9uZSBieXRlLWJvdW5kZWQgVVRGLTggc3RyZWFtIGNhcHR1cmUuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4aW11bUJ5dGVzIC0gTWF4aW11bSBjYXB0dXJlZCBieXRlcy5cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gb25FeGNlZWRlZCAtIEZpcnN0LW92ZXJmbG93IGNhbGxiYWNrLlxuICogQHJldHVybnMge3tmaW5pc2g6ICgpID0+IHN0cmluZywgcmVjZWl2ZTogKGNodW5rOiBCdWZmZXIpID0+IHZvaWR9fSBDYXB0dXJlIGNhbGxiYWNrcy5cbiAqL1xuZnVuY3Rpb24gb3V0cHV0Q2FwdHVyZShtYXhpbXVtQnl0ZXMsIG9uRXhjZWVkZWQpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcbiAgbGV0IGNvbnRlbnQgPSBcIlwiXG4gIGxldCBleGNlZWRlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBmaW5pc2goKSB7XG4gICAgICByZXR1cm4gY29udGVudCArIGRlY29kZXIuZW5kKClcbiAgICB9LFxuICAgIHJlY2VpdmUoY2h1bmspIHtcbiAgICAgIGlmIChleGNlZWRlZCkgcmV0dXJuXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBtYXhpbXVtQnl0ZXMgLSBieXRlTGVuZ3RoXG5cbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuay5zdWJhcnJheSgwLCByZW1haW5pbmcpKVxuICAgICAgICBleGNlZWRlZCA9IHRydWVcbiAgICAgICAgb25FeGNlZWRlZCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnl0ZUxlbmd0aCArPSBjaHVuay5sZW5ndGhcbiAgICAgIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBzcGF3bmVkIGNoaWxkIGlzIHRoZSBsaXZlIGxlYWRlciBvZiBpdHMgZGlzdGluY3QgUE9TSVggZ3JvdXAuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIHJlcXVpcmVkIGdyb3VwIElELlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG93bmVkIGdyb3VwIGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXByb2Nlc3NHcm91cElkLCAwKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PSBcIkVTUkNIXCIpIHJldHVybiBmYWxzZVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBTaWduYWxzIG9ubHkgdGhlIHZlcmlmaWVkIHByb2Nlc3MgZ3JvdXAgY3JlYXRlZCBmb3IgdGhlIGV4YWN0IHNwYXduZWQgY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIFBPU0lYIHByb2Nlc3MtZ3JvdXAgSUQuXG4gKiBAcGFyYW0ge1wiU0lHS0lMTFwiIHwgXCJTSUdURVJNXCJ9IHNpZ25hbCAtIExpZmVjeWNsZSBzaWduYWwuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gc2lnbmFsT3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQsIHNpZ25hbCkge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcHJvY2Vzc0dyb3VwSWQsIHNpZ25hbClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT0gXCJFU1JDSFwiKSkgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGlzIG1vZHVsZSdzIGRlYWRsaW5lIHRpbWVyIGluaXRpYXRlZCB0ZXJtaW5hdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBTdWJwcm9jZXNzIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmFpbHVyZSBiZWxvbmdzIHRvIGFuIG93bmVkIGRlYWRsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPSBudWxsICYmIGRlYWRsaW5lRmFpbHVyZXMuaGFzKGVycm9yKVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGlzIG1vZHVsZSdzIGNhbmNlbGxhdGlvbiBzaWduYWwgaW5pdGlhdGVkIHRlcm1pbmF0aW9uLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFN1YnByb2Nlc3MgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBmYWlsdXJlIGJlbG9uZ3MgdG8gb3duZWQgY2FuY2VsbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsbGVkT3duZWRQcm9jZXNzKGVycm9yKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPSBudWxsICYmIGNhbmNlbGxhdGlvbkZhaWx1cmVzLmhhcyhlcnJvcilcbn1cbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { executeFileWithDeadline } from "./subprocess.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates and validates one target-owned developer check plan.
|
|
4
|
+
* @param {object} input - Exact staged target context.
|
|
5
|
+
* @param {import("./semantic/types.js").GeneratedArtifactSet} input.artifacts - Validated staged artifacts.
|
|
6
|
+
* @param {string} input.buildPath - Exact generation-scoped target build subtree.
|
|
7
|
+
* @param {string} input.projectId - Exact project identity.
|
|
8
|
+
* @param {string} input.sourcePath - Exact generation-scoped target source subtree.
|
|
9
|
+
* @param {string} input.targetId - Exact project target identity.
|
|
10
|
+
* @param {readonly import("./semantic/types.js").DiscoveredToolchain[]} input.tools - Discovered immutable tool records.
|
|
11
|
+
* @returns {import("./semantic/types.js").TargetCheckPlan} Validated immutable plan.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createTargetCheckPlan(input: {
|
|
14
|
+
artifacts: import("./semantic/types.js").GeneratedArtifactSet;
|
|
15
|
+
buildPath: string;
|
|
16
|
+
projectId: string;
|
|
17
|
+
sourcePath: string;
|
|
18
|
+
targetId: string;
|
|
19
|
+
tools: readonly import("./semantic/types.js").DiscoveredToolchain[];
|
|
20
|
+
}): import("./semantic/types.js").TargetCheckPlan;
|
|
21
|
+
/**
|
|
22
|
+
* Owns ordered check subprocesses and settles only after each child closes.
|
|
23
|
+
*/
|
|
24
|
+
export declare class TargetCheckRunner {
|
|
25
|
+
/**
|
|
26
|
+
* Runs one already-staged immutable plan without executing generated application code.
|
|
27
|
+
* @param {import("./semantic/types.js").TargetCheckPlan} plan - Target-owned plan.
|
|
28
|
+
* @param {{onStage?: (result: import("./semantic/types.js").TargetCheckStageResult) => void, signal?: AbortSignal, timeoutMs?: number}} [options] - Lifecycle controls.
|
|
29
|
+
* @returns {Promise<import("./semantic/types.js").TargetCheckResult>} Successful check evidence and output metadata.
|
|
30
|
+
*/
|
|
31
|
+
run(plan: import("./semantic/types.js").TargetCheckPlan, options?: {
|
|
32
|
+
onStage?: (result: import("./semantic/types.js").TargetCheckStageResult) => void;
|
|
33
|
+
signal?: AbortSignal;
|
|
34
|
+
timeoutMs?: number;
|
|
35
|
+
}): Promise<import("./semantic/types.js").TargetCheckResult>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Creates a runner with focused instance-owned dependencies.
|
|
39
|
+
* @param {{execute: typeof executeFileWithDeadline, now: () => number}} dependencies - Testable lifecycle collaborators.
|
|
40
|
+
* @returns {TargetCheckRunner} Runner.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createTargetCheckRunner(dependencies: {
|
|
43
|
+
execute: typeof executeFileWithDeadline;
|
|
44
|
+
now: () => number;
|
|
45
|
+
}): TargetCheckRunner;
|
|
46
|
+
/**
|
|
47
|
+
* Validates a complete immutable plan before any process starts.
|
|
48
|
+
* @param {unknown} candidate - Candidate plan.
|
|
49
|
+
* @returns {import("./semantic/types.js").TargetCheckPlan} Exact validated plan.
|
|
50
|
+
*/
|
|
51
|
+
export declare function validateTargetCheckPlan(candidate: unknown): import("./semantic/types.js").TargetCheckPlan;
|
|
52
|
+
//# sourceMappingURL=target-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-check.d.ts","sourceRoot":"","sources":["../../src/target-check.js"],"names":[],"mappings":"AAQA,OAAO,EAA+C,uBAAuB,EAAC,MAAM,iBAAiB,CAAA;AAgBrG;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EARxC;IAAkE,SAAS,EAAnE,OAAO,qBAAqB,EAAE,oBAAoB,CAC1D;IAAsB,SAAS,EAAvB,MAAM,CACd;IAAsB,SAAS,EAAvB,MAAM,CACd;IAAsB,UAAU,EAAxB,MAAM,CACd;IAAsB,QAAQ,EAAtB,MAAM,CACd;IAA4E,KAAK,EAAzE,SAAS,OAAO,qBAAqB,EAAE,mBAAmB,EAAE,CACpE;CAEwC,GAF9B,OAAO,qBAAqB,EAAE,eAAe,CAuEzD;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;;;;OAKG;IACG,GAAG,CAAC,IAAI,EAJH,OAAO,qBAAqB,EAAE,eAI3B,EAAE,OAAO,AAHpB,CACA,EADQ;QAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,KAAK,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAG1G,GAFf,OAAO,CAAC,OAAO,qBAAqB,EAAE,iBAAiB,CAAC,CA8FpE;CACF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAHzC;IAAC,OAAO,EAAE,OAAO,uBAAuB,CAAC;IAAC,GAAG,EAAE,MAAM,MAAM,CAAA;CAGlB,GAFvC,iBAAiB,CAW7B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAHtC,OAGsC,GAFpC,OAAO,qBAAqB,EAAE,eAAe,CA4IzD"}
|