semantifold 0.3.0 → 0.4.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 +58 -15
- package/build/index.d.ts +48 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +57 -8
- package/build/src/artifact-path.d.ts +23 -1
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +45 -3
- package/build/src/artifacts.d.ts.map +1 -1
- package/build/src/artifacts.js +66 -1
- package/build/src/backends/c-validation.d.ts.map +1 -1
- package/build/src/backends/c-validation.js +7 -3
- package/build/src/backends/cpp-validation.d.ts.map +1 -1
- package/build/src/backends/cpp-validation.js +7 -3
- package/build/src/backends/csharp.js +7 -1
- package/build/src/backends/dart-runtime.d.ts +2 -0
- package/build/src/backends/dart-runtime.d.ts.map +1 -0
- package/build/src/backends/dart-runtime.js +41 -0
- package/build/src/backends/dart.d.ts +20 -0
- package/build/src/backends/dart.d.ts.map +1 -0
- package/build/src/backends/dart.js +321 -0
- package/build/src/backends/effects.d.ts +60 -0
- package/build/src/backends/effects.d.ts.map +1 -0
- package/build/src/backends/effects.js +746 -0
- package/build/src/backends/go.js +18 -4
- package/build/src/backends/identifiers.d.ts +36 -4
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +154 -10
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -4
- package/build/src/backends/ios.d.ts +68 -0
- package/build/src/backends/ios.d.ts.map +1 -0
- package/build/src/backends/ios.js +1503 -0
- package/build/src/backends/java.d.ts.map +1 -1
- package/build/src/backends/java.js +429 -36
- package/build/src/backends/javascript.d.ts +6 -0
- package/build/src/backends/javascript.d.ts.map +1 -1
- package/build/src/backends/javascript.js +380 -24
- package/build/src/backends/kotlin-runtime.d.ts +3 -0
- package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
- package/build/src/backends/kotlin-runtime.js +29 -0
- package/build/src/backends/kotlin.d.ts +23 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +136 -0
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/ordered-expressions.d.ts.map +1 -1
- package/build/src/backends/ordered-expressions.js +39 -7
- package/build/src/backends/php-stdlib-support.d.ts +19 -0
- package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
- package/build/src/backends/php-stdlib-support.js +227 -0
- package/build/src/backends/php.d.ts.map +1 -1
- package/build/src/backends/php.js +448 -33
- package/build/src/backends/program.d.ts +81 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1308 -0
- package/build/src/backends/python.js +7 -1
- package/build/src/backends/ruby.d.ts.map +1 -1
- package/build/src/backends/ruby.js +310 -24
- package/build/src/backends/rust-runtime.d.ts +7 -0
- package/build/src/backends/rust-runtime.d.ts.map +1 -0
- package/build/src/backends/rust-runtime.js +32 -0
- package/build/src/backends/rust-validation.d.ts +9 -0
- package/build/src/backends/rust-validation.d.ts.map +1 -0
- package/build/src/backends/rust-validation.js +78 -0
- package/build/src/backends/rust.d.ts +24 -0
- package/build/src/backends/rust.d.ts.map +1 -0
- package/build/src/backends/rust.js +344 -0
- package/build/src/backends/scalars.d.ts +14 -6
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +167 -17
- package/build/src/backends/shared.d.ts +23 -4
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +2158 -62
- package/build/src/backends/stdlib-support.d.ts +14 -0
- package/build/src/backends/stdlib-support.d.ts.map +1 -0
- package/build/src/backends/stdlib-support.js +237 -0
- package/build/src/backends/swift-runtime.d.ts +3 -0
- package/build/src/backends/swift-runtime.d.ts.map +1 -0
- package/build/src/backends/swift-runtime.js +14 -0
- package/build/src/backends/swift.d.ts +8 -0
- package/build/src/backends/swift.d.ts.map +1 -0
- package/build/src/backends/swift.js +127 -0
- package/build/src/backends/typescript.d.ts.map +1 -1
- package/build/src/backends/typescript.js +344 -24
- package/build/src/backends/wasm.d.ts +43 -0
- package/build/src/backends/wasm.d.ts.map +1 -0
- package/build/src/backends/wasm.js +2164 -0
- package/build/src/backends/writer.d.ts +235 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +468 -3
- package/build/src/diagnostic.d.ts +4 -3
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +5 -3
- package/build/src/frontends/c.d.ts.map +1 -1
- package/build/src/frontends/c.js +5 -3
- package/build/src/frontends/cpp.d.ts.map +1 -1
- package/build/src/frontends/cpp.js +5 -3
- package/build/src/frontends/csharp.d.ts.map +1 -1
- package/build/src/frontends/csharp.js +7 -3
- package/build/src/frontends/dart.d.ts +10 -0
- package/build/src/frontends/dart.d.ts.map +1 -0
- package/build/src/frontends/dart.js +913 -0
- package/build/src/frontends/index.d.ts +3 -1
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +15 -5
- package/build/src/frontends/java.d.ts +110 -1
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +1725 -70
- package/build/src/frontends/javascript-typescript.d.ts +69 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +1825 -93
- package/build/src/frontends/kotlin.d.ts +10 -0
- package/build/src/frontends/kotlin.d.ts.map +1 -0
- package/build/src/frontends/kotlin.js +685 -0
- package/build/src/frontends/php.d.ts +118 -1
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +1583 -76
- package/build/src/frontends/program.d.ts +74 -0
- package/build/src/frontends/program.d.ts.map +1 -0
- package/build/src/frontends/program.js +989 -0
- package/build/src/frontends/ruby.d.ts +68 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +1446 -101
- package/build/src/frontends/rust-parser.d.ts +11 -0
- package/build/src/frontends/rust-parser.d.ts.map +1 -0
- package/build/src/frontends/rust-parser.js +15 -0
- package/build/src/frontends/rust.d.ts +14 -0
- package/build/src/frontends/rust.d.ts.map +1 -0
- package/build/src/frontends/rust.js +715 -0
- package/build/src/frontends/scalars.d.ts +10 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +28 -2
- package/build/src/frontends/swift.d.ts +10 -0
- package/build/src/frontends/swift.d.ts.map +1 -0
- package/build/src/frontends/swift.js +860 -0
- package/build/src/frontends/types.d.ts +186 -0
- package/build/src/frontends/types.d.ts.map +1 -0
- package/build/src/frontends/types.js +634 -0
- package/build/src/language-registry.d.ts +46 -4
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +167 -13
- package/build/src/mapping.d.ts +2 -2
- package/build/src/mapping.d.ts.map +1 -1
- package/build/src/mapping.js +31 -10
- package/build/src/semantic/capabilities.d.ts +66 -0
- package/build/src/semantic/capabilities.d.ts.map +1 -0
- package/build/src/semantic/capabilities.js +649 -0
- package/build/src/semantic/effects.d.ts +26 -0
- package/build/src/semantic/effects.d.ts.map +1 -0
- package/build/src/semantic/effects.js +764 -0
- package/build/src/semantic/generics.d.ts +23 -0
- package/build/src/semantic/generics.d.ts.map +1 -0
- package/build/src/semantic/generics.js +61 -0
- package/build/src/semantic/lifetime.d.ts +37 -0
- package/build/src/semantic/lifetime.d.ts.map +1 -0
- package/build/src/semantic/lifetime.js +527 -0
- package/build/src/semantic/provenance.d.ts +9 -2
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +462 -20
- package/build/src/semantic/scalars.d.ts +11 -0
- package/build/src/semantic/scalars.d.ts.map +1 -1
- package/build/src/semantic/scalars.js +16 -1
- package/build/src/semantic/stdlib.d.ts +254 -0
- package/build/src/semantic/stdlib.d.ts.map +1 -0
- package/build/src/semantic/stdlib.js +880 -0
- package/build/src/semantic/types.d.ts +2952 -202
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +688 -15
- package/build/src/semantic/validate.d.ts +85 -5
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +2576 -98
- package/build/src/stdlib-facades.d.ts +304 -0
- package/build/src/stdlib-facades.d.ts.map +1 -0
- package/build/src/stdlib-facades.js +1167 -0
- package/build/src/stdlib-negotiation.d.ts +69 -0
- package/build/src/stdlib-negotiation.d.ts.map +1 -0
- package/build/src/stdlib-negotiation.js +403 -0
- package/build/src/stdlib-providers.d.ts +72 -0
- package/build/src/stdlib-providers.d.ts.map +1 -0
- package/build/src/stdlib-providers.js +339 -0
- package/build/src/toolchains.d.ts +55 -1
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +15 -4
- package/docs/architecture.md +45 -13
- package/docs/dart.md +60 -0
- package/docs/goals.md +3 -3
- package/docs/ios.md +121 -0
- package/docs/kotlin.md +42 -0
- package/docs/language-support.md +231 -26
- package/docs/multi-file-modules.md +52 -0
- package/docs/parser-qualification.md +121 -8
- package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
- package/docs/rust.md +88 -0
- package/docs/source-maps.md +15 -7
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +366 -4
- package/docs/webassembly.md +52 -0
- package/index.js +63 -8
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
- package/package.json +5 -2
- package/src/artifact-path.js +47 -2
- package/src/artifacts.js +67 -0
- package/src/backends/c-validation.js +6 -1
- package/src/backends/cpp-validation.js +6 -1
- package/src/backends/csharp.js +3 -0
- package/src/backends/dart-runtime.js +41 -0
- package/src/backends/dart.js +326 -0
- package/src/backends/effects.js +705 -0
- package/src/backends/go.js +14 -2
- package/src/backends/identifiers.js +160 -9
- package/src/backends/index.js +27 -2
- package/src/backends/ios.js +1612 -0
- package/src/backends/java.js +454 -36
- package/src/backends/javascript.js +389 -23
- package/src/backends/kotlin-runtime.js +29 -0
- package/src/backends/kotlin.js +141 -0
- package/src/backends/native-validation.js +1 -1
- package/src/backends/ordered-expressions.js +40 -6
- package/src/backends/php-stdlib-support.js +239 -0
- package/src/backends/php.js +469 -32
- package/src/backends/program.js +1407 -0
- package/src/backends/python.js +3 -0
- package/src/backends/ruby.js +326 -23
- package/src/backends/rust-runtime.js +34 -0
- package/src/backends/rust-validation.js +75 -0
- package/src/backends/rust.js +335 -0
- package/src/backends/scalars.js +141 -16
- package/src/backends/shared.js +2304 -124
- package/src/backends/stdlib-support.js +234 -0
- package/src/backends/swift-runtime.js +14 -0
- package/src/backends/swift.js +132 -0
- package/src/backends/typescript.js +349 -23
- package/src/backends/wasm.js +2208 -0
- package/src/backends/writer.js +520 -2
- package/src/diagnostic.js +4 -2
- package/src/frontends/c.js +4 -2
- package/src/frontends/cpp.js +4 -2
- package/src/frontends/csharp.js +4 -2
- package/src/frontends/dart.js +963 -0
- package/src/frontends/index.js +14 -4
- package/src/frontends/java.js +1977 -69
- package/src/frontends/javascript-typescript.js +2046 -102
- package/src/frontends/kotlin.js +713 -0
- package/src/frontends/php.js +1725 -79
- package/src/frontends/program.js +1062 -0
- package/src/frontends/ruby.js +1624 -98
- package/src/frontends/rust-parser.js +18 -0
- package/src/frontends/rust.js +714 -0
- package/src/frontends/scalars.js +31 -1
- package/src/frontends/swift.js +893 -0
- package/src/frontends/types.js +750 -0
- package/src/language-registry.js +172 -12
- package/src/mapping.js +33 -9
- package/src/semantic/capabilities.js +671 -0
- package/src/semantic/effects.js +737 -0
- package/src/semantic/generics.js +58 -0
- package/src/semantic/lifetime.js +517 -0
- package/src/semantic/provenance.js +412 -19
- package/src/semantic/scalars.js +17 -0
- package/src/semantic/stdlib.js +921 -0
- package/src/semantic/types.js +765 -14
- package/src/semantic/validate.js +2934 -209
- package/src/stdlib-facades.js +1211 -0
- package/src/stdlib-negotiation.js +446 -0
- package/src/stdlib-providers.js +377 -0
- package/src/toolchains.js +16 -3
package/build/src/toolchains.js
CHANGED
|
@@ -8,17 +8,26 @@ import { exceededOwnedDeadline, executeFileWithDeadline } from "./subprocess.js"
|
|
|
8
8
|
import { isSupportedTimeoutMs, maximumTimeoutMs } from "./timeout.js";
|
|
9
9
|
const defaultTimeoutMs = 10_000;
|
|
10
10
|
export const canonicalToolchains = deepFreeze({
|
|
11
|
+
dart: definition("dart", "SEMANTIFOLD_DART", ["--version"], /^Dart SDK version: 3\.13\.3 \(stable\) \(Tue Sep 1 01:07:17 2026 -0700\) on "linux_x64"$/u),
|
|
11
12
|
php: definition("php", "SEMANTIFOLD_PHP", ["--version"], /^PHP 8\./u),
|
|
13
|
+
php82: definition("php", "SEMANTIFOLD_PHP", ["--version"], /^PHP (?:8\.(?:[2-9]|[1-9][0-9]+)|(?:9|[1-9][0-9]+)\.[0-9]+)\./u),
|
|
12
14
|
ruby: definition("ruby", "SEMANTIFOLD_RUBY", ["--version"], /^ruby 3\./u),
|
|
13
15
|
node: definition("node", "SEMANTIFOLD_NODE", ["--version"], /^v24\./u),
|
|
14
16
|
tsc: definition("tsc", "SEMANTIFOLD_TSC", ["--version"], /^Version 7\./u),
|
|
15
17
|
javac: definition("javac", "SEMANTIFOLD_JAVAC", ["-version"], /^javac (?:1[7-9]|2[0-9])\./u),
|
|
16
18
|
java: definition("java", "SEMANTIFOLD_JAVA", ["-version"], /^(?:openjdk|java) version "(?:1[7-9]|2[0-9])\./u),
|
|
19
|
+
java25: definition("java", "SEMANTIFOLD_JAVA", ["-version"], /^openjdk version "25\.0\.4" 2026-07-21\nOpenJDK Runtime Environment \(build 25\.0\.4\+7-1-((?:24|26)\.04)-Ubuntu\)\nOpenJDK 64-Bit Server VM \(build 25\.0\.4\+7-1-\1-Ubuntu, mixed mode, sharing\)$/u),
|
|
20
|
+
kotlinc: definition("kotlinc", "SEMANTIFOLD_KOTLINC", ["-version"], /^info: kotlinc-jvm 2\.4\.20 \(JRE 25\.0\.4\+7-1-(?:24|26)\.04-Ubuntu\)$/u),
|
|
17
21
|
python: definition("python3", "SEMANTIFOLD_PYTHON", ["--version"], /^Python 3\./u),
|
|
18
22
|
dotnet: definition("dotnet", "SEMANTIFOLD_DOTNET", ["--version"], /^10\./u),
|
|
19
23
|
go: definition("go", "SEMANTIFOLD_GO", ["version"], /^go version go1\.26\.\d+ linux\/amd64$/u),
|
|
20
24
|
clangpp: definition("clang++", "SEMANTIFOLD_CLANGPP", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u),
|
|
21
|
-
clang: definition("clang", "SEMANTIFOLD_CLANG", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u)
|
|
25
|
+
clang: definition("clang", "SEMANTIFOLD_CLANG", ["--version"], /^Ubuntu clang version 21\.1\.8 [^\n]+\nTarget: x86_64-pc-linux-gnu\n/u),
|
|
26
|
+
rustc: definition("rustc", "SEMANTIFOLD_RUSTC", ["--version", "--verbose"], /^rustc 1\.98\.1 \(48a229cea 2026-09-01\)\nbinary: rustc\ncommit-hash: 48a229ceaefd4985c50990b14116b6d856af0985\ncommit-date: 2026-09-01\nhost: x86_64-unknown-linux-gnu\nrelease: 1\.98\.1\nLLVM version: 22\.1\.8$/u),
|
|
27
|
+
cargo: definition("cargo", "SEMANTIFOLD_CARGO", ["--version", "--verbose"], /^cargo 1\.98\.1 \(797e8a9bc 2026-08-05\)\nrelease: 1\.98\.1\ncommit-hash: 797e8a9bca276c1c9f9f738d2a20f484fa4eea9d\ncommit-date: 2026-08-05\nhost: x86_64-unknown-linux-gnu\n/u),
|
|
28
|
+
swiftc: definition("swiftc", "SEMANTIFOLD_SWIFTC", ["--driver-mode=swiftc", "--version"], /^Swift version 6\.3\.3 \(swift-6\.3\.3-RELEASE\)\nTarget: x86_64-unknown-linux-gnu$/u),
|
|
29
|
+
"wasm-validate": definition("wasm-validate", "SEMANTIFOLD_WASM_VALIDATE", ["--version"], /^1\.0\.36$/u),
|
|
30
|
+
chromium: definition("chromium", "SEMANTIFOLD_CHROMIUM", ["--version"], /^Google Chrome 152\.0\.7977\.82$/u)
|
|
22
31
|
});
|
|
23
32
|
/**
|
|
24
33
|
* Discovers one repository-declared canonical toolchain.
|
|
@@ -63,7 +72,7 @@ export async function discoverCanonicalToolchain(id, options = {}) {
|
|
|
63
72
|
* @param {Readonly<Record<string, string | undefined>>} [input.environment] - Explicit discovery environment.
|
|
64
73
|
* @param {string} input.id - Toolchain ID.
|
|
65
74
|
* @param {string} [input.override] - Configured absolute executable path.
|
|
66
|
-
* @param {RegExp} [input.supportedVersion] - Full
|
|
75
|
+
* @param {RegExp} [input.supportedVersion] - Full selected-stream version policy.
|
|
67
76
|
* @param {number} [input.timeoutMs] - Version command timeout.
|
|
68
77
|
* @param {string[]} input.versionArguments - Exact version argument array.
|
|
69
78
|
* @returns {Promise<import("./semantic/types.js").DiscoveredToolchain>} Discovered tool.
|
|
@@ -125,7 +134,9 @@ export async function discoverToolchain(input) {
|
|
|
125
134
|
});
|
|
126
135
|
}
|
|
127
136
|
const { stderr, stdout } = result;
|
|
128
|
-
const
|
|
137
|
+
const normalizedStdout = stdout.trim();
|
|
138
|
+
const normalizedStderr = stderr.trim();
|
|
139
|
+
const versionOutput = normalizedStdout.length > 0 ? normalizedStdout : normalizedStderr;
|
|
129
140
|
const version = versionOutput.split(/\r?\n/u)[0] ?? "";
|
|
130
141
|
if (version.length == 0) {
|
|
131
142
|
throw new SemantifoldDiagnostic({
|
|
@@ -414,4 +425,4 @@ function deepFreeze(value) {
|
|
|
414
425
|
deepFreeze(nested);
|
|
415
426
|
return Object.freeze(value);
|
|
416
427
|
}
|
|
417
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDO0lBQ3pFLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZUFBZSxDQUFDO0lBQ3pFLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFF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LENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjb25zdGFudHMgYXMgZnNDb25zdGFudHN9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7YWNjZXNzLCByZWFscGF0aCwgc3RhdH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtleGNlZWRlZE93bmVkRGVhZGxpbmUsIGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lfSBmcm9tIFwiLi9zdWJwcm9jZXNzLmpzXCJcbmltcG9ydCB7aXNTdXBwb3J0ZWRUaW1lb3V0TXMsIG1heGltdW1UaW1lb3V0TXN9IGZyb20gXCIuL3RpbWVvdXQuanNcIlxuXG5jb25zdCBkZWZhdWx0VGltZW91dE1zID0gMTBfMDAwXG5cbmV4cG9ydCBjb25zdCBjYW5vbmljYWxUb29sY2hhaW5zID0gZGVlcEZyZWV6ZSh7XG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHJ1Ynk6IGRlZmluaXRpb24oXCJydWJ5XCIsIFwiU0VNQU5USUZPTERfUlVCWVwiLCBbXCItLXZlcnNpb25cIl0sIC9ecnVieSAzXFwuL3UpLFxuICBub2RlOiBkZWZpbml0aW9uKFwibm9kZVwiLCBcIlNFTUFOVElGT0xEX05PREVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnYyNFxcLi91KSxcbiAgdHNjOiBkZWZpbml0aW9uKFwidHNjXCIsIFwiU0VNQU5USUZPTERfVFNDXCIsIFtcIi0tdmVyc2lvblwiXSwgL15WZXJzaW9uIDdcXC4vdSksXG4gIGphdmFjOiBkZWZpbml0aW9uKFwiamF2YWNcIiwgXCJTRU1BTlRJRk9MRF9KQVZBQ1wiLCBbXCItdmVyc2lvblwiXSwgL15qYXZhYyAoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTogZGVmaW5pdGlvbihcImphdmFcIiwgXCJTRU1BTlRJRk9MRF9KQVZBXCIsIFtcIi12ZXJzaW9uXCJdLCAvXig/Om9wZW5qZGt8amF2YSkgdmVyc2lvbiBcIig/OjFbNy05XXwyWzAtOV0pXFwuL3UpLFxuICBweXRob246IGRlZmluaXRpb24oXCJweXRob24zXCIsIFwiU0VNQU5USUZPTERfUFlUSE9OXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QeXRob24gM1xcLi91KSxcbiAgZG90bmV0OiBkZWZpbml0aW9uKFwiZG90bmV0XCIsIFwiU0VNQU5USUZPTERfRE9UTkVUXCIsIFtcIi0tdmVyc2lvblwiXSwgL14xMFxcLi91KSxcbiAgZ286IGRlZmluaXRpb24oXCJnb1wiLCBcIlNFTUFOVElGT0xEX0dPXCIsIFtcInZlcnNpb25cIl0sIC9eZ28gdmVyc2lvbiBnbzFcXC4yNlxcLlxcZCsgbGludXhcXC9hbWQ2NCQvdSksXG4gIGNsYW5ncHA6IGRlZmluaXRpb24oXCJjbGFuZysrXCIsIFwiU0VNQU5USUZPTERfQ0xBTkdQUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eVWJ1bnR1IGNsYW5nIHZlcnNpb24gMjFcXC4xXFwuOCBbXlxcbl0rXFxuVGFyZ2V0OiB4ODZfNjQtcGMtbGludXgtZ251XFxuL3UpLFxuICBjbGFuZzogZGVmaW5pdGlvbihcImNsYW5nXCIsIFwiU0VNQU5USUZPTERfQ0xBTkdcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlVidW50dSBjbGFuZyB2ZXJzaW9uIDIxXFwuMVxcLjggW15cXG5dK1xcblRhcmdldDogeDg2XzY0LXBjLWxpbnV4LWdudVxcbi91KVxufSlcblxuLyoqXG4gKiBEaXNjb3ZlcnMgb25lIHJlcG9zaXRvcnktZGVjbGFyZWQgY2Fub25pY2FsIHRvb2xjaGFpbi5cbiAqIEBwYXJhbSB7a2V5b2YgdHlwZW9mIGNhbm9uaWNhbFRvb2xjaGFpbnN9IGlkIC0gQ2Fub25pY2FsIHRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7e2Vudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4sIG92ZXJyaWRlPzogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXJ9fSBbb3B0aW9uc10gLSBEaXNjb3Zlcnkgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IEV4YWN0IGV4ZWN1dGFibGUgYW5kIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlckNhbm9uaWNhbFRvb2xjaGFpbihpZCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIElEIG11c3QgYmUgYSBub24tZW1wdHkgcHJpbWl0aXZlIHN0cmluZy5cIiwgXCJ0b29sY2hhaW5cIilcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3Qob3B0aW9ucykpIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QuXCIsIGlkKVxuICBjb25zdCBkZWZpbml0aW9uID0gT2JqZWN0Lmhhc093bihjYW5vbmljYWxUb29sY2hhaW5zLCBpZClcbiAgICA/IGNhbm9uaWNhbFRvb2xjaGFpbnNbLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgY2Fub25pY2FsVG9vbGNoYWluc30gKi8gKGlkKV1cbiAgICA6IHVuZGVmaW5lZFxuXG4gIGlmICghZGVmaW5pdGlvbikgaW52YWxpZFRvb2xjaGFpbihgVW5rbm93biBjYW5vbmljYWwgdG9vbGNoYWluICcke2lkfScuYCwgaWQpXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA9IG9wdGlvbnMuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBzbmFwc2hvdEVudmlyb25tZW50KG9wdGlvbnMuZW52aXJvbm1lbnQsIGlkKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudCA/PyBkZWZhdWx0RW52aXJvbm1lbnQoKVxuICBjb25zdCBjb25maWd1cmVkID0gb3B0aW9ucy5vdmVycmlkZSA9PT0gdW5kZWZpbmVkXG4gICAgPyBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZFxuICAgICAgPyBwcm9jZXNzLmVudltkZWZpbml0aW9uLm92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZV1cbiAgICAgIDogY29uZmlndXJhdGlvbkVudmlyb25tZW50W2RlZmluaXRpb24ub3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlXVxuICAgIDogb3B0aW9ucy5vdmVycmlkZVxuXG4gIHJldHVybiBkaXNjb3ZlclRvb2xjaGFpbih7XG4gICAgY2Fub25pY2FsQ29tbWFuZDogZGVmaW5pdGlvbi5jYW5vbmljYWxDb21tYW5kLFxuICAgIGVudmlyb25tZW50LFxuICAgIGlkLFxuICAgIG92ZXJyaWRlOiBjb25maWd1cmVkLFxuICAgIHN1cHBvcnRlZFZlcnNpb246IGRlZmluaXRpb24uc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IGRlZmluaXRpb24udmVyc2lvbkFyZ3VtZW50c1xuICB9KVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2ZXJzaW9ucyBvbmUgY29uZmlndXJlZCBvciBjYW5vbmljYWwgZXhlY3V0YWJsZSB3aXRob3V0IGludm9raW5nIGEgc2hlbGwuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBEaXNjb3ZlcnkgcmVxdWVzdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC5jYW5vbmljYWxDb21tYW5kIC0gQ2Fub25pY2FsIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IFtpbnB1dC5lbnZpcm9ubWVudF0gLSBFeHBsaWNpdCBkaXNjb3ZlcnkgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2lucHV0Lm92ZXJyaWRlXSAtIENvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHBhcmFtIHtSZWdFeHB9IFtpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uXSAtIEZ1bGwgY2FwdHVyZWQtb3V0cHV0IHZlcnNpb24gcG9saWN5LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbnB1dC50aW1lb3V0TXNdIC0gVmVyc2lvbiBjb21tYW5kIHRpbWVvdXQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBpbnB1dC52ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbj59IERpc2NvdmVyZWQgdG9vbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyVG9vbGNoYWluKGlucHV0KSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dCkpIGludmFsaWRUb29sY2hhaW4oXCJUb29sY2hhaW4gZGlzY292ZXJ5IHJlcXVpcmVzIGEgcmVxdWVzdCBvYmplY3QuXCIsIFwidG9vbGNoYWluXCIpXG4gIGNvbnN0IHZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZSA9IGlucHV0LnZlcnNpb25Bcmd1bWVudHNcbiAgY29uc3QgdmVyc2lvbkFyZ3VtZW50cyA9IGlzRGVuc2VBcnJheSh2ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGUpID8gWy4uLnZlcnNpb25Bcmd1bWVudENhbmRpZGF0ZV0gOiB1bmRlZmluZWRcbiAgY29uc3QgY2FuZGlkYXRlID0ge1xuICAgIGNhbm9uaWNhbENvbW1hbmQ6IGlucHV0LmNhbm9uaWNhbENvbW1hbmQsXG4gICAgZW52aXJvbm1lbnQ6IGlucHV0LmVudmlyb25tZW50ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0RW52aXJvbm1lbnQoKSA6IGlucHV0LmVudmlyb25tZW50LFxuICAgIGlkOiBpbnB1dC5pZCxcbiAgICBvdmVycmlkZTogaW5wdXQub3ZlcnJpZGUsXG4gICAgc3VwcG9ydGVkVmVyc2lvbjogaW5wdXQuc3VwcG9ydGVkVmVyc2lvbixcbiAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFRpbWVvdXRNcyA6IGlucHV0LnRpbWVvdXRNcyxcbiAgICB2ZXJzaW9uQXJndW1lbnRzXG4gIH1cblxuICB2YWxpZGF0ZURpc2NvdmVyeShjYW5kaWRhdGUpXG4gIGNvbnN0IGNhbm9uaWNhbENvbW1hbmQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNhbmRpZGF0ZS5jYW5vbmljYWxDb21tYW5kKVxuICBjb25zdCBlbnZpcm9ubWVudCA9IC8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59ICovIChjYW5kaWRhdGUuZW52aXJvbm1lbnQpXG4gIGNvbnN0IGlkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjYW5kaWRhdGUuaWQpXG4gIGNvbnN0IG92ZXJyaWRlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovIChjYW5kaWRhdGUub3ZlcnJpZGUpXG4gIGNvbnN0IHN1cHBvcnRlZFZlcnNpb24gPSBjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbiBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgID8gbmV3IFJlZ0V4cChjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbi5zb3VyY2UsIGNhbmRpZGF0ZS5zdXBwb3J0ZWRWZXJzaW9uLmZsYWdzKVxuICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IHRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2FuZGlkYXRlLnRpbWVvdXRNcylcbiAgY29uc3QgdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChjYW5kaWRhdGUudmVyc2lvbkFyZ3VtZW50cylcbiAgY29uc3Qgbm9ybWFsaXplZEVudmlyb25tZW50ID0gZGV0ZXJtaW5pc3RpY0Vudmlyb25tZW50KGVudmlyb25tZW50KVxuICBjb25zdCB7ZXhlY3V0YWJsZSwgc291cmNlfSA9IG92ZXJyaWRlID09PSB1bmRlZmluZWRcbiAgICA/IGF3YWl0IHJlc29sdmVDYW5vbmljYWwoaWQsIGNhbm9uaWNhbENvbW1hbmQsIG5vcm1hbGl6ZWRFbnZpcm9ubWVudC5QQVRIID8/IFwiXCIpXG4gICAgOiB7ZXhlY3V0YWJsZTogYXdhaXQgcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY2Fub25pY2FsQ29tbWFuZCksIHNvdXJjZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwib3ZlcnJpZGVcIil9XG4gIC8qKiBAdHlwZSB7e3N0ZG91dDogc3RyaW5nLCBzdGRlcnI6IHN0cmluZ319ICovXG4gIGxldCByZXN1bHRcblxuICB0cnkge1xuICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lKHtcbiAgICAgIGFyZ3VtZW50czogdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyxcbiAgICAgIGVudmlyb25tZW50OiBub3JtYWxpemVkRW52aXJvbm1lbnQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXRNc1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKVxuICAgIGNvbnN0IHRpbWVkT3V0ID0gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKVxuXG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAuLi5wcm9jZXNzRXJyb3IsXG4gICAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgICAgY29kZTogdGltZWRPdXQgPyBcIlRPT0xfVkVSU0lPTl9USU1FT1VUXCIgOiBcIlRPT0xfVkVSU0lPTl9GQUlMVVJFXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IHRpbWVkT3V0XG4gICAgICAgID8gYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIGV4Y2VlZGVkICR7dGltZW91dE1zfW1zLmBcbiAgICAgICAgOiBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgZmFpbGVkLmAsXG4gICAgICBzdGRlcnI6IHByb2Nlc3NFcnJvci5zdGRlcnIsXG4gICAgICBzdGRvdXQ6IHByb2Nlc3NFcnJvci5zdGRvdXRcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qge3N0ZGVyciwgc3Rkb3V0fSA9IHJlc3VsdFxuICBjb25zdCB2ZXJzaW9uT3V0cHV0ID0gW3N0ZG91dCwgc3RkZXJyXS5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS5sZW5ndGggPiAwKS5qb2luKFwiXFxuXCIpLnRyaW0oKVxuICBjb25zdCB2ZXJzaW9uID0gdmVyc2lvbk91dHB1dC5zcGxpdCgvXFxyP1xcbi91KVswXSA/PyBcIlwiXG5cbiAgaWYgKHZlcnNpb24ubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9WRVJTSU9OX0ZBSUxVUkVcIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIHJldHVybmVkIG5vIHZlcnNpb24gb3V0cHV0LmAsXG4gICAgICBzdGRlcnIsXG4gICAgICBzdGRvdXRcbiAgICB9KVxuICB9XG4gIGlmIChzdXBwb3J0ZWRWZXJzaW9uICYmICFzdXBwb3J0ZWRWZXJzaW9uLnRlc3QodmVyc2lvbk91dHB1dCkpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9VTlNVUFBPUlRFRF9WRVJTSU9OXCIsXG4gICAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBFeGVjdXRhYmxlICcke2V4ZWN1dGFibGV9JyByZXBvcnRlZCB1bnN1cHBvcnRlZCB2ZXJzaW9uICcke3ZlcnNpb259Jy5gLFxuICAgICAgc3RkZXJyLFxuICAgICAgc3Rkb3V0LFxuICAgICAgdmVyc2lvblxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZGVlcEZyZWV6ZSh7XG4gICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICBleGVjdXRhYmxlLFxuICAgIGlkLFxuICAgIHNvdXJjZSxcbiAgICB2ZXJzaW9uLFxuICAgIHZlcnNpb25Bcmd1bWVudHM6IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMsXG4gICAgdmVyc2lvbk91dHB1dFxuICB9KVxufVxuXG4vKipcbiAqIEJ1aWxkcyBvbmUgY2Fub25pY2FsIGltbXV0YWJsZSB0b29sY2hhaW4gZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gY2Fub25pY2FsQ29tbWFuZCAtIFBBVEggY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUgLSBDb25maWd1cmVkIG92ZXJyaWRlIHZhcmlhYmxlLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnRzLlxuICogQHBhcmFtIHtSZWdFeHB9IHN1cHBvcnRlZFZlcnNpb24gLSBTdXBwb3J0ZWQgdmVyc2lvbiBvdXRwdXQuXG4gKiBAcmV0dXJucyB7e2Nhbm9uaWNhbENvbW1hbmQ6IHN0cmluZywgb3ZlcnJpZGVFbnZpcm9ubWVudFZhcmlhYmxlOiBzdHJpbmcsIHN1cHBvcnRlZFZlcnNpb246IFJlZ0V4cCwgdmVyc2lvbkFyZ3VtZW50czogc3RyaW5nW119fSBEZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmaW5pdGlvbihjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHZlcnNpb25Bcmd1bWVudHMsIHN1cHBvcnRlZFZlcnNpb24pIHtcbiAgcmV0dXJuIHtjYW5vbmljYWxDb21tYW5kLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGUsIHN1cHBvcnRlZFZlcnNpb24sIHZlcnNpb25Bcmd1bWVudHN9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRvb2wgZGlzY292ZXJ5IGJlZm9yZSBmaWxlc3lzdGVtIG9yIHByb2Nlc3MgYWNjZXNzLlxuICogQHBhcmFtIHt7XG4gKiAgIGNhbm9uaWNhbENvbW1hbmQ6IHVua25vd24sXG4gKiAgIGVudmlyb25tZW50OiB1bmtub3duLFxuICogICBpZDogdW5rbm93bixcbiAqICAgb3ZlcnJpZGU6IHVua25vd24sXG4gKiAgIHN1cHBvcnRlZFZlcnNpb246IHVua25vd24sXG4gKiAgIHRpbWVvdXRNczogdW5rbm93bixcbiAqICAgdmVyc2lvbkFyZ3VtZW50czogdW5rbm93blxuICogfX0gaW5wdXQgLSBDYW5kaWRhdGUgZGlzY292ZXJ5IGZpZWxkcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURpc2NvdmVyeShpbnB1dCkge1xuICBpZiAodHlwZW9mIGlucHV0LmlkICE9IFwic3RyaW5nXCIgfHwgaW5wdXQuaWQubGVuZ3RoID09IDAgfHxcbiAgICB0eXBlb2YgaW5wdXQuY2Fub25pY2FsQ29tbWFuZCAhPSBcInN0cmluZ1wiIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQubGVuZ3RoID09IDAgfHxcbiAgICBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiL1wiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFxcXFwiKSB8fCBpbnB1dC5jYW5vbmljYWxDb21tYW5kLmluY2x1ZGVzKFwiXFwwXCIpIHx8XG4gICAgIWlzRGVuc2VBcnJheShpbnB1dC52ZXJzaW9uQXJndW1lbnRzKSB8fCAhaW5wdXQudmVyc2lvbkFyZ3VtZW50cy5ldmVyeSh2YWxpZEFyZ3VtZW50KSB8fFxuICAgICFpc0Vudmlyb25tZW50KGlucHV0LmVudmlyb25tZW50KSB8fCAhaXNTdXBwb3J0ZWRUaW1lb3V0TXMoaW5wdXQudGltZW91dE1zKSB8fFxuICAgIChpbnB1dC5vdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgaW5wdXQub3ZlcnJpZGUgIT0gXCJzdHJpbmdcIiB8fCAhcGF0aC5pc0Fic29sdXRlKGlucHV0Lm92ZXJyaWRlKSB8fCBpbnB1dC5vdmVycmlkZS5pbmNsdWRlcyhcIlxcMFwiKSkpIHx8XG4gICAgKGlucHV0LnN1cHBvcnRlZFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAoIShpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uIGluc3RhbmNlb2YgUmVnRXhwKSB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLmdsb2JhbCB8fCBpbnB1dC5zdXBwb3J0ZWRWZXJzaW9uLnN0aWNreSkpKSB7XG4gICAgaW52YWxpZFRvb2xjaGFpbihgVG9vbGNoYWluIGRpc2NvdmVyeSByZXF1aXJlcyBhIGNhbm9uaWNhbCBiYXNlbmFtZSwgYWJzb2x1dGUgb3ZlcnJpZGUsIGFyZ3VtZW50IGFycmF5LCBlbnZpcm9ubWVudCwgYW5kIHRpbWVvdXQgZnJvbSAxIHRocm91Z2ggJHttYXhpbXVtVGltZW91dE1zfW1zLmAsXG4gICAgICB0eXBlb2YgaW5wdXQuaWQgPT0gXCJzdHJpbmdcIiA/IGlucHV0LmlkIDogXCJ0b29sY2hhaW5cIilcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSB1bmFtYmlndW91cyBjYW5vbmljYWwgY29tbWFuZCBmcm9tIGFuIGV4cGxpY2l0IFBBVEguXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUb29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIENhbm9uaWNhbCBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhWYWx1ZSAtIEV4cGxpY2l0IFBBVEguXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7ZXhlY3V0YWJsZTogc3RyaW5nLCBzb3VyY2U6IFwiY2Fub25pY2FsXCJ9Pn0gRXhhY3QgZXhlY3V0YWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhbm9uaWNhbChpZCwgY29tbWFuZCwgcGF0aFZhbHVlKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBwYXRoVmFsdWUuc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgaWYgKGRpcmVjdG9yeS5sZW5ndGggPT0gMCB8fCAhcGF0aC5pc0Fic29sdXRlKGRpcmVjdG9yeSkpIGNvbnRpbnVlXG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgY29tbWFuZClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGFjdCA9IGF3YWl0IHJlc29sdmVFeGVjdXRhYmxlRmlsZShjYW5kaWRhdGUpXG5cbiAgICAgIGlmIChleGFjdCAhPSB1bmRlZmluZWQpIG1hdGNoZXMuc2V0KGV4YWN0LCBleGFjdClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgUEFUSCBjYW5kaWRhdGUgaXMgYWJzZW50IG9yIG5vbi1leGVjdXRhYmxlOyBkaXNjb3ZlcnkgY29udGludWVzIGRldGVybWluaXN0aWNhbGx5LlxuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLnNpemUgPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBDYW5vbmljYWwgY29tbWFuZCAnJHtjb21tYW5kfScgd2FzIG5vdCBmb3VuZCBhcyBhbiBleGVjdXRhYmxlIG9uIFBBVEguYFxuICAgIH0pXG4gIH1cbiAgaWYgKG1hdGNoZXMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiVE9PTF9BTUJJR1VPVVNcIixcbiAgICAgIGNvbW1hbmQsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIGNvbW1hbmQgJyR7Y29tbWFuZH0nIHJlc29sdmVzIHRvIG11bHRpcGxlIGV4ZWN1dGFibGVzOiAke1suLi5tYXRjaGVzLmtleXMoKV0uam9pbihcIiwgXCIpfS5gXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7ZXhlY3V0YWJsZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChbLi4ubWF0Y2hlcy5rZXlzKCldWzBdKSwgc291cmNlOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJjYW5vbmljYWxcIil9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNvbmZpZ3VyZWQgYWJzb2x1dGUgZXhlY3V0YWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdmVycmlkZSAtIEFic29sdXRlIG92ZXJyaWRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBDYW5vbmljYWwgY29tbWFuZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEV4YWN0IGV4ZWN1dGFibGUgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU92ZXJyaWRlKGlkLCBvdmVycmlkZSwgY29tbWFuZCkge1xuICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgY2F1c2VcblxuICB0cnkge1xuICAgIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKG92ZXJyaWRlKVxuXG4gICAgaWYgKGV4YWN0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGV4YWN0XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2F1c2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWRcbiAgfVxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNhdXNlLFxuICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICBjb21tYW5kLFxuICAgIGV4ZWN1dGFibGU6IG92ZXJyaWRlLFxuICAgIGxhbmd1YWdlOiBpZCxcbiAgICBtZXNzYWdlOiBgQ29uZmlndXJlZCBleGVjdXRhYmxlICcke292ZXJyaWRlfScgaXMgbWlzc2luZyBvciBub3QgZXhlY3V0YWJsZS5gXG4gIH0pXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIGNhbmRpZGF0ZSB0byBhbiBleGVjdXRhYmxlIHJlZ3VsYXIgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYW5kaWRhdGUgLSBDYW5kaWRhdGUgcGF0aC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59IEV4YWN0IHJlZ3VsYXIgZXhlY3V0YWJsZSwgaWYgdGhlIGZpbGUgdHlwZSBpcyB2YWxpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKGNhbmRpZGF0ZSkge1xuICBjb25zdCBleGFjdCA9IGF3YWl0IHJlYWxwYXRoKGNhbmRpZGF0ZSlcbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhdChleGFjdClcblxuICBpZiAoIXN0YXR1cy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZFxuICBhd2FpdCBhY2Nlc3MoZXhhY3QsIGZzQ29uc3RhbnRzLlhfT0spXG5cbiAgcmV0dXJuIGV4YWN0XG59XG5cbi8qKlxuICogUHJvZHVjZXMgdGhlIG1pbmltYWwgZGV0ZXJtaW5pc3RpYyBwcm9jZXNzIGVudmlyb25tZW50LlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gZW52aXJvbm1lbnQgLSBFeHBsaWNpdCBpbnB1dHMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IE5vcm1hbGl6ZWQgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmlzdGljRW52aXJvbm1lbnQoZW52aXJvbm1lbnQgPSBkZWZhdWx0RW52aXJvbm1lbnQoKSkge1xuICBjb25zdCBlbnRyaWVzID0gZW52aXJvbm1lbnRFbnRyaWVzKGVudmlyb25tZW50KVxuXG4gIGlmIChlbnRyaWVzID09IHVuZGVmaW5lZCkgaW52YWxpZFRvb2xjaGFpbihcIlByb2Nlc3MgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIG93bi1wcm9wZXJ0eSBkYXRhIHJlY29yZCBvZiBzdHJpbmcgb3IgdW5kZWZpbmVkIHZhbHVlcy5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgIGlmICghL15bQS1aYS16X11bQS1aYS16MC05X10qJC91LnRlc3Qoa2V5KSB8fCBrZXkuaW5jbHVkZXMoXCJcXDBcIikgfHwgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuaW5jbHVkZXMoXCJcXDBcIikpKSB7XG4gICAgICBpbnZhbGlkVG9vbGNoYWluKFwiUHJvY2VzcyBlbnZpcm9ubWVudCBjb250YWlucyBhbiBpbnZhbGlkIGtleSBvciB2YWx1ZS5cIiwgXCJlbnZpcm9ubWVudFwiKVxuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZFtrZXldID0gdmFsdWVcbiAgfVxuICBub3JtYWxpemVkLkxBTkcgPSBcIkMuVVRGLThcIlxuICBub3JtYWxpemVkLkxDX0FMTCA9IFwiQy5VVEYtOFwiXG4gIG5vcm1hbGl6ZWQuVFogPSBcIlVUQ1wiXG4gIG5vcm1hbGl6ZWQuUEFUSCA/Pz0gXCIvdXNyL2xvY2FsL2JpbjovdXNyL2JpbjovYmluXCJcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIFJldGFpbnMgb25seSBleGVjdXRhYmxlIGxvb2t1cCBmcm9tIHRoZSBhbWJpZW50IGVudmlyb25tZW50LlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBNaW5pbWFsIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRFbnZpcm9ubWVudCgpIHtcbiAgcmV0dXJuIHtQQVRIOiBwcm9jZXNzLmVudi5QQVRIfVxufVxuXG4vKipcbiAqIE5hcnJvd3Mgc3RhYmxlIGZpZWxkcyBmcm9tIGEgdmVyc2lvbiBzdWJwcm9jZXNzIHJlamVjdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBQcm9jZXNzIHJlamVjdGlvbi5cbiAqIEByZXR1cm5zIHt7ZXhpdENvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ319IFN0YWJsZSBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NFcnJvckZpZWxkcyhlcnJvcikge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPSBcIm9iamVjdFwiKSByZXR1cm4ge2V4aXRDb2RlOiB1bmRlZmluZWQsIHNpZ25hbDogdW5kZWZpbmVkLCBzdGRlcnI6IFwiXCIsIHN0ZG91dDogXCJcIn1cbiAgY29uc3QgdmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZXJyb3IpXG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZTogdHlwZW9mIHZhbHVlLmNvZGUgPT0gXCJudW1iZXJcIiA/IHZhbHVlLmNvZGUgOiB1bmRlZmluZWQsXG4gICAgc2lnbmFsOiB0eXBlb2YgdmFsdWUuc2lnbmFsID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zaWduYWwgOiB1bmRlZmluZWQsXG4gICAgc3RkZXJyOiB0eXBlb2YgdmFsdWUuc3RkZXJyID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRlcnIgOiBcIlwiLFxuICAgIHN0ZG91dDogdHlwZW9mIHZhbHVlLnN0ZG91dCA9PSBcInN0cmluZ1wiID8gdmFsdWUuc3Rkb3V0IDogXCJcIlxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBzaGVsbC1mcmVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBzdHJpbmd9IFdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIHNhZmUgdG8gcGFzcyBkaXJlY3RseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRBcmd1bWVudCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiYgIXZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIGV4cGxpY2l0IHByb2Nlc3MtZW52aXJvbm1lbnQgdmFsdWVzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gV2hldGhlciBlbnRyaWVzIGFyZSBzdHJpbmdzIG9yIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gaXNFbnZpcm9ubWVudCh2YWx1ZSkge1xuICByZXR1cm4gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKSAhPSB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBEZXRhY2hlcyBhbiBleHBsaWNpdCBlbnZpcm9ubWVudCBiZWZvcmUgY2Fub25pY2FsIG92ZXJyaWRlIGxvb2t1cCBjYW4geWllbGQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50IHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gT3duZWQgZW52aXJvbm1lbnQgZGF0YS5cbiAqL1xuZnVuY3Rpb24gc25hcHNob3RFbnZpcm9ubWVudCh2YWx1ZSwgaWQpIHtcbiAgY29uc3QgZW50cmllcyA9IGVudmlyb25tZW50RW50cmllcyh2YWx1ZSlcblxuICBpZiAoZW50cmllcyA9PSB1bmRlZmluZWQpIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBlbnZpcm9ubWVudCBtdXN0IGJlIGEgcGxhaW4gb3duLXByb3BlcnR5IGRhdGEgcmVjb3JkIG9mIHN0cmluZyBvciB1bmRlZmluZWQgdmFsdWVzLlwiLCBpZClcbiAgfVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG4gIGNvbnN0IHNuYXBzaG90ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGVudHJpZXMpIHNuYXBzaG90W2tleV0gPSBlbnRyeVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHNuYXBzaG90KVxufVxuXG4vKipcbiAqIFJlYWRzIG9ubHkgZW51bWVyYWJsZSBvd24gZGF0YSBwcm9wZXJ0aWVzIGZyb20gYW4gb3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgcmVjb3JkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudCByZWNvcmQuXG4gKiBAcmV0dXJucyB7W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXVtdIHwgdW5kZWZpbmVkfSBEZXRhY2hlZCBlbnRyaWVzIHdoZW4gdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGVudmlyb25tZW50RW50cmllcyh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gICAgaWYgKHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF1bXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyh2YWx1ZSkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ICE9IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpXG5cbiAgICAgIGlmIChkZXNjcmlwdG9yID09IHVuZGVmaW5lZCB8fCAhZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8ICEoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIHx8XG4gICAgICAgIChkZXNjcmlwdG9yLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT0gXCJzdHJpbmdcIikpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGVudHJpZXMucHVzaChba2V5LCBkZXNjcmlwdG9yLnZhbHVlXSlcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IHN0cmluZy1rZXllZCBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PSBPYmplY3QucHJvdG90eXBlXG59XG5cbi8qKlxuICogVGhyb3dzIGEgbm9ybWFsaXplZCBkaXNjb3ZlcnktY29uZmlndXJhdGlvbiBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFRvb2xjaGFpbihtZXNzYWdlLCBpZCkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIklOVkFMSURfVE9PTENIQUlOXCIsIGxhbmd1YWdlOiBpZCwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogRGVlcGx5IGZyZWV6ZXMgY2Fub25pY2FsIGRlY2xhcmF0aW9ucyBhbmQgZGlzY292ZXJ5IHJlc3VsdHMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFRvb2xjaGFpbi1vd25lZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtUfSBGcm96ZW4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZXBGcmVlemUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgZGVlcEZyZWV6ZShuZXN0ZWQpXG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWUpXG59XG4iXX0=
|
|
428
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWlucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29sY2hhaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsU0FBUyxJQUFJLFdBQVcsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUNoRCxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN2RCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUE7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQ3hELDJGQUEyRixDQUFDO0lBQzlGLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3JFLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsZ0VBQWdFLENBQUM7SUFDNUgsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDekUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0JBQWtC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RSxPQUFPLFNBQVMsQ0FBQTtZQUMzRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUE7QUFDL0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRTtJQUNuQyxNQUFNLElBQUkscUJBQXFCLENBQUMsRUFBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO0FBQ3JGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y29uc3RhbnRzIGFzIGZzQ29uc3RhbnRzfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQge2FjY2VzcywgcmVhbHBhdGgsIHN0YXR9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtpc0RlbnNlQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7ZXhjZWVkZWRPd25lZERlYWRsaW5lLCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZX0gZnJvbSBcIi4vc3VicHJvY2Vzcy5qc1wiXG5pbXBvcnQge2lzU3VwcG9ydGVkVGltZW91dE1zLCBtYXhpbXVtVGltZW91dE1zfSBmcm9tIFwiLi90aW1lb3V0LmpzXCJcblxuY29uc3QgZGVmYXVsdFRpbWVvdXRNcyA9IDEwXzAwMFxuXG5leHBvcnQgY29uc3QgY2Fub25pY2FsVG9vbGNoYWlucyA9IGRlZXBGcmVlemUoe1xuICBkYXJ0OiBkZWZpbml0aW9uKFwiZGFydFwiLCBcIlNFTUFOVElGT0xEX0RBUlRcIiwgW1wiLS12ZXJzaW9uXCJdLFxuICAgIC9eRGFydCBTREsgdmVyc2lvbjogM1xcLjEzXFwuMyBcXChzdGFibGVcXCkgXFwoVHVlIFNlcCAxIDAxOjA3OjE3IDIwMjYgLTA3MDBcXCkgb24gXCJsaW51eF94NjRcIiQvdSksXG4gIHBocDogZGVmaW5pdGlvbihcInBocFwiLCBcIlNFTUFOVElGT0xEX1BIUFwiLCBbXCItLXZlcnNpb25cIl0sIC9eUEhQIDhcXC4vdSksXG4gIHBocDgyOiBkZWZpbml0aW9uKFwicGhwXCIsIFwiU0VNQU5USUZPTERfUEhQXCIsIFtcIi0tdmVyc2lvblwiXSwgL15QSFAgKD86OFxcLig/OlsyLTldfFsxLTldWzAtOV0rKXwoPzo5fFsxLTldWzAtOV0rKVxcLlswLTldKylcXC4vdSksXG4gIHJ1Ynk6IGRlZmluaXRpb24oXCJydWJ5XCIsIFwiU0VNQU5USUZPTERfUlVCWVwiLCBbXCItLXZlcnNpb25cIl0sIC9ecnVieSAzXFwuL3UpLFxuICBub2RlOiBkZWZpbml0aW9uKFwibm9kZVwiLCBcIlNFTUFOVElGT0xEX05PREVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXnYyNFxcLi91KSxcbiAgdHNjOiBkZWZpbml0aW9uKFwidHNjXCIsIFwiU0VNQU5USUZPTERfVFNDXCIsIFtcIi0tdmVyc2lvblwiXSwgL15WZXJzaW9uIDdcXC4vdSksXG4gIGphdmFjOiBkZWZpbml0aW9uKFwiamF2YWNcIiwgXCJTRU1BTlRJRk9MRF9KQVZBQ1wiLCBbXCItdmVyc2lvblwiXSwgL15qYXZhYyAoPzoxWzctOV18MlswLTldKVxcLi91KSxcbiAgamF2YTogZGVmaW5pdGlvbihcImphdmFcIiwgXCJTRU1BTlRJRk9MRF9KQVZBXCIsIFtcIi12ZXJzaW9uXCJdLCAvXig/Om9wZW5qZGt8amF2YSkgdmVyc2lvbiBcIig/OjFbNy05XXwyWzAtOV0pXFwuL3UpLFxuICBqYXZhMjU6IGRlZmluaXRpb24oXCJqYXZhXCIsIFwiU0VNQU5USUZPTERfSkFWQVwiLCBbXCItdmVyc2lvblwiXSxcbiAgICAvXm9wZW5qZGsgdmVyc2lvbiBcIjI1XFwuMFxcLjRcIiAyMDI2LTA3LTIxXFxuT3BlbkpESyBSdW50aW1lIEVudmlyb25tZW50IFxcKGJ1aWxkIDI1XFwuMFxcLjRcXCs3LTEtKCg/OjI0fDI2KVxcLjA0KS1VYnVudHVcXClcXG5PcGVuSkRLIDY0LUJpdCBTZXJ2ZXIgVk0gXFwoYnVpbGQgMjVcXC4wXFwuNFxcKzctMS1cXDEtVWJ1bnR1LCBtaXhlZCBtb2RlLCBzaGFyaW5nXFwpJC91KSxcbiAga290bGluYzogZGVmaW5pdGlvbihcImtvdGxpbmNcIiwgXCJTRU1BTlRJRk9MRF9LT1RMSU5DXCIsIFtcIi12ZXJzaW9uXCJdLCAvXmluZm86IGtvdGxpbmMtanZtIDJcXC40XFwuMjAgXFwoSlJFIDI1XFwuMFxcLjRcXCs3LTEtKD86MjR8MjYpXFwuMDQtVWJ1bnR1XFwpJC91KSxcbiAgcHl0aG9uOiBkZWZpbml0aW9uKFwicHl0aG9uM1wiLCBcIlNFTUFOVElGT0xEX1BZVEhPTlwiLCBbXCItLXZlcnNpb25cIl0sIC9eUHl0aG9uIDNcXC4vdSksXG4gIGRvdG5ldDogZGVmaW5pdGlvbihcImRvdG5ldFwiLCBcIlNFTUFOVElGT0xEX0RPVE5FVFwiLCBbXCItLXZlcnNpb25cIl0sIC9eMTBcXC4vdSksXG4gIGdvOiBkZWZpbml0aW9uKFwiZ29cIiwgXCJTRU1BTlRJRk9MRF9HT1wiLCBbXCJ2ZXJzaW9uXCJdLCAvXmdvIHZlcnNpb24gZ28xXFwuMjZcXC5cXGQrIGxpbnV4XFwvYW1kNjQkL3UpLFxuICBjbGFuZ3BwOiBkZWZpbml0aW9uKFwiY2xhbmcrK1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HUFBcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXlVidW50dSBjbGFuZyB2ZXJzaW9uIDIxXFwuMVxcLjggW15cXG5dK1xcblRhcmdldDogeDg2XzY0LXBjLWxpbnV4LWdudVxcbi91KSxcbiAgY2xhbmc6IGRlZmluaXRpb24oXCJjbGFuZ1wiLCBcIlNFTUFOVElGT0xEX0NMQU5HXCIsIFtcIi0tdmVyc2lvblwiXSwgL15VYnVudHUgY2xhbmcgdmVyc2lvbiAyMVxcLjFcXC44IFteXFxuXStcXG5UYXJnZXQ6IHg4Nl82NC1wYy1saW51eC1nbnVcXG4vdSksXG4gIHJ1c3RjOiBkZWZpbml0aW9uKFwicnVzdGNcIiwgXCJTRU1BTlRJRk9MRF9SVVNUQ1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9ecnVzdGMgMVxcLjk4XFwuMSBcXCg0OGEyMjljZWEgMjAyNi0wOS0wMVxcKVxcbmJpbmFyeTogcnVzdGNcXG5jb21taXQtaGFzaDogNDhhMjI5Y2VhZWZkNDk4NWM1MDk5MGIxNDExNmI2ZDg1NmFmMDk4NVxcbmNvbW1pdC1kYXRlOiAyMDI2LTA5LTAxXFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxucmVsZWFzZTogMVxcLjk4XFwuMVxcbkxMVk0gdmVyc2lvbjogMjJcXC4xXFwuOCQvdSksXG4gIGNhcmdvOiBkZWZpbml0aW9uKFwiY2FyZ29cIiwgXCJTRU1BTlRJRk9MRF9DQVJHT1wiLCBbXCItLXZlcnNpb25cIiwgXCItLXZlcmJvc2VcIl0sIC9eY2FyZ28gMVxcLjk4XFwuMSBcXCg3OTdlOGE5YmMgMjAyNi0wOC0wNVxcKVxcbnJlbGVhc2U6IDFcXC45OFxcLjFcXG5jb21taXQtaGFzaDogNzk3ZThhOWJjYTI3NmMxYzlmOWY3MzhkMmEyMGY0ODRmYTRlZWE5ZFxcbmNvbW1pdC1kYXRlOiAyMDI2LTA4LTA1XFxuaG9zdDogeDg2XzY0LXVua25vd24tbGludXgtZ251XFxuL3UpLFxuICBzd2lmdGM6IGRlZmluaXRpb24oXCJzd2lmdGNcIiwgXCJTRU1BTlRJRk9MRF9TV0lGVENcIiwgW1wiLS1kcml2ZXItbW9kZT1zd2lmdGNcIiwgXCItLXZlcnNpb25cIl0sIC9eU3dpZnQgdmVyc2lvbiA2XFwuM1xcLjMgXFwoc3dpZnQtNlxcLjNcXC4zLVJFTEVBU0VcXClcXG5UYXJnZXQ6IHg4Nl82NC11bmtub3duLWxpbnV4LWdudSQvdSksXG4gIFwid2FzbS12YWxpZGF0ZVwiOiBkZWZpbml0aW9uKFwid2FzbS12YWxpZGF0ZVwiLCBcIlNFTUFOVElGT0xEX1dBU01fVkFMSURBVEVcIiwgW1wiLS12ZXJzaW9uXCJdLCAvXjFcXC4wXFwuMzYkL3UpLFxuICBjaHJvbWl1bTogZGVmaW5pdGlvbihcImNocm9taXVtXCIsIFwiU0VNQU5USUZPTERfQ0hST01JVU1cIiwgW1wiLS12ZXJzaW9uXCJdLCAvXkdvb2dsZSBDaHJvbWUgMTUyXFwuMFxcLjc5NzdcXC44MiQvdSlcbn0pXG5cbi8qKlxuICogRGlzY292ZXJzIG9uZSByZXBvc2l0b3J5LWRlY2xhcmVkIGNhbm9uaWNhbCB0b29sY2hhaW4uXG4gKiBAcGFyYW0ge2tleW9mIHR5cGVvZiBjYW5vbmljYWxUb29sY2hhaW5zfSBpZCAtIENhbm9uaWNhbCB0b29sY2hhaW4gSUQuXG4gKiBAcGFyYW0ge3tlbnZpcm9ubWVudD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+LCBvdmVycmlkZT86IHN0cmluZywgdGltZW91dE1zPzogbnVtYmVyfX0gW29wdGlvbnNdIC0gRGlzY292ZXJ5IG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW4+fSBFeGFjdCBleGVjdXRhYmxlIGFuZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJDYW5vbmljYWxUb29sY2hhaW4oaWQsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAodHlwZW9mIGlkICE9IFwic3RyaW5nXCIgfHwgaWQubGVuZ3RoID09IDApIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBJRCBtdXN0IGJlIGEgbm9uLWVtcHR5IHByaW1pdGl2ZSBzdHJpbmcuXCIsIFwidG9vbGNoYWluXCIpXG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9wdGlvbnMpKSBpbnZhbGlkVG9vbGNoYWluKFwiQ2Fub25pY2FsIHRvb2xjaGFpbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0LlwiLCBpZClcbiAgY29uc3QgZGVmaW5pdGlvbiA9IE9iamVjdC5oYXNPd24oY2Fub25pY2FsVG9vbGNoYWlucywgaWQpXG4gICAgPyBjYW5vbmljYWxUb29sY2hhaW5zWy8qKiBAdHlwZSB7a2V5b2YgdHlwZW9mIGNhbm9uaWNhbFRvb2xjaGFpbnN9ICovIChpZCldXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoIWRlZmluaXRpb24pIGludmFsaWRUb29sY2hhaW4oYFVua25vd24gY2Fub25pY2FsIHRvb2xjaGFpbiAnJHtpZH0nLmAsIGlkKVxuICBjb25zdCBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPSBvcHRpb25zLmVudmlyb25tZW50ID09PSB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogc25hcHNob3RFbnZpcm9ubWVudChvcHRpb25zLmVudmlyb25tZW50LCBpZClcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBjb25maWd1cmF0aW9uRW52aXJvbm1lbnQgPz8gZGVmYXVsdEVudmlyb25tZW50KClcbiAgY29uc3QgY29uZmlndXJlZCA9IG9wdGlvbnMub3ZlcnJpZGUgPT09IHVuZGVmaW5lZFxuICAgID8gY29uZmlndXJhdGlvbkVudmlyb25tZW50ID09PSB1bmRlZmluZWRcbiAgICAgID8gcHJvY2Vzcy5lbnZbZGVmaW5pdGlvbi5vdmVycmlkZUVudmlyb25tZW50VmFyaWFibGVdXG4gICAgICA6IGNvbmZpZ3VyYXRpb25FbnZpcm9ubWVudFtkZWZpbml0aW9uLm92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZV1cbiAgICA6IG9wdGlvbnMub3ZlcnJpZGVcblxuICByZXR1cm4gZGlzY292ZXJUb29sY2hhaW4oe1xuICAgIGNhbm9uaWNhbENvbW1hbmQ6IGRlZmluaXRpb24uY2Fub25pY2FsQ29tbWFuZCxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBpZCxcbiAgICBvdmVycmlkZTogY29uZmlndXJlZCxcbiAgICBzdXBwb3J0ZWRWZXJzaW9uOiBkZWZpbml0aW9uLnN1cHBvcnRlZFZlcnNpb24sXG4gICAgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICB2ZXJzaW9uQXJndW1lbnRzOiBkZWZpbml0aW9uLnZlcnNpb25Bcmd1bWVudHNcbiAgfSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbmQgdmVyc2lvbnMgb25lIGNvbmZpZ3VyZWQgb3IgY2Fub25pY2FsIGV4ZWN1dGFibGUgd2l0aG91dCBpbnZva2luZyBhIHNoZWxsLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gRGlzY292ZXJ5IHJlcXVlc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQuY2Fub25pY2FsQ29tbWFuZCAtIENhbm9uaWNhbCBQQVRIIGNvbW1hbmQuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBbaW5wdXQuZW52aXJvbm1lbnRdIC0gRXhwbGljaXQgZGlzY292ZXJ5IGVudmlyb25tZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmlkIC0gVG9vbGNoYWluIElELlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5vdmVycmlkZV0gLSBDb25maWd1cmVkIGFic29sdXRlIGV4ZWN1dGFibGUgcGF0aC5cbiAqIEBwYXJhbSB7UmVnRXhwfSBbaW5wdXQuc3VwcG9ydGVkVmVyc2lvbl0gLSBGdWxsIHNlbGVjdGVkLXN0cmVhbSB2ZXJzaW9uIHBvbGljeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW5wdXQudGltZW91dE1zXSAtIFZlcnNpb24gY29tbWFuZCB0aW1lb3V0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gaW5wdXQudmVyc2lvbkFyZ3VtZW50cyAtIEV4YWN0IHZlcnNpb24gYXJndW1lbnQgYXJyYXkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW4+fSBEaXNjb3ZlcmVkIHRvb2wuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlclRvb2xjaGFpbihpbnB1dCkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXQpKSBpbnZhbGlkVG9vbGNoYWluKFwiVG9vbGNoYWluIGRpc2NvdmVyeSByZXF1aXJlcyBhIHJlcXVlc3Qgb2JqZWN0LlwiLCBcInRvb2xjaGFpblwiKVxuICBjb25zdCB2ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGUgPSBpbnB1dC52ZXJzaW9uQXJndW1lbnRzXG4gIGNvbnN0IHZlcnNpb25Bcmd1bWVudHMgPSBpc0RlbnNlQXJyYXkodmVyc2lvbkFyZ3VtZW50Q2FuZGlkYXRlKSA/IFsuLi52ZXJzaW9uQXJndW1lbnRDYW5kaWRhdGVdIDogdW5kZWZpbmVkXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHtcbiAgICBjYW5vbmljYWxDb21tYW5kOiBpbnB1dC5jYW5vbmljYWxDb21tYW5kLFxuICAgIGVudmlyb25tZW50OiBpbnB1dC5lbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdEVudmlyb25tZW50KCkgOiBpbnB1dC5lbnZpcm9ubWVudCxcbiAgICBpZDogaW5wdXQuaWQsXG4gICAgb3ZlcnJpZGU6IGlucHV0Lm92ZXJyaWRlLFxuICAgIHN1cHBvcnRlZFZlcnNpb246IGlucHV0LnN1cHBvcnRlZFZlcnNpb24sXG4gICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0TXMgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRUaW1lb3V0TXMgOiBpbnB1dC50aW1lb3V0TXMsXG4gICAgdmVyc2lvbkFyZ3VtZW50c1xuICB9XG5cbiAgdmFsaWRhdGVEaXNjb3ZlcnkoY2FuZGlkYXRlKVxuICBjb25zdCBjYW5vbmljYWxDb21tYW5kID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjYW5kaWRhdGUuY2Fub25pY2FsQ29tbWFuZClcbiAgY29uc3QgZW52aXJvbm1lbnQgPSAvKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSAqLyAoY2FuZGlkYXRlLmVudmlyb25tZW50KVxuICBjb25zdCBpZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoY2FuZGlkYXRlLmlkKVxuICBjb25zdCBvdmVycmlkZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqLyAoY2FuZGlkYXRlLm92ZXJyaWRlKVxuICBjb25zdCBzdXBwb3J0ZWRWZXJzaW9uID0gY2FuZGlkYXRlLnN1cHBvcnRlZFZlcnNpb24gaW5zdGFuY2VvZiBSZWdFeHBcbiAgICA/IG5ldyBSZWdFeHAoY2FuZGlkYXRlLnN1cHBvcnRlZFZlcnNpb24uc291cmNlLCBjYW5kaWRhdGUuc3VwcG9ydGVkVmVyc2lvbi5mbGFncylcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCB0aW1lb3V0TXMgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGNhbmRpZGF0ZS50aW1lb3V0TXMpXG4gIGNvbnN0IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoY2FuZGlkYXRlLnZlcnNpb25Bcmd1bWVudHMpXG4gIGNvbnN0IG5vcm1hbGl6ZWRFbnZpcm9ubWVudCA9IGRldGVybWluaXN0aWNFbnZpcm9ubWVudChlbnZpcm9ubWVudClcbiAgY29uc3Qge2V4ZWN1dGFibGUsIHNvdXJjZX0gPSBvdmVycmlkZSA9PT0gdW5kZWZpbmVkXG4gICAgPyBhd2FpdCByZXNvbHZlQ2Fub25pY2FsKGlkLCBjYW5vbmljYWxDb21tYW5kLCBub3JtYWxpemVkRW52aXJvbm1lbnQuUEFUSCA/PyBcIlwiKVxuICAgIDoge2V4ZWN1dGFibGU6IGF3YWl0IHJlc29sdmVPdmVycmlkZShpZCwgb3ZlcnJpZGUsIGNhbm9uaWNhbENvbW1hbmQpLCBzb3VyY2U6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIm92ZXJyaWRlXCIpfVxuICAvKiogQHR5cGUge3tzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmd9fSAqL1xuICBsZXQgcmVzdWx0XG5cbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBhd2FpdCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZSh7XG4gICAgICBhcmd1bWVudHM6IHZhbGlkYXRlZFZlcnNpb25Bcmd1bWVudHMsXG4gICAgICBlbnZpcm9ubWVudDogbm9ybWFsaXplZEVudmlyb25tZW50LFxuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0TXNcbiAgICB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IHByb2Nlc3NFcnJvckZpZWxkcyhlcnJvcilcbiAgICBjb25zdCB0aW1lZE91dCA9IGV4Y2VlZGVkT3duZWREZWFkbGluZShlcnJvcilcblxuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgLi4ucHJvY2Vzc0Vycm9yLFxuICAgICAgY2F1c2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICAgIGNvZGU6IHRpbWVkT3V0ID8gXCJUT09MX1ZFUlNJT05fVElNRU9VVFwiIDogXCJUT09MX1ZFUlNJT05fRkFJTFVSRVwiLFxuICAgICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiB0aW1lZE91dFxuICAgICAgICA/IGBWZXJzaW9uIGNvbW1hbmQgZm9yICcke2V4ZWN1dGFibGV9JyBleGNlZWRlZCAke3RpbWVvdXRNc31tcy5gXG4gICAgICAgIDogYFZlcnNpb24gY29tbWFuZCBmb3IgJyR7ZXhlY3V0YWJsZX0nIGZhaWxlZC5gLFxuICAgICAgc3RkZXJyOiBwcm9jZXNzRXJyb3Iuc3RkZXJyLFxuICAgICAgc3Rkb3V0OiBwcm9jZXNzRXJyb3Iuc3Rkb3V0XG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IHtzdGRlcnIsIHN0ZG91dH0gPSByZXN1bHRcbiAgY29uc3Qgbm9ybWFsaXplZFN0ZG91dCA9IHN0ZG91dC50cmltKClcbiAgY29uc3Qgbm9ybWFsaXplZFN0ZGVyciA9IHN0ZGVyci50cmltKClcbiAgY29uc3QgdmVyc2lvbk91dHB1dCA9IG5vcm1hbGl6ZWRTdGRvdXQubGVuZ3RoID4gMCA/IG5vcm1hbGl6ZWRTdGRvdXQgOiBub3JtYWxpemVkU3RkZXJyXG4gIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uT3V0cHV0LnNwbGl0KC9cXHI/XFxuL3UpWzBdID8/IFwiXCJcblxuICBpZiAodmVyc2lvbi5sZW5ndGggPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX1ZFUlNJT05fRkFJTFVSRVwiLFxuICAgICAgY29tbWFuZDogY2Fub25pY2FsQ29tbWFuZCxcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBsYW5ndWFnZTogaWQsXG4gICAgICBtZXNzYWdlOiBgVmVyc2lvbiBjb21tYW5kIGZvciAnJHtleGVjdXRhYmxlfScgcmV0dXJuZWQgbm8gdmVyc2lvbiBvdXRwdXQuYCxcbiAgICAgIHN0ZGVycixcbiAgICAgIHN0ZG91dFxuICAgIH0pXG4gIH1cbiAgaWYgKHN1cHBvcnRlZFZlcnNpb24gJiYgIXN1cHBvcnRlZFZlcnNpb24udGVzdCh2ZXJzaW9uT3V0cHV0KSkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX1VOU1VQUE9SVEVEX1ZFUlNJT05cIixcbiAgICAgIGNvbW1hbmQ6IGNhbm9uaWNhbENvbW1hbmQsXG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYEV4ZWN1dGFibGUgJyR7ZXhlY3V0YWJsZX0nIHJlcG9ydGVkIHVuc3VwcG9ydGVkIHZlcnNpb24gJyR7dmVyc2lvbn0nLmAsXG4gICAgICBzdGRlcnIsXG4gICAgICBzdGRvdXQsXG4gICAgICB2ZXJzaW9uXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBkZWVwRnJlZXplKHtcbiAgICBjb21tYW5kOiBjYW5vbmljYWxDb21tYW5kLFxuICAgIGV4ZWN1dGFibGUsXG4gICAgaWQsXG4gICAgc291cmNlLFxuICAgIHZlcnNpb24sXG4gICAgdmVyc2lvbkFyZ3VtZW50czogdmFsaWRhdGVkVmVyc2lvbkFyZ3VtZW50cyxcbiAgICB2ZXJzaW9uT3V0cHV0XG4gIH0pXG59XG5cbi8qKlxuICogQnVpbGRzIG9uZSBjYW5vbmljYWwgaW1tdXRhYmxlIHRvb2xjaGFpbiBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjYW5vbmljYWxDb21tYW5kIC0gUEFUSCBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZSAtIENvbmZpZ3VyZWQgb3ZlcnJpZGUgdmFyaWFibGUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge1JlZ0V4cH0gc3VwcG9ydGVkVmVyc2lvbiAtIFN1cHBvcnRlZCB2ZXJzaW9uIG91dHB1dC5cbiAqIEByZXR1cm5zIHt7Y2Fub25pY2FsQ29tbWFuZDogc3RyaW5nLCBvdmVycmlkZUVudmlyb25tZW50VmFyaWFibGU6IHN0cmluZywgc3VwcG9ydGVkVmVyc2lvbjogUmVnRXhwLCB2ZXJzaW9uQXJndW1lbnRzOiBzdHJpbmdbXX19IERlY2xhcmF0aW9uLlxuICovXG5mdW5jdGlvbiBkZWZpbml0aW9uKGNhbm9uaWNhbENvbW1hbmQsIG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZSwgdmVyc2lvbkFyZ3VtZW50cywgc3VwcG9ydGVkVmVyc2lvbikge1xuICByZXR1cm4ge2Nhbm9uaWNhbENvbW1hbmQsIG92ZXJyaWRlRW52aXJvbm1lbnRWYXJpYWJsZSwgc3VwcG9ydGVkVmVyc2lvbiwgdmVyc2lvbkFyZ3VtZW50c31cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdG9vbCBkaXNjb3ZlcnkgYmVmb3JlIGZpbGVzeXN0ZW0gb3IgcHJvY2VzcyBhY2Nlc3MuXG4gKiBAcGFyYW0ge3tcbiAqICAgY2Fub25pY2FsQ29tbWFuZDogdW5rbm93bixcbiAqICAgZW52aXJvbm1lbnQ6IHVua25vd24sXG4gKiAgIGlkOiB1bmtub3duLFxuICogICBvdmVycmlkZTogdW5rbm93bixcbiAqICAgc3VwcG9ydGVkVmVyc2lvbjogdW5rbm93bixcbiAqICAgdGltZW91dE1zOiB1bmtub3duLFxuICogICB2ZXJzaW9uQXJndW1lbnRzOiB1bmtub3duXG4gKiB9fSBpbnB1dCAtIENhbmRpZGF0ZSBkaXNjb3ZlcnkgZmllbGRzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGlzY292ZXJ5KGlucHV0KSB7XG4gIGlmICh0eXBlb2YgaW5wdXQuaWQgIT0gXCJzdHJpbmdcIiB8fCBpbnB1dC5pZC5sZW5ndGggPT0gMCB8fFxuICAgIHR5cGVvZiBpbnB1dC5jYW5vbmljYWxDb21tYW5kICE9IFwic3RyaW5nXCIgfHwgaW5wdXQuY2Fub25pY2FsQ29tbWFuZC5sZW5ndGggPT0gMCB8fFxuICAgIGlucHV0LmNhbm9uaWNhbENvbW1hbmQuaW5jbHVkZXMoXCIvXCIpIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQuaW5jbHVkZXMoXCJcXFxcXCIpIHx8IGlucHV0LmNhbm9uaWNhbENvbW1hbmQuaW5jbHVkZXMoXCJcXDBcIikgfHxcbiAgICAhaXNEZW5zZUFycmF5KGlucHV0LnZlcnNpb25Bcmd1bWVudHMpIHx8ICFpbnB1dC52ZXJzaW9uQXJndW1lbnRzLmV2ZXJ5KHZhbGlkQXJndW1lbnQpIHx8XG4gICAgIWlzRW52aXJvbm1lbnQoaW5wdXQuZW52aXJvbm1lbnQpIHx8ICFpc1N1cHBvcnRlZFRpbWVvdXRNcyhpbnB1dC50aW1lb3V0TXMpIHx8XG4gICAgKGlucHV0Lm92ZXJyaWRlICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBpbnB1dC5vdmVycmlkZSAhPSBcInN0cmluZ1wiIHx8ICFwYXRoLmlzQWJzb2x1dGUoaW5wdXQub3ZlcnJpZGUpIHx8IGlucHV0Lm92ZXJyaWRlLmluY2x1ZGVzKFwiXFwwXCIpKSkgfHxcbiAgICAoaW5wdXQuc3VwcG9ydGVkVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmICghKGlucHV0LnN1cHBvcnRlZFZlcnNpb24gaW5zdGFuY2VvZiBSZWdFeHApIHx8IGlucHV0LnN1cHBvcnRlZFZlcnNpb24uZ2xvYmFsIHx8IGlucHV0LnN1cHBvcnRlZFZlcnNpb24uc3RpY2t5KSkpIHtcbiAgICBpbnZhbGlkVG9vbGNoYWluKGBUb29sY2hhaW4gZGlzY292ZXJ5IHJlcXVpcmVzIGEgY2Fub25pY2FsIGJhc2VuYW1lLCBhYnNvbHV0ZSBvdmVycmlkZSwgYXJndW1lbnQgYXJyYXksIGVudmlyb25tZW50LCBhbmQgdGltZW91dCBmcm9tIDEgdGhyb3VnaCAke21heGltdW1UaW1lb3V0TXN9bXMuYCxcbiAgICAgIHR5cGVvZiBpbnB1dC5pZCA9PSBcInN0cmluZ1wiID8gaW5wdXQuaWQgOiBcInRvb2xjaGFpblwiKVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIHVuYW1iaWd1b3VzIGNhbm9uaWNhbCBjb21tYW5kIGZyb20gYW4gZXhwbGljaXQgUEFUSC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIC0gQ2Fub25pY2FsIGNvbW1hbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFZhbHVlIC0gRXhwbGljaXQgUEFUSC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtleGVjdXRhYmxlOiBzdHJpbmcsIHNvdXJjZTogXCJjYW5vbmljYWxcIn0+fSBFeGFjdCBleGVjdXRhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2Fub25pY2FsKGlkLCBjb21tYW5kLCBwYXRoVmFsdWUpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIHBhdGhWYWx1ZS5zcGxpdChwYXRoLmRlbGltaXRlcikpIHtcbiAgICBpZiAoZGlyZWN0b3J5Lmxlbmd0aCA9PSAwIHx8ICFwYXRoLmlzQWJzb2x1dGUoZGlyZWN0b3J5KSkgY29udGludWVcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBjb21tYW5kKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVzb2x2ZUV4ZWN1dGFibGVGaWxlKGNhbmRpZGF0ZSlcblxuICAgICAgaWYgKGV4YWN0ICE9IHVuZGVmaW5lZCkgbWF0Y2hlcy5zZXQoZXhhY3QsIGV4YWN0KVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQSBQQVRIIGNhbmRpZGF0ZSBpcyBhYnNlbnQgb3Igbm9uLWV4ZWN1dGFibGU7IGRpc2NvdmVyeSBjb250aW51ZXMgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gICAgfVxuICB9XG5cbiAgaWYgKG1hdGNoZXMuc2l6ZSA9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlRPT0xfTk9UX0ZPVU5EXCIsXG4gICAgICBjb21tYW5kLFxuICAgICAgbGFuZ3VhZ2U6IGlkLFxuICAgICAgbWVzc2FnZTogYENhbm9uaWNhbCBjb21tYW5kICcke2NvbW1hbmR9JyB3YXMgbm90IGZvdW5kIGFzIGFuIGV4ZWN1dGFibGUgb24gUEFUSC5gXG4gICAgfSlcbiAgfVxuICBpZiAobWF0Y2hlcy5zaXplID4gMSkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJUT09MX0FNQklHVU9VU1wiLFxuICAgICAgY29tbWFuZCxcbiAgICAgIGxhbmd1YWdlOiBpZCxcbiAgICAgIG1lc3NhZ2U6IGBDYW5vbmljYWwgY29tbWFuZCAnJHtjb21tYW5kfScgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgZXhlY3V0YWJsZXM6ICR7Wy4uLm1hdGNoZXMua2V5cygpXS5qb2luKFwiLCBcIil9LmBcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtleGVjdXRhYmxlOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKFsuLi5tYXRjaGVzLmtleXMoKV1bMF0pLCBzb3VyY2U6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImNhbm9uaWNhbFwiKX1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgY29uZmlndXJlZCBhYnNvbHV0ZSBleGVjdXRhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIElELlxuICogQHBhcmFtIHtzdHJpbmd9IG92ZXJyaWRlIC0gQWJzb2x1dGUgb3ZlcnJpZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIENhbm9uaWNhbCBjb21tYW5kLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRXhhY3QgZXhlY3V0YWJsZSBwYXRoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlT3ZlcnJpZGUoaWQsIG92ZXJyaWRlLCBjb21tYW5kKSB7XG4gIC8qKiBAdHlwZSB7RXJyb3IgfCB1bmRlZmluZWR9ICovXG4gIGxldCBjYXVzZVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhhY3QgPSBhd2FpdCByZXNvbHZlRXhlY3V0YWJsZUZpbGUob3ZlcnJpZGUpXG5cbiAgICBpZiAoZXhhY3QgIT0gdW5kZWZpbmVkKSByZXR1cm4gZXhhY3RcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXVzZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZFxuICB9XG5cbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY2F1c2UsXG4gICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgIGNvbW1hbmQsXG4gICAgZXhlY3V0YWJsZTogb3ZlcnJpZGUsXG4gICAgbGFuZ3VhZ2U6IGlkLFxuICAgIG1lc3NhZ2U6IGBDb25maWd1cmVkIGV4ZWN1dGFibGUgJyR7b3ZlcnJpZGV9JyBpcyBtaXNzaW5nIG9yIG5vdCBleGVjdXRhYmxlLmBcbiAgfSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgY2FuZGlkYXRlIHRvIGFuIGV4ZWN1dGFibGUgcmVndWxhciBmaWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBwYXRoLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPn0gRXhhY3QgcmVndWxhciBleGVjdXRhYmxlLCBpZiB0aGUgZmlsZSB0eXBlIGlzIHZhbGlkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRXhlY3V0YWJsZUZpbGUoY2FuZGlkYXRlKSB7XG4gIGNvbnN0IGV4YWN0ID0gYXdhaXQgcmVhbHBhdGgoY2FuZGlkYXRlKVxuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGF0KGV4YWN0KVxuXG4gIGlmICghc3RhdHVzLmlzRmlsZSgpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGF3YWl0IGFjY2VzcyhleGFjdCwgZnNDb25zdGFudHMuWF9PSylcblxuICByZXR1cm4gZXhhY3Rcbn1cblxuLyoqXG4gKiBQcm9kdWNlcyB0aGUgbWluaW1hbCBkZXRlcm1pbmlzdGljIHByb2Nlc3MgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBlbnZpcm9ubWVudCAtIEV4cGxpY2l0IGlucHV0cy5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pn0gTm9ybWFsaXplZCBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluaXN0aWNFbnZpcm9ubWVudChlbnZpcm9ubWVudCA9IGRlZmF1bHRFbnZpcm9ubWVudCgpKSB7XG4gIGNvbnN0IGVudHJpZXMgPSBlbnZpcm9ubWVudEVudHJpZXMoZW52aXJvbm1lbnQpXG5cbiAgaWYgKGVudHJpZXMgPT0gdW5kZWZpbmVkKSBpbnZhbGlkVG9vbGNoYWluKFwiUHJvY2VzcyBlbnZpcm9ubWVudCBtdXN0IGJlIGEgcGxhaW4gb3duLXByb3BlcnR5IGRhdGEgcmVjb3JkIG9mIHN0cmluZyBvciB1bmRlZmluZWQgdmFsdWVzLlwiLCBcImVudmlyb25tZW50XCIpXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCEvXltBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdChrZXkpIHx8IGtleS5pbmNsdWRlcyhcIlxcMFwiKSB8fCAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5pbmNsdWRlcyhcIlxcMFwiKSkpIHtcbiAgICAgIGludmFsaWRUb29sY2hhaW4oXCJQcm9jZXNzIGVudmlyb25tZW50IGNvbnRhaW5zIGFuIGludmFsaWQga2V5IG9yIHZhbHVlLlwiLCBcImVudmlyb25tZW50XCIpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkW2tleV0gPSB2YWx1ZVxuICB9XG4gIG5vcm1hbGl6ZWQuTEFORyA9IFwiQy5VVEYtOFwiXG4gIG5vcm1hbGl6ZWQuTENfQUxMID0gXCJDLlVURi04XCJcbiAgbm9ybWFsaXplZC5UWiA9IFwiVVRDXCJcbiAgbm9ybWFsaXplZC5QQVRIID8/PSBcIi91c3IvbG9jYWwvYmluOi91c3IvYmluOi9iaW5cIlxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogUmV0YWlucyBvbmx5IGV4ZWN1dGFibGUgbG9va3VwIGZyb20gdGhlIGFtYmllbnQgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj59IE1pbmltYWwgZGVmYXVsdCBlbnZpcm9ubWVudC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVudmlyb25tZW50KCkge1xuICByZXR1cm4ge1BBVEg6IHByb2Nlc3MuZW52LlBBVEh9XG59XG5cbi8qKlxuICogTmFycm93cyBzdGFibGUgZmllbGRzIGZyb20gYSB2ZXJzaW9uIHN1YnByb2Nlc3MgcmVqZWN0aW9uLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFByb2Nlc3MgcmVqZWN0aW9uLlxuICogQHJldHVybnMge3tleGl0Q29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RkZXJyOiBzdHJpbmcsIHN0ZG91dDogc3RyaW5nfX0gU3RhYmxlIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKSB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9IFwib2JqZWN0XCIpIHJldHVybiB7ZXhpdENvZGU6IHVuZGVmaW5lZCwgc2lnbmFsOiB1bmRlZmluZWQsIHN0ZGVycjogXCJcIiwgc3Rkb3V0OiBcIlwifVxuICBjb25zdCB2YWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChlcnJvcilcblxuICByZXR1cm4ge1xuICAgIGV4aXRDb2RlOiB0eXBlb2YgdmFsdWUuY29kZSA9PSBcIm51bWJlclwiID8gdmFsdWUuY29kZSA6IHVuZGVmaW5lZCxcbiAgICBzaWduYWw6IHR5cGVvZiB2YWx1ZS5zaWduYWwgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNpZ25hbCA6IHVuZGVmaW5lZCxcbiAgICBzdGRlcnI6IHR5cGVvZiB2YWx1ZS5zdGRlcnIgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnN0ZGVyciA6IFwiXCIsXG4gICAgc3Rkb3V0OiB0eXBlb2YgdmFsdWUuc3Rkb3V0ID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRvdXQgOiBcIlwiXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgb25lIHNoZWxsLWZyZWUgYXJndW1lbnQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGFyZ3VtZW50LlxuICogQHJldHVybnMge3ZhbHVlIGlzIHN0cmluZ30gV2hldGhlciB0aGUgYXJndW1lbnQgaXMgc2FmZSB0byBwYXNzIGRpcmVjdGx5LlxuICovXG5mdW5jdGlvbiB2YWxpZEFyZ3VtZW50KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuaW5jbHVkZXMoXCJcXDBcIilcbn1cblxuLyoqXG4gKiBDaGVja3MgZXhwbGljaXQgcHJvY2Vzcy1lbnZpcm9ubWVudCB2YWx1ZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50LlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBXaGV0aGVyIGVudHJpZXMgYXJlIHN0cmluZ3Mgb3IgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50KHZhbHVlKSB7XG4gIHJldHVybiBlbnZpcm9ubWVudEVudHJpZXModmFsdWUpICE9IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIERldGFjaGVzIGFuIGV4cGxpY2l0IGVudmlyb25tZW50IGJlZm9yZSBjYW5vbmljYWwgb3ZlcnJpZGUgbG9va3VwIGNhbiB5aWVsZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZW52aXJvbm1lbnQgcmVjb3JkLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIGlkZW50aXR5LlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBPd25lZCBlbnZpcm9ubWVudCBkYXRhLlxuICovXG5mdW5jdGlvbiBzbmFwc2hvdEVudmlyb25tZW50KHZhbHVlLCBpZCkge1xuICBjb25zdCBlbnRyaWVzID0gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKVxuXG4gIGlmIChlbnRyaWVzID09IHVuZGVmaW5lZCkge1xuICAgIGludmFsaWRUb29sY2hhaW4oXCJDYW5vbmljYWwgdG9vbGNoYWluIGVudmlyb25tZW50IG11c3QgYmUgYSBwbGFpbiBvd24tcHJvcGVydHkgZGF0YSByZWNvcmQgb2Ygc3RyaW5nIG9yIHVuZGVmaW5lZCB2YWx1ZXMuXCIsIGlkKVxuICB9XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPn0gKi9cbiAgY29uc3Qgc25hcHNob3QgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgZW50cmllcykgc25hcHNob3Rba2V5XSA9IGVudHJ5XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoc25hcHNob3QpXG59XG5cbi8qKlxuICogUmVhZHMgb25seSBlbnVtZXJhYmxlIG93biBkYXRhIHByb3BlcnRpZXMgZnJvbSBhbiBvcmRpbmFyeSBvciBudWxsLXByb3RvdHlwZSByZWNvcmQuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGVudmlyb25tZW50IHJlY29yZC5cbiAqIEByZXR1cm5zIHtbc3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWRdW10gfCB1bmRlZmluZWR9IERldGFjaGVkIGVudHJpZXMgd2hlbiB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gZW52aXJvbm1lbnRFbnRyaWVzKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PSBudWxsIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXVtdfSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKHZhbHVlKSkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgIT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSlcblxuICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gdW5kZWZpbmVkIHx8ICFkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgIShcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgfHxcbiAgICAgICAgKGRlc2NyaXB0b3IudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSAhPSBcInN0cmluZ1wiKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgZW50cmllcy5wdXNoKFtrZXksIGRlc2NyaXB0b3IudmFsdWVdKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBub3JtYWxpemVkIGRpc2NvdmVyeS1jb25maWd1cmF0aW9uIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEZhaWx1cmUgZGV0YWlsLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIGlkZW50aXR5LlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkVG9vbGNoYWluKG1lc3NhZ2UsIGlkKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiSU5WQUxJRF9UT09MQ0hBSU5cIiwgbGFuZ3VhZ2U6IGlkLCBtZXNzYWdlfSlcbn1cblxuLyoqXG4gKiBEZWVwbHkgZnJlZXplcyBjYW5vbmljYWwgZGVjbGFyYXRpb25zIGFuZCBkaXNjb3ZlcnkgcmVzdWx0cy5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlIC0gVG9vbGNoYWluLW93bmVkIHZhbHVlLlxuICogQHJldHVybnMge1R9IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGZvciAoY29uc3QgbmVzdGVkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBkZWVwRnJlZXplKG5lc3RlZClcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcbn1cbiJdfQ==
|
package/docs/architecture.md
CHANGED
|
@@ -4,21 +4,33 @@ Semantifold has three explicit layers.
|
|
|
4
4
|
|
|
5
5
|
Task 018's C path follows these layers through the unchanged root-bundled private legacy CST boundary. `src/frontends/c.js` owns all C trees and exhaustive profile validation. `src/backends/native-validation.js` checks native graph/location limits and `c-validation.js` checks C memory limits; `ordered-expressions.js` plans occurrence-specific evaluation without modifying IR; `c.js` emits mapped `program.c`; and `c-runtime.js` supplies the synthetic immutable-slice/arena header. The C frontend reconstructs candidates only from complete CST regions, resolves them with the existing semantic validator, and compares the original whole CST against the re-parsed canonical backend plan before returning a module. This same-language validation keeps target generation free of parser objects. See the [C profile](c.md).
|
|
6
6
|
|
|
7
|
-
1. Frontend adapters in `src/frontends/` invoke mature language parsers and translate only recognized syntax. Babel owns JavaScript and TypeScript parsing, `php-parser` owns PHP, Prism owns Ruby, Lezer owns Java, and
|
|
8
|
-
2. `src/semantic/` defines the shared JSDoc-typed discriminated representation and one-based, filename-bearing UTF-16 source locations. `provenance.js` indexes exact source content, deterministic semantic paths/node IDs, resolved symbol IDs, parser-token subranges, and closed source/derived/synthetic origins without exposing parser objects.
|
|
9
|
-
3. Source backends in `src/backends/` validate their semantic capabilities before emitting target syntax. Shared validation owns recursive block shape, reachability and all-path
|
|
7
|
+
1. Frontend adapters in `src/frontends/` invoke mature language parsers and translate only recognized syntax. Babel owns JavaScript and TypeScript parsing, `php-parser` owns PHP, Prism owns Ruby, Lezer owns Java, and qualified Tree-sitter bindings and grammars own Python, C#, Go, C, CPP, Rust, Swift, Kotlin, and Dart. Their AST/CST objects never appear in the public API. Adapters enumerate supported children and reject every other parser node; filtering syntax away is not a normalization strategy. Prism node offsets and comment byte ranges are converted from UTF-8 to JavaScript UTF-16 offsets before semantic location construction and metadata source slicing. Tree-sitter adapters reject lone surrogates, exhaustively traverse named/anonymous/comment/directive/error/missing children, and verify reported boundaries through the shared UTF-8-byte-to-UTF-16 converter. The Go adapter additionally collapses only exact `package main`, optional `fmt`, ordered semantic functions, and a final zero-argument `func main()` into the shared module/entry shape; assignment occurrences, not Go's uniformly mutable `var` syntax, determine semantic local mutability.
|
|
8
|
+
2. `src/semantic/` defines the shared JSDoc-typed discriminated representation and one-based, filename-bearing UTF-16 source locations. `provenance.js` indexes exact source content, deterministic semantic paths/node IDs, resolved symbol IDs, parser-token subranges, and closed source/derived/synthetic origins without exposing parser objects. Task 010's `SemanticProgram` adds dependency-first logical modules, a caller-order multi-source registry, explicit import/export nodes, one selected entry module, and stable module-qualified declaration identities; native filenames, package names, and target paths remain outside semantic resolution. Value types are scalar `integer`/`boolean`/`string` references or recursive acyclic `ListType`, unordered string-keyed `MapType`, insertion-ordered `OrderedMapType`, `OptionalType`, nominal `RecordType`, nominal Task 033 `ReferenceType`, and Task 034 linear `OwnedResourceType`/`OwnedReferenceType`; `void` exists only as a callable return. Task 012 adds invariant unbounded declaration-owned `TypeParameter` values, scoped `TypeVariableReference` leaves, and exact ordered arguments on generic record types. Task 011 adds nominal `ErrorType` only for catch bindings and error constructions, never as an ordinary parameter/local/return value. Task 034 adds compiler-authorized capability/resource/failure/operation declarations, complete resolved `EffectCallExpression` sites, and explicit `OwnedMoveExpression`/`OwnedBorrowExpression` nodes. Every function and reference class/member has a deterministic declaration identity; every list, ordered-map, condition-controlled loop, capability member, and effect site has a deterministic module-local identity. Every direct function, constructor, receiver method, and effect call carries exact resolution facts. Literal and access nodes distinguish scalars, collections, presence/absence, nominal values/references/resources, errors, receivers, and private fields. Unary and binary expressions carry a closed semantic `operation` and explicit result `type`, never a source operator symbol. Every function, constructor, method, entry point, branch, loop, try body, and catch body owns a located `Block` containing ordered `Statement` nodes. Statements additionally include exact `ForEachMapStatement`, strict-Boolean precondition `WhileStatement`, identity-resolved `BreakStatement`/`ContinueStatement`, private receiver-field writes, `RaiseStatement`, and one-handler `TryStatement`; general exception constructs have no semantic node. `lifetime.js` retains distinct normal/return/raise/break/continue ownership states and proves every owner terminal or transferred at every reachable scope exit. Task 033 class identity/private state remains single-module semantics; Task 034's effect/resource nodes stay compiler-authorized and single-module by default, Task 035 extends Task 010 `SemanticProgram` with versioned canonical capability modules and negotiated provider link requirements, and Task 036 adds exact facade-resolution evidence plus compiler-owned source/module roles and a complete selected-facade descriptor.
|
|
9
|
+
3. Source and binary backends in `src/backends/` validate their semantic capabilities before emitting target syntax or bytes. Shared validation owns recursive block shape, reachability and all-path abrupt-completion analysis, recursively complete expressions, exhaustive operation/type signatures, function signatures, lexical binding scopes, mutability, declaration-before-use, strict condition/return/argument/initializer/assignment types, fixed-point propagation of nominal unchecked errors, and Task 034 capability/effect/resource graph integrity. `backends/effects.js` rejects unsupported authority/target/context combinations before writer allocation and plans nested eager effects into statement-local collision-safe temporaries in semantic evaluation order. Dependency-first Task 010 validation carries ordinary inferred error sets across resolved function-import identities; both single-module generation and program mode accept compiler-authorized capability modules, while program mode additionally resolves their canonical standard-library contract references and links negotiated target host provider artifacts before any writer allocation. Target-specific validation adds identifier rules, entry-scaffolding name collisions, numeric/memory/resource bounds, and target string representation. The single-module original five retain one fixed compiler-owned Task 034 probe binding, and program mode materializes the same probe behavior as a tree-shaken provider artifact under a protected native binding. Text emitters write through `SourceWriter`; the Wasm encoder writes through an annotated binary writer so every byte range is semantic or explicitly synthetic. A backend either returns a complete executable program/project/application set or raises `UNSUPPORTED_CAPABILITY`; it never silently drops nodes, exposes a partial artifact, or lets an emitter discover malformed shape through a native error.
|
|
10
10
|
|
|
11
|
-
`src/language-registry.js` is the sole ordered dispatch and discovery source. Its deeply frozen records bind implementations to independent frontend, text-backend, binary-backend, application-backend, and interoperability roles. Public descriptors derive role booleans, artifact multiplicity, round-trip support, rich/v3/byte mapping forms, and acceptance stages/toolchains from those records; `supportedLanguages` is the derived compatibility view containing IDs with both a frontend and text backend. Duplicate IDs, unknown record fields, malformed capabilities, and unordered acceptance stages fail as `INVALID_REGISTRY`.
|
|
11
|
+
`src/language-registry.js` is the sole ordered dispatch and discovery source. Its deeply frozen records bind implementations to independent frontend, text-backend, binary-backend, application-backend, and interoperability roles. Public descriptors derive role booleans, semantic feature flags, artifact multiplicity, round-trip support, rich/v3/byte mapping forms, and acceptance stages/toolchains from those records; `generalFunctionsAndCalls` is true for PHP, Ruby, JavaScript, TypeScript, Java, and Dart; every later feature flag remains true only for the original five. `supportedLanguages` is the derived compatibility view containing IDs with both a frontend and text backend. Duplicate IDs, unknown record fields, malformed capabilities, and unordered acceptance stages fail as `INVALID_REGISTRY`.
|
|
12
12
|
|
|
13
|
-
`index.js` is the public boundary. `parse({language, filename, source})` resolves only the frontend role. `generate({language, module})` and `generateArtifact(...)` resolve a single-text backend, validate the full module, and preserve the compatibility source/artifact contracts; they intentionally reject the multiple-artifact C#, Go, and
|
|
13
|
+
`index.js` is the public boundary. `createCapabilityAuthority(input)` validates, detaches, and freezes explicit Task 034 compilation authority. `parse({language, filename, source, capabilityAuthority?})` resolves only the frontend role; omitted authority retains the legacy empty capability set and explicit `null` is malformed. `parseProgram(...)` composes only the original-five parser adapters over an explicit complete source set, resolves declarations by identity, performs no I/O, and accepts the same optional compiler authority so program modules may carry Task 034 capability declarations and a Task 035 standard-library contract descriptor. `createStdlibContractRegistry`, `listStdlibModules`, and `resolveStdlibModule` own the versioned canonical contract registry; `createStdlibProviderRegistry` and `listStdlibProviders` own the target host provider registry; `negotiateStdlibProviders` computes the transitive capability closure; and Task 036's `createStdlibFacadeRegistry`, `listStdlibFacades`, and `resolveStdlibFacade` expose detached versioned source-language facade definitions. `generate({language, module})` and `generateArtifact(...)` resolve a single-text backend, validate the full module, and preserve the compatibility source/artifact contracts; they intentionally reject the multiple-artifact C#, Go, C, Rust, Dart, and Wasm backends. `generateArtifactSet(...)` remains the additive single-module artifact boundary, while `generateProgramArtifactSet(...)` plans and validates a complete original-five program before any writer allocation. An unknown ID is `UNSUPPORTED_LANGUAGE`; a known ID missing the program cohort is `UNSUPPORTED_ROLE`; `UNSUPPORTED_CAPABILITY` remains a backend-with-role rejection of semantic content or target layout. `src/artifacts.js` owns transactional generated-file validation and detached, deeply frozen JSON metadata snapshots, including JSON object keys without prototype interpretation. `src/binary-mapping.js` owns byte provenance, and `src/mapping.js` owns text lookup, serialization, import/composition, and diagnostic remapping.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
The [iOS application target](ios.md) is a target-only spoke on that artifact boundary. `src/backends/ios.js` reuses Task 010 project/source ownership and the Task 022 Tasks 001–004 Swift capability profile, validates the complete graph/configuration/asset layout, then emits captured namespaced Swift plus synthetic SwiftUI, unsigned project, test, asset-catalog, and versioned manifest artifacts. Apple lifecycle/configuration/resources do not enter semantic IR, and generation performs no filesystem access. There is no public project materializer: transactional create-only directory publication is deferred because Node's public filesystem API cannot combine atomic no-replace publication with descriptor-relative no-follow staging and cleanup without a separately authorized native boundary. No best-effort writer replaces that guarantee. Linux semantic/tool/packed-generator proofs are implemented; Apple/Xcode/Simulator proof remains explicitly deferred.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
`src/toolchains.js` resolves configured absolute overrides or one unambiguous canonical PATH executable, runs a bounded version command, and returns its exact real path and captured version. Alongside language compilers/runtimes, browser Wasm defines exact WABT 1.0.36 and Chrome/Chromium 152.0.7977.82 contracts through `SEMANTIFOLD_WASM_VALIDATE` and `SEMANTIFOLD_CHROMIUM`. `src/acceptance.js` validates all artifacts and ordered stages before filesystem mutation, materializes only safe generated paths in a unique temporary directory, invokes exact executable/argument arrays without a shell, fixes `LANG`, `LC_ALL`, and `TZ`, captures output, distinguishes discovery/version/launch/timeout/nonzero failures, records the precise failed stage, and removes the directory. The browser-specific acceptance owner additionally serves a materialized artifact directory on loopback under strict CSP and owns the headless browser process group. No runner performs tool installation or runtime download.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
## Browser WebAssembly target
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
`src/backends/wasm.js` consumes the unchanged semantic module and directly emits core WebAssembly binary version 1. It owns signed-i64 arithmetic traps, canonical i32 Booleans, UTF-8 literal/data layout, fixed memory, the private checked scratch allocator, semantic call-depth guards, the `semantifold.browser.v1` import/export ABI, binary section/index construction, and path-sensitive resource analysis. These are target concerns and add no Wasm nodes, pointers, traps, imports, memory, or JavaScript values to `src/semantic/`.
|
|
22
|
+
|
|
23
|
+
Generation first bounds the caller graph before recursive shared validation, checks known i64 operations module-wide, then performs entry-reachable resource validation. It builds deterministic literal and function indexes, emits all bytes with contiguous `SemantifoldByteMapping` ranges, and validates the completed module with the host standard WebAssembly API. Only then does it construct the ordered module/map/loader/HTML set and frozen ABI metadata. The generated JavaScript starts native streaming immediately while inspecting a response clone, keeps host import behavior locked until import signatures, fixed memory, exports, and absence of a start section pass, and cannot execute semantic operations itself. See the [browser WebAssembly target](webassembly.md).
|
|
24
|
+
|
|
25
|
+
## Standard-library portability
|
|
26
|
+
|
|
27
|
+
Task 034 is the unversioned semantic effect/lifetime foundation. Task 035, delivered through PR #45 and merge `a2aad9d4932bfc6087adc4ff8bca43678c92413c`, adds the versioned canonical contract registry with the built-in `semantifold.task034.resource-probe@1.0.0`, the target host provider registry with its protected native binding, capability negotiation, and transactional program linking. Task 036, delivered through PR #46 and merge `9aba48f9d48bcef4fd4c9275aec14bfcc4f0904c`, adds a bounded original-five qualification facade corpus. Parser-backed module resolution substitutes a facade only after proving its exact native library and symbol identity; the selected portable executable source enters the same frontend and semantic layers as application code and calls only a versioned **canonical Semantifold stdlib contract/capability**, never a target API or pair-specific bridge.
|
|
28
|
+
|
|
29
|
+
Task 037 exercises that architecture in one Ruby-source-to-PHP-target slice. Only an exact literal Ruby `require "socket"` profile can authorize the compiler-owned socket and output facades, genuine two-argument `TCPSocket.new`, zero-argument `gets`/`close`, and one-string unqualified `puts` or `Kernel.puts`. Those facade sources compile through semantic IR and directly require canonical SocketClient, TextStream, Output, and Resource v1 operations. The plural linker resolves only reachable PHP provider modules, qualifies operations by canonical module and operation, and validates source, facade, contract, provider, runtime, namespace, path, provenance, mapping, and complete artifact graphs before returning anything. Application modules receive no capability authority, and importing or calling a facade never propagates it.
|
|
30
|
+
|
|
31
|
+
The PHP provider layer owns opaque native socket handles and is the only generated code permitted to reach `fsockopen`, `fgets`, `feof`, `fclose`, and stdout. It validates host/port, scopes warning capture, converts native failures to the declared canonical errors, distinguishes clean EOF from read failure, incrementally validates UTF-8, preserves LF/CRLF, returns a final unterminated line once, completes short stdout writes, and treats either result of the first close attempt as terminal. Facades remain under `semantifold/facade/ruby/`; provider modules remain under `providers/php/semantifold/`. No Ruby-to-PHP adapter or source-shaped loop rewrite exists.
|
|
32
|
+
|
|
33
|
+
Program artifact generation compiles the application and only its used compatibility modules, then links only the required **target host provider/native binding** modules through the negotiated provider set. Providers implement canonical capabilities with the target's genuine native stdlib behind a protected host-native boundary unavailable to ordinary application and facade code; that isolation also prevents same-language generation from recursively selecting its own compatibility facade. Contract and target validation must finish before any artifact is exposed. Unsupported source identity, source APIs, target capabilities, or semantic mismatches produce located diagnostics rather than partial output.
|
|
22
34
|
|
|
23
35
|
Generated target code may preserve source API class or function names in a collision-safe compatibility namespace or import alias while using valid target syntax. A later backend may replace a facade/provider path with direct idiomatic lowering only when equivalence is proven; it is never the correctness baseline. Linking, tree-shaking, contract precision, namespace rules, and the full compile flow are defined in the [authoritative standard-library portability design](standard-library-portability.md).
|
|
24
36
|
|
|
@@ -38,20 +50,40 @@ Frontend source capabilities and backend target capabilities are intentionally s
|
|
|
38
50
|
|
|
39
51
|
Binary operands evaluate left to right. `BooleanAnd` and `BooleanOr` are short-circuit operations. Equality accepts only two operands of the same supported scalar type and means scalar value equality. Semantic integers are mathematical integers with one unsigned zero; IEEE-754 signed zero is not a distinct semantic value. Backends map meaning rather than copying syntax: PHP concatenation is `.`, Java string equality is `.equals`, JavaScript/TypeScript/PHP equality is strict, and other operations use their target's matching native construct. Because supported operations cannot otherwise distinguish signed zero, JavaScript and TypeScript canonically stringify observable scalar output when a module contains integer negation or multiplication. Their frontends unwrap that exact parser-native output scaffold during generated-source reparse, retaining the original operation tree without constant folding. Every emitted operation is conservatively parenthesized; generated-source reparsing reconstructs the same semantic tree.
|
|
40
52
|
|
|
41
|
-
A source-valid semantic name can be rejected for a target reserved word, and a safe semantic integer can be rejected by Java's narrower `int` range. Java validates literal-only integer operation trees with exact mathematical integers without folding the IR, rejecting known results outside signed 32-bit `int`. C# performs the same proof against signed 64-bit and emits an exact `checked(...)` wrapper for every integer arithmetic/negate operation while the project also enables overflow checking. Go performs the signed-64-bit proof without folding, but non-literal runtime overflow retains native `int64` wrap behavior and remains outside the portable result guarantee.
|
|
53
|
+
A source-valid semantic name can be rejected for a target reserved word, and a safe semantic integer can be rejected by Java's narrower `int` range. Java validates literal-only integer operation trees with exact mathematical integers without folding the IR, rejecting known results outside signed 32-bit `int`. Kotlin rejects known results outside the semantic safe range and routes dynamic arithmetic through private `Math.*Exact` helpers followed by the same bound check. C# performs the same proof against signed 64-bit and emits an exact `checked(...)` wrapper for every integer arithmetic/negate operation while the project also enables overflow checking. Go performs the signed-64-bit proof without folding, but non-literal runtime overflow retains native `int64` wrap behavior and remains outside the portable result guarantee. Dart rejects statically known results outside the semantic safe range and routes dynamic add/subtract/multiply/negate through exact private `BigInt` helpers before conversion to `int`; a private Boolean identity helper prevents analyzer constant-fold warnings without changing short-circuit evaluation. Only the complete canonical support CST authorizes either helper family during generated-source reparse.
|
|
42
54
|
|
|
43
55
|
## Blocks, flow, and bindings
|
|
44
56
|
|
|
45
|
-
Blocks preserve source order, evaluation order, and lexical nesting. Validation walks each statement once in order: an unconditional return makes every following statement in that block unreachable, and an `if` returns on all paths only when both its consequent and present alternate do. A non-void function must end every reachable path in an explicit return; optional alternates and empty blocks are valid only when later control flow remains complete. Entry points may not return a value.
|
|
57
|
+
Blocks preserve source order, evaluation order, and lexical nesting. Validation walks each statement once in order: an unconditional return, raise, break, or continue makes every following statement in that block unreachable, and an `if` returns on all paths only when both its consequent and present alternate do. A non-void function must end every reachable path in an explicit return; optional alternates and empty blocks are valid only when later control flow remains complete. Every loop is conservatively fallthrough-capable, so its body alone cannot satisfy a non-void function return. Entry points may not return a value.
|
|
58
|
+
|
|
59
|
+
Function identity is resolver-owned and exposed as deterministic module-local `function:N` IDs, never parser objects or trusted caller numeric IDs. A complete module signature pass precedes every body, so direct recursion and unambiguous forward or mutual references resolve consistently. Calls bind that identity and exact ordered signature; backend validation rechecks caller-supplied bindings before emission. Each provenance pass creates symbol records for functions, parameters, and locals, records a function symbol's semantic declaration identity, and resolves identifier reads, assignment targets, and calls through lexical function/branch/entry scopes. Module callables, parameters, and locals share one no-shadowing namespace; repeated names are rejected even across disjoint branches in this initial capability. Nested-block declarations do not escape their block. Initializers are validated before declaration and assignment right-hand expressions before the target update, preserving evaluation order and making self-reference a use-before-declaration error.
|
|
60
|
+
|
|
61
|
+
Task006 adds recursive `ListType` and `MapType` value types while retaining scalar `TypeReference` leaves. Lists are finite, homogeneous, ordered, zero-based, and duplicate-preserving; maps are finite homogeneous string-key associations with source-ordered initializer diagnostics but no semantic iteration order. Literal/index/lookup/size nodes are traversed recursively for validation, provenance, symbol resolution, and mapping. Static literal propagation proves bounded reads; only an exact source operation with absence failure can admit an otherwise dynamic read. The IR has no optional result, mutation, deep-freeze promise, or object/record interpretation. Backend capability and target factory/key restrictions are checked before writer or artifact construction.
|
|
46
62
|
|
|
47
|
-
|
|
63
|
+
Task007 adds explicit `OptionalType`, presence/absence construction, simple-identifier presence tests, and proof-checked unwrap. Presence facts are branch-local and invalidated conservatively by assignment. Task008 adds ordered `ForEachStatement` over lists with one immutable body binding and nearest-loop control; it never exposes map order. Task032 resolves every loop and abrupt control to deterministic `loop:N` identities, rejects non-nearest and cross-function targets, and adds `WhileStatement {id, condition, body, location}` with an exact Boolean condition evaluated before each iteration. Repeated conditions see conservative invalidation from body assignments; `continue` reaches the next condition evaluation and every condition loop remains a possible zero-iteration path. Task014 separately adds `OrderedMapType {keyType, valueType, order: "insertion"}`, `OrderedMapLiteral`, and `ForEachMapStatement {map, keyBinding, valueBinding, body, location}`. Unique nonnumeric string keys retain first-insertion order, both loop bindings are immutable and body-scoped, and ordinary Task006 `MapType` remains non-iterable. The source adapters prove exact native ordered construction profiles; target adapters consume only this canonical capability. Java statement lowering creates a collision-safe `LinkedHashMap`, performs source-ordered `put` calls, and immediately seals it behind `Collections.unmodifiableSequencedMap`; unsafe expression positions and any backing escape fail before emission. No sorting, pairwise/name-only rewrite, compatibility-facade coupling, or source-to-target shortcut is involved. Task009 adds parser-neutral nominal `RecordDeclaration`, `RecordField`, `RecordType`, `RecordConstruction`, and `MemberRead` values. Declaration and field identities, ordered arity, nominal type equality, direct-recursion rejection, mediated-recursion representation, and member resolution live in the semantic validator; parser-specific class trees remain in frontends and target declaration/access syntax remains in backends. Task011 adds `ErrorDeclaration`, `ErrorType`, `ErrorConstruction`, `RaiseStatement`, `TryStatement`, immutable `CatchBinding`, and `ErrorMessageRead`. Exact handler identity removes only its matching error from a protected block's escaping set; unmatched errors and errors raised by the handler propagate. A raise, return, break, or continue ends the current block path, while a caught path may resume after the try. Task012 keeps generic typing in this same hub: declaration scopes own stable parameter IDs, recursive validation rejects free/raw/wrong-arity applications, and argument-only first-order unification recursively gathers evidence from list/map/optional argument structure before contextually validating evidence-free nested values after the substitution is complete. Shared recursive substitution and variable detection close call returns, record construction fields, and member reads without mutating declarations. Externally supplied call resolutions must contain dense ordered inferred type arguments, including every nested generic-record identity array. Frontends use those same operations only for parser conversion and conservative syntax classification from parser-known arguments or explicit applications; they preserve an optional binding as a whole when it is direct generic evidence, and never use the expected return type. For parser-known context, a present nonoptional value against `Optional<X>` contributes evidence to `X`, two optionals recurse structurally, and an optional actual against plain `T` remains the whole inferred type. PHP call conversion may use that rule to close recursive documented parameter context from sibling arguments, but any variable left open must have an exact ID owned by the caller's lexical declaration. PHP optional generic-record access becomes a semantic unwrap only through the existing branch-local presence proof. Program rekeying qualifies both declaration and parameter IDs. Type parameters and every reference are ordinary provenance nodes/symbols; target backends receive only canonical types and either emit native syntax or exact documented syntax. No source/target pair adapter or standard-library capability is introduced. Task013 adds no node or validation rule: its spec-only structural comparator excludes locations, provenance, and regenerated declaration IDs while preserving every other modeled field, and its five-by-five round trips freeze the historical Tasks001–008 original-five boundary.
|
|
48
64
|
|
|
49
65
|
## Provenance and generated mappings
|
|
50
66
|
|
|
51
|
-
Frontend offsets remain parser-owned. Babel token positions, php-parser nodes/tokens, Prism byte locations/comment carriers, Lezer syntax nodes, and Tree-sitter Python/C#/Go/C/CPP named and anonymous nodes provide exact function, parameter, local, type, assignment, literal, call, branch, and operator ranges. Every Tree-sitter adapter traverses every child, rejects propagated error/missing recovery, and never substitutes source-text parsing after a rejected tree node. The JavaScript/TypeScript adapter indexes Babel tokens once by start offset, using direct identifier lookup and bounded binary-search token lookup instead of rescanning the full token stream per semantic node. Source normalization converts only coordinates; it never normalizes source content. CRLF and lone CR count as line breaks and parser coordinates become verified UTF-16 offsets.
|
|
67
|
+
Frontend offsets remain parser-owned. Babel token positions, php-parser nodes/tokens, Prism byte locations/comment carriers, Lezer syntax nodes, and Tree-sitter Python/C#/Go/C/CPP/Rust/Swift/Kotlin named and anonymous nodes provide exact function, parameter, local, type, assignment, literal, call, branch, error declaration/construction, catch type/binding, message read, and operator ranges. Every Tree-sitter adapter traverses every child, rejects propagated error/missing recovery, and never substitutes source-text parsing after a rejected tree node. Error declarations and catches receive their own symbols; construction/type and catch-binding message-read references resolve through the same deterministic provenance graph. The JavaScript/TypeScript adapter indexes Babel tokens once by start offset, using direct identifier lookup and bounded binary-search token lookup instead of rescanning the full token stream per semantic node. Source normalization converts only coordinates; it never normalizes source content. CRLF and lone CR count as line breaks and parser coordinates become verified UTF-16 offsets.
|
|
52
68
|
|
|
53
69
|
Each semantic node carries a JSON-safe source-provenance association through reorder, insertion, deletion, cloning, and serialization. Generation rebuilds canonical paths and node/symbol identities from current traversal and validates any serialized caller provenance before use; aggregate path/kind coincidence is never used to associate a different node. Shared caller objects receive deterministic occurrence records keyed by current JSON Pointer, so reused parameters, types, expressions, and valid statements do not collapse distinct emitted locations. Malformed caller registries, including empty source filenames, are discarded before canonical source fallback. This permits legacy and multi-source caller IR while preventing duplicate/stale IDs, mismatched source ownership, or out-of-bounds ranges from becoming semantic authority. The source-aware writer makes all output spans explicit, retains every contextual origin range across composition boundaries, and leaves no coarse legacy emitter path. Rich maps are frozen and indexed after validation; generated, original, node, and symbol queries include contextual related provenance without duplicate spans. See [source provenance and mappings](source-maps.md).
|
|
54
70
|
|
|
55
71
|
## Task019 CPP integration
|
|
56
72
|
|
|
57
73
|
`src/frontends/cpp.js` independently consumes official CPP snapshots and validates exact qualified types, condition clauses, inline support and CPP ordered regions. `src/backends/cpp.js` emits one mapped `program.cpp`; `cpp-runtime.js` owns fixed C++20 libstdc++ support and `cpp-validation.js` proves known owned-value sizes. C and CPP reuse `ordered-expressions.js` for occurrence planning/signatures and `native-validation.js` for bounded graphs, with the owning language preserved in diagnostics. The CPP frontend compares complete CPP CST structure against its canonical CPP output; it never calls the C frontend. The private runtime explicitly selects its official grammar and exports only frozen parser-neutral values. No semantic IR, standalone package identity, parser export, artifact contract or standard-library architecture is expanded. See the [CPP profile](cpp.md).
|
|
74
|
+
|
|
75
|
+
## Rust ownership and Cargo artifacts
|
|
76
|
+
|
|
77
|
+
Task020 adds `rust` through the same role registry, semantic language/provenance union, scalar tables and identifier validation. Its dedicated frontend adapter calls the existing private `parseCst(source, "rust")` boundary; only schema-1 recursively frozen plain data crosses the native runtime boundary. The root binding stays 0.25.1 and the private binding stays 0.21.1 with exact official Rust grammar 0.23.1. There is no pairwise dispatch or new semantic node.
|
|
78
|
+
|
|
79
|
+
The Rust reader accounts for every parser edge and compares all helper CST fields and tokens with exact target-owned support. It records clone and borrow occurrences privately, resolves scalar operations through shared validation, then checks moves in left-to-right evaluation order and joins continuing branch paths. Generated clones never repair illegal source moves. Only exact string construction, clones, concat borrows and print/overflow helpers collapse into existing scalar expressions and statements; arbitrary macros and source-text reparsing are forbidden.
|
|
80
|
+
|
|
81
|
+
The Cargo backend validates the complete graph, types, flow, bindings, reserved/scalar/helper collisions, fixed paths, known numeric/string bounds, source length and expanded CST depth before creating a writer or returning artifacts. A size/depth preflight follows the actual emission rules, including String borrow wrappers. The ordered set is synthetic manifest, synthetic Cargo-qualified format-4 lock, mapped entry source. Generation has no filesystem, network or compiler effects. Native left-to-right operands and short-circuit operators need no ordered temporary lowering. Clones, borrow punctuation and support bodies carry synthetic provenance related to the original nodes; copied identifiers, literals, call and operator tokens retain their original ranges.
|
|
82
|
+
|
|
83
|
+
Rust/Cargo discovery requires the exact qualified 1.98.1 commits and Linux x86-64 host; the verbose Cargo OS/library lines may differ across the qualified Ubuntu bases. Offline acceptance supplies an empty Cargo home and the exact compiler path, separates check/build diagnostics from direct binary and Cargo-run output, and verifies all original artifact hashes after both profiles. Host allocation, stack and output failures remain host failures under `panic = "abort"`, outside portable control flow. [Rust](rust.md) records the complete contract and qualification.
|
|
84
|
+
|
|
85
|
+
## Kotlin/JVM source and runnable JAR
|
|
86
|
+
|
|
87
|
+
Task023 adds `kotlin` through the root Tree-sitter 0.25.1 boundary and the exact ABI-14 Semantifold packaging fork of the community Kotlin grammar. The adapter consumes every CST edge, accepts only explicit Tasks001-004 Kotlin forms, and recognizes generated checked-arithmetic support only when the complete canonical helper CST is present. Parser trees and helper authority remain frontend-private.
|
|
88
|
+
|
|
89
|
+
The backend emits one mapped `Program.kt` and validates its final source through the registered Kotlin frontend before returning it. `generateArtifactSet()` wraps that entry with detached immutable Kotlin2.4/API2.4/JVM25 compiler and `java -jar Program.jar` metadata; it does not create a Gradle project or expose compiler artifacts. Exact `kotlinc` 2.4.20 and OpenJDK25 discovery and real compilation/execution remain acceptance concerns, never generation effects. See the [Kotlin/JVM profile](kotlin.md).
|
package/docs/dart.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Dart source and target
|
|
2
|
+
|
|
3
|
+
Task 029 adds `dart` as Semantifold's fourteenth parser-native source/text language. It round-trips the Tasks 001–005 semantic profile through a deterministic dependency-free Dart VM/native package. The implementation and exact Dart 3.13.3 local acceptance are complete; independent review, exact-head TensorBuzz CI, merge, and post-merge verification remain pending.
|
|
4
|
+
|
|
5
|
+
## Source profile
|
|
6
|
+
|
|
7
|
+
The frontend accepts one directive-free compilation unit containing synchronous top-level functions followed by exactly one `void main()`. Functions use explicit `int`, `bool`, `String`, or `void` returns and zero or more explicitly typed required positional parameters. Statements are initialized `final Type name = value;` or mutable `Type name = value;` locals, simple identifier assignment, strict-Boolean `if`/`else if`/`else`, explicit value or bare returns, resolved void-call expression statements, and exact `print(value);`. Expressions are scalar literals, identifiers, parentheses, direct resolved calls, and the Tasks 001–005 unary/binary operations. Strings are ordinary noninterpolated quoted strings with the implemented escapes and valid Unicode scalar values.
|
|
8
|
+
|
|
9
|
+
Every named, anonymous, extra, field, error, and missing CST edge is traversed. Parser recovery is `PARSE_ERROR`; missing explicit types use `MISSING_TYPE`; valid Dart outside the profile uses located `UNSUPPORTED_SYNTAX`. Ordinary comments may be ignored only after complete traversal. Parser trees stay inside `src/frontends/dart.js`.
|
|
10
|
+
|
|
11
|
+
Inference, `var`, inferred `final`, `const`, `late`, `dynamic`, `Object`, `num`, `double`, user `BigInt`, nullability, named/optional/default parameters or arguments, generics, methods/classes/mixins/extensions/enums/records, closures/tear-offs, casts/type tests, interpolation, raw/multiline strings, collections, loops/switch/assert, exceptions, async/futures/streams/isolates, directives/imports, annotations, external/operator/getter/setter declarations, cascades, and null-aware syntax are rejected. Exact `_` is a Dart 3 wildcard rather than a binding and is rejected for semantic function, parameter, and local names; ordinary identifiers such as `_value` remain available. Exact lowercase `// dart format off` and `// dart format on` comments are rejected as formatter directives, while case or spacing near-misses remain ordinary comments. Flutter and browser/JavaScript Dart are separate work.
|
|
12
|
+
|
|
13
|
+
## Qualified parser
|
|
14
|
+
|
|
15
|
+
The exact dependency is public registry `tree-sitter-dart-orchard@0.7.0`, tarball `https://registry.npmjs.org/tree-sitter-dart-orchard/-/tree-sitter-dart-orchard-0.7.0.tgz`, integrity `sha512-dO4hyC6eCz7tnXNWk7ZZ/CVzorvWQKRhxRYUT/uwAnA50m+4Jbogd1Oh33lPcj1/bP9wG1pS3TWQEfs1W3LFbg==`, and MIT license. Immutable annotated tag `v0.7.0` peels to commit/npm `gitHead` `9322cd5e1266c60983ae0ff921fbb4e77e903781`. Its ABI 14 language object, typed 359-entry node metadata, local native source, lifecycle, signatures, complete corpus traversal, recovery, coordinates, clean ordinary install/`npm ci`, and credential-free packed-consumer behavior pass with Node 24 and exact root `tree-sitter@0.25.1`.
|
|
16
|
+
|
|
17
|
+
Unscoped `tree-sitter-dart@1.0.0` is rejected because its language object is incompatible with the root binding. `@driftlog/tree-sitter-dart@1.0.4` is rejected because a clean install leaves undeclared extraneous `@driftlog/node-addon-api` residue. No cleanup hook, Git/archive dependency, copied or vendored parser, source-text fallback, compiler-output AST, or private package replaces either failure. See [parser qualification](parser-qualification.md#task-029-dart-grammar-qualification--2026-09-15).
|
|
18
|
+
|
|
19
|
+
## Generated package and public API
|
|
20
|
+
|
|
21
|
+
Use `generateArtifactSet({language: "dart", module})`. The ordered result is exactly:
|
|
22
|
+
|
|
23
|
+
1. `pubspec.yaml` — `manifest`, `application/yaml`, synthetic configuration provenance;
|
|
24
|
+
2. `pubspec.lock` — `manifest`, `application/yaml`, deterministic synthetic provenance;
|
|
25
|
+
3. `bin/program.dart` — sole `entry`, `text/x-dart`, rich mapping and Source Map v3 provenance.
|
|
26
|
+
|
|
27
|
+
The fixed package is named `semantifold_generated`, has `publish_to: none`, declares exact SDK `3.13.3`, has no dependencies, and emits the deterministic empty-package lockfile. `.dart_tool/`, SDK files, caches, and compiled executables are never artifacts. Omitted `filename` selects `bin/program.dart`; any other filename or any map-directive/source-map filename option fails transactionally with `UNSUPPORTED_CAPABILITY`. Because Dart is multi-artifact, `generate()` and `generateArtifact()` reject it with `UNSUPPORTED_ROLE`.
|
|
28
|
+
|
|
29
|
+
Generation validates the whole module before writer allocation, including types, required arity, complete call resolutions, identifiers, compiler-owned name collisions, safe known arithmetic, graph bounds, and Task 006+ exclusions. Over-width signatures use Dart 3.13.3's canonical one-parameter-per-line form with a trailing comma while preserving parameter type/name mappings. Repeated generation is byte-identical across paths, contents, mappings, Source Map v3, and metadata.
|
|
30
|
+
|
|
31
|
+
## Safe integers and generated support
|
|
32
|
+
|
|
33
|
+
Semantic integers remain within `[-9007199254740991, 9007199254740991]`. Literals and statically known arithmetic outside that range fail before artifact allocation. Dynamic integer add, subtract, multiply, and negate use exact private compiler-owned helpers that calculate in `BigInt`, range-check, and convert to `int`. A private Boolean identity helper prevents Dart analyzer constant folding from reporting valid short-circuit branches as dead code; it does not change left-to-right or short-circuit evaluation. When an accepted initialized local has no semantic read, generation preserves its declaration and initializer effects, then emits one synthetic private no-op read so fatal Dart analysis remains clean.
|
|
34
|
+
|
|
35
|
+
The frontend recognizes these calls only after recursively matching the complete canonical runtime CST—node type, named/extra state, child count, field names, and leaf text. Partial, reordered, renamed, duplicated, or token-modified support fails. The exact no-op local read is removed only when it immediately follows its matching declaration behind that authenticated prefix, so generated reparse reconstructs the original semantic block. User source cannot name the helpers, `BigInt`, `RangeError`, or runtime constants. Formatter-required trailing commas in generated formal parameter and call lists are accepted only behind this authenticated generated-runtime route.
|
|
36
|
+
|
|
37
|
+
## Mappings
|
|
38
|
+
|
|
39
|
+
`bin/program.dart` maps function names, parameter/local types and names, assignments, operators, calls and arguments, literals, print, returns, and entry statements to semantic/source origins. Formatting, the runtime prefix, manifest content, lockfile content, and fixed main shell are explicitly synthetic with related origins. Its embedded Source Map v3 names `bin/program.dart`; Dart emits no source-map directive or `.map` artifact. See [source provenance and mappings](source-maps.md).
|
|
40
|
+
|
|
41
|
+
## Exact toolchain and offline acceptance
|
|
42
|
+
|
|
43
|
+
The canonical Docker and TensorBuzz lanes install the official stable Linux x64 Dart SDK 3.13.3 ZIP under `/opt/dart-sdk-3.13.3`, verify SHA-256 `549c182cffbdc6864df7509c16fec646c73fe6cb8a18c2cb572db1292f300cd7`, and require:
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
Dart SDK version: 3.13.3 (stable) (Tue Sep 1 01:07:17 2026 -0700) on "linux_x64"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`SEMANTIFOLD_DART` may select only an executable matching that identity. Each acceptance run owns fresh absolute HOME, PUB_CACHE, project, native-output, and TMPDIR paths; sets `CI=true`, `DART_SUPPRESS_ANALYTICS=true`, `LANG=C.UTF-8`, `LC_ALL=C.UTF-8`, and `TZ=UTC`; and points `PUB_HOSTED_URL` at an unreachable loopback endpoint. It runs without credentials or ambient Dart/pub configuration:
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
dart pub get --offline --no-precompile
|
|
53
|
+
dart format --output=none --set-exit-if-changed bin/program.dart
|
|
54
|
+
dart analyze --fatal-infos --fatal-warnings
|
|
55
|
+
dart run bin/program.dart
|
|
56
|
+
dart compile exe bin/program.dart -o semantifold-dart
|
|
57
|
+
./semantifold-dart
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
All three generated artifact hashes remain unchanged after every command; only disposable `.dart_tool/` state and the native executable appear. The six Tasks 001–005 Dart fixtures translate to every compatible target and execute identically on Dart VM/native. Representative PHP, Ruby, JavaScript, TypeScript, and Java fixtures translate into Dart. Additional acceptance proves Unicode, eager argument ordering, direct recursion, void calls, Boolean short-circuiting, and the safe-integer boundary with exact empty stderr and identical VM/native stdout.
|
package/docs/goals.md
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Semantifold's long-term goal is a language-neutral toolkit for understanding, transforming, generating, and eventually executing programs through a shared high-level semantic representation. The representation should make types, control flow, calls, declarations, diagnostics, and source provenance understandable without exposing a language parser's private tree.
|
|
4
4
|
|
|
5
|
-
The current source tree proves one minimal Tasks 001–004 vertical slice across
|
|
5
|
+
The current source tree proves one minimal Tasks 001–004 vertical slice across fourteen registered source languages: PHP, Ruby, JavaScript, TypeScript, Java, Kotlin/JVM, strictly annotated Python, canonical C#, bounded Go, C17, C++20, Rust edition 2021, Swift, and Dart. Dart additionally implements the bounded Task 005 required-function/call profile; the original five retain the delivered Task 013 acceptance gate for the combined Tasks 001–008 profile, Task 009 nominal closed records, Task 010 explicit acyclic multi-source semantic programs, Task 011 exact nominal typed unchecked errors, and Task 012 invariant unbounded function/record type parameters with closed applications and argument-only first-order call inference. Task 014 is delivered through PR #41, Task 032 through PR #42, Task 033 through PR #43, and Task 034 through PR #44. Task 035 is delivered through PR #45 and merge commit `a2aad9d4932bfc6087adc4ff8bca43678c92413c`, with versioned canonical standard-library contracts, target host providers and protected native bindings, capability negotiation, and program-mode provider linking. Task 036 is delivered through PR #46 and merge `9aba48f9d48bcef4fd4c9275aec14bfcc4f0904c`; it adds bounded versioned executable qualification facades and exact parser-backed native identity resolution for the original five. Task 037 adds only the first concrete Ruby-source-to-PHP-target blocking TCP/line-output slice on those foundations. The source tree includes versioned source provenance, deterministic semantic node/symbol identity, range-based generated mappings, Source Map v3 interop, composition, and diagnostic remapping across those bounded profiles. The published `semantifold@0.3.0` release predates these additions. Neither the source tree nor that release provides a general analyzer, transformation API, interpreter, optimizer, implicit project/package discovery, debugger integration, coverage remapping, or lossless formatter.
|
|
6
6
|
|
|
7
|
-
The long-term product direction includes bounded standard-library portability through [language compatibility stdlib/facades, canonical Semantifold stdlib contracts/capabilities, and target host providers/native bindings](standard-library-portability.md). That direction is incremental and versioned; it does not promise arbitrary standard-library coverage or arbitrary-application translation. The `0.
|
|
7
|
+
The long-term product direction includes bounded standard-library portability through [language compatibility stdlib/facades, canonical Semantifold stdlib contracts/capabilities, and target host providers/native bindings](standard-library-portability.md). That direction is incremental and versioned; it does not promise arbitrary standard-library coverage or arbitrary-application translation. The `0.3.0` release has no imports, classes or methods, loops, optional values, typed errors, resources, host APIs, or stdlib portability.
|
|
8
8
|
|
|
9
|
-
Other roadmap candidates include a versioned fuller semantic schema, more scalar and compound types, expressions and statements, user-authored transformations, richer backend capability negotiation,
|
|
9
|
+
Other roadmap candidates include a versioned fuller semantic schema, more scalar and compound types, expressions and statements, user-authored transformations, richer backend capability negotiation, cross-language stack/coverage presentation, and a semantic interpreter. Task 014 owns the only observable ordered-map iteration profile; Task 032 owns exact condition-controlled loops; Task 033 owns only the closed single-module reference-class profile; and Task 034 owns the bounded effect/ownership/close foundation. Task 035 supplies the delivered canonical/provider hub, and Task 036 supplies the delivered neutral qualification facades with exact identity evidence, ordinary compilation, collision-safe aliases, and protected same-language isolation. Task 037's concrete profile is only literal Ruby `require "socket"`, genuine `TCPSocket.new`/`gets`/`close`, and one-string `puts` compiled to protected PHP 8.2 core-stream providers; other sources, targets, networking APIs, output forms, timeouts, async behavior, and pair-specific rewrites remain outside it. LLVM, general Wasm source support, JVM bytecode, package-manager resolution, package publication automation, and production TensorBuzz changes remain outside the current release.
|