semantifold 0.1.0 → 0.2.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 +13 -6
- package/build/index.d.ts +32 -3
- package/build/index.d.ts.map +1 -1
- package/build/index.js +99 -4
- package/build/src/acceptance.d.ts +22 -0
- package/build/src/acceptance.d.ts.map +1 -0
- package/build/src/acceptance.js +339 -0
- package/build/src/array.d.ts +7 -0
- package/build/src/array.d.ts.map +1 -0
- package/build/src/array.js +18 -0
- package/build/src/artifact-path.d.ts +13 -0
- package/build/src/artifact-path.d.ts.map +1 -0
- package/build/src/artifact-path.js +30 -0
- package/build/src/artifacts.d.ts +7 -0
- package/build/src/artifacts.d.ts.map +1 -0
- package/build/src/artifacts.js +389 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +10 -2
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +19 -37
- package/build/src/backends/python.d.ts +8 -0
- package/build/src/backends/python.d.ts.map +1 -0
- package/build/src/backends/python.js +162 -0
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +2 -1
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +9 -6
- package/build/src/binary-mapping.d.ts +32 -0
- package/build/src/binary-mapping.d.ts.map +1 -0
- package/build/src/binary-mapping.js +285 -0
- package/build/src/diagnostic.d.ts +36 -4
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +42 -3
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +5 -23
- package/build/src/frontends/python.d.ts +14 -0
- package/build/src/frontends/python.d.ts.map +1 -0
- package/build/src/frontends/python.js +615 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +6 -1
- package/build/src/language-registry.d.ts +113 -0
- package/build/src/language-registry.d.ts.map +1 -0
- package/build/src/language-registry.js +372 -0
- package/build/src/mapping.js +3 -2
- package/build/src/semantic/location.d.ts +7 -0
- package/build/src/semantic/location.d.ts.map +1 -1
- package/build/src/semantic/location.js +10 -1
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +399 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +110 -2
- package/build/src/subprocess.d.ts +29 -0
- package/build/src/subprocess.d.ts.map +1 -0
- package/build/src/subprocess.js +207 -0
- package/build/src/timeout.d.ts +8 -0
- package/build/src/timeout.d.ts.map +1 -0
- package/build/src/timeout.js +11 -0
- package/build/src/toolchains.d.ts +83 -0
- package/build/src/toolchains.d.ts.map +1 -0
- package/build/src/toolchains.js +413 -0
- package/docs/architecture.md +7 -3
- package/docs/language-support.md +25 -4
- package/docs/parser-qualification.md +70 -0
- package/docs/source-maps.md +31 -4
- package/docs/testing.md +21 -2
- package/index.js +109 -4
- package/package.json +4 -2
- package/src/acceptance.js +359 -0
- package/src/array.js +19 -0
- package/src/artifact-path.js +34 -0
- package/src/artifacts.js +420 -0
- package/src/backends/identifiers.js +9 -1
- package/src/backends/index.js +16 -32
- package/src/backends/python.js +175 -0
- package/src/backends/scalars.js +1 -0
- package/src/backends/shared.js +8 -5
- package/src/binary-mapping.js +305 -0
- package/src/diagnostic.js +34 -2
- package/src/frontends/index.js +5 -20
- package/src/frontends/python.js +689 -0
- package/src/frontends/scalars.js +5 -0
- package/src/language-registry.js +403 -0
- package/src/mapping.js +2 -1
- package/src/semantic/location.js +10 -0
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +124 -1
- package/src/subprocess.js +203 -0
- package/src/timeout.js +12 -0
- package/src/toolchains.js +444 -0
- package/tsconfig.json +1 -0
|
@@ -1,10 +1,40 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
/** @typedef {"php" | "ruby" | "javascript" | "typescript" | "java"} SemanticLanguage */
|
|
2
|
+
/** @typedef {"php" | "ruby" | "javascript" | "typescript" | "java" | "python"} SemanticLanguage */
|
|
3
3
|
/** @typedef {"integer" | "boolean" | "string"} SemanticTypeName */
|
|
4
4
|
/** @typedef {"IntegerNegate" | "BooleanNot"} SemanticUnaryOperation */
|
|
5
5
|
/** @typedef {"IntegerAdd" | "IntegerSubtract" | "IntegerMultiply" | "BooleanAnd" | "BooleanOr" | "IntegerEqual" | "IntegerNotEqual" | "BooleanEqual" | "BooleanNotEqual" | "StringEqual" | "StringNotEqual" | "IntegerLessThan" | "IntegerLessThanOrEqual" | "IntegerGreaterThan" | "IntegerGreaterThanOrEqual" | "StringConcat"} SemanticBinaryOperation */
|
|
6
6
|
/** @typedef {"function" | "parameter" | "local"} SemanticSymbolKind */
|
|
7
7
|
/** @typedef {"declaration" | "read" | "write" | "call"} SemanticSymbolRole */
|
|
8
|
+
/** @typedef {"parse" | "generate" | "compile" | "link" | "validate" | "instantiate" | "execute"} AcceptanceStage */
|
|
9
|
+
/** @typedef {"entry" | "source" | "manifest" | "support" | "mapping" | "resource" | "loader"} GeneratedArtifactRole */
|
|
10
|
+
/**
|
|
11
|
+
* @typedef LanguageRoleCapabilities
|
|
12
|
+
* @property {boolean} frontend - Parser adapter availability.
|
|
13
|
+
* @property {boolean} textBackend - Single- or multi-file text backend availability.
|
|
14
|
+
* @property {boolean} binaryBackend - Binary backend availability.
|
|
15
|
+
* @property {boolean} applicationBackend - Application-artifact backend availability.
|
|
16
|
+
* @property {boolean} interoperability - Interoperability bridge availability.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* @typedef LanguageMappingCapabilities
|
|
20
|
+
* @property {boolean} richText - Authoritative rich text mappings.
|
|
21
|
+
* @property {boolean} sourceMapV3 - Source Map v3 projection.
|
|
22
|
+
* @property {boolean} binaryRanges - Byte-coordinate binary/resource mappings.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* @typedef LanguageAcceptanceCapabilities
|
|
26
|
+
* @property {readonly AcceptanceStage[]} stages - Applicable ordered acceptance stages.
|
|
27
|
+
* @property {readonly string[]} toolchains - Required canonical toolchain IDs.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* @typedef LanguageCapabilities
|
|
31
|
+
* @property {string} id - Stable registry identity.
|
|
32
|
+
* @property {Readonly<LanguageRoleCapabilities>} roles - Independently registered roles.
|
|
33
|
+
* @property {"single" | "multiple"} artifactMultiplicity - Target artifact multiplicity.
|
|
34
|
+
* @property {boolean} roundTrip - Whether frontend/backend round-trip acceptance is declared.
|
|
35
|
+
* @property {Readonly<LanguageMappingCapabilities>} mapping - Mapping forms.
|
|
36
|
+
* @property {Readonly<LanguageAcceptanceCapabilities>} acceptance - Stages and toolchains.
|
|
37
|
+
*/
|
|
8
38
|
/**
|
|
9
39
|
* @typedef SourcePoint
|
|
10
40
|
* @property {number} line - One-based line.
|
|
@@ -50,6 +80,22 @@
|
|
|
50
80
|
* @property {RelatedOrigin[]} relatedOrigins - Ordered related ranges, possibly empty.
|
|
51
81
|
*/
|
|
52
82
|
/** @typedef {SourceOrigin | DerivedOrigin | SyntheticOrigin} SemanticOrigin */
|
|
83
|
+
/**
|
|
84
|
+
* @typedef GeneratedByteRange
|
|
85
|
+
* @property {{start: number, end: number}} generated - Half-open generated byte offsets.
|
|
86
|
+
* @property {SemanticOrigin} origin - Semantic or explicit synthetic provenance.
|
|
87
|
+
* @property {string} [nodeId] - Originating semantic node identity.
|
|
88
|
+
* @property {string} [symbolId] - Originating semantic symbol identity.
|
|
89
|
+
* @property {string} [role] - Semantic or binary-region role.
|
|
90
|
+
*/
|
|
91
|
+
/**
|
|
92
|
+
* @typedef SemantifoldByteMapping
|
|
93
|
+
* @property {"SemantifoldByteMapping"} schema - Schema discriminator.
|
|
94
|
+
* @property {1} version - Schema version.
|
|
95
|
+
* @property {"bytes"} coordinateSystem - Generated offsets are bytes, never text columns.
|
|
96
|
+
* @property {{path: string, byteLength: number}} generated - Generated artifact identity.
|
|
97
|
+
* @property {readonly GeneratedByteRange[]} ranges - Ordered non-overlapping ranges.
|
|
98
|
+
*/
|
|
53
99
|
/**
|
|
54
100
|
* @typedef SemanticNodeSourceProvenance
|
|
55
101
|
* @property {"SemantifoldNodeProvenance"} schema - Association discriminator.
|
|
@@ -127,6 +173,68 @@
|
|
|
127
173
|
* @property {import("@jridgewell/gen-mapping").EncodedSourceMap} sourceMap - Source Map v3 projection.
|
|
128
174
|
* @property {string} sourceMapFilename - Default external Source Map filename.
|
|
129
175
|
*/
|
|
176
|
+
/**
|
|
177
|
+
* @typedef TextArtifactProvenance
|
|
178
|
+
* @property {"text"} kind - Rich text provenance discriminator.
|
|
179
|
+
* @property {SemantifoldMapping} mapping - Authoritative range mapping.
|
|
180
|
+
* @property {import("@jridgewell/gen-mapping").EncodedSourceMap} sourceMap - Interoperable projection.
|
|
181
|
+
* @property {string} [sourceMapFilename] - Logical Source Map sidecar path.
|
|
182
|
+
*/
|
|
183
|
+
/**
|
|
184
|
+
* @typedef ByteArtifactProvenance
|
|
185
|
+
* @property {"bytes"} kind - Byte provenance discriminator.
|
|
186
|
+
* @property {SemantifoldByteMapping} mapping - Authoritative byte ranges.
|
|
187
|
+
*/
|
|
188
|
+
/**
|
|
189
|
+
* @typedef ArtifactSyntheticProvenance
|
|
190
|
+
* @property {"synthetic"} kind - Synthetic artifact discriminator.
|
|
191
|
+
* @property {string} reason - Explicit target-scaffolding reason.
|
|
192
|
+
* @property {readonly RelatedOrigin[]} relatedOrigins - Related semantic source ranges.
|
|
193
|
+
*/
|
|
194
|
+
/** @typedef {TextArtifactProvenance | ByteArtifactProvenance | ArtifactSyntheticProvenance} ArtifactProvenance */
|
|
195
|
+
/**
|
|
196
|
+
* @typedef GeneratedSetArtifact
|
|
197
|
+
* @property {string} path - Unique safe relative POSIX path.
|
|
198
|
+
* @property {"text" | "binary"} contentKind - Content representation.
|
|
199
|
+
* @property {string | Uint8Array} content - Text or a detached copy of the exact generated bytes on every binary read.
|
|
200
|
+
* @property {string} mediaType - Artifact media type.
|
|
201
|
+
* @property {GeneratedArtifactRole} role - Artifact role; exactly one set artifact is entry.
|
|
202
|
+
* @property {"generated"} ownership - Task-015 ownership contract.
|
|
203
|
+
* @property {ArtifactProvenance} provenance - Text, byte-range, or synthetic provenance.
|
|
204
|
+
*/
|
|
205
|
+
/**
|
|
206
|
+
* @typedef GeneratedArtifactSet
|
|
207
|
+
* @property {"GeneratedArtifactSet"} schema - Schema discriminator.
|
|
208
|
+
* @property {1} version - Schema version.
|
|
209
|
+
* @property {string} target - Stable language or target ID.
|
|
210
|
+
* @property {string} entry - Path of the sole declared entry artifact.
|
|
211
|
+
* @property {readonly GeneratedSetArtifact[]} artifacts - Deterministic artifact order.
|
|
212
|
+
*/
|
|
213
|
+
/**
|
|
214
|
+
* @typedef DiscoveredToolchain
|
|
215
|
+
* @property {string} id - Toolchain ID.
|
|
216
|
+
* @property {string} command - Documented canonical command.
|
|
217
|
+
* @property {string} executable - Exact absolute executable path.
|
|
218
|
+
* @property {"override" | "canonical"} source - Resolution route.
|
|
219
|
+
* @property {string} version - First captured version line.
|
|
220
|
+
* @property {string} versionOutput - Complete captured version output.
|
|
221
|
+
* @property {readonly string[]} versionArguments - Exact version argument array.
|
|
222
|
+
*/
|
|
223
|
+
/**
|
|
224
|
+
* @typedef AcceptanceStageResult
|
|
225
|
+
* @property {AcceptanceStage} stage - Completed stage.
|
|
226
|
+
* @property {string} executable - Exact executable used.
|
|
227
|
+
* @property {readonly string[]} arguments - Exact argument array used.
|
|
228
|
+
* @property {string} version - Discovered tool version.
|
|
229
|
+
* @property {string} stdout - Captured standard output.
|
|
230
|
+
* @property {string} stderr - Captured standard error.
|
|
231
|
+
*/
|
|
232
|
+
/**
|
|
233
|
+
* @typedef AcceptanceResult
|
|
234
|
+
* @property {string} target - Target identity.
|
|
235
|
+
* @property {string} directory - Removed isolated project directory identity.
|
|
236
|
+
* @property {readonly AcceptanceStageResult[]} stages - Ordered completed stages.
|
|
237
|
+
*/
|
|
130
238
|
/**
|
|
131
239
|
* @typedef TypeReference
|
|
132
240
|
* @property {"TypeReference"} kind - Node discriminator.
|
|
@@ -276,4 +384,4 @@
|
|
|
276
384
|
/** @typedef {SemanticModule | FunctionDeclaration | Parameter | Block | Statement | EntryPoint | Expression | TypeReference} SemanticNode */
|
|
277
385
|
/** @typedef {SemanticNode} SemanticNodeWithoutLocations */
|
|
278
386
|
export {};
|
|
279
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLHdGQUF3RjtBQUN4RixtRUFBbUU7QUFDbkUsdUVBQXVFO0FBQ3ZFLDZWQUE2VjtBQUM3Vix1RUFBdUU7QUFDdkUsOEVBQThFO0FBRTlFOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSCwrRUFBK0U7QUFFL0U7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCw4REFBOEQ7QUFFOUQ7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSCx5SkFBeUo7QUFFeko7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUgsdUVBQXVFO0FBQ3ZFLDJGQUEyRjtBQUUzRjs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILDZJQUE2STtBQUM3SSwyREFBMkQ7QUFFM0QsT0FBTyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtcInBocFwiIHwgXCJydWJ5XCIgfCBcImphdmFzY3JpcHRcIiB8IFwidHlwZXNjcmlwdFwiIHwgXCJqYXZhXCJ9IFNlbWFudGljTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7XCJpbnRlZ2VyXCIgfCBcImJvb2xlYW5cIiB8IFwic3RyaW5nXCJ9IFNlbWFudGljVHlwZU5hbWUgKi9cbi8qKiBAdHlwZWRlZiB7XCJJbnRlZ2VyTmVnYXRlXCIgfCBcIkJvb2xlYW5Ob3RcIn0gU2VtYW50aWNVbmFyeU9wZXJhdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtcIkludGVnZXJBZGRcIiB8IFwiSW50ZWdlclN1YnRyYWN0XCIgfCBcIkludGVnZXJNdWx0aXBseVwiIHwgXCJCb29sZWFuQW5kXCIgfCBcIkJvb2xlYW5PclwiIHwgXCJJbnRlZ2VyRXF1YWxcIiB8IFwiSW50ZWdlck5vdEVxdWFsXCIgfCBcIkJvb2xlYW5FcXVhbFwiIHwgXCJCb29sZWFuTm90RXF1YWxcIiB8IFwiU3RyaW5nRXF1YWxcIiB8IFwiU3RyaW5nTm90RXF1YWxcIiB8IFwiSW50ZWdlckxlc3NUaGFuXCIgfCBcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIiB8IFwiSW50ZWdlckdyZWF0ZXJUaGFuXCIgfCBcIkludGVnZXJHcmVhdGVyVGhhbk9yRXF1YWxcIiB8IFwiU3RyaW5nQ29uY2F0XCJ9IFNlbWFudGljQmluYXJ5T3BlcmF0aW9uICovXG4vKiogQHR5cGVkZWYge1wiZnVuY3Rpb25cIiB8IFwicGFyYW1ldGVyXCIgfCBcImxvY2FsXCJ9IFNlbWFudGljU3ltYm9sS2luZCAqL1xuLyoqIEB0eXBlZGVmIHtcImRlY2xhcmF0aW9uXCIgfCBcInJlYWRcIiB8IFwid3JpdGVcIiB8IFwiY2FsbFwifSBTZW1hbnRpY1N5bWJvbFJvbGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VQb2ludFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxpbmUgLSBPbmUtYmFzZWQgbGluZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb2x1bW4gLSBPbmUtYmFzZWQgVVRGLTE2IGNvZGUtdW5pdCBjb2x1bW4uXG4gKiBAcHJvcGVydHkge251bWJlcn0gb2Zmc2V0IC0gWmVyby1iYXNlZCBVVEYtMTYgc291cmNlIG9mZnNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZUxvY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPcmlnaW5hdGluZyBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IHN0YXJ0IC0gSW5jbHVzaXZlIHN0YXJ0LlxuICogQHByb3BlcnR5IHtTb3VyY2VQb2ludH0gZW5kIC0gRXhjbHVzaXZlIGVuZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZ2lzdGVyZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFJlZ2lzdHJ5LWxvY2FsIGRldGVybWluaXN0aWMgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYWwgZmlsZW5hbWUsIHByZXNlcnZlZCB2ZXJiYXRpbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY29udGVudCAtIE9yaWdpbmFsIHNvdXJjZSBjb250ZW50LCBwcmVzZXJ2ZWQgdmVyYmF0aW0gd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2UgfCBudWxsfSBsYW5ndWFnZSAtIFBhcnNlciBsYW5ndWFnZSB3aGVuIGtub3duLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlT3JpZ2luXG4gKiBAcHJvcGVydHkge1wic291cmNlXCJ9IGtpbmQgLSBEaXJlY3Qgc291cmNlIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlSWQgLSBSZWdpc3RlcmVkIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3Qgb3JpZ2luYWwgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWxhdGVkT3JpZ2luXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlSWQgLSBSZWdpc3RlcmVkIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUmVsYXRlZCBvcmlnaW5hbCByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIFJlbGF0ZWQgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVsYXRlZCBzZW1hbnRpYyBzeW1ib2wgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gUmVsYXRpb25zaGlwIHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBEZXJpdmVkT3JpZ2luXG4gKiBAcHJvcGVydHkge1wiZGVyaXZlZFwifSBraW5kIC0gUHJvdmVuYW5jZSBkZXJpdmVkIGZyb20gb25lIG9yIG1vcmUgb3JpZ2lucy5cbiAqIEBwcm9wZXJ0eSB7UmVsYXRlZE9yaWdpbltdfSBvcmlnaW5zIC0gT3JkZXJlZCwgbm9uLWVtcHR5IG9yaWdpbmFsIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN5bnRoZXRpY09yaWdpblxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU291cmNlLWZyZWUgZ2VuZXJhdGVkIG9yIHNlbWFudGljIHNjYWZmb2xkaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSBodW1hbi1yZWFkYWJsZSByZWFzb24uXG4gKiBAcHJvcGVydHkge1JlbGF0ZWRPcmlnaW5bXX0gcmVsYXRlZE9yaWdpbnMgLSBPcmRlcmVkIHJlbGF0ZWQgcmFuZ2VzLCBwb3NzaWJseSBlbXB0eS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NvdXJjZU9yaWdpbiB8IERlcml2ZWRPcmlnaW4gfCBTeW50aGV0aWNPcmlnaW59IFNlbWFudGljT3JpZ2luICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkTm9kZVByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gQXNzb2NpYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIEFzc29jaWF0aW9uIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBTb3VyY2UgYXNzb2NpYXRpb24gaW5kZXBlbmRlbnQgb2YgdHJhdmVyc2FsIHBvc2l0aW9uLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCBzZW1hbnRpYy10b2tlbiBzdWJyYW5nZXMgYnkgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTm9kZVByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmcm9tIHRoZSBzZW1hbnRpYyBtb2R1bGUgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlW1wia2luZFwiXSB8IFwiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gU2VtYW50aWMgbm9kZSBraW5kLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIHByb3ZlbmFuY2UgdmFsdWUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHNlbWFudGljLXRva2VuIHN1YnJhbmdlcyBieSByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZXNvbHZlZCBkZWNsYXJlZC9yZWZlcmVuY2VkIHN5bWJvbCBpZGVudGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljU3ltYm9sUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbm9kZUlkIC0gUmVmZXJyaW5nIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUm9sZX0gcm9sZSAtIFJlZmVyZW5jZSByb2xlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByZWZlcmVuY2UgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU2VtYW50aWMgc3ltYm9sIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sS2luZH0ga2luZCAtIFN5bWJvbCBjYXRlZ29yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbk5vZGVJZCAtIERlY2xhcmluZyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFJlZmVyZW5jZVtdfSByZWZlcmVuY2VzIC0gT3JkZXJlZCByZXNvbHZlZCByZWZlcmVuY2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRQcm92ZW5hbmNlXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1widXRmMTZcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIE9mZnNldCBhbmQgY29sdW1uIHVuaXQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIFZlcnNpb25lZCBzb3VyY2UgcmVnaXN0cnkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVByb3ZlbmFuY2VbXX0gbm9kZXMgLSBEZXRlcm1pbmlzdGljIG5vZGUgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBzeW1ib2xzIC0gRGV0ZXJtaW5pc3RpYyBzeW1ib2wgaW5kZXguXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtcImV4YWN0XCIgfCBcImFuY2hvclwiIHwgXCJzeW50aGV0aWNcIn0gTWFwcGluZ0tpbmQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZE1hcHBpbmdTcGFuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgaGFsZi1vcGVuIHJhbmdlLlxuICogQHByb3BlcnR5IHtNYXBwaW5nS2luZH0gbWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENsb3NlZCBvcmlnaW5hbCBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gUmVsYXRlZCBjYW5vbmljYWwgc2VtYW50aWMgbm9kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gUmVsYXRlZCBjYW5vbmljYWwgc2VtYW50aWMgc3ltYm9sLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gVXNlZnVsIHN5bWJvbCBuYW1lIGZvciBTb3VyY2UgTWFwIHYzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkU291cmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPdXRwdXQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gT3V0cHV0IGxhbmd1YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnQgLSBFeGFjdCBnZW5lcmF0ZWQgTEYgc291cmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRNYXBwaW5nXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRNYXBwaW5nXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1widXRmMTZcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIE9mZnNldCBhbmQgY29sdW1uIHVuaXQuXG4gKiBAcHJvcGVydHkge0dlbmVyYXRlZFNvdXJjZX0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIHByb2dyYW0gaWRlbnRpdHkgYW5kIGNvbnRlbnQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIE9yaWdpbmFsIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSBub2RlcyAtIENhbm9uaWNhbCBzZW1hbnRpYyBub2RlIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VbXX0gc3ltYm9scyAtIENhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gc3BhbnMgLSBPcmRlcmVkIGdlbmVyYXRlZCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvZGUgLSBHZW5lcmF0ZWQgb3V0cHV0IHByb2dyYW0sIGluY2x1ZGluZyBhbnkgcmVxdWVzdGVkIGRpcmVjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIEdlbmVyYXRlZCBvdXRwdXQgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gT3V0cHV0IGxhbmd1YWdlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZE1hcHBpbmd9IG1hcHBpbmcgLSBBdXRob3JpdGF0aXZlIHJpY2ggbWFwcGluZy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmdcIikuRW5jb2RlZFNvdXJjZU1hcH0gc291cmNlTWFwIC0gU291cmNlIE1hcCB2MyBwcm9qZWN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZU1hcEZpbGVuYW1lIC0gRGVmYXVsdCBleHRlcm5hbCBTb3VyY2UgTWFwIGZpbGVuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVHlwZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gbmFtZSAtIE5vcm1hbGl6ZWQgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7XCJQYXJhbWV0ZXJcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IHR5cGUgLSBQYXJhbWV0ZXIgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElkZW50aWZpZXJFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiSWRlbnRpZmllckV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gUmVmZXJlbmNlZCBuYW1lLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW50ZWdlckxpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJJbnRlZ2VyTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZhbHVlIC0gSmF2YVNjcmlwdC1zYWZlIGludGVnZXIgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb29sZWFuTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkJvb2xlYW5MaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZhbHVlIC0gQm9vbGVhbiB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0cmluZ0xpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJTdHJpbmdMaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWUgLSBVbmljb2RlIHN0cmluZyB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFVuYXJ5RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIlVuYXJ5RXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1VuYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBDbG9zZWQgc2VtYW50aWMgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBvcGVyYW5kIC0gT3BlcmFuZCBldmFsdWF0ZWQgZXhhY3RseSBvbmNlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSB0eXBlIC0gRXhwbGljaXQgb3BlcmF0aW9uIHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQmluYXJ5RXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkJpbmFyeUV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNCaW5hcnlPcGVyYXRpb259IG9wZXJhdGlvbiAtIENsb3NlZCBzZW1hbnRpYyBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGxlZnQgLSBMZWZ0IG9wZXJhbmQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IHJpZ2h0IC0gUmlnaHQgb3BlcmFuZC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IG9wZXJhdGlvbiByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQ2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjYWxsZWUgLSBGdW5jdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFBvc2l0aW9uYWwgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7SWRlbnRpZmllckV4cHJlc3Npb24gfCBJbnRlZ2VyTGl0ZXJhbCB8IEJvb2xlYW5MaXRlcmFsIHwgU3RyaW5nTGl0ZXJhbCB8IFVuYXJ5RXhwcmVzc2lvbiB8IEJpbmFyeUV4cHJlc3Npb24gfCBDYWxsRXhwcmVzc2lvbn0gRXhwcmVzc2lvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvY2FsRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJMb2NhbERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIGxvY2FsIG5hbWUuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IHR5cGUgLSBFeHBsaWNpdCBsb2NhbCB0eXBlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBtdXRhYmxlIC0gV2hldGhlciBsYXRlciBhc3NpZ25tZW50IGlzIGFsbG93ZWQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGluaXRpYWxpemVyIC0gUmVxdWlyZWQgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFzc2lnbm1lbnRTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJBc3NpZ25tZW50U3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0lkZW50aWZpZXJFeHByZXNzaW9ufSB0YXJnZXQgLSBTaW1wbGUgbG9jYWwgYXNzaWdubWVudCB0YXJnZXQuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGV4cHJlc3Npb24gLSBBc3NpZ25lZCBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBc3NpZ25tZW50IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXR1cm5TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJSZXR1cm5TdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFJldHVybmVkIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZlN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIklmU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJyYW5jaCBjb25kaXRpb24uXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBjb25zZXF1ZW50IC0gVHJ1ZSBicmFuY2guXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBbYWx0ZXJuYXRlXSAtIEZhbHNlIGJyYW5jaCwgYWJzZW50IHdoZW4gZXhlY3V0aW9uIGZhbGxzIHRocm91Z2guXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtMb2NhbERlY2xhcmF0aW9uIHwgQXNzaWdubWVudFN0YXRlbWVudH0gTG9jYWxTdGF0ZW1lbnQgKi9cbi8qKiBAdHlwZWRlZiB7TG9jYWxTdGF0ZW1lbnQgfCBJZlN0YXRlbWVudCB8IFJldHVyblN0YXRlbWVudCB8IFByaW50U3RhdGVtZW50fSBTdGF0ZW1lbnQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCbG9ja1xuICogQHByb3BlcnR5IHtcIkJsb2NrXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1N0YXRlbWVudFtdfSBzdGF0ZW1lbnRzIC0gT3JkZXJlZCBzdGF0ZW1lbnRzIGluIG9uZSBsZXhpY2FsIHNjb3BlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnVuY3Rpb25EZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRnVuY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBGdW5jdGlvbiBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtUeXBlUmVmZXJlbmNlfSByZXR1cm5UeXBlIC0gUmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRnVuY3Rpb24gYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFByaW50ZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVudHJ5UG9pbnRcbiAqIEBwcm9wZXJ0eSB7XCJFbnRyeVBvaW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRW50cnktcG9pbnQgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTW9kdWxlXG4gKiBAcHJvcGVydHkge1wiTW9kdWxlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gZW50cnlQb2ludCAtIEV4ZWN1dGFibGUgZW50cnkgcG9pbnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXg7IG9wdGlvbmFsIGZvciBsZWdhY3kgY2FsbGVyLWF1dGhvcmVkIG1vZHVsZXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY01vZHVsZSB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBQYXJhbWV0ZXIgfCBCbG9jayB8IFN0YXRlbWVudCB8IEVudHJ5UG9pbnQgfCBFeHByZXNzaW9uIHwgVHlwZVJlZmVyZW5jZX0gU2VtYW50aWNOb2RlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTm9kZX0gU2VtYW50aWNOb2RlV2l0aG91dExvY2F0aW9ucyAqL1xuXG5leHBvcnQge31cbiJdfQ==
|
|
387
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLG1HQUFtRztBQUNuRyxtRUFBbUU7QUFDbkUsdUVBQXVFO0FBQ3ZFLDZWQUE2VjtBQUM3Vix1RUFBdUU7QUFDdkUsOEVBQThFO0FBQzlFLG9IQUFvSDtBQUNwSCx1SEFBdUg7QUFFdkg7Ozs7Ozs7R0FPRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILCtFQUErRTtBQUUvRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUgsOERBQThEO0FBRTlEOzs7Ozs7Ozs7R0FTRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUgsa0hBQWtIO0FBRWxIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUgseUpBQXlKO0FBRXpKOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILHVFQUF1RTtBQUN2RSwyRkFBMkY7QUFFM0Y7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCw2SUFBNkk7QUFDN0ksMkRBQTJEO0FBRTNELE9BQU8sRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7XCJwaHBcIiB8IFwicnVieVwiIHwgXCJqYXZhc2NyaXB0XCIgfCBcInR5cGVzY3JpcHRcIiB8IFwiamF2YVwiIHwgXCJweXRob25cIn0gU2VtYW50aWNMYW5ndWFnZSAqL1xuLyoqIEB0eXBlZGVmIHtcImludGVnZXJcIiB8IFwiYm9vbGVhblwiIHwgXCJzdHJpbmdcIn0gU2VtYW50aWNUeXBlTmFtZSAqL1xuLyoqIEB0eXBlZGVmIHtcIkludGVnZXJOZWdhdGVcIiB8IFwiQm9vbGVhbk5vdFwifSBTZW1hbnRpY1VuYXJ5T3BlcmF0aW9uICovXG4vKiogQHR5cGVkZWYge1wiSW50ZWdlckFkZFwiIHwgXCJJbnRlZ2VyU3VidHJhY3RcIiB8IFwiSW50ZWdlck11bHRpcGx5XCIgfCBcIkJvb2xlYW5BbmRcIiB8IFwiQm9vbGVhbk9yXCIgfCBcIkludGVnZXJFcXVhbFwiIHwgXCJJbnRlZ2VyTm90RXF1YWxcIiB8IFwiQm9vbGVhbkVxdWFsXCIgfCBcIkJvb2xlYW5Ob3RFcXVhbFwiIHwgXCJTdHJpbmdFcXVhbFwiIHwgXCJTdHJpbmdOb3RFcXVhbFwiIHwgXCJJbnRlZ2VyTGVzc1RoYW5cIiB8IFwiSW50ZWdlckxlc3NUaGFuT3JFcXVhbFwiIHwgXCJJbnRlZ2VyR3JlYXRlclRoYW5cIiB8IFwiSW50ZWdlckdyZWF0ZXJUaGFuT3JFcXVhbFwiIHwgXCJTdHJpbmdDb25jYXRcIn0gU2VtYW50aWNCaW5hcnlPcGVyYXRpb24gKi9cbi8qKiBAdHlwZWRlZiB7XCJmdW5jdGlvblwiIHwgXCJwYXJhbWV0ZXJcIiB8IFwibG9jYWxcIn0gU2VtYW50aWNTeW1ib2xLaW5kICovXG4vKiogQHR5cGVkZWYge1wiZGVjbGFyYXRpb25cIiB8IFwicmVhZFwiIHwgXCJ3cml0ZVwiIHwgXCJjYWxsXCJ9IFNlbWFudGljU3ltYm9sUm9sZSAqL1xuLyoqIEB0eXBlZGVmIHtcInBhcnNlXCIgfCBcImdlbmVyYXRlXCIgfCBcImNvbXBpbGVcIiB8IFwibGlua1wiIHwgXCJ2YWxpZGF0ZVwiIHwgXCJpbnN0YW50aWF0ZVwiIHwgXCJleGVjdXRlXCJ9IEFjY2VwdGFuY2VTdGFnZSAqL1xuLyoqIEB0eXBlZGVmIHtcImVudHJ5XCIgfCBcInNvdXJjZVwiIHwgXCJtYW5pZmVzdFwiIHwgXCJzdXBwb3J0XCIgfCBcIm1hcHBpbmdcIiB8IFwicmVzb3VyY2VcIiB8IFwibG9hZGVyXCJ9IEdlbmVyYXRlZEFydGlmYWN0Um9sZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlUm9sZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSBmcm9udGVuZCAtIFBhcnNlciBhZGFwdGVyIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGV4dEJhY2tlbmQgLSBTaW5nbGUtIG9yIG11bHRpLWZpbGUgdGV4dCBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmluYXJ5QmFja2VuZCAtIEJpbmFyeSBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYXBwbGljYXRpb25CYWNrZW5kIC0gQXBwbGljYXRpb24tYXJ0aWZhY3QgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGludGVyb3BlcmFiaWxpdHkgLSBJbnRlcm9wZXJhYmlsaXR5IGJyaWRnZSBhdmFpbGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmljaFRleHQgLSBBdXRob3JpdGF0aXZlIHJpY2ggdGV4dCBtYXBwaW5ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc291cmNlTWFwVjMgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeVJhbmdlcyAtIEJ5dGUtY29vcmRpbmF0ZSBiaW5hcnkvcmVzb3VyY2UgbWFwcGluZ3MuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIEFwcGxpY2FibGUgb3JkZXJlZCBhY2NlcHRhbmNlIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHRvb2xjaGFpbnMgLSBSZXF1aXJlZCBjYW5vbmljYWwgdG9vbGNoYWluIElEcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTdGFibGUgcmVnaXN0cnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlUm9sZUNhcGFiaWxpdGllcz59IHJvbGVzIC0gSW5kZXBlbmRlbnRseSByZWdpc3RlcmVkIHJvbGVzLlxuICogQHByb3BlcnR5IHtcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwifSBhcnRpZmFjdE11bHRpcGxpY2l0eSAtIFRhcmdldCBhcnRpZmFjdCBtdWx0aXBsaWNpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJvdW5kVHJpcCAtIFdoZXRoZXIgZnJvbnRlbmQvYmFja2VuZCByb3VuZC10cmlwIGFjY2VwdGFuY2UgaXMgZGVjbGFyZWQuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlTWFwcGluZ0NhcGFiaWxpdGllcz59IG1hcHBpbmcgLSBNYXBwaW5nIGZvcm1zLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXM+fSBhY2NlcHRhbmNlIC0gU3RhZ2VzIGFuZCB0b29sY2hhaW5zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlUG9pbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsaW5lIC0gT25lLWJhc2VkIGxpbmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY29sdW1uIC0gT25lLWJhc2VkIFVURi0xNiBjb2RlLXVuaXQgY29sdW1uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9mZnNldCAtIFplcm8tYmFzZWQgVVRGLTE2IHNvdXJjZSBvZmZzZXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VMb2NhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYXRpbmcgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZVBvaW50fSBzdGFydCAtIEluY2x1c2l2ZSBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IGVuZCAtIEV4Y2x1c2l2ZSBlbmQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWdpc3RlcmVkU291cmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBSZWdpc3RyeS1sb2NhbCBkZXRlcm1pbmlzdGljIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE9yaWdpbmFsIGZpbGVuYW1lLCBwcmVzZXJ2ZWQgdmVyYmF0aW0uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgLSBPcmlnaW5hbCBzb3VyY2UgY29udGVudCwgcHJlc2VydmVkIHZlcmJhdGltIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlIHwgbnVsbH0gbGFuZ3VhZ2UgLSBQYXJzZXIgbGFuZ3VhZ2Ugd2hlbiBrbm93bi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZU9yaWdpblxuICogQHByb3BlcnR5IHtcInNvdXJjZVwifSBraW5kIC0gRGlyZWN0IHNvdXJjZSBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZUlkIC0gUmVnaXN0ZXJlZCBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IG9yaWdpbmFsIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVsYXRlZE9yaWdpblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZUlkIC0gUmVnaXN0ZXJlZCBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFJlbGF0ZWQgb3JpZ2luYWwgcmFuZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBSZWxhdGVkIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlbGF0ZWQgc2VtYW50aWMgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFJlbGF0aW9uc2hpcCByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRGVyaXZlZE9yaWdpblxuICogQHByb3BlcnR5IHtcImRlcml2ZWRcIn0ga2luZCAtIFByb3ZlbmFuY2UgZGVyaXZlZCBmcm9tIG9uZSBvciBtb3JlIG9yaWdpbnMuXG4gKiBAcHJvcGVydHkge1JlbGF0ZWRPcmlnaW5bXX0gb3JpZ2lucyAtIE9yZGVyZWQsIG5vbi1lbXB0eSBvcmlnaW5hbCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTeW50aGV0aWNPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJzeW50aGV0aWNcIn0ga2luZCAtIFNvdXJjZS1mcmVlIGdlbmVyYXRlZCBvciBzZW1hbnRpYyBzY2FmZm9sZGluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWFzb24gLSBTdGFibGUgaHVtYW4tcmVhZGFibGUgcmVhc29uLlxuICogQHByb3BlcnR5IHtSZWxhdGVkT3JpZ2luW119IHJlbGF0ZWRPcmlnaW5zIC0gT3JkZXJlZCByZWxhdGVkIHJhbmdlcywgcG9zc2libHkgZW1wdHkuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTb3VyY2VPcmlnaW4gfCBEZXJpdmVkT3JpZ2luIHwgU3ludGhldGljT3JpZ2lufSBTZW1hbnRpY09yaWdpbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEJ5dGVSYW5nZVxuICogQHByb3BlcnR5IHt7c3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXJ9fSBnZW5lcmF0ZWQgLSBIYWxmLW9wZW4gZ2VuZXJhdGVkIGJ5dGUgb2Zmc2V0cy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIFNlbWFudGljIG9yIGV4cGxpY2l0IHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gT3JpZ2luYXRpbmcgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gT3JpZ2luYXRpbmcgc2VtYW50aWMgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFNlbWFudGljIG9yIGJpbmFyeS1yZWdpb24gcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkQnl0ZU1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIEdlbmVyYXRlZCBvZmZzZXRzIGFyZSBieXRlcywgbmV2ZXIgdGV4dCBjb2x1bW5zLlxuICogQHByb3BlcnR5IHt7cGF0aDogc3RyaW5nLCBieXRlTGVuZ3RoOiBudW1iZXJ9fSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgYXJ0aWZhY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRlZEJ5dGVSYW5nZVtdfSByYW5nZXMgLSBPcmRlcmVkIG5vbi1vdmVybGFwcGluZyByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGROb2RlUHJvdmVuYW5jZVwifSBzY2hlbWEgLSBBc3NvY2lhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gQXNzb2NpYXRpb24gdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIFNvdXJjZSBhc3NvY2lhdGlvbiBpbmRlcGVuZGVudCBvZiB0cmF2ZXJzYWwgcG9zaXRpb24uXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHNlbWFudGljLXRva2VuIHN1YnJhbmdlcyBieSByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNOb2RlUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gSlNPTiBQb2ludGVyIGZyb20gdGhlIHNlbWFudGljIG1vZHVsZSByb290LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVbXCJraW5kXCJdIHwgXCJUeXBlUmVmZXJlbmNlXCJ9IGtpbmQgLSBTZW1hbnRpYyBub2RlIGtpbmQuXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgc2VtYW50aWMtdG9rZW4gc3VicmFuZ2VzIGJ5IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlc29sdmVkIGRlY2xhcmVkL3JlZmVyZW5jZWQgc3ltYm9sIGlkZW50aXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNTeW1ib2xSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub2RlSWQgLSBSZWZlcnJpbmcgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xSb2xlfSByb2xlIC0gUmVmZXJlbmNlIHJvbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHJlZmVyZW5jZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTZW1hbnRpYyBzeW1ib2wgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xLaW5kfSBraW5kIC0gU3ltYm9sIGNhdGVnb3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uTm9kZUlkIC0gRGVjbGFyaW5nIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUmVmZXJlbmNlW119IHJlZmVyZW5jZXMgLSBPcmRlcmVkIHJlc29sdmVkIHJlZmVyZW5jZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZFByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gVmVyc2lvbmVkIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSBub2RlcyAtIERldGVybWluaXN0aWMgbm9kZSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlW119IHN5bWJvbHMgLSBEZXRlcm1pbmlzdGljIHN5bWJvbCBpbmRleC5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCIgfCBcInN5bnRoZXRpY1wifSBNYXBwaW5nS2luZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkTWFwcGluZ1NwYW5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBoYWxmLW9wZW4gcmFuZ2UuXG4gKiBAcHJvcGVydHkge01hcHBpbmdLaW5kfSBtYXBwaW5nS2luZCAtIE1hcHBpbmcgcHJlY2lzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIG9yaWdpbmFsIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBub2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBVc2VmdWwgc3ltYm9sIG5hbWUgZm9yIFNvdXJjZSBNYXAgdjMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudCAtIEV4YWN0IGdlbmVyYXRlZCBMRiBzb3VyY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZE1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZE1hcHBpbmdcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkU291cmNlfSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgcHJvZ3JhbSBpZGVudGl0eSBhbmQgY29udGVudC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gT3JpZ2luYWwgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gQ2Fub25pY2FsIHNlbWFudGljIG5vZGUgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBzeW1ib2xzIC0gQ2Fub25pY2FsIHNlbWFudGljIHN5bWJvbCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBzcGFucyAtIE9yZGVyZWQgZ2VuZXJhdGVkIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEFydGlmYWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29kZSAtIEdlbmVyYXRlZCBvdXRwdXQgcHJvZ3JhbSwgaW5jbHVkaW5nIGFueSByZXF1ZXN0ZWQgZGlyZWN0aXZlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gR2VuZXJhdGVkIG91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgcmljaCBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTWFwRmlsZW5hbWUgLSBEZWZhdWx0IGV4dGVybmFsIFNvdXJjZSBNYXAgZmlsZW5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUZXh0QXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1widGV4dFwifSBraW5kIC0gUmljaCB0ZXh0IHByb3ZlbmFuY2UgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSByYW5nZSBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBJbnRlcm9wZXJhYmxlIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZU1hcEZpbGVuYW1lXSAtIExvZ2ljYWwgU291cmNlIE1hcCBzaWRlY2FyIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0ga2luZCAtIEJ5dGUgcHJvdmVuYW5jZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSBieXRlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFydGlmYWN0U3ludGhldGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU3ludGhldGljIGFydGlmYWN0IGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gRXhwbGljaXQgdGFyZ2V0LXNjYWZmb2xkaW5nIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIFJlbGF0ZWQgc2VtYW50aWMgc291cmNlIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1RleHRBcnRpZmFjdFByb3ZlbmFuY2UgfCBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlIHwgQXJ0aWZhY3RTeW50aGV0aWNQcm92ZW5hbmNlfSBBcnRpZmFjdFByb3ZlbmFuY2UgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTZXRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBVbmlxdWUgc2FmZSByZWxhdGl2ZSBQT1NJWCBwYXRoLlxuICogQHByb3BlcnR5IHtcInRleHRcIiB8IFwiYmluYXJ5XCJ9IGNvbnRlbnRLaW5kIC0gQ29udGVudCByZXByZXNlbnRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIFRleHQgb3IgYSBkZXRhY2hlZCBjb3B5IG9mIHRoZSBleGFjdCBnZW5lcmF0ZWQgYnl0ZXMgb24gZXZlcnkgYmluYXJ5IHJlYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gQXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkQXJ0aWZhY3RSb2xlfSByb2xlIC0gQXJ0aWZhY3Qgcm9sZTsgZXhhY3RseSBvbmUgc2V0IGFydGlmYWN0IGlzIGVudHJ5LlxuICogQHByb3BlcnR5IHtcImdlbmVyYXRlZFwifSBvd25lcnNoaXAgLSBUYXNrLTAxNSBvd25lcnNoaXAgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0FydGlmYWN0UHJvdmVuYW5jZX0gcHJvdmVuYW5jZSAtIFRleHQsIGJ5dGUtcmFuZ2UsIG9yIHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQXJ0aWZhY3RTZXRcbiAqIEBwcm9wZXJ0eSB7XCJHZW5lcmF0ZWRBcnRpZmFjdFNldFwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFN0YWJsZSBsYW5ndWFnZSBvciB0YXJnZXQgSUQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW50cnkgLSBQYXRoIG9mIHRoZSBzb2xlIGRlY2xhcmVkIGVudHJ5IGFydGlmYWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRTZXRBcnRpZmFjdFtdfSBhcnRpZmFjdHMgLSBEZXRlcm1pbmlzdGljIGFydGlmYWN0IG9yZGVyLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRGlzY292ZXJlZFRvb2xjaGFpblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbW1hbmQgLSBEb2N1bWVudGVkIGNhbm9uaWNhbCBjb21tYW5kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBhYnNvbHV0ZSBleGVjdXRhYmxlIHBhdGguXG4gKiBAcHJvcGVydHkge1wib3ZlcnJpZGVcIiB8IFwiY2Fub25pY2FsXCJ9IHNvdXJjZSAtIFJlc29sdXRpb24gcm91dGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIEZpcnN0IGNhcHR1cmVkIHZlcnNpb24gbGluZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uT3V0cHV0IC0gQ29tcGxldGUgY2FwdHVyZWQgdmVyc2lvbiBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VTdGFnZVJlc3VsdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gQ29tcGxldGVkIHN0YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHVzZWQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd1bWVudHMgLSBFeGFjdCBhcmd1bWVudCBhcnJheSB1c2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBEaXNjb3ZlcmVkIHRvb2wgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBDYXB0dXJlZCBzdGFuZGFyZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gQ2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBY2NlcHRhbmNlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gVGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpcmVjdG9yeSAtIFJlbW92ZWQgaXNvbGF0ZWQgcHJvamVjdCBkaXJlY3RvcnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVJlc3VsdFtdfSBzdGFnZXMgLSBPcmRlcmVkIGNvbXBsZXRlZCBzdGFnZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSBuYW1lIC0gTm9ybWFsaXplZCB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlIHRoYXQgc3Vydml2ZXMgc2VtYW50aWMgdHJhbnNmb3Jtcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFBhcmFtZXRlclxuICogQHByb3BlcnR5IHtcIlBhcmFtZXRlclwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBQYXJhbWV0ZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0gdHlwZSAtIFBhcmFtZXRlciB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSWRlbnRpZmllckV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJJZGVudGlmaWVyRXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBSZWZlcmVuY2VkIG5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJbnRlZ2VyTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkludGVnZXJMaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmFsdWUgLSBKYXZhU2NyaXB0LXNhZmUgaW50ZWdlciB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJvb2xlYW5MaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiQm9vbGVhbkxpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdmFsdWUgLSBCb29sZWFuIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3RyaW5nTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIlN0cmluZ0xpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZSAtIFVuaWNvZGUgc3RyaW5nIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVW5hcnlFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiVW5hcnlFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVW5hcnlPcGVyYXRpb259IG9wZXJhdGlvbiAtIENsb3NlZCBzZW1hbnRpYyBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IG9wZXJhbmQgLSBPcGVyYW5kIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCBvcGVyYXRpb24gcmVzdWx0IHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCaW5hcnlFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQmluYXJ5RXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2xvc2VkIHNlbWFudGljIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbGVmdCAtIExlZnQgb3BlcmFuZC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gcmlnaHQgLSBSaWdodCBvcGVyYW5kLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSB0eXBlIC0gRXhwbGljaXQgb3BlcmF0aW9uIHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2FsbEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJDYWxsRXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNhbGxlZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gUG9zaXRpb25hbCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IEludGVnZXJMaXRlcmFsIHwgQm9vbGVhbkxpdGVyYWwgfCBTdHJpbmdMaXRlcmFsIHwgVW5hcnlFeHByZXNzaW9uIHwgQmluYXJ5RXhwcmVzc2lvbiB8IENhbGxFeHByZXNzaW9ufSBFeHByZXNzaW9uICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9jYWxEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkxvY2FsRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRGVjbGFyZWQgbG9jYWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0gdHlwZSAtIEV4cGxpY2l0IGxvY2FsIHR5cGUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG11dGFibGUgLSBXaGV0aGVyIGxhdGVyIGFzc2lnbm1lbnQgaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gaW5pdGlhbGl6ZXIgLSBSZXF1aXJlZCBpbml0aWFsaXplciBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBEZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQXNzaWdubWVudFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IHRhcmdldCAtIFNpbXBsZSBsb2NhbCBhc3NpZ25tZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEFzc2lnbmVkIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEFzc2lnbm1lbnQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJldHVyblN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlJldHVyblN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gUmV0dXJuZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElmU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiSWZTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29uZGl0aW9uIC0gQnJhbmNoIGNvbmRpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNvbnNlcXVlbnQgLSBUcnVlIGJyYW5jaC5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IFthbHRlcm5hdGVdIC0gRmFsc2UgYnJhbmNoLCBhYnNlbnQgd2hlbiBleGVjdXRpb24gZmFsbHMgdGhyb3VnaC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0xvY2FsRGVjbGFyYXRpb24gfCBBc3NpZ25tZW50U3RhdGVtZW50fSBMb2NhbFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtMb2NhbFN0YXRlbWVudCB8IElmU3RhdGVtZW50IHwgUmV0dXJuU3RhdGVtZW50IHwgUHJpbnRTdGF0ZW1lbnR9IFN0YXRlbWVudCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJsb2NrXG4gKiBAcHJvcGVydHkge1wiQmxvY2tcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U3RhdGVtZW50W119IHN0YXRlbWVudHMgLSBPcmRlcmVkIHN0YXRlbWVudHMgaW4gb25lIGxleGljYWwgc2NvcGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGdW5jdGlvbkRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRnVuY3Rpb25EZWNsYXJhdGlvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBGdW5jdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEZ1bmN0aW9uIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IHJldHVyblR5cGUgLSBSZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBGdW5jdGlvbiBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpbnRTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJQcmludFN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gUHJpbnRlZCBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRW50cnlQb2ludFxuICogQHByb3BlcnR5IHtcIkVudHJ5UG9pbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBFbnRyeS1wb2ludCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNNb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25EZWNsYXJhdGlvbltdfSBmdW5jdGlvbnMgLSBUb3AtbGV2ZWwgZnVuY3Rpb25zLlxuICogQHByb3BlcnR5IHtFbnRyeVBvaW50fSBlbnRyeVBvaW50IC0gRXhlY3V0YWJsZSBlbnRyeSBwb2ludC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm92ZW5hbmNlfSBbcHJvdmVuYW5jZV0gLSBQYXJzZXItYXV0aG9yZWQgc291cmNlIGFuZCBpZGVudGl0eSBpbmRleDsgb3B0aW9uYWwgZm9yIGxlZ2FjeSBjYWxsZXItYXV0aG9yZWQgbW9kdWxlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljTW9kdWxlIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IFBhcmFtZXRlciB8IEJsb2NrIHwgU3RhdGVtZW50IHwgRW50cnlQb2ludCB8IEV4cHJlc3Npb24gfCBUeXBlUmVmZXJlbmNlfSBTZW1hbnRpY05vZGUgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNOb2RlfSBTZW1hbnRpY05vZGVXaXRob3V0TG9jYXRpb25zICovXG5cbmV4cG9ydCB7fVxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executes one exact file while owning its complete bounded lifecycle.
|
|
3
|
+
* @param {object} input - Process request.
|
|
4
|
+
* @param {readonly string[]} input.arguments - Exact argument array.
|
|
5
|
+
* @param {string} [input.cwd] - Working directory.
|
|
6
|
+
* @param {Readonly<Record<string, string>>} input.environment - Exact environment.
|
|
7
|
+
* @param {string} input.executable - Exact executable path.
|
|
8
|
+
* @param {number} input.maxBuffer - Maximum bytes captured per output stream.
|
|
9
|
+
* @param {number} input.timeoutMs - Deadline before termination begins.
|
|
10
|
+
* @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
|
|
11
|
+
*/
|
|
12
|
+
export declare function executeFileWithDeadline({ arguments: processArguments, cwd, environment, executable, maxBuffer, timeoutMs }: {
|
|
13
|
+
arguments: readonly string[];
|
|
14
|
+
cwd?: string;
|
|
15
|
+
environment: Readonly<Record<string, string>>;
|
|
16
|
+
executable: string;
|
|
17
|
+
maxBuffer: number;
|
|
18
|
+
timeoutMs: number;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
stderr: string;
|
|
21
|
+
stdout: string;
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Reports whether this module's deadline timer initiated termination.
|
|
25
|
+
* @param {unknown} error - Subprocess failure.
|
|
26
|
+
* @returns {boolean} Whether the failure belongs to an owned deadline.
|
|
27
|
+
*/
|
|
28
|
+
export declare function exceededOwnedDeadline(error: unknown): boolean;
|
|
29
|
+
//# sourceMappingURL=subprocess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/subprocess.js"],"names":[],"mappings":"AASA;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,EAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAC,EARtH;IAAiC,SAAS,EAAlC,SAAS,MAAM,EAAE,CACzB;IAAuB,GAAG,AAA1B,CACA,EADQ,MAAM,CACd;IAAgD,WAAW,EAAnD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACxC;IAAsB,UAAU,EAAxB,MAAM,CACd;IAAsB,SAAS,EAAvB,MAAM,CACd;IAAsB,SAAS,EAAvB,MAAM,CACd;CAEsH,GAF5G,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC,CAkHrD;AA+DD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAHhC,OAGgC,GAF9B,OAAO,CAInB"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { StringDecoder } from "node:string_decoder";
|
|
4
|
+
const forcedTerminationGraceMs = 250;
|
|
5
|
+
const retainedPipeGraceMs = 250;
|
|
6
|
+
const deadlineFailures = new WeakSet();
|
|
7
|
+
/**
|
|
8
|
+
* Executes one exact file while owning its complete bounded lifecycle.
|
|
9
|
+
* @param {object} input - Process request.
|
|
10
|
+
* @param {readonly string[]} input.arguments - Exact argument array.
|
|
11
|
+
* @param {string} [input.cwd] - Working directory.
|
|
12
|
+
* @param {Readonly<Record<string, string>>} input.environment - Exact environment.
|
|
13
|
+
* @param {string} input.executable - Exact executable path.
|
|
14
|
+
* @param {number} input.maxBuffer - Maximum bytes captured per output stream.
|
|
15
|
+
* @param {number} input.timeoutMs - Deadline before termination begins.
|
|
16
|
+
* @returns {Promise<{stderr: string, stdout: string}>} Output after the owned process group closes.
|
|
17
|
+
*/
|
|
18
|
+
export function executeFileWithDeadline({ arguments: processArguments, cwd, environment, executable, maxBuffer, timeoutMs }) {
|
|
19
|
+
if (process.platform == "win32") {
|
|
20
|
+
return Promise.reject(Object.assign(new Error("Owned process-tree termination is unavailable on this platform."), {
|
|
21
|
+
code: "ENOTSUP",
|
|
22
|
+
stderr: "",
|
|
23
|
+
stdout: ""
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
/** @type {ReturnType<typeof setTimeout> | undefined} */
|
|
28
|
+
let deadlineTimer;
|
|
29
|
+
/** @type {ReturnType<typeof setTimeout> | undefined} */
|
|
30
|
+
let forceTimer;
|
|
31
|
+
/** @type {ReturnType<typeof setTimeout> | undefined} */
|
|
32
|
+
let pipeTimer;
|
|
33
|
+
/** @type {Error | undefined} */
|
|
34
|
+
let launchError;
|
|
35
|
+
let deadlineExceeded = false;
|
|
36
|
+
let outputExceeded = false;
|
|
37
|
+
let settled = false;
|
|
38
|
+
const stderr = outputCapture(maxBuffer, () => terminateForOutputLimit());
|
|
39
|
+
const stdout = outputCapture(maxBuffer, () => terminateForOutputLimit());
|
|
40
|
+
const child = spawn(executable, [...processArguments], {
|
|
41
|
+
cwd,
|
|
42
|
+
detached: true,
|
|
43
|
+
env: environment,
|
|
44
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
45
|
+
});
|
|
46
|
+
const processGroupId = child.pid;
|
|
47
|
+
child.stderr.on("data", stderr.receive);
|
|
48
|
+
child.stdout.on("data", stdout.receive);
|
|
49
|
+
child.once("error", (error) => {
|
|
50
|
+
launchError = error;
|
|
51
|
+
});
|
|
52
|
+
child.once("spawn", () => {
|
|
53
|
+
if (processGroupId == undefined || !verifyOwnedProcessGroup(processGroupId)) {
|
|
54
|
+
launchError = Object.assign(new Error("Spawned subprocess did not establish its required process group."), { code: "ENOTSUP" });
|
|
55
|
+
child.kill("SIGKILL");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
deadlineTimer = setTimeout(() => {
|
|
59
|
+
if (settled)
|
|
60
|
+
return;
|
|
61
|
+
deadlineExceeded = true;
|
|
62
|
+
beginTermination(processGroupId);
|
|
63
|
+
}, timeoutMs);
|
|
64
|
+
});
|
|
65
|
+
child.once("close", (code, signal) => {
|
|
66
|
+
settled = true;
|
|
67
|
+
if (deadlineTimer != undefined)
|
|
68
|
+
clearTimeout(deadlineTimer);
|
|
69
|
+
if (forceTimer != undefined)
|
|
70
|
+
clearTimeout(forceTimer);
|
|
71
|
+
if (pipeTimer != undefined)
|
|
72
|
+
clearTimeout(pipeTimer);
|
|
73
|
+
const capturedStderr = stderr.finish();
|
|
74
|
+
const capturedStdout = stdout.finish();
|
|
75
|
+
if (launchError) {
|
|
76
|
+
reject(Object.assign(launchError, { stderr: capturedStderr, stdout: capturedStdout }));
|
|
77
|
+
}
|
|
78
|
+
else if (outputExceeded) {
|
|
79
|
+
reject(Object.assign(new Error(`Subprocess exceeded its ${maxBuffer}-byte output capture limit.`), {
|
|
80
|
+
code: "ERR_CHILD_PROCESS_STDIO_MAXBUFFER",
|
|
81
|
+
signal,
|
|
82
|
+
stderr: capturedStderr,
|
|
83
|
+
stdout: capturedStdout
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
else if (deadlineExceeded) {
|
|
87
|
+
const timeoutError = Object.assign(new Error("Subprocess exceeded its owned deadline."), {
|
|
88
|
+
code,
|
|
89
|
+
signal,
|
|
90
|
+
stderr: capturedStderr,
|
|
91
|
+
stdout: capturedStdout
|
|
92
|
+
});
|
|
93
|
+
deadlineFailures.add(timeoutError);
|
|
94
|
+
reject(timeoutError);
|
|
95
|
+
}
|
|
96
|
+
else if (code != 0 || signal != null) {
|
|
97
|
+
reject(Object.assign(new Error("Subprocess failed after launch."), {
|
|
98
|
+
code,
|
|
99
|
+
signal,
|
|
100
|
+
stderr: capturedStderr,
|
|
101
|
+
stdout: capturedStdout
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
else
|
|
105
|
+
resolve({ stderr: capturedStderr, stdout: capturedStdout });
|
|
106
|
+
});
|
|
107
|
+
/** Begins bounded termination after output capture crosses its limit. */
|
|
108
|
+
function terminateForOutputLimit() {
|
|
109
|
+
if (outputExceeded || settled)
|
|
110
|
+
return;
|
|
111
|
+
outputExceeded = true;
|
|
112
|
+
if (processGroupId != undefined)
|
|
113
|
+
beginTermination(processGroupId);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Signals the owned group now and escalates if its inherited pipes remain open.
|
|
117
|
+
* @param {number} ownedGroupId - Spawn-verified process-group identity.
|
|
118
|
+
*/
|
|
119
|
+
function beginTermination(ownedGroupId) {
|
|
120
|
+
signalOwnedProcessGroup(ownedGroupId, "SIGTERM");
|
|
121
|
+
if (!settled && forceTimer == undefined) {
|
|
122
|
+
forceTimer = setTimeout(() => {
|
|
123
|
+
if (settled)
|
|
124
|
+
return;
|
|
125
|
+
signalOwnedProcessGroup(ownedGroupId, "SIGKILL");
|
|
126
|
+
pipeTimer = setTimeout(() => {
|
|
127
|
+
if (settled)
|
|
128
|
+
return;
|
|
129
|
+
child.stdout.destroy();
|
|
130
|
+
child.stderr.destroy();
|
|
131
|
+
}, retainedPipeGraceMs);
|
|
132
|
+
}, forcedTerminationGraceMs);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Creates one byte-bounded UTF-8 stream capture.
|
|
139
|
+
* @param {number} maximumBytes - Maximum captured bytes.
|
|
140
|
+
* @param {() => void} onExceeded - First-overflow callback.
|
|
141
|
+
* @returns {{finish: () => string, receive: (chunk: Buffer) => void}} Capture callbacks.
|
|
142
|
+
*/
|
|
143
|
+
function outputCapture(maximumBytes, onExceeded) {
|
|
144
|
+
const decoder = new StringDecoder("utf8");
|
|
145
|
+
let byteLength = 0;
|
|
146
|
+
let content = "";
|
|
147
|
+
let exceeded = false;
|
|
148
|
+
return {
|
|
149
|
+
finish() {
|
|
150
|
+
return content + decoder.end();
|
|
151
|
+
},
|
|
152
|
+
receive(chunk) {
|
|
153
|
+
if (exceeded)
|
|
154
|
+
return;
|
|
155
|
+
const remaining = maximumBytes - byteLength;
|
|
156
|
+
if (chunk.length > remaining) {
|
|
157
|
+
if (remaining > 0)
|
|
158
|
+
content += decoder.write(chunk.subarray(0, remaining));
|
|
159
|
+
exceeded = true;
|
|
160
|
+
onExceeded();
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
byteLength += chunk.length;
|
|
164
|
+
content += decoder.write(chunk);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Verifies that the spawned child is the live leader of its distinct POSIX group.
|
|
170
|
+
* @param {number} processGroupId - Spawn-returned child PID and required group ID.
|
|
171
|
+
* @returns {boolean} Whether the owned group exists.
|
|
172
|
+
*/
|
|
173
|
+
function verifyOwnedProcessGroup(processGroupId) {
|
|
174
|
+
try {
|
|
175
|
+
process.kill(-processGroupId, 0);
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
if (error instanceof Error && "code" in error && error.code == "ESRCH")
|
|
180
|
+
return false;
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Signals only the verified process group created for the exact spawned child.
|
|
186
|
+
* @param {number} processGroupId - Spawn-returned child PID and POSIX process-group ID.
|
|
187
|
+
* @param {"SIGKILL" | "SIGTERM"} signal - Lifecycle signal.
|
|
188
|
+
* @returns {void}
|
|
189
|
+
*/
|
|
190
|
+
function signalOwnedProcessGroup(processGroupId, signal) {
|
|
191
|
+
try {
|
|
192
|
+
process.kill(-processGroupId, signal);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (!(error instanceof Error && "code" in error && error.code == "ESRCH"))
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Reports whether this module's deadline timer initiated termination.
|
|
201
|
+
* @param {unknown} error - Subprocess failure.
|
|
202
|
+
* @returns {boolean} Whether the failure belongs to an owned deadline.
|
|
203
|
+
*/
|
|
204
|
+
export function exceededOwnedDeadline(error) {
|
|
205
|
+
return typeof error == "object" && error != null && deadlineFailures.has(error);
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VicHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdWJwcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFBO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFBO0FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUM7SUFDdkgsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLEVBQUU7WUFDaEgsSUFBSSxFQUFFLFNBQVM7WUFDZixNQUFNLEVBQUUsRUFBRTtZQUNWLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyx3REFBd0Q7UUFDeEQsSUFBSSxhQUFhLENBQUE7UUFDakIsd0RBQXdEO1FBQ3hELElBQUksVUFBVSxDQUFBO1FBQ2Qsd0RBQXdEO1FBQ3hELElBQUksU0FBUyxDQUFBO1FBQ2IsZ0NBQWdDO1FBQ2hDLElBQUksV0FBVyxDQUFBO1FBQ2YsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7UUFDNUIsSUFBSSxjQUFjLEdB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QkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDakYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3NwYXdufSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCB7U3RyaW5nRGVjb2Rlcn0gZnJvbSBcIm5vZGU6c3RyaW5nX2RlY29kZXJcIlxuXG5jb25zdCBmb3JjZWRUZXJtaW5hdGlvbkdyYWNlTXMgPSAyNTBcbmNvbnN0IHJldGFpbmVkUGlwZUdyYWNlTXMgPSAyNTBcbmNvbnN0IGRlYWRsaW5lRmFpbHVyZXMgPSBuZXcgV2Vha1NldCgpXG5cbi8qKlxuICogRXhlY3V0ZXMgb25lIGV4YWN0IGZpbGUgd2hpbGUgb3duaW5nIGl0cyBjb21wbGV0ZSBib3VuZGVkIGxpZmVjeWNsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFByb2Nlc3MgcmVxdWVzdC5cbiAqIEBwYXJhbSB7cmVhZG9ubHkgc3RyaW5nW119IGlucHV0LmFyZ3VtZW50cyAtIEV4YWN0IGFyZ3VtZW50IGFycmF5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbnB1dC5jd2RdIC0gV29ya2luZyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+fSBpbnB1dC5lbnZpcm9ubWVudCAtIEV4YWN0IGVudmlyb25tZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0LmV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHBhdGguXG4gKiBAcGFyYW0ge251bWJlcn0gaW5wdXQubWF4QnVmZmVyIC0gTWF4aW11bSBieXRlcyBjYXB0dXJlZCBwZXIgb3V0cHV0IHN0cmVhbS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dC50aW1lb3V0TXMgLSBEZWFkbGluZSBiZWZvcmUgdGVybWluYXRpb24gYmVnaW5zLlxuICogQHJldHVybnMge1Byb21pc2U8e3N0ZGVycjogc3RyaW5nLCBzdGRvdXQ6IHN0cmluZ30+fSBPdXRwdXQgYWZ0ZXIgdGhlIG93bmVkIHByb2Nlc3MgZ3JvdXAgY2xvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZUZpbGVXaXRoRGVhZGxpbmUoe2FyZ3VtZW50czogcHJvY2Vzc0FyZ3VtZW50cywgY3dkLCBlbnZpcm9ubWVudCwgZXhlY3V0YWJsZSwgbWF4QnVmZmVyLCB0aW1lb3V0TXN9KSB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09IFwid2luMzJcIikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIk93bmVkIHByb2Nlc3MtdHJlZSB0ZXJtaW5hdGlvbiBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLlwiKSwge1xuICAgICAgY29kZTogXCJFTk9UU1VQXCIsXG4gICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICBzdGRvdXQ6IFwiXCJcbiAgICB9KSlcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgZGVhZGxpbmVUaW1lclxuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGZvcmNlVGltZXJcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBwaXBlVGltZXJcbiAgICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBsYXVuY2hFcnJvclxuICAgIGxldCBkZWFkbGluZUV4Y2VlZGVkID0gZmFsc2VcbiAgICBsZXQgb3V0cHV0RXhjZWVkZWQgPSBmYWxzZVxuICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICBjb25zdCBzdGRlcnIgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBzdGRvdXQgPSBvdXRwdXRDYXB0dXJlKG1heEJ1ZmZlciwgKCkgPT4gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSlcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGV4ZWN1dGFibGUsIFsuLi5wcm9jZXNzQXJndW1lbnRzXSwge1xuICAgICAgY3dkLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdXG4gICAgfSlcbiAgICBjb25zdCBwcm9jZXNzR3JvdXBJZCA9IGNoaWxkLnBpZFxuXG4gICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCBzdGRlcnIucmVjZWl2ZSlcbiAgICBjaGlsZC5zdGRvdXQub24oXCJkYXRhXCIsIHN0ZG91dC5yZWNlaXZlKVxuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGxhdW5jaEVycm9yID0gZXJyb3JcbiAgICB9KVxuICAgIGNoaWxkLm9uY2UoXCJzcGF3blwiLCAoKSA9PiB7XG4gICAgICBpZiAocHJvY2Vzc0dyb3VwSWQgPT0gdW5kZWZpbmVkIHx8ICF2ZXJpZnlPd25lZFByb2Nlc3NHcm91cChwcm9jZXNzR3JvdXBJZCkpIHtcbiAgICAgICAgbGF1bmNoRXJyb3IgPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIlNwYXduZWQgc3VicHJvY2VzcyBkaWQgbm90IGVzdGFibGlzaCBpdHMgcmVxdWlyZWQgcHJvY2VzcyBncm91cC5cIiksIHtjb2RlOiBcIkVOT1RTVVBcIn0pXG4gICAgICAgIGNoaWxkLmtpbGwoXCJTSUdLSUxMXCIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBkZWFkbGluZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgZGVhZGxpbmVFeGNlZWRlZCA9IHRydWVcbiAgICAgICAgYmVnaW5UZXJtaW5hdGlvbihwcm9jZXNzR3JvdXBJZClcbiAgICAgIH0sIHRpbWVvdXRNcylcbiAgICB9KVxuICAgIGNoaWxkLm9uY2UoXCJjbG9zZVwiLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgaWYgKGRlYWRsaW5lVGltZXIgIT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQoZGVhZGxpbmVUaW1lcilcbiAgICAgIGlmIChmb3JjZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KGZvcmNlVGltZXIpXG4gICAgICBpZiAocGlwZVRpbWVyICE9IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHBpcGVUaW1lcilcbiAgICAgIGNvbnN0IGNhcHR1cmVkU3RkZXJyID0gc3RkZXJyLmZpbmlzaCgpXG4gICAgICBjb25zdCBjYXB0dXJlZFN0ZG91dCA9IHN0ZG91dC5maW5pc2goKVxuXG4gICAgICBpZiAobGF1bmNoRXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KE9iamVjdC5hc3NpZ24obGF1bmNoRXJyb3IsIHtzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLCBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0fSkpXG4gICAgICB9IGVsc2UgaWYgKG91dHB1dEV4Y2VlZGVkKSB7XG4gICAgICAgIHJlamVjdChPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU3VicHJvY2VzcyBleGNlZWRlZCBpdHMgJHttYXhCdWZmZXJ9LWJ5dGUgb3V0cHV0IGNhcHR1cmUgbGltaXQuYCksIHtcbiAgICAgICAgICBjb2RlOiBcIkVSUl9DSElMRF9QUk9DRVNTX1NURElPX01BWEJVRkZFUlwiLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICBzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLFxuICAgICAgICAgIHN0ZG91dDogY2FwdHVyZWRTdGRvdXRcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2UgaWYgKGRlYWRsaW5lRXhjZWVkZWQpIHtcbiAgICAgICAgY29uc3QgdGltZW91dEVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTdWJwcm9jZXNzIGV4Y2VlZGVkIGl0cyBvd25lZCBkZWFkbGluZS5cIiksIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICBzdGRlcnI6IGNhcHR1cmVkU3RkZXJyLFxuICAgICAgICAgIHN0ZG91dDogY2FwdHVyZWRTdGRvdXRcbiAgICAgICAgfSlcblxuICAgICAgICBkZWFkbGluZUZhaWx1cmVzLmFkZCh0aW1lb3V0RXJyb3IpXG4gICAgICAgIHJlamVjdCh0aW1lb3V0RXJyb3IpXG4gICAgICB9IGVsc2UgaWYgKGNvZGUgIT0gMCB8fCBzaWduYWwgIT0gbnVsbCkge1xuICAgICAgICByZWplY3QoT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJTdWJwcm9jZXNzIGZhaWxlZCBhZnRlciBsYXVuY2guXCIpLCB7XG4gICAgICAgICAgY29kZSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgc3RkZXJyOiBjYXB0dXJlZFN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IGNhcHR1cmVkU3Rkb3V0XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIHJlc29sdmUoe3N0ZGVycjogY2FwdHVyZWRTdGRlcnIsIHN0ZG91dDogY2FwdHVyZWRTdGRvdXR9KVxuICAgIH0pXG5cbiAgICAvKiogQmVnaW5zIGJvdW5kZWQgdGVybWluYXRpb24gYWZ0ZXIgb3V0cHV0IGNhcHR1cmUgY3Jvc3NlcyBpdHMgbGltaXQuICovXG4gICAgZnVuY3Rpb24gdGVybWluYXRlRm9yT3V0cHV0TGltaXQoKSB7XG4gICAgICBpZiAob3V0cHV0RXhjZWVkZWQgfHwgc2V0dGxlZCkgcmV0dXJuXG4gICAgICBvdXRwdXRFeGNlZWRlZCA9IHRydWVcbiAgICAgIGlmIChwcm9jZXNzR3JvdXBJZCAhPSB1bmRlZmluZWQpIGJlZ2luVGVybWluYXRpb24ocHJvY2Vzc0dyb3VwSWQpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2lnbmFscyB0aGUgb3duZWQgZ3JvdXAgbm93IGFuZCBlc2NhbGF0ZXMgaWYgaXRzIGluaGVyaXRlZCBwaXBlcyByZW1haW4gb3Blbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3duZWRHcm91cElkIC0gU3Bhd24tdmVyaWZpZWQgcHJvY2Vzcy1ncm91cCBpZGVudGl0eS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiZWdpblRlcm1pbmF0aW9uKG93bmVkR3JvdXBJZCkge1xuICAgICAgc2lnbmFsT3duZWRQcm9jZXNzR3JvdXAob3duZWRHcm91cElkLCBcIlNJR1RFUk1cIilcbiAgICAgIGlmICghc2V0dGxlZCAmJiBmb3JjZVRpbWVyID09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3JjZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuICAgICAgICAgIHNpZ25hbE93bmVkUHJvY2Vzc0dyb3VwKG93bmVkR3JvdXBJZCwgXCJTSUdLSUxMXCIpXG4gICAgICAgICAgcGlwZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgICAgICBjaGlsZC5zdGRvdXQuZGVzdHJveSgpXG4gICAgICAgICAgICBjaGlsZC5zdGRlcnIuZGVzdHJveSgpXG4gICAgICAgICAgfSwgcmV0YWluZWRQaXBlR3JhY2VNcylcbiAgICAgICAgfSwgZm9yY2VkVGVybWluYXRpb25HcmFjZU1zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG9uZSBieXRlLWJvdW5kZWQgVVRGLTggc3RyZWFtIGNhcHR1cmUuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4aW11bUJ5dGVzIC0gTWF4aW11bSBjYXB0dXJlZCBieXRlcy5cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gb25FeGNlZWRlZCAtIEZpcnN0LW92ZXJmbG93IGNhbGxiYWNrLlxuICogQHJldHVybnMge3tmaW5pc2g6ICgpID0+IHN0cmluZywgcmVjZWl2ZTogKGNodW5rOiBCdWZmZXIpID0+IHZvaWR9fSBDYXB0dXJlIGNhbGxiYWNrcy5cbiAqL1xuZnVuY3Rpb24gb3V0cHV0Q2FwdHVyZShtYXhpbXVtQnl0ZXMsIG9uRXhjZWVkZWQpIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcbiAgbGV0IGNvbnRlbnQgPSBcIlwiXG4gIGxldCBleGNlZWRlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBmaW5pc2goKSB7XG4gICAgICByZXR1cm4gY29udGVudCArIGRlY29kZXIuZW5kKClcbiAgICB9LFxuICAgIHJlY2VpdmUoY2h1bmspIHtcbiAgICAgIGlmIChleGNlZWRlZCkgcmV0dXJuXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBtYXhpbXVtQnl0ZXMgLSBieXRlTGVuZ3RoXG5cbiAgICAgIGlmIChjaHVuay5sZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuay5zdWJhcnJheSgwLCByZW1haW5pbmcpKVxuICAgICAgICBleGNlZWRlZCA9IHRydWVcbiAgICAgICAgb25FeGNlZWRlZCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnl0ZUxlbmd0aCArPSBjaHVuay5sZW5ndGhcbiAgICAgIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBzcGF3bmVkIGNoaWxkIGlzIHRoZSBsaXZlIGxlYWRlciBvZiBpdHMgZGlzdGluY3QgUE9TSVggZ3JvdXAuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIHJlcXVpcmVkIGdyb3VwIElELlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG93bmVkIGdyb3VwIGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gdmVyaWZ5T3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQpIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXByb2Nlc3NHcm91cElkLCAwKVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PSBcIkVTUkNIXCIpIHJldHVybiBmYWxzZVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBTaWduYWxzIG9ubHkgdGhlIHZlcmlmaWVkIHByb2Nlc3MgZ3JvdXAgY3JlYXRlZCBmb3IgdGhlIGV4YWN0IHNwYXduZWQgY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gcHJvY2Vzc0dyb3VwSWQgLSBTcGF3bi1yZXR1cm5lZCBjaGlsZCBQSUQgYW5kIFBPU0lYIHByb2Nlc3MtZ3JvdXAgSUQuXG4gKiBAcGFyYW0ge1wiU0lHS0lMTFwiIHwgXCJTSUdURVJNXCJ9IHNpZ25hbCAtIExpZmVjeWNsZSBzaWduYWwuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gc2lnbmFsT3duZWRQcm9jZXNzR3JvdXAocHJvY2Vzc0dyb3VwSWQsIHNpZ25hbCkge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcHJvY2Vzc0dyb3VwSWQsIHNpZ25hbClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT0gXCJFU1JDSFwiKSkgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciB0aGlzIG1vZHVsZSdzIGRlYWRsaW5lIHRpbWVyIGluaXRpYXRlZCB0ZXJtaW5hdGlvbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBTdWJwcm9jZXNzIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmFpbHVyZSBiZWxvbmdzIHRvIGFuIG93bmVkIGRlYWRsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkZWRPd25lZERlYWRsaW5lKGVycm9yKSB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPSBudWxsICYmIGRlYWRsaW5lRmFpbHVyZXMuaGFzKGVycm9yKVxufVxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const maximumTimeoutMs = 2147483647;
|
|
2
|
+
/**
|
|
3
|
+
* Checks whether a public subprocess timeout fits one exact Node timer.
|
|
4
|
+
* @param {unknown} value - Candidate timeout.
|
|
5
|
+
* @returns {value is number} Whether the timeout is a supported positive integer.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isSupportedTimeoutMs(value: unknown): value is number;
|
|
8
|
+
//# sourceMappingURL=timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../src/timeout.js"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,aAAgB,CAAA;AAE7C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAH/B,OAG+B,GAF7B,KAAK,IAAI,MAAM,CAI3B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
export const maximumTimeoutMs = 2_147_483_647;
|
|
3
|
+
/**
|
|
4
|
+
* Checks whether a public subprocess timeout fits one exact Node timer.
|
|
5
|
+
* @param {unknown} value - Candidate timeout.
|
|
6
|
+
* @returns {value is number} Whether the timeout is a supported positive integer.
|
|
7
|
+
*/
|
|
8
|
+
export function isSupportedTimeoutMs(value) {
|
|
9
|
+
return typeof value == "number" && Number.isSafeInteger(value) && value > 0 && value <= maximumTimeoutMs;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90aW1lb3V0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUE7QUFFN0M7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxLQUFLO0lBQ3hDLE9BQU8sT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksZ0JBQWdCLENBQUE7QUFDMUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5leHBvcnQgY29uc3QgbWF4aW11bVRpbWVvdXRNcyA9IDJfMTQ3XzQ4M182NDdcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHB1YmxpYyBzdWJwcm9jZXNzIHRpbWVvdXQgZml0cyBvbmUgZXhhY3QgTm9kZSB0aW1lci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBudW1iZXJ9IFdoZXRoZXIgdGhlIHRpbWVvdXQgaXMgYSBzdXBwb3J0ZWQgcG9zaXRpdmUgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwcG9ydGVkVGltZW91dE1zKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPiAwICYmIHZhbHVlIDw9IG1heGltdW1UaW1lb3V0TXNcbn1cbiJdfQ==
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export declare const canonicalToolchains: {
|
|
2
|
+
php: {
|
|
3
|
+
canonicalCommand: string;
|
|
4
|
+
overrideEnvironmentVariable: string;
|
|
5
|
+
supportedVersion: RegExp;
|
|
6
|
+
versionArguments: string[];
|
|
7
|
+
};
|
|
8
|
+
ruby: {
|
|
9
|
+
canonicalCommand: string;
|
|
10
|
+
overrideEnvironmentVariable: string;
|
|
11
|
+
supportedVersion: RegExp;
|
|
12
|
+
versionArguments: string[];
|
|
13
|
+
};
|
|
14
|
+
node: {
|
|
15
|
+
canonicalCommand: string;
|
|
16
|
+
overrideEnvironmentVariable: string;
|
|
17
|
+
supportedVersion: RegExp;
|
|
18
|
+
versionArguments: string[];
|
|
19
|
+
};
|
|
20
|
+
tsc: {
|
|
21
|
+
canonicalCommand: string;
|
|
22
|
+
overrideEnvironmentVariable: string;
|
|
23
|
+
supportedVersion: RegExp;
|
|
24
|
+
versionArguments: string[];
|
|
25
|
+
};
|
|
26
|
+
javac: {
|
|
27
|
+
canonicalCommand: string;
|
|
28
|
+
overrideEnvironmentVariable: string;
|
|
29
|
+
supportedVersion: RegExp;
|
|
30
|
+
versionArguments: string[];
|
|
31
|
+
};
|
|
32
|
+
java: {
|
|
33
|
+
canonicalCommand: string;
|
|
34
|
+
overrideEnvironmentVariable: string;
|
|
35
|
+
supportedVersion: RegExp;
|
|
36
|
+
versionArguments: string[];
|
|
37
|
+
};
|
|
38
|
+
python: {
|
|
39
|
+
canonicalCommand: string;
|
|
40
|
+
overrideEnvironmentVariable: string;
|
|
41
|
+
supportedVersion: RegExp;
|
|
42
|
+
versionArguments: string[];
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Discovers one repository-declared canonical toolchain.
|
|
47
|
+
* @param {keyof typeof canonicalToolchains} id - Canonical toolchain ID.
|
|
48
|
+
* @param {{environment?: Readonly<Record<string, string | undefined>>, override?: string, timeoutMs?: number}} [options] - Discovery options.
|
|
49
|
+
* @returns {Promise<import("./semantic/types.js").DiscoveredToolchain>} Exact executable and version.
|
|
50
|
+
*/
|
|
51
|
+
export declare function discoverCanonicalToolchain(id: keyof typeof canonicalToolchains, options?: {
|
|
52
|
+
environment?: Readonly<Record<string, string | undefined>>;
|
|
53
|
+
override?: string;
|
|
54
|
+
timeoutMs?: number;
|
|
55
|
+
}): Promise<import("./semantic/types.js").DiscoveredToolchain>;
|
|
56
|
+
/**
|
|
57
|
+
* Resolves and versions one configured or canonical executable without invoking a shell.
|
|
58
|
+
* @param {object} input - Discovery request.
|
|
59
|
+
* @param {string} input.canonicalCommand - Canonical PATH command.
|
|
60
|
+
* @param {Readonly<Record<string, string | undefined>>} [input.environment] - Explicit discovery environment.
|
|
61
|
+
* @param {string} input.id - Toolchain ID.
|
|
62
|
+
* @param {string} [input.override] - Configured absolute executable path.
|
|
63
|
+
* @param {RegExp} [input.supportedVersion] - Full captured-output version policy.
|
|
64
|
+
* @param {number} [input.timeoutMs] - Version command timeout.
|
|
65
|
+
* @param {string[]} input.versionArguments - Exact version argument array.
|
|
66
|
+
* @returns {Promise<import("./semantic/types.js").DiscoveredToolchain>} Discovered tool.
|
|
67
|
+
*/
|
|
68
|
+
export declare function discoverToolchain(input: {
|
|
69
|
+
canonicalCommand: string;
|
|
70
|
+
environment?: Readonly<Record<string, string | undefined>>;
|
|
71
|
+
id: string;
|
|
72
|
+
override?: string;
|
|
73
|
+
supportedVersion?: RegExp;
|
|
74
|
+
timeoutMs?: number;
|
|
75
|
+
versionArguments: string[];
|
|
76
|
+
}): Promise<import("./semantic/types.js").DiscoveredToolchain>;
|
|
77
|
+
/**
|
|
78
|
+
* Produces the minimal deterministic process environment.
|
|
79
|
+
* @param {Readonly<Record<string, string | undefined>>} environment - Explicit inputs.
|
|
80
|
+
* @returns {Readonly<Record<string, string>>} Normalized environment.
|
|
81
|
+
*/
|
|
82
|
+
export declare function deterministicEnvironment(environment?: Readonly<Record<string, string | undefined>>): Readonly<Record<string, string>>;
|
|
83
|
+
//# sourceMappingURL=toolchains.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolchains.d.ts","sourceRoot":"","sources":["../../src/toolchains.js"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB;;0BAkKA,MAAM;qCAA+B,MAAM;0BAAoB,MAAM;0BAAoB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA1J/H,CAAA;AAEF;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAJxC,MAAM,OAAO,mBAI2B,EAAE,OAAO,AAHzD,CACA,EADQ;IAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAG5C,GAFpD,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CA+BtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAT1C;IAAsB,gBAAgB,EAA9B,MAAM,CACd;IAA6D,WAAW,AAAxE,CACA,EADQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CACpD;IAAsB,EAAE,EAAhB,MAAM,CACd;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAAuB,gBAAgB,AAAvC,CACA,EADQ,MAAM,CACd;IAAuB,SAAS,AAAhC,CACA,EADQ,MAAM,CACd;IAAwB,gBAAgB,EAAhC,MAAM,EAAE,CAChB;CAE0C,GAFhC,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CAiGtE;AA+HD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,GAHzC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAGqB,GAF9D,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqB5C"}
|