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.
Files changed (90) hide show
  1. package/README.md +13 -6
  2. package/build/index.d.ts +32 -3
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +99 -4
  5. package/build/src/acceptance.d.ts +22 -0
  6. package/build/src/acceptance.d.ts.map +1 -0
  7. package/build/src/acceptance.js +339 -0
  8. package/build/src/array.d.ts +7 -0
  9. package/build/src/array.d.ts.map +1 -0
  10. package/build/src/array.js +18 -0
  11. package/build/src/artifact-path.d.ts +13 -0
  12. package/build/src/artifact-path.d.ts.map +1 -0
  13. package/build/src/artifact-path.js +30 -0
  14. package/build/src/artifacts.d.ts +7 -0
  15. package/build/src/artifacts.d.ts.map +1 -0
  16. package/build/src/artifacts.js +389 -0
  17. package/build/src/backends/identifiers.d.ts.map +1 -1
  18. package/build/src/backends/identifiers.js +10 -2
  19. package/build/src/backends/index.d.ts.map +1 -1
  20. package/build/src/backends/index.js +19 -37
  21. package/build/src/backends/python.d.ts +8 -0
  22. package/build/src/backends/python.d.ts.map +1 -0
  23. package/build/src/backends/python.js +162 -0
  24. package/build/src/backends/scalars.d.ts.map +1 -1
  25. package/build/src/backends/scalars.js +2 -1
  26. package/build/src/backends/shared.d.ts.map +1 -1
  27. package/build/src/backends/shared.js +9 -6
  28. package/build/src/binary-mapping.d.ts +32 -0
  29. package/build/src/binary-mapping.d.ts.map +1 -0
  30. package/build/src/binary-mapping.js +285 -0
  31. package/build/src/diagnostic.d.ts +36 -4
  32. package/build/src/diagnostic.d.ts.map +1 -1
  33. package/build/src/diagnostic.js +42 -3
  34. package/build/src/frontends/index.d.ts.map +1 -1
  35. package/build/src/frontends/index.js +5 -23
  36. package/build/src/frontends/python.d.ts +14 -0
  37. package/build/src/frontends/python.d.ts.map +1 -0
  38. package/build/src/frontends/python.js +615 -0
  39. package/build/src/frontends/scalars.d.ts.map +1 -1
  40. package/build/src/frontends/scalars.js +6 -1
  41. package/build/src/language-registry.d.ts +113 -0
  42. package/build/src/language-registry.d.ts.map +1 -0
  43. package/build/src/language-registry.js +372 -0
  44. package/build/src/mapping.js +3 -2
  45. package/build/src/semantic/location.d.ts +7 -0
  46. package/build/src/semantic/location.d.ts.map +1 -1
  47. package/build/src/semantic/location.js +10 -1
  48. package/build/src/semantic/provenance.js +3 -3
  49. package/build/src/semantic/types.d.ts +399 -2
  50. package/build/src/semantic/types.d.ts.map +1 -1
  51. package/build/src/semantic/types.js +110 -2
  52. package/build/src/subprocess.d.ts +29 -0
  53. package/build/src/subprocess.d.ts.map +1 -0
  54. package/build/src/subprocess.js +207 -0
  55. package/build/src/timeout.d.ts +8 -0
  56. package/build/src/timeout.d.ts.map +1 -0
  57. package/build/src/timeout.js +11 -0
  58. package/build/src/toolchains.d.ts +83 -0
  59. package/build/src/toolchains.d.ts.map +1 -0
  60. package/build/src/toolchains.js +413 -0
  61. package/docs/architecture.md +7 -3
  62. package/docs/language-support.md +25 -4
  63. package/docs/parser-qualification.md +70 -0
  64. package/docs/source-maps.md +31 -4
  65. package/docs/testing.md +21 -2
  66. package/index.js +109 -4
  67. package/package.json +4 -2
  68. package/src/acceptance.js +359 -0
  69. package/src/array.js +19 -0
  70. package/src/artifact-path.js +34 -0
  71. package/src/artifacts.js +420 -0
  72. package/src/backends/identifiers.js +9 -1
  73. package/src/backends/index.js +16 -32
  74. package/src/backends/python.js +175 -0
  75. package/src/backends/scalars.js +1 -0
  76. package/src/backends/shared.js +8 -5
  77. package/src/binary-mapping.js +305 -0
  78. package/src/diagnostic.js +34 -2
  79. package/src/frontends/index.js +5 -20
  80. package/src/frontends/python.js +689 -0
  81. package/src/frontends/scalars.js +5 -0
  82. package/src/language-registry.js +403 -0
  83. package/src/mapping.js +2 -1
  84. package/src/semantic/location.js +10 -0
  85. package/src/semantic/provenance.js +2 -2
  86. package/src/semantic/types.js +124 -1
  87. package/src/subprocess.js +203 -0
  88. package/src/timeout.js +12 -0
  89. package/src/toolchains.js +444 -0
  90. package/tsconfig.json +1 -0
@@ -0,0 +1,339 @@
1
+ // @ts-check
2
+ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { isDenseArray } from "./array.js";
6
+ import { createGeneratedArtifactSet } from "./artifacts.js";
7
+ import { SemantifoldDiagnostic } from "./diagnostic.js";
8
+ import { exceededOwnedDeadline, executeFileWithDeadline } from "./subprocess.js";
9
+ import { isSupportedTimeoutMs, maximumTimeoutMs } from "./timeout.js";
10
+ import { deterministicEnvironment } from "./toolchains.js";
11
+ const acceptanceMaxBuffer = 16 * 1024 * 1024;
12
+ const launchErrorCodes = new Set([
13
+ "E2BIG", "EACCES", "EAGAIN", "ELOOP", "EMFILE", "ENAMETOOLONG", "ENFILE", "ENOENT", "ENOEXEC", "ENOMEM", "ENOTDIR", "ENOTSUP", "EPERM", "ETXTBSY"
14
+ ]);
15
+ const orderedStages = Object.freeze(["parse", "generate", "compile", "link", "validate", "instantiate", "execute"]);
16
+ const stageIndexes = new Map(orderedStages.map((stage, index) => [stage, index]));
17
+ /**
18
+ * Materializes one artifact set and runs ordered acceptance stages without a shell.
19
+ * @param {object} input - Acceptance request.
20
+ * @param {import("./semantic/types.js").GeneratedArtifactSet} input.artifacts - Complete input artifacts.
21
+ * @param {Readonly<Record<string, string | undefined>>} [input.environment] - Explicit process environment.
22
+ * @param {{arguments: string[], stage: import("./semantic/types.js").AcceptanceStage, tool: import("./semantic/types.js").DiscoveredToolchain}[]} input.stages - Ordered stages.
23
+ * @param {string} input.target - Target identity.
24
+ * @param {number} [input.timeoutMs] - Per-stage timeout.
25
+ * @returns {Promise<import("./semantic/types.js").AcceptanceResult>} Captured results after cleanup.
26
+ */
27
+ export async function runAcceptanceStages(input) {
28
+ if (!isPlainObject(input))
29
+ invalidRunner("Acceptance requires a request object.", "acceptance");
30
+ const artifacts = /** @type {import("./semantic/types.js").GeneratedArtifactSet} */ (input.artifacts);
31
+ const environment = /** @type {Readonly<Record<string, string | undefined>>} */ (input.environment === undefined ? { PATH: process.env.PATH } : input.environment);
32
+ const stages = /** @type {{arguments: string[], stage: import("./semantic/types.js").AcceptanceStage, tool: import("./semantic/types.js").DiscoveredToolchain}[]} */ (input.stages);
33
+ const target = /** @type {string} */ (input.target);
34
+ const timeoutMs = /** @type {number} */ (input.timeoutMs === undefined ? 10_000 : input.timeoutMs);
35
+ const request = validateRequest({ artifacts, environment, stages, target, timeoutMs });
36
+ const directory = await createAcceptanceDirectory(request.target);
37
+ /** @type {unknown} */
38
+ let primaryFailure;
39
+ /** @type {import("./semantic/types.js").AcceptanceResult | undefined} */
40
+ let result;
41
+ let primaryFailed = false;
42
+ try {
43
+ await materializeArtifacts(request.artifacts, directory, request.target);
44
+ /** @type {import("./semantic/types.js").AcceptanceStageResult[]} */
45
+ const results = [];
46
+ for (const stage of request.stages) {
47
+ try {
48
+ const result = await executeFileWithDeadline({
49
+ arguments: stage.arguments,
50
+ cwd: directory,
51
+ environment: request.environment,
52
+ executable: stage.tool.executable,
53
+ maxBuffer: acceptanceMaxBuffer,
54
+ timeoutMs: request.timeoutMs
55
+ });
56
+ results.push(Object.freeze({
57
+ arguments: Object.freeze([...stage.arguments]),
58
+ executable: stage.tool.executable,
59
+ stage: stage.stage,
60
+ stderr: result.stderr,
61
+ stdout: result.stdout,
62
+ version: stage.tool.version
63
+ }));
64
+ }
65
+ catch (error) {
66
+ throw processDiagnostic(error, stage, request.target, request.timeoutMs);
67
+ }
68
+ }
69
+ result = Object.freeze({ directory, stages: Object.freeze(results), target: request.target });
70
+ }
71
+ catch (error) {
72
+ primaryFailed = true;
73
+ primaryFailure = error;
74
+ }
75
+ /** @type {unknown} */
76
+ let cleanupFailure;
77
+ let cleanupFailed = false;
78
+ try {
79
+ await removeAcceptanceDirectory(directory, request.target);
80
+ }
81
+ catch (error) {
82
+ cleanupFailed = true;
83
+ cleanupFailure = error;
84
+ }
85
+ if (primaryFailed && cleanupFailed && primaryFailure instanceof Error) {
86
+ throw preservePrimaryFailure(primaryFailure, cleanupFailure, request.target);
87
+ }
88
+ if (primaryFailed)
89
+ throw primaryFailure;
90
+ if (cleanupFailed)
91
+ throw cleanupFailure;
92
+ return /** @type {import("./semantic/types.js").AcceptanceResult} */ (result);
93
+ }
94
+ /**
95
+ * Validates and detaches a staged acceptance request before filesystem mutation.
96
+ * @param {{
97
+ * artifacts: import("./semantic/types.js").GeneratedArtifactSet,
98
+ * environment: Readonly<Record<string, string | undefined>>,
99
+ * stages: {arguments: string[], stage: import("./semantic/types.js").AcceptanceStage, tool: import("./semantic/types.js").DiscoveredToolchain}[],
100
+ * target: string,
101
+ * timeoutMs: number
102
+ * }} input - Candidate request.
103
+ * @returns {{
104
+ * artifacts: import("./semantic/types.js").GeneratedArtifactSet,
105
+ * environment: Readonly<Record<string, string>>,
106
+ * stages: {arguments: string[], stage: import("./semantic/types.js").AcceptanceStage, tool: Readonly<{executable: string, version: string}>}[],
107
+ * target: string,
108
+ * timeoutMs: number
109
+ * }} Validated request.
110
+ */
111
+ function validateRequest(input) {
112
+ try {
113
+ if (typeof input.target != "string" || input.target.length == 0 || !isSupportedTimeoutMs(input.timeoutMs) ||
114
+ !isDenseArray(input.stages) || input.stages.length == 0) {
115
+ invalidRunner(`Acceptance requires a target, timeout from 1 through ${maximumTimeoutMs}ms, and non-empty ordered stages.`, input.target);
116
+ }
117
+ const artifacts = createGeneratedArtifactSet(input.artifacts);
118
+ if (artifacts.target != input.target)
119
+ invalidRunner("Acceptance target must match the generated artifact-set target.", input.target);
120
+ const environment = deterministicEnvironment(input.environment);
121
+ let previousIndex = -1;
122
+ const seen = new Set();
123
+ /** @type {{arguments: string[], stage: import("./semantic/types.js").AcceptanceStage, tool: Readonly<{executable: string, version: string}>}[]} */
124
+ const stages = [];
125
+ for (let stagePosition = 0; stagePosition < input.stages.length; stagePosition += 1) {
126
+ const stage = input.stages[stagePosition];
127
+ if (!isPlainObject(stage))
128
+ invalidRunner("Acceptance stages must be distinct known stage records.", input.target);
129
+ const stageName = stage.stage;
130
+ if (typeof stageName != "string" || !stageIndexes.has(stageName) || seen.has(stageName)) {
131
+ invalidRunner("Acceptance stages must be distinct known stage records.", input.target);
132
+ }
133
+ const index = /** @type {number} */ (stageIndexes.get(stageName));
134
+ if (index < previousIndex)
135
+ invalidRunner("Acceptance stages must follow parse-to-execute order.", input.target);
136
+ previousIndex = index;
137
+ seen.add(stageName);
138
+ const argumentCandidate = stage.arguments;
139
+ const stageArguments = isDenseArray(argumentCandidate) ? [...argumentCandidate] : undefined;
140
+ const toolCandidate = stage.tool;
141
+ const tool = isPlainObject(toolCandidate) ? Object.freeze({
142
+ executable: toolCandidate.executable,
143
+ id: toolCandidate.id,
144
+ source: toolCandidate.source,
145
+ version: toolCandidate.version
146
+ }) : undefined;
147
+ if (stageArguments == undefined || !stageArguments.every((argument) => typeof argument == "string" && !argument.includes("\0")) ||
148
+ !isTool(tool))
149
+ invalidRunner(`Acceptance stage '${stageName}' has an invalid tool or argument array.`, input.target);
150
+ stages.push(Object.freeze({ arguments: stageArguments, stage: stageName, tool }));
151
+ }
152
+ return { artifacts, environment, stages, target: input.target, timeoutMs: input.timeoutMs };
153
+ }
154
+ catch (error) {
155
+ if (error instanceof SemantifoldDiagnostic && error.code == "INVALID_ACCEPTANCE_RUNNER")
156
+ throw error;
157
+ if (error instanceof SemantifoldDiagnostic) {
158
+ throw new SemantifoldDiagnostic({
159
+ cause: error,
160
+ code: "INVALID_ACCEPTANCE_RUNNER",
161
+ language: typeof input.target == "string" ? input.target : "acceptance",
162
+ message: `Acceptance runner input is invalid: ${error.detail}`
163
+ });
164
+ }
165
+ return invalidRunner("Acceptance runner input is invalid.", typeof input.target == "string" ? input.target : "acceptance", error);
166
+ }
167
+ }
168
+ /**
169
+ * Normalizes a subprocess failure with exact stage and toolchain context.
170
+ * @param {unknown} error - Subprocess rejection.
171
+ * @param {{arguments: string[], stage: string, tool: Readonly<{executable: string, version: string}>}} stage - Failed stage.
172
+ * @param {string} target - Acceptance target.
173
+ * @param {number} timeoutMs - Configured stage timeout.
174
+ * @returns {SemantifoldDiagnostic} Normalized failure.
175
+ */
176
+ function processDiagnostic(error, stage, target, timeoutMs) {
177
+ const fields = processErrorFields(error);
178
+ const outputLimited = fields.nativeCode == "ERR_CHILD_PROCESS_STDIO_MAXBUFFER";
179
+ const timedOut = !outputLimited && exceededOwnedDeadline(error);
180
+ const launchFailure = fields.nativeCode != undefined && launchErrorCodes.has(fields.nativeCode);
181
+ const signaled = !outputLimited && !timedOut && fields.signal != undefined;
182
+ const code = outputLimited ? "ACCEPTANCE_OUTPUT_LIMIT" : timedOut ? "ACCEPTANCE_TIMEOUT" : launchFailure ? "ACCEPTANCE_LAUNCH_FAILURE" : signaled
183
+ ? "ACCEPTANCE_SIGNAL"
184
+ : "ACCEPTANCE_NONZERO_EXIT";
185
+ const reason = outputLimited ? `exceeded the ${acceptanceMaxBuffer}-byte output capture limit (${fields.nativeCode})` : timedOut
186
+ ? `timed out after ${timeoutMs}ms` : launchFailure
187
+ ? `could not launch (${fields.nativeCode})`
188
+ : signaled ? `terminated by signal ${fields.signal}`
189
+ : fields.exitCode != undefined ? `exited nonzero (${fields.exitCode})`
190
+ : `failed after launch (${fields.nativeCode ?? "unknown"})`;
191
+ return new SemantifoldDiagnostic({
192
+ cause: outputLimited ? undefined : error instanceof Error ? error : undefined,
193
+ code,
194
+ executable: stage.tool.executable,
195
+ exitCode: fields.exitCode,
196
+ language: target,
197
+ message: `Acceptance stage '${stage.stage}' ${reason} using '${stage.tool.executable}' (${stage.tool.version}).`,
198
+ signal: fields.signal,
199
+ stage: stage.stage,
200
+ stderr: fields.stderr,
201
+ stdout: fields.stdout,
202
+ version: stage.tool.version
203
+ });
204
+ }
205
+ /**
206
+ * Narrows the stable fields of an opaque child-process failure.
207
+ * @param {unknown} error - Process rejection.
208
+ * @returns {{exitCode: number | undefined, nativeCode: string | undefined, signal: string | undefined, stderr: string, stdout: string}} Stable fields.
209
+ */
210
+ function processErrorFields(error) {
211
+ if (!error || typeof error != "object")
212
+ return { exitCode: undefined, nativeCode: undefined, signal: undefined, stderr: "", stdout: "" };
213
+ const value = /** @type {Record<string, unknown>} */ (error);
214
+ const nativeCode = typeof value.code == "string" ? value.code : undefined;
215
+ const outputLimited = nativeCode == "ERR_CHILD_PROCESS_STDIO_MAXBUFFER";
216
+ return {
217
+ exitCode: typeof value.code == "number" ? value.code : undefined,
218
+ nativeCode,
219
+ signal: typeof value.signal == "string" ? value.signal : undefined,
220
+ stderr: !outputLimited && typeof value.stderr == "string" ? value.stderr : "",
221
+ stdout: !outputLimited && typeof value.stdout == "string" ? value.stdout : ""
222
+ };
223
+ }
224
+ /**
225
+ * Checks the discovered-tool fields consumed by the runner.
226
+ * @param {unknown} value - Candidate tool.
227
+ * @returns {value is import("./semantic/types.js").DiscoveredToolchain} Whether the tool contract is present.
228
+ */
229
+ function isTool(value) {
230
+ return isPlainObject(value) && typeof value.id == "string" && typeof value.executable == "string" && path.isAbsolute(value.executable) &&
231
+ !value.executable.includes("\0") && typeof value.version == "string" && value.version.length > 0 &&
232
+ (value.source == "canonical" || value.source == "override");
233
+ }
234
+ /**
235
+ * Keeps the primary acceptance error while recording bounded cleanup evidence in its cause chain.
236
+ * @param {Error} primaryFailure - Original materialization or stage failure.
237
+ * @param {unknown} cleanupFailure - Cleanup rejection.
238
+ * @param {string} target - Acceptance target.
239
+ * @returns {Error} The original primary error with structured cleanup evidence.
240
+ */
241
+ function preservePrimaryFailure(primaryFailure, cleanupFailure, target) {
242
+ const cleanupEvidence = new SemantifoldDiagnostic({
243
+ code: "ACCEPTANCE_CLEANUP_FAILURE",
244
+ language: cleanupFailure instanceof SemantifoldDiagnostic ? cleanupFailure.language : target,
245
+ message: "Isolated acceptance-directory cleanup failed after the primary acceptance failure."
246
+ });
247
+ const causes = primaryFailure.cause instanceof Error ? [primaryFailure.cause, cleanupEvidence] : [cleanupEvidence];
248
+ Object.defineProperty(primaryFailure, "cause", {
249
+ configurable: true,
250
+ value: new AggregateError(causes, "Acceptance failed and isolated-directory cleanup also failed."),
251
+ writable: true
252
+ });
253
+ return primaryFailure;
254
+ }
255
+ /**
256
+ * Throws a normalized runner-configuration diagnostic.
257
+ * @param {string} message - Failure detail.
258
+ * @param {unknown} target - Candidate target identity.
259
+ * @param {unknown} [error] - Preserved cause.
260
+ * @returns {never} Always throws.
261
+ */
262
+ function invalidRunner(message, target, error) {
263
+ throw new SemantifoldDiagnostic({
264
+ cause: error instanceof Error ? error : undefined,
265
+ code: "INVALID_ACCEPTANCE_RUNNER",
266
+ language: typeof target == "string" && target.length > 0 ? target : "acceptance",
267
+ message
268
+ });
269
+ }
270
+ /**
271
+ * Checks for an ordinary string-keyed object.
272
+ * @param {unknown} value - Candidate value.
273
+ * @returns {value is Record<string, unknown>} Whether the value is a plain object.
274
+ */
275
+ function isPlainObject(value) {
276
+ return typeof value == "object" && value != null && !Array.isArray(value) && Object.getPrototypeOf(value) == Object.prototype;
277
+ }
278
+ /**
279
+ * Removes the isolated acceptance directory with a normalized failure.
280
+ * @param {string} directory - Exact temporary directory.
281
+ * @param {string} target - Acceptance target.
282
+ * @returns {Promise<void>} Cleanup completion.
283
+ */
284
+ async function removeAcceptanceDirectory(directory, target) {
285
+ try {
286
+ await rm(directory, { force: true, recursive: true });
287
+ }
288
+ catch (error) {
289
+ throw new SemantifoldDiagnostic({
290
+ cause: error instanceof Error ? error : undefined,
291
+ code: "ACCEPTANCE_CLEANUP_FAILURE",
292
+ language: target,
293
+ message: `Failed to remove isolated acceptance directory '${directory}'.`
294
+ });
295
+ }
296
+ }
297
+ /**
298
+ * Creates one isolated acceptance directory with a normalized setup failure.
299
+ * @param {string} target - Acceptance target.
300
+ * @returns {Promise<string>} Exact temporary directory.
301
+ */
302
+ async function createAcceptanceDirectory(target) {
303
+ try {
304
+ return await mkdtemp(path.join(os.tmpdir(), "semantifold-acceptance-"));
305
+ }
306
+ catch (error) {
307
+ throw new SemantifoldDiagnostic({
308
+ cause: error instanceof Error ? error : undefined,
309
+ code: "ACCEPTANCE_SETUP_FAILURE",
310
+ language: target,
311
+ message: "Failed to create an isolated acceptance directory."
312
+ });
313
+ }
314
+ }
315
+ /**
316
+ * Writes only the already-validated generated artifacts into the isolated directory.
317
+ * @param {import("./semantic/types.js").GeneratedArtifactSet} artifacts - Complete validated set.
318
+ * @param {string} directory - Exact temporary directory.
319
+ * @param {string} target - Acceptance target.
320
+ * @returns {Promise<void>} Materialization completion.
321
+ */
322
+ async function materializeArtifacts(artifacts, directory, target) {
323
+ for (const artifact of artifacts.artifacts) {
324
+ const filename = path.join(directory, ...artifact.path.split("/"));
325
+ try {
326
+ await mkdir(path.dirname(filename), { recursive: true });
327
+ await writeFile(filename, artifact.content);
328
+ }
329
+ catch (error) {
330
+ throw new SemantifoldDiagnostic({
331
+ cause: error instanceof Error ? error : undefined,
332
+ code: "ACCEPTANCE_MATERIALIZATION_FAILURE",
333
+ language: target,
334
+ message: `Failed to materialize generated artifact '${artifact.path}'.`
335
+ });
336
+ }
337
+ }
338
+ }
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXB0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY2NlcHRhbmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDOUQsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQ3ZDLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3pELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQzlFLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUNuRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUV4RCxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBO0FBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVM7Q0FDbEosQ0FBQyxDQUFBO0FBQ0YsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFNB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SUFBSSxJQUFJO2FBQ3hFLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge21rZGlyLCBta2R0ZW1wLCBybSwgd3JpdGVGaWxlfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgb3MgZnJvbSBcIm5vZGU6b3NcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIlxuaW1wb3J0IHtjcmVhdGVHZW5lcmF0ZWRBcnRpZmFjdFNldH0gZnJvbSBcIi4vYXJ0aWZhY3RzLmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7ZXhjZWVkZWRPd25lZERlYWRsaW5lLCBleGVjdXRlRmlsZVdpdGhEZWFkbGluZX0gZnJvbSBcIi4vc3VicHJvY2Vzcy5qc1wiXG5pbXBvcnQge2lzU3VwcG9ydGVkVGltZW91dE1zLCBtYXhpbXVtVGltZW91dE1zfSBmcm9tIFwiLi90aW1lb3V0LmpzXCJcbmltcG9ydCB7ZGV0ZXJtaW5pc3RpY0Vudmlyb25tZW50fSBmcm9tIFwiLi90b29sY2hhaW5zLmpzXCJcblxuY29uc3QgYWNjZXB0YW5jZU1heEJ1ZmZlciA9IDE2ICogMTAyNCAqIDEwMjRcbmNvbnN0IGxhdW5jaEVycm9yQ29kZXMgPSBuZXcgU2V0KFtcbiAgXCJFMkJJR1wiLCBcIkVBQ0NFU1wiLCBcIkVBR0FJTlwiLCBcIkVMT09QXCIsIFwiRU1GSUxFXCIsIFwiRU5BTUVUT09MT05HXCIsIFwiRU5GSUxFXCIsIFwiRU5PRU5UXCIsIFwiRU5PRVhFQ1wiLCBcIkVOT01FTVwiLCBcIkVOT1RESVJcIiwgXCJFTk9UU1VQXCIsIFwiRVBFUk1cIiwgXCJFVFhUQlNZXCJcbl0pXG5jb25zdCBvcmRlcmVkU3RhZ2VzID0gT2JqZWN0LmZyZWV6ZShbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImxpbmtcIiwgXCJ2YWxpZGF0ZVwiLCBcImluc3RhbnRpYXRlXCIsIFwiZXhlY3V0ZVwiXSlcbmNvbnN0IHN0YWdlSW5kZXhlcyA9IG5ldyBNYXAob3JkZXJlZFN0YWdlcy5tYXAoKHN0YWdlLCBpbmRleCkgPT4gW3N0YWdlLCBpbmRleF0pKVxuXG4vKipcbiAqIE1hdGVyaWFsaXplcyBvbmUgYXJ0aWZhY3Qgc2V0IGFuZCBydW5zIG9yZGVyZWQgYWNjZXB0YW5jZSBzdGFnZXMgd2l0aG91dCBhIHNoZWxsLlxuICogQHBhcmFtIHtvYmplY3R9IGlucHV0IC0gQWNjZXB0YW5jZSByZXF1ZXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBpbnB1dC5hcnRpZmFjdHMgLSBDb21wbGV0ZSBpbnB1dCBhcnRpZmFjdHMuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSBbaW5wdXQuZW52aXJvbm1lbnRdIC0gRXhwbGljaXQgcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7e2FyZ3VtZW50czogc3RyaW5nW10sIHN0YWdlOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZSwgdG9vbDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWlufVtdfSBpbnB1dC5zdGFnZXMgLSBPcmRlcmVkIHN0YWdlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dC50YXJnZXQgLSBUYXJnZXQgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge251bWJlcn0gW2lucHV0LnRpbWVvdXRNc10gLSBQZXItc3RhZ2UgdGltZW91dC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVJlc3VsdD59IENhcHR1cmVkIHJlc3VsdHMgYWZ0ZXIgY2xlYW51cC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkFjY2VwdGFuY2VTdGFnZXMoaW5wdXQpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0KSkgaW52YWxpZFJ1bm5lcihcIkFjY2VwdGFuY2UgcmVxdWlyZXMgYSByZXF1ZXN0IG9iamVjdC5cIiwgXCJhY2NlcHRhbmNlXCIpXG4gIGNvbnN0IGFydGlmYWN0cyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRBcnRpZmFjdFNldH0gKi8gKGlucHV0LmFydGlmYWN0cylcbiAgY29uc3QgZW52aXJvbm1lbnQgPSAvKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+fSAqLyAoXG4gICAgaW5wdXQuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZCA/IHtQQVRIOiBwcm9jZXNzLmVudi5QQVRIfSA6IGlucHV0LmVudmlyb25tZW50KVxuICBjb25zdCBzdGFnZXMgPSAvKiogQHR5cGUge3thcmd1bWVudHM6IHN0cmluZ1tdLCBzdGFnZTogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2UsIHRvb2w6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRGlzY292ZXJlZFRvb2xjaGFpbn1bXX0gKi8gKGlucHV0LnN0YWdlcylcbiAgY29uc3QgdGFyZ2V0ID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChpbnB1dC50YXJnZXQpXG4gIGNvbnN0IHRpbWVvdXRNcyA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoaW5wdXQudGltZW91dE1zID09PSB1bmRlZmluZWQgPyAxMF8wMDAgOiBpbnB1dC50aW1lb3V0TXMpXG4gIGNvbnN0IHJlcXVlc3QgPSB2YWxpZGF0ZVJlcXVlc3Qoe2FydGlmYWN0cywgZW52aXJvbm1lbnQsIHN0YWdlcywgdGFyZ2V0LCB0aW1lb3V0TXN9KVxuICBjb25zdCBkaXJlY3RvcnkgPSBhd2FpdCBjcmVhdGVBY2NlcHRhbmNlRGlyZWN0b3J5KHJlcXVlc3QudGFyZ2V0KVxuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGxldCBwcmltYXJ5RmFpbHVyZVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVJlc3VsdCB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IHJlc3VsdFxuICBsZXQgcHJpbWFyeUZhaWxlZCA9IGZhbHNlXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBtYXRlcmlhbGl6ZUFydGlmYWN0cyhyZXF1ZXN0LmFydGlmYWN0cywgZGlyZWN0b3J5LCByZXF1ZXN0LnRhcmdldClcblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2VSZXN1bHRbXX0gKi9cbiAgICBjb25zdCByZXN1bHRzID0gW11cblxuICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2YgcmVxdWVzdC5zdGFnZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVGaWxlV2l0aERlYWRsaW5lKHtcbiAgICAgICAgICBhcmd1bWVudHM6IHN0YWdlLmFyZ3VtZW50cyxcbiAgICAgICAgICBjd2Q6IGRpcmVjdG9yeSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogcmVxdWVzdC5lbnZpcm9ubWVudCxcbiAgICAgICAgICBleGVjdXRhYmxlOiBzdGFnZS50b29sLmV4ZWN1dGFibGUsXG4gICAgICAgICAgbWF4QnVmZmVyOiBhY2NlcHRhbmNlTWF4QnVmZmVyLFxuICAgICAgICAgIHRpbWVvdXRNczogcmVxdWVzdC50aW1lb3V0TXNcbiAgICAgICAgfSlcblxuICAgICAgICByZXN1bHRzLnB1c2goT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgYXJndW1lbnRzOiBPYmplY3QuZnJlZXplKFsuLi5zdGFnZS5hcmd1bWVudHNdKSxcbiAgICAgICAgICBleGVjdXRhYmxlOiBzdGFnZS50b29sLmV4ZWN1dGFibGUsXG4gICAgICAgICAgc3RhZ2U6IHN0YWdlLnN0YWdlLFxuICAgICAgICAgIHN0ZGVycjogcmVzdWx0LnN0ZGVycixcbiAgICAgICAgICBzdGRvdXQ6IHJlc3VsdC5zdGRvdXQsXG4gICAgICAgICAgdmVyc2lvbjogc3RhZ2UudG9vbC52ZXJzaW9uXG4gICAgICAgIH0pKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgcHJvY2Vzc0RpYWdub3N0aWMoZXJyb3IsIHN0YWdlLCByZXF1ZXN0LnRhcmdldCwgcmVxdWVzdC50aW1lb3V0TXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzdWx0ID0gT2JqZWN0LmZyZWV6ZSh7ZGlyZWN0b3J5LCBzdGFnZXM6IE9iamVjdC5mcmVlemUocmVzdWx0cyksIHRhcmdldDogcmVxdWVzdC50YXJnZXR9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW1hcnlGYWlsZWQgPSB0cnVlXG4gICAgcHJpbWFyeUZhaWx1cmUgPSBlcnJvclxuICB9XG5cbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBsZXQgY2xlYW51cEZhaWx1cmVcbiAgbGV0IGNsZWFudXBGYWlsZWQgPSBmYWxzZVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcmVtb3ZlQWNjZXB0YW5jZURpcmVjdG9yeShkaXJlY3RvcnksIHJlcXVlc3QudGFyZ2V0KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNsZWFudXBGYWlsZWQgPSB0cnVlXG4gICAgY2xlYW51cEZhaWx1cmUgPSBlcnJvclxuICB9XG5cbiAgaWYgKHByaW1hcnlGYWlsZWQgJiYgY2xlYW51cEZhaWxlZCAmJiBwcmltYXJ5RmFpbHVyZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgcHJlc2VydmVQcmltYXJ5RmFpbHVyZShwcmltYXJ5RmFpbHVyZSwgY2xlYW51cEZhaWx1cmUsIHJlcXVlc3QudGFyZ2V0KVxuICB9XG4gIGlmIChwcmltYXJ5RmFpbGVkKSB0aHJvdyBwcmltYXJ5RmFpbHVyZVxuICBpZiAoY2xlYW51cEZhaWxlZCkgdGhyb3cgY2xlYW51cEZhaWx1cmVcblxuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VSZXN1bHR9ICovIChyZXN1bHQpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFuZCBkZXRhY2hlcyBhIHN0YWdlZCBhY2NlcHRhbmNlIHJlcXVlc3QgYmVmb3JlIGZpbGVzeXN0ZW0gbXV0YXRpb24uXG4gKiBAcGFyYW0ge3tcbiAqICAgYXJ0aWZhY3RzOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0LFxuICogICBlbnZpcm9ubWVudDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4sXG4gKiAgIHN0YWdlczoge2FyZ3VtZW50czogc3RyaW5nW10sIHN0YWdlOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZSwgdG9vbDogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWlufVtdLFxuICogICB0YXJnZXQ6IHN0cmluZyxcbiAqICAgdGltZW91dE1zOiBudW1iZXJcbiAqIH19IGlucHV0IC0gQ2FuZGlkYXRlIHJlcXVlc3QuXG4gKiBAcmV0dXJucyB7e1xuICogICBhcnRpZmFjdHM6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkQXJ0aWZhY3RTZXQsXG4gKiAgIGVudmlyb25tZW50OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAqICAgc3RhZ2VzOiB7YXJndW1lbnRzOiBzdHJpbmdbXSwgc3RhZ2U6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVN0YWdlLCB0b29sOiBSZWFkb25seTx7ZXhlY3V0YWJsZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9Pn1bXSxcbiAqICAgdGFyZ2V0OiBzdHJpbmcsXG4gKiAgIHRpbWVvdXRNczogbnVtYmVyXG4gKiB9fSBWYWxpZGF0ZWQgcmVxdWVzdC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZXF1ZXN0KGlucHV0KSB7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dC50YXJnZXQgIT0gXCJzdHJpbmdcIiB8fCBpbnB1dC50YXJnZXQubGVuZ3RoID09IDAgfHwgIWlzU3VwcG9ydGVkVGltZW91dE1zKGlucHV0LnRpbWVvdXRNcykgfHxcbiAgICAgICFpc0RlbnNlQXJyYXkoaW5wdXQuc3RhZ2VzKSB8fCBpbnB1dC5zdGFnZXMubGVuZ3RoID09IDApIHtcbiAgICAgIGludmFsaWRSdW5uZXIoYEFjY2VwdGFuY2UgcmVxdWlyZXMgYSB0YXJnZXQsIHRpbWVvdXQgZnJvbSAxIHRocm91Z2ggJHttYXhpbXVtVGltZW91dE1zfW1zLCBhbmQgbm9uLWVtcHR5IG9yZGVyZWQgc3RhZ2VzLmAsIGlucHV0LnRhcmdldClcbiAgICB9XG4gICAgY29uc3QgYXJ0aWZhY3RzID0gY3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXQoaW5wdXQuYXJ0aWZhY3RzKVxuXG4gICAgaWYgKGFydGlmYWN0cy50YXJnZXQgIT0gaW5wdXQudGFyZ2V0KSBpbnZhbGlkUnVubmVyKFwiQWNjZXB0YW5jZSB0YXJnZXQgbXVzdCBtYXRjaCB0aGUgZ2VuZXJhdGVkIGFydGlmYWN0LXNldCB0YXJnZXQuXCIsIGlucHV0LnRhcmdldClcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IGRldGVybWluaXN0aWNFbnZpcm9ubWVudChpbnB1dC5lbnZpcm9ubWVudClcbiAgICBsZXQgcHJldmlvdXNJbmRleCA9IC0xXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIC8qKiBAdHlwZSB7e2FyZ3VtZW50czogc3RyaW5nW10sIHN0YWdlOiBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZSwgdG9vbDogUmVhZG9ubHk8e2V4ZWN1dGFibGU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT59W119ICovXG4gICAgY29uc3Qgc3RhZ2VzID0gW11cblxuICAgIGZvciAobGV0IHN0YWdlUG9zaXRpb24gPSAwOyBzdGFnZVBvc2l0aW9uIDwgaW5wdXQuc3RhZ2VzLmxlbmd0aDsgc3RhZ2VQb3NpdGlvbiArPSAxKSB7XG4gICAgICBjb25zdCBzdGFnZSA9IGlucHV0LnN0YWdlc1tzdGFnZVBvc2l0aW9uXVxuXG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3Qoc3RhZ2UpKSBpbnZhbGlkUnVubmVyKFwiQWNjZXB0YW5jZSBzdGFnZXMgbXVzdCBiZSBkaXN0aW5jdCBrbm93biBzdGFnZSByZWNvcmRzLlwiLCBpbnB1dC50YXJnZXQpXG4gICAgICBjb25zdCBzdGFnZU5hbWUgPSBzdGFnZS5zdGFnZVxuXG4gICAgICBpZiAodHlwZW9mIHN0YWdlTmFtZSAhPSBcInN0cmluZ1wiIHx8ICFzdGFnZUluZGV4ZXMuaGFzKHN0YWdlTmFtZSkgfHwgc2Vlbi5oYXMoc3RhZ2VOYW1lKSkge1xuICAgICAgICBpbnZhbGlkUnVubmVyKFwiQWNjZXB0YW5jZSBzdGFnZXMgbXVzdCBiZSBkaXN0aW5jdCBrbm93biBzdGFnZSByZWNvcmRzLlwiLCBpbnB1dC50YXJnZXQpXG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoc3RhZ2VJbmRleGVzLmdldChzdGFnZU5hbWUpKVxuXG4gICAgICBpZiAoaW5kZXggPCBwcmV2aW91c0luZGV4KSBpbnZhbGlkUnVubmVyKFwiQWNjZXB0YW5jZSBzdGFnZXMgbXVzdCBmb2xsb3cgcGFyc2UtdG8tZXhlY3V0ZSBvcmRlci5cIiwgaW5wdXQudGFyZ2V0KVxuICAgICAgcHJldmlvdXNJbmRleCA9IGluZGV4XG4gICAgICBzZWVuLmFkZChzdGFnZU5hbWUpXG4gICAgICBjb25zdCBhcmd1bWVudENhbmRpZGF0ZSA9IHN0YWdlLmFyZ3VtZW50c1xuICAgICAgY29uc3Qgc3RhZ2VBcmd1bWVudHMgPSBpc0RlbnNlQXJyYXkoYXJndW1lbnRDYW5kaWRhdGUpID8gWy4uLmFyZ3VtZW50Q2FuZGlkYXRlXSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgdG9vbENhbmRpZGF0ZSA9IHN0YWdlLnRvb2xcbiAgICAgIGNvbnN0IHRvb2wgPSBpc1BsYWluT2JqZWN0KHRvb2xDYW5kaWRhdGUpID8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGV4ZWN1dGFibGU6IHRvb2xDYW5kaWRhdGUuZXhlY3V0YWJsZSxcbiAgICAgICAgaWQ6IHRvb2xDYW5kaWRhdGUuaWQsXG4gICAgICAgIHNvdXJjZTogdG9vbENhbmRpZGF0ZS5zb3VyY2UsXG4gICAgICAgIHZlcnNpb246IHRvb2xDYW5kaWRhdGUudmVyc2lvblxuICAgICAgfSkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHN0YWdlQXJndW1lbnRzID09IHVuZGVmaW5lZCB8fCAhc3RhZ2VBcmd1bWVudHMuZXZlcnkoKGFyZ3VtZW50KSA9PiB0eXBlb2YgYXJndW1lbnQgPT0gXCJzdHJpbmdcIiAmJiAhYXJndW1lbnQuaW5jbHVkZXMoXCJcXDBcIikpIHx8XG4gICAgICAgICFpc1Rvb2wodG9vbCkpIGludmFsaWRSdW5uZXIoYEFjY2VwdGFuY2Ugc3RhZ2UgJyR7c3RhZ2VOYW1lfScgaGFzIGFuIGludmFsaWQgdG9vbCBvciBhcmd1bWVudCBhcnJheS5gLCBpbnB1dC50YXJnZXQpXG5cbiAgICAgIHN0YWdlcy5wdXNoKE9iamVjdC5mcmVlemUoe2FyZ3VtZW50czogc3RhZ2VBcmd1bWVudHMsIHN0YWdlOiBzdGFnZU5hbWUsIHRvb2x9KSlcbiAgICB9XG5cbiAgICByZXR1cm4ge2FydGlmYWN0cywgZW52aXJvbm1lbnQsIHN0YWdlcywgdGFyZ2V0OiBpbnB1dC50YXJnZXQsIHRpbWVvdXRNczogaW5wdXQudGltZW91dE1zfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlbWFudGlmb2xkRGlhZ25vc3RpYyAmJiBlcnJvci5jb2RlID09IFwiSU5WQUxJRF9BQ0NFUFRBTkNFX1JVTk5FUlwiKSB0aHJvdyBlcnJvclxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlbWFudGlmb2xkRGlhZ25vc3RpYykge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgY29kZTogXCJJTlZBTElEX0FDQ0VQVEFOQ0VfUlVOTkVSXCIsXG4gICAgICAgIGxhbmd1YWdlOiB0eXBlb2YgaW5wdXQudGFyZ2V0ID09IFwic3RyaW5nXCIgPyBpbnB1dC50YXJnZXQgOiBcImFjY2VwdGFuY2VcIixcbiAgICAgICAgbWVzc2FnZTogYEFjY2VwdGFuY2UgcnVubmVyIGlucHV0IGlzIGludmFsaWQ6ICR7ZXJyb3IuZGV0YWlsfWBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGludmFsaWRSdW5uZXIoXCJBY2NlcHRhbmNlIHJ1bm5lciBpbnB1dCBpcyBpbnZhbGlkLlwiLCB0eXBlb2YgaW5wdXQudGFyZ2V0ID09IFwic3RyaW5nXCIgPyBpbnB1dC50YXJnZXQgOiBcImFjY2VwdGFuY2VcIiwgZXJyb3IpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgc3VicHJvY2VzcyBmYWlsdXJlIHdpdGggZXhhY3Qgc3RhZ2UgYW5kIHRvb2xjaGFpbiBjb250ZXh0LlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFN1YnByb2Nlc3MgcmVqZWN0aW9uLlxuICogQHBhcmFtIHt7YXJndW1lbnRzOiBzdHJpbmdbXSwgc3RhZ2U6IHN0cmluZywgdG9vbDogUmVhZG9ubHk8e2V4ZWN1dGFibGU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT59fSBzdGFnZSAtIEZhaWxlZCBzdGFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBY2NlcHRhbmNlIHRhcmdldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0TXMgLSBDb25maWd1cmVkIHN0YWdlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBOb3JtYWxpemVkIGZhaWx1cmUuXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NEaWFnbm9zdGljKGVycm9yLCBzdGFnZSwgdGFyZ2V0LCB0aW1lb3V0TXMpIHtcbiAgY29uc3QgZmllbGRzID0gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKVxuICBjb25zdCBvdXRwdXRMaW1pdGVkID0gZmllbGRzLm5hdGl2ZUNvZGUgPT0gXCJFUlJfQ0hJTERfUFJPQ0VTU19TVERJT19NQVhCVUZGRVJcIlxuICBjb25zdCB0aW1lZE91dCA9ICFvdXRwdXRMaW1pdGVkICYmIGV4Y2VlZGVkT3duZWREZWFkbGluZShlcnJvcilcbiAgY29uc3QgbGF1bmNoRmFpbHVyZSA9IGZpZWxkcy5uYXRpdmVDb2RlICE9IHVuZGVmaW5lZCAmJiBsYXVuY2hFcnJvckNvZGVzLmhhcyhmaWVsZHMubmF0aXZlQ29kZSlcbiAgY29uc3Qgc2lnbmFsZWQgPSAhb3V0cHV0TGltaXRlZCAmJiAhdGltZWRPdXQgJiYgZmllbGRzLnNpZ25hbCAhPSB1bmRlZmluZWRcbiAgY29uc3QgY29kZSA9IG91dHB1dExpbWl0ZWQgPyBcIkFDQ0VQVEFOQ0VfT1VUUFVUX0xJTUlUXCIgOiB0aW1lZE91dCA/IFwiQUNDRVBUQU5DRV9USU1FT1VUXCIgOiBsYXVuY2hGYWlsdXJlID8gXCJBQ0NFUFRBTkNFX0xBVU5DSF9GQUlMVVJFXCIgOiBzaWduYWxlZFxuICAgID8gXCJBQ0NFUFRBTkNFX1NJR05BTFwiXG4gICAgOiBcIkFDQ0VQVEFOQ0VfTk9OWkVST19FWElUXCJcbiAgY29uc3QgcmVhc29uID0gb3V0cHV0TGltaXRlZCA/IGBleGNlZWRlZCB0aGUgJHthY2NlcHRhbmNlTWF4QnVmZmVyfS1ieXRlIG91dHB1dCBjYXB0dXJlIGxpbWl0ICgke2ZpZWxkcy5uYXRpdmVDb2RlfSlgIDogdGltZWRPdXRcbiAgICA/IGB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgIDogbGF1bmNoRmFpbHVyZVxuICAgID8gYGNvdWxkIG5vdCBsYXVuY2ggKCR7ZmllbGRzLm5hdGl2ZUNvZGV9KWBcbiAgICA6IHNpZ25hbGVkID8gYHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7ZmllbGRzLnNpZ25hbH1gXG4gICAgOiBmaWVsZHMuZXhpdENvZGUgIT0gdW5kZWZpbmVkID8gYGV4aXRlZCBub256ZXJvICgke2ZpZWxkcy5leGl0Q29kZX0pYFxuICAgIDogYGZhaWxlZCBhZnRlciBsYXVuY2ggKCR7ZmllbGRzLm5hdGl2ZUNvZGUgPz8gXCJ1bmtub3duXCJ9KWBcblxuICByZXR1cm4gbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY2F1c2U6IG91dHB1dExpbWl0ZWQgPyB1bmRlZmluZWQgOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgY29kZSxcbiAgICBleGVjdXRhYmxlOiBzdGFnZS50b29sLmV4ZWN1dGFibGUsXG4gICAgZXhpdENvZGU6IGZpZWxkcy5leGl0Q29kZSxcbiAgICBsYW5ndWFnZTogdGFyZ2V0LFxuICAgIG1lc3NhZ2U6IGBBY2NlcHRhbmNlIHN0YWdlICcke3N0YWdlLnN0YWdlfScgJHtyZWFzb259IHVzaW5nICcke3N0YWdlLnRvb2wuZXhlY3V0YWJsZX0nICgke3N0YWdlLnRvb2wudmVyc2lvbn0pLmAsXG4gICAgc2lnbmFsOiBmaWVsZHMuc2lnbmFsLFxuICAgIHN0YWdlOiBzdGFnZS5zdGFnZSxcbiAgICBzdGRlcnI6IGZpZWxkcy5zdGRlcnIsXG4gICAgc3Rkb3V0OiBmaWVsZHMuc3Rkb3V0LFxuICAgIHZlcnNpb246IHN0YWdlLnRvb2wudmVyc2lvblxuICB9KVxufVxuXG4vKipcbiAqIE5hcnJvd3MgdGhlIHN0YWJsZSBmaWVsZHMgb2YgYW4gb3BhcXVlIGNoaWxkLXByb2Nlc3MgZmFpbHVyZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBQcm9jZXNzIHJlamVjdGlvbi5cbiAqIEByZXR1cm5zIHt7ZXhpdENvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgbmF0aXZlQ29kZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzaWduYWw6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RkZXJyOiBzdHJpbmcsIHN0ZG91dDogc3RyaW5nfX0gU3RhYmxlIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Vycm9yRmllbGRzKGVycm9yKSB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9IFwib2JqZWN0XCIpIHJldHVybiB7ZXhpdENvZGU6IHVuZGVmaW5lZCwgbmF0aXZlQ29kZTogdW5kZWZpbmVkLCBzaWduYWw6IHVuZGVmaW5lZCwgc3RkZXJyOiBcIlwiLCBzdGRvdXQ6IFwiXCJ9XG4gIGNvbnN0IHZhbHVlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGVycm9yKVxuICBjb25zdCBuYXRpdmVDb2RlID0gdHlwZW9mIHZhbHVlLmNvZGUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLmNvZGUgOiB1bmRlZmluZWRcbiAgY29uc3Qgb3V0cHV0TGltaXRlZCA9IG5hdGl2ZUNvZGUgPT0gXCJFUlJfQ0hJTERfUFJPQ0VTU19TVERJT19NQVhCVUZGRVJcIlxuXG4gIHJldHVybiB7XG4gICAgZXhpdENvZGU6IHR5cGVvZiB2YWx1ZS5jb2RlID09IFwibnVtYmVyXCIgPyB2YWx1ZS5jb2RlIDogdW5kZWZpbmVkLFxuICAgIG5hdGl2ZUNvZGUsXG4gICAgc2lnbmFsOiB0eXBlb2YgdmFsdWUuc2lnbmFsID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zaWduYWwgOiB1bmRlZmluZWQsXG4gICAgc3RkZXJyOiAhb3V0cHV0TGltaXRlZCAmJiB0eXBlb2YgdmFsdWUuc3RkZXJyID09IFwic3RyaW5nXCIgPyB2YWx1ZS5zdGRlcnIgOiBcIlwiLFxuICAgIHN0ZG91dDogIW91dHB1dExpbWl0ZWQgJiYgdHlwZW9mIHZhbHVlLnN0ZG91dCA9PSBcInN0cmluZ1wiID8gdmFsdWUuc3Rkb3V0IDogXCJcIlxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBkaXNjb3ZlcmVkLXRvb2wgZmllbGRzIGNvbnN1bWVkIGJ5IHRoZSBydW5uZXIuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHRvb2wuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWlufSBXaGV0aGVyIHRoZSB0b29sIGNvbnRyYWN0IGlzIHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGlzVG9vbCh2YWx1ZSkge1xuICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlLmlkID09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLmV4ZWN1dGFibGUgPT0gXCJzdHJpbmdcIiAmJiBwYXRoLmlzQWJzb2x1dGUodmFsdWUuZXhlY3V0YWJsZSkgJiZcbiAgICAhdmFsdWUuZXhlY3V0YWJsZS5pbmNsdWRlcyhcIlxcMFwiKSAmJiB0eXBlb2YgdmFsdWUudmVyc2lvbiA9PSBcInN0cmluZ1wiICYmIHZhbHVlLnZlcnNpb24ubGVuZ3RoID4gMCAmJlxuICAgICh2YWx1ZS5zb3VyY2UgPT0gXCJjYW5vbmljYWxcIiB8fCB2YWx1ZS5zb3VyY2UgPT0gXCJvdmVycmlkZVwiKVxufVxuXG4vKipcbiAqIEtlZXBzIHRoZSBwcmltYXJ5IGFjY2VwdGFuY2UgZXJyb3Igd2hpbGUgcmVjb3JkaW5nIGJvdW5kZWQgY2xlYW51cCBldmlkZW5jZSBpbiBpdHMgY2F1c2UgY2hhaW4uXG4gKiBAcGFyYW0ge0Vycm9yfSBwcmltYXJ5RmFpbHVyZSAtIE9yaWdpbmFsIG1hdGVyaWFsaXphdGlvbiBvciBzdGFnZSBmYWlsdXJlLlxuICogQHBhcmFtIHt1bmtub3dufSBjbGVhbnVwRmFpbHVyZSAtIENsZWFudXAgcmVqZWN0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFjY2VwdGFuY2UgdGFyZ2V0LlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgb3JpZ2luYWwgcHJpbWFyeSBlcnJvciB3aXRoIHN0cnVjdHVyZWQgY2xlYW51cCBldmlkZW5jZS5cbiAqL1xuZnVuY3Rpb24gcHJlc2VydmVQcmltYXJ5RmFpbHVyZShwcmltYXJ5RmFpbHVyZSwgY2xlYW51cEZhaWx1cmUsIHRhcmdldCkge1xuICBjb25zdCBjbGVhbnVwRXZpZGVuY2UgPSBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjb2RlOiBcIkFDQ0VQVEFOQ0VfQ0xFQU5VUF9GQUlMVVJFXCIsXG4gICAgbGFuZ3VhZ2U6IGNsZWFudXBGYWlsdXJlIGluc3RhbmNlb2YgU2VtYW50aWZvbGREaWFnbm9zdGljID8gY2xlYW51cEZhaWx1cmUubGFuZ3VhZ2UgOiB0YXJnZXQsXG4gICAgbWVzc2FnZTogXCJJc29sYXRlZCBhY2NlcHRhbmNlLWRpcmVjdG9yeSBjbGVhbnVwIGZhaWxlZCBhZnRlciB0aGUgcHJpbWFyeSBhY2NlcHRhbmNlIGZhaWx1cmUuXCJcbiAgfSlcbiAgY29uc3QgY2F1c2VzID0gcHJpbWFyeUZhaWx1cmUuY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IFtwcmltYXJ5RmFpbHVyZS5jYXVzZSwgY2xlYW51cEV2aWRlbmNlXSA6IFtjbGVhbnVwRXZpZGVuY2VdXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByaW1hcnlGYWlsdXJlLCBcImNhdXNlXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IG5ldyBBZ2dyZWdhdGVFcnJvcihjYXVzZXMsIFwiQWNjZXB0YW5jZSBmYWlsZWQgYW5kIGlzb2xhdGVkLWRpcmVjdG9yeSBjbGVhbnVwIGFsc28gZmFpbGVkLlwiKSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxuXG4gIHJldHVybiBwcmltYXJ5RmFpbHVyZVxufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgcnVubmVyLWNvbmZpZ3VyYXRpb24gZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRmFpbHVyZSBkZXRhaWwuXG4gKiBAcGFyYW0ge3Vua25vd259IHRhcmdldCAtIENhbmRpZGF0ZSB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3Vua25vd259IFtlcnJvcl0gLSBQcmVzZXJ2ZWQgY2F1c2UuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGludmFsaWRSdW5uZXIobWVzc2FnZSwgdGFyZ2V0LCBlcnJvcikge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgIGNvZGU6IFwiSU5WQUxJRF9BQ0NFUFRBTkNFX1JVTk5FUlwiLFxuICAgIGxhbmd1YWdlOiB0eXBlb2YgdGFyZ2V0ID09IFwic3RyaW5nXCIgJiYgdGFyZ2V0Lmxlbmd0aCA+IDAgPyB0YXJnZXQgOiBcImFjY2VwdGFuY2VcIixcbiAgICBtZXNzYWdlXG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2tzIGZvciBhbiBvcmRpbmFyeSBzdHJpbmcta2V5ZWQgb2JqZWN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gT2JqZWN0LnByb3RvdHlwZVxufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGlzb2xhdGVkIGFjY2VwdGFuY2UgZGlyZWN0b3J5IHdpdGggYSBub3JtYWxpemVkIGZhaWx1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyZWN0b3J5IC0gRXhhY3QgdGVtcG9yYXJ5IGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgLSBBY2NlcHRhbmNlIHRhcmdldC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDbGVhbnVwIGNvbXBsZXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUFjY2VwdGFuY2VEaXJlY3RvcnkoZGlyZWN0b3J5LCB0YXJnZXQpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBybShkaXJlY3RvcnksIHtmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNhdXNlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICBjb2RlOiBcIkFDQ0VQVEFOQ0VfQ0xFQU5VUF9GQUlMVVJFXCIsXG4gICAgICBsYW5ndWFnZTogdGFyZ2V0LFxuICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byByZW1vdmUgaXNvbGF0ZWQgYWNjZXB0YW5jZSBkaXJlY3RvcnkgJyR7ZGlyZWN0b3J5fScuYFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIG9uZSBpc29sYXRlZCBhY2NlcHRhbmNlIGRpcmVjdG9yeSB3aXRoIGEgbm9ybWFsaXplZCBzZXR1cCBmYWlsdXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIEFjY2VwdGFuY2UgdGFyZ2V0LlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRXhhY3QgdGVtcG9yYXJ5IGRpcmVjdG9yeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQWNjZXB0YW5jZURpcmVjdG9yeSh0YXJnZXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgbWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwic2VtYW50aWZvbGQtYWNjZXB0YW5jZS1cIikpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjYXVzZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgICAgY29kZTogXCJBQ0NFUFRBTkNFX1NFVFVQX0ZBSUxVUkVcIixcbiAgICAgIGxhbmd1YWdlOiB0YXJnZXQsXG4gICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byBjcmVhdGUgYW4gaXNvbGF0ZWQgYWNjZXB0YW5jZSBkaXJlY3RvcnkuXCJcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIG9ubHkgdGhlIGFscmVhZHktdmFsaWRhdGVkIGdlbmVyYXRlZCBhcnRpZmFjdHMgaW50byB0aGUgaXNvbGF0ZWQgZGlyZWN0b3J5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZEFydGlmYWN0U2V0fSBhcnRpZmFjdHMgLSBDb21wbGV0ZSB2YWxpZGF0ZWQgc2V0LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIEV4YWN0IHRlbXBvcmFyeSBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gQWNjZXB0YW5jZSB0YXJnZXQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gTWF0ZXJpYWxpemF0aW9uIGNvbXBsZXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplQXJ0aWZhY3RzKGFydGlmYWN0cywgZGlyZWN0b3J5LCB0YXJnZXQpIHtcbiAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBhcnRpZmFjdHMuYXJ0aWZhY3RzKSB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCAuLi5hcnRpZmFjdC5wYXRoLnNwbGl0KFwiL1wiKSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZmlsZW5hbWUpLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlbmFtZSwgYXJ0aWZhY3QuY29udGVudClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNhdXNlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvZGU6IFwiQUNDRVBUQU5DRV9NQVRFUklBTElaQVRJT05fRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZTogdGFyZ2V0LFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIG1hdGVyaWFsaXplIGdlbmVyYXRlZCBhcnRpZmFjdCAnJHthcnRpZmFjdC5wYXRofScuYFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Checks that every index below an array's length is an own property.
3
+ * @param {unknown} value - Candidate ordered array.
4
+ * @returns {value is unknown[]} Whether the value is a dense array.
5
+ */
6
+ export declare function isDenseArray(value: unknown): value is unknown[];
7
+ //# sourceMappingURL=array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/array.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAHvB,OAGuB,GAFrB,KAAK,IAAI,OAAO,EAAE,CAa9B"}
@@ -0,0 +1,18 @@
1
+ // @ts-check
2
+ /**
3
+ * Checks that every index below an array's length is an own property.
4
+ * @param {unknown} value - Candidate ordered array.
5
+ * @returns {value is unknown[]} Whether the value is a dense array.
6
+ */
7
+ export function isDenseArray(value) {
8
+ if (!Array.isArray(value))
9
+ return false;
10
+ let indexedProperties = 0;
11
+ for (const property of Object.getOwnPropertyNames(value)) {
12
+ const index = Number(property);
13
+ if (Number.isInteger(index) && index >= 0 && index < value.length && String(index) == property)
14
+ indexedProperties += 1;
15
+ }
16
+ return indexedProperties == value.length;
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJyYXkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQUs7SUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDdkMsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUE7SUFFekIsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFOUIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVE7WUFBRSxpQkFBaUIsSUFBSSxDQUFDLENBQUE7SUFDeEgsQ0FBQztJQUVELE9BQU8saUJBQWlCLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQTtBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQ2hlY2tzIHRoYXQgZXZlcnkgaW5kZXggYmVsb3cgYW4gYXJyYXkncyBsZW5ndGggaXMgYW4gb3duIHByb3BlcnR5LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBvcmRlcmVkIGFycmF5LlxuICogQHJldHVybnMge3ZhbHVlIGlzIHVua25vd25bXX0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBkZW5zZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVuc2VBcnJheSh2YWx1ZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2VcbiAgbGV0IGluZGV4ZWRQcm9wZXJ0aWVzID0gMFxuXG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpKSB7XG4gICAgY29uc3QgaW5kZXggPSBOdW1iZXIocHJvcGVydHkpXG5cbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IHZhbHVlLmxlbmd0aCAmJiBTdHJpbmcoaW5kZXgpID09IHByb3BlcnR5KSBpbmRleGVkUHJvcGVydGllcyArPSAxXG4gIH1cblxuICByZXR1cm4gaW5kZXhlZFByb3BlcnRpZXMgPT0gdmFsdWUubGVuZ3RoXG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Validates filename metadata without imposing artifact-set path semantics.
3
+ * @param {unknown} value - Candidate filename.
4
+ * @returns {value is string} Whether the value is a non-empty single-line string.
5
+ */
6
+ export declare function isValidFilenameMetadata(value: unknown): value is string;
7
+ /**
8
+ * Validates a safe relative POSIX artifact path.
9
+ * @param {unknown} value - Candidate path.
10
+ * @returns {value is string} Whether the value is safe.
11
+ */
12
+ export declare function isSafeArtifactPath(value: unknown): value is string;
13
+ //# sourceMappingURL=artifact-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-path.d.ts","sourceRoot":"","sources":["../../src/artifact-path.js"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAHlC,OAGkC,GAFhC,KAAK,IAAI,MAAM,CAI3B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAH7B,OAG6B,GAF3B,KAAK,IAAI,MAAM,CAe3B"}
@@ -0,0 +1,30 @@
1
+ // @ts-check
2
+ import { hasOnlyUnicodeScalars } from "./semantic/scalars.js";
3
+ const lineTerminatorPattern = /[\n\r\u2028\u2029]/u;
4
+ /**
5
+ * Validates filename metadata without imposing artifact-set path semantics.
6
+ * @param {unknown} value - Candidate filename.
7
+ * @returns {value is string} Whether the value is a non-empty single-line string.
8
+ */
9
+ export function isValidFilenameMetadata(value) {
10
+ return typeof value == "string" && value.length > 0 && !lineTerminatorPattern.test(value);
11
+ }
12
+ /**
13
+ * Validates a safe relative POSIX artifact path.
14
+ * @param {unknown} value - Candidate path.
15
+ * @returns {value is string} Whether the value is safe.
16
+ */
17
+ export function isSafeArtifactPath(value) {
18
+ if (typeof value != "string" || value.length == 0 || value.includes("\\") || value.includes("\0") ||
19
+ !hasOnlyUnicodeScalars(value))
20
+ return false;
21
+ if (value.startsWith("/") || /^[A-Za-z]:/u.test(value))
22
+ return false;
23
+ const parts = value.split("/");
24
+ return parts.every((part) => part.length > 0 && part != "." && part != ".." &&
25
+ [...part].every((character) => {
26
+ const codePoint = character.codePointAt(0);
27
+ return codePoint != undefined && codePoint > 31 && codePoint != 127;
28
+ }));
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3QtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcnRpZmFjdC1wYXRoLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUUzRCxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFBO0FBRW5EOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsS0FBSztJQUMzQyxPQUFPLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMzRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFLO0lBQ3RDLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDL0YsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUM3QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUVwRSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRTlCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSTtRQUN6RSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUUxQyxPQUFPLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxHQUFHLEVBQUUsSUFBSSxTQUFTLElBQUksR0FBRyxDQUFBO1FBQ3JFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aGFzT25seVVuaWNvZGVTY2FsYXJzfSBmcm9tIFwiLi9zZW1hbnRpYy9zY2FsYXJzLmpzXCJcblxuY29uc3QgbGluZVRlcm1pbmF0b3JQYXR0ZXJuID0gL1tcXG5cXHJcXHUyMDI4XFx1MjAyOV0vdVxuXG4vKipcbiAqIFZhbGlkYXRlcyBmaWxlbmFtZSBtZXRhZGF0YSB3aXRob3V0IGltcG9zaW5nIGFydGlmYWN0LXNldCBwYXRoIHNlbWFudGljcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgZmlsZW5hbWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgc3RyaW5nfSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzaW5nbGUtbGluZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRmlsZW5hbWVNZXRhZGF0YSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiAhbGluZVRlcm1pbmF0b3JQYXR0ZXJuLnRlc3QodmFsdWUpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2FmZSByZWxhdGl2ZSBQT1NJWCBhcnRpZmFjdCBwYXRoLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBwYXRoLlxuICogQHJldHVybnMge3ZhbHVlIGlzIHN0cmluZ30gV2hldGhlciB0aGUgdmFsdWUgaXMgc2FmZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmZUFydGlmYWN0UGF0aCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoID09IDAgfHwgdmFsdWUuaW5jbHVkZXMoXCJcXFxcXCIpIHx8IHZhbHVlLmluY2x1ZGVzKFwiXFwwXCIpIHx8XG4gICAgIWhhc09ubHlVbmljb2RlU2NhbGFycyh2YWx1ZSkpIHJldHVybiBmYWxzZVxuICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIi9cIikgfHwgL15bQS1aYS16XTovdS50ZXN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdChcIi9cIilcblxuICByZXR1cm4gcGFydHMuZXZlcnkoKHBhcnQpID0+IHBhcnQubGVuZ3RoID4gMCAmJiBwYXJ0ICE9IFwiLlwiICYmIHBhcnQgIT0gXCIuLlwiICYmXG4gICAgWy4uLnBhcnRdLmV2ZXJ5KChjaGFyYWN0ZXIpID0+IHtcbiAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGNoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKVxuXG4gICAgICByZXR1cm4gY29kZVBvaW50ICE9IHVuZGVmaW5lZCAmJiBjb2RlUG9pbnQgPiAzMSAmJiBjb2RlUG9pbnQgIT0gMTI3XG4gICAgfSkpXG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Transactionally validates and constructs one deterministic generated artifact set.
3
+ * @param {unknown} candidate - Artifact-set fields.
4
+ * @returns {import("./semantic/types.js").GeneratedArtifactSet} Detached immutable set.
5
+ */
6
+ export declare function createGeneratedArtifactSet(candidate: unknown): import("./semantic/types.js").GeneratedArtifactSet;
7
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/artifacts.js"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAHzC,OAGyC,GAFvC,OAAO,qBAAqB,EAAE,oBAAoB,CAgG9D"}