@dbx-tools/core 0.9.21 → 0.9.29

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 (55) hide show
  1. package/index.ts +2 -2
  2. package/lib/index.d.ts +2 -2
  3. package/lib/index.js +2 -2
  4. package/lib/src/bin.d.ts +2 -0
  5. package/lib/src/bin.js +16 -19
  6. package/lib/src/config-utils.js +3 -4
  7. package/lib/src/exec.js +10 -3
  8. package/lib/src/file-lock.d.ts +13 -0
  9. package/lib/src/file-lock.js +52 -2
  10. package/package.json +2 -3
  11. package/src/bin.ts +15 -16
  12. package/src/config-utils.ts +2 -7
  13. package/src/exec.ts +9 -2
  14. package/src/file-lock.ts +64 -1
  15. package/._LICENSE +0 -0
  16. package/._README.md +0 -0
  17. package/._index.ts +0 -0
  18. package/._package.json +0 -0
  19. package/lib/._index.d.ts +0 -0
  20. package/lib/._index.js +0 -0
  21. package/lib/._tsconfig.tsbuildinfo +0 -0
  22. package/lib/src/._bin.d.ts +0 -0
  23. package/lib/src/._bin.js +0 -0
  24. package/lib/src/._brand-files.d.ts +0 -0
  25. package/lib/src/._brand-files.js +0 -0
  26. package/lib/src/._bundle.d.ts +0 -0
  27. package/lib/src/._bundle.js +0 -0
  28. package/lib/src/._config-utils.d.ts +0 -0
  29. package/lib/src/._config-utils.js +0 -0
  30. package/lib/src/._dependency-resolver.d.ts +0 -0
  31. package/lib/src/._dependency-resolver.js +0 -0
  32. package/lib/src/._exec.d.ts +0 -0
  33. package/lib/src/._exec.js +0 -0
  34. package/lib/src/._file-lock.d.ts +0 -0
  35. package/lib/src/._file-lock.js +0 -0
  36. package/lib/src/._file.d.ts +0 -0
  37. package/lib/src/._file.js +0 -0
  38. package/lib/src/._npm-resolver.d.ts +0 -0
  39. package/lib/src/._npm-resolver.js +0 -0
  40. package/lib/src/._process-lock.d.ts +0 -0
  41. package/lib/src/._process-lock.js +0 -0
  42. package/lib/src/._project-utils.d.ts +0 -0
  43. package/lib/src/._project-utils.js +0 -0
  44. package/lib/src/npm-resolver.d.ts +0 -44
  45. package/lib/src/npm-resolver.js +0 -367
  46. package/src/._bin.ts +0 -0
  47. package/src/._brand-files.ts +0 -0
  48. package/src/._bundle.ts +0 -0
  49. package/src/._config-utils.ts +0 -0
  50. package/src/._dependency-resolver.ts +0 -0
  51. package/src/._exec.ts +0 -0
  52. package/src/._file-lock.ts +0 -0
  53. package/src/._file.ts +0 -0
  54. package/src/._process-lock.ts +0 -0
  55. package/src/._project-utils.ts +0 -0
package/src/file-lock.ts CHANGED
@@ -26,7 +26,12 @@ import { mkdir, open } from "node:fs/promises";
26
26
  import { tmpdir } from "node:os";
27
27
  import { dirname, join } from "node:path";
28
28
 
29
- import { asyncUtils, errorUtils, functionUtils, hash, log, object } from "@dbx-tools/shared-core";
29
+ import * as asyncUtils from "@dbx-tools/shared-core/async-utils";
30
+ import * as errorUtils from "@dbx-tools/shared-core/error-utils";
31
+ import * as functionUtils from "@dbx-tools/shared-core/function-utils";
32
+ import * as hash from "@dbx-tools/shared-core/hash";
33
+ import * as log from "@dbx-tools/shared-core/log";
34
+ import * as object from "@dbx-tools/shared-core/object";
30
35
  import lockfile from "proper-lockfile";
31
36
 
32
37
  const logger = log.logger("core:file-lock");
@@ -77,6 +82,12 @@ export interface FileLockOptions {
77
82
  onWait?: (acquisition: FileLockAcquisition) => void;
78
83
  }
79
84
 
85
+ /** Explicit cross-process lease returned by {@link acquireFileLock}. */
86
+ export interface FileLockLease extends FileLockAcquisition {
87
+ /** Release the held lock. Repeated calls are safe. */
88
+ release(): Promise<void>;
89
+ }
90
+
80
91
  type FlockFn = (fd: number, operation: number) => number;
81
92
 
82
93
  interface BunFfiModule {
@@ -142,6 +153,58 @@ export async function withFileLock<T>(
142
153
  throw new Error("withFileLock: no lock backend available");
143
154
  }
144
155
 
156
+ /**
157
+ * Acquire a cross-process lock and return an explicit lease.
158
+ *
159
+ * Prefer {@link withFileLock} for ordinary JavaScript callers. This lower-level
160
+ * shape exists for storage adapters and cross-language bridges that cannot
161
+ * conveniently pass an async callback through their FFI boundary.
162
+ */
163
+ export async function acquireFileLock(
164
+ key: unknown,
165
+ options: FileLockOptions = {},
166
+ ): Promise<FileLockLease> {
167
+ let acquisition: FileLockAcquisition | undefined;
168
+ let resolveAcquired!: () => void;
169
+ let rejectAcquired!: (error: unknown) => void;
170
+ let resolveRelease!: () => void;
171
+ const acquired = new Promise<void>((resolve, reject) => {
172
+ resolveAcquired = resolve;
173
+ rejectAcquired = reject;
174
+ });
175
+ const released = new Promise<void>((resolve) => {
176
+ resolveRelease = resolve;
177
+ });
178
+ const run = withFileLock(
179
+ key,
180
+ async () => {
181
+ resolveAcquired();
182
+ await released;
183
+ },
184
+ {
185
+ ...options,
186
+ onAcquire: (value) => {
187
+ acquisition = value;
188
+ options.onAcquire?.(value);
189
+ },
190
+ },
191
+ );
192
+ void run.catch(rejectAcquired);
193
+ await acquired;
194
+ if (!acquisition) throw new Error("File-lock backend was not recorded");
195
+
196
+ let active = true;
197
+ return {
198
+ ...acquisition,
199
+ async release() {
200
+ if (!active) return;
201
+ active = false;
202
+ resolveRelease();
203
+ await run;
204
+ },
205
+ };
206
+ }
207
+
145
208
  /** Canonical filesystem-safe id for a lock key. */
146
209
  function lockId(key: unknown): string {
147
210
  const stable = object
package/._LICENSE DELETED
Binary file
package/._README.md DELETED
Binary file
package/._index.ts DELETED
Binary file
package/._package.json DELETED
Binary file
package/lib/._index.d.ts DELETED
Binary file
package/lib/._index.js DELETED
Binary file
Binary file
Binary file
package/lib/src/._bin.js DELETED
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/lib/src/._exec.js DELETED
Binary file
Binary file
Binary file
Binary file
package/lib/src/._file.js DELETED
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,44 +0,0 @@
1
- /**
2
- * Resolve npm dependency specifiers against the configured registry.
3
- *
4
- * Callers pass an already-parsed `package.json`. The function never writes that
5
- * project: it copies the manifest into a temporary directory, proves that this
6
- * Bun version's missing-package errors are parseable, then pins unavailable
7
- * packages (or their parents) until `bun install` succeeds. The returned maps
8
- * are the resolvable registry specifiers.
9
- *
10
- * @module
11
- */
12
- type InstallResult = {
13
- ok: boolean;
14
- stdout: string;
15
- stderr: string;
16
- missing: string[];
17
- };
18
- type PackageInfo = {
19
- name: string;
20
- versions: string[];
21
- latest?: string;
22
- dependencies: Record<string, Record<string, string>>;
23
- };
24
- type ResolveDependenciesOptions = {
25
- verify?: () => Promise<void>;
26
- install?: (manifest: Record<string, unknown>) => Promise<InstallResult>;
27
- packageInfo?: (name: string) => Promise<PackageInfo | undefined>;
28
- };
29
- /** Registry dependency maps that `bun install` can resolve. */
30
- export type ResolvedNpmDependencies = {
31
- dependencies: Record<string, string>;
32
- devDependencies: Record<string, string>;
33
- optionalDependencies: Record<string, string>;
34
- peerDependencies: Record<string, string>;
35
- overrides: Record<string, string>;
36
- };
37
- /**
38
- * Return resolvable dependency specifiers for an in-memory `package.json`.
39
- *
40
- * The input object is not mutated. Bun missing-package parsing is self-tested
41
- * once per process before any install attempt.
42
- */
43
- export declare function resolveDependencies(manifest: Record<string, unknown>, options?: ResolveDependenciesOptions): Promise<ResolvedNpmDependencies>;
44
- export {};
@@ -1,367 +0,0 @@
1
- /**
2
- * Resolve npm dependency specifiers against the configured registry.
3
- *
4
- * Callers pass an already-parsed `package.json`. The function never writes that
5
- * project: it copies the manifest into a temporary directory, proves that this
6
- * Bun version's missing-package errors are parseable, then pins unavailable
7
- * packages (or their parents) until `bun install` succeeds. The returned maps
8
- * are the resolvable registry specifiers.
9
- *
10
- * @module
11
- */
12
- import { randomUUID } from "node:crypto";
13
- import { mkdtemp, rm, writeFile } from "node:fs/promises";
14
- import { tmpdir } from "node:os";
15
- import { delimiter, dirname, join } from "node:path";
16
- import { functionUtils, json, object } from "@dbx-tools/shared-core";
17
- import { spawn } from "./exec.js";
18
- import { npmRegistry } from "./project-utils.js";
19
- const DEPENDENCY_FIELDS = [
20
- "dependencies",
21
- "devDependencies",
22
- "optionalDependencies",
23
- "peerDependencies",
24
- ];
25
- const INSTALL_ARGS = ["install", "--ignore-scripts", "--no-cache"];
26
- const MAX_ITERATIONS = 100;
27
- /**
28
- * Return resolvable dependency specifiers for an in-memory `package.json`.
29
- *
30
- * The input object is not mutated. Bun missing-package parsing is self-tested
31
- * once per process before any install attempt.
32
- */
33
- export async function resolveDependencies(manifest, options = {}) {
34
- const working = structuredClone(manifest);
35
- await (options.verify ?? verifyBunErrorParsing)();
36
- const install = options.install ?? installManifest;
37
- const packageInfo = options.packageInfo ?? createPackageInfoLookup();
38
- const attempted = new Set();
39
- for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration += 1) {
40
- const result = await install(working);
41
- if (result.ok)
42
- return snapshot(working);
43
- if (result.missing.length === 0) {
44
- throw new Error([
45
- "bun install failed without a parseable missing package.",
46
- "",
47
- "Raw Bun output:",
48
- `${result.stdout}\n${result.stderr}`,
49
- ].join("\n"));
50
- }
51
- let changed = false;
52
- for (const missing of result.missing) {
53
- const pin = await pinForMissing(missing, working, packageInfo, attempted);
54
- if (pin)
55
- changed = pinPackage(working, pin.name, pin.version) || changed;
56
- }
57
- if (!changed) {
58
- throw new Error(`No remaining registry pin for: ${result.missing.join(", ")}`);
59
- }
60
- }
61
- throw new Error(`Reached ${MAX_ITERATIONS} install attempts without a successful bun install.`);
62
- }
63
- const verifyBunErrorParsing = functionUtils.memoize(async () => {
64
- const impossible = `__npm_resolver_missing_${randomUUID()}__`;
65
- const result = await installManifest({
66
- private: true,
67
- dependencies: { [impossible]: "1.0.0" },
68
- });
69
- if (result.ok) {
70
- throw new Error(`Bun self-test unexpectedly succeeded for ${impossible}`);
71
- }
72
- if (!result.missing.includes(impossible)) {
73
- throw new Error([
74
- "Bun's missing-package output is not parseable.",
75
- "",
76
- `Expected: ${impossible}`,
77
- `Parsed: ${JSON.stringify(result.missing)}`,
78
- "",
79
- "Raw Bun output:",
80
- `${result.stdout}\n${result.stderr}`,
81
- ].join("\n"));
82
- }
83
- });
84
- async function installManifest(manifest) {
85
- const dir = await mkdtemp(join(tmpdir(), "npm-resolver-"));
86
- try {
87
- await writeFile(join(dir, "package.json"), `${JSON.stringify(manifest, null, 2)}\n`);
88
- const [command, ...prefix] = bunArgv();
89
- const url = registryUrl();
90
- const registryArgs = url ? ["--registry", url] : [];
91
- const result = await spawn(command, [...prefix, ...INSTALL_ARGS, ...registryArgs], {
92
- cwd: dir,
93
- stdin: "ignore",
94
- stdout: "capture",
95
- stderr: "capture",
96
- env: registryEnv(),
97
- });
98
- const stdout = result.stdout;
99
- const stderr = result.stderr;
100
- return {
101
- ok: result.exitCode === 0,
102
- stdout,
103
- stderr,
104
- missing: parseMissingPackages(`${stdout}\n${stderr}`),
105
- };
106
- }
107
- finally {
108
- await rm(dir, { recursive: true, force: true });
109
- }
110
- }
111
- function parseMissingPackages(output) {
112
- const packages = new Set();
113
- const url404 = /(?:GET|HEAD)\s+https?:\/\/[^/\s]+\/((?:@[^/\s]+(?:%2[fF]|\/)[^/?\s]+)|(?:[^/?\s]+))[^\s]*\s+-\s+404/g;
114
- for (const match of output.matchAll(url404)) {
115
- packages.add(decodePackageName(match[1] ?? ""));
116
- }
117
- const packageNotFound = /package\s+["']([^"']+)["']\s+(?:was\s+)?not\s+found/gi;
118
- for (const match of output.matchAll(packageNotFound)) {
119
- packages.add(match[1] ?? "");
120
- }
121
- const failedResolve = /failed\s+to\s+resolve\s+["']([^"']+)["']/gi;
122
- for (const match of output.matchAll(failedResolve)) {
123
- packages.add(stripVersion(match[1] ?? ""));
124
- }
125
- const failedAt = /((?:@[^/\s]+\/)?[^@\s]+)@[^\s]+\s+failed to resolve/gi;
126
- for (const match of output.matchAll(failedAt)) {
127
- packages.add(match[1] ?? "");
128
- }
129
- packages.delete("");
130
- return [...packages];
131
- }
132
- function decodePackageName(value) {
133
- let name = value;
134
- try {
135
- name = decodeURIComponent(name);
136
- }
137
- catch {
138
- // Leave it encoded when the segment is not a valid URI component.
139
- }
140
- return name.replace(/%2f/gi, "/");
141
- }
142
- function stripVersion(value) {
143
- if (value.startsWith("@")) {
144
- const slash = value.indexOf("/");
145
- const at = value.indexOf("@", slash + 1);
146
- return at === -1 ? value : value.slice(0, at);
147
- }
148
- const at = value.indexOf("@");
149
- return at === -1 ? value : value.slice(0, at);
150
- }
151
- function registryUrl() {
152
- return npmRegistry(null, { overrideOnly: true, envVars: true })?.toString();
153
- }
154
- function registryEnv() {
155
- const env = { ...process.env };
156
- const runtimeBin = dirname(process.execPath);
157
- const pathEntries = (env.PATH ?? "").split(delimiter).filter(Boolean);
158
- if (!pathEntries.includes(runtimeBin)) {
159
- env.PATH = [runtimeBin, ...pathEntries].join(delimiter);
160
- }
161
- const url = registryUrl();
162
- if (url) {
163
- env.npm_config_registry = url;
164
- env.NPM_CONFIG_REGISTRY = url;
165
- env.BUN_CONFIG_REGISTRY = url;
166
- }
167
- return env;
168
- }
169
- function bunArgv() {
170
- return /\bbun\b/i.test(process.execPath) ? [process.execPath] : ["bun"];
171
- }
172
- function snapshot(manifest) {
173
- return {
174
- dependencies: dependencyMap(manifest, "dependencies"),
175
- devDependencies: dependencyMap(manifest, "devDependencies"),
176
- optionalDependencies: dependencyMap(manifest, "optionalDependencies"),
177
- peerDependencies: dependencyMap(manifest, "peerDependencies"),
178
- overrides: overrideMap(manifest),
179
- };
180
- }
181
- function dependencyMap(manifest, field) {
182
- const value = manifest[field];
183
- if (!object.isRecord(value))
184
- return {};
185
- const out = {};
186
- for (const [name, spec] of Object.entries(value)) {
187
- if (typeof spec === "string")
188
- out[name] = spec;
189
- }
190
- return out;
191
- }
192
- function declaredDependencies(manifest) {
193
- const out = {};
194
- for (const field of DEPENDENCY_FIELDS)
195
- Object.assign(out, dependencyMap(manifest, field));
196
- return out;
197
- }
198
- function isRegistrySpecifier(spec) {
199
- return !/^(workspace:|catalog:|file:|link:|git\+|github:|https?:|npm:)/i.test(spec);
200
- }
201
- function overrideMap(manifest) {
202
- const value = manifest.overrides;
203
- if (!object.isRecord(value))
204
- return {};
205
- const out = {};
206
- for (const [name, spec] of Object.entries(value)) {
207
- if (typeof spec === "string")
208
- out[name] = spec;
209
- }
210
- return out;
211
- }
212
- function pinPackage(manifest, name, version) {
213
- let changed = false;
214
- const overrides = overrideMap(manifest);
215
- if (overrides[name] !== version) {
216
- overrides[name] = version;
217
- manifest.overrides = overrides;
218
- changed = true;
219
- }
220
- for (const field of DEPENDENCY_FIELDS) {
221
- const deps = dependencyMap(manifest, field);
222
- if (name in deps && deps[name] !== version && isRegistrySpecifier(deps[name] ?? "")) {
223
- deps[name] = version;
224
- manifest[field] = deps;
225
- changed = true;
226
- }
227
- }
228
- return changed;
229
- }
230
- function newestFirst(versions) {
231
- return [...versions].sort((left, right) => right.localeCompare(left, undefined, { numeric: true, sensitivity: "base" }));
232
- }
233
- async function pinForMissing(missing, manifest, packageInfo, attempted) {
234
- const available = await packageInfo(missing);
235
- if (available) {
236
- const version = nextUnusedVersion(missing, available, attempted);
237
- if (version) {
238
- attempted.add(`${missing}@${version}`);
239
- return { name: missing, version };
240
- }
241
- }
242
- for (const parent of await parentPackages(missing, manifest, packageInfo)) {
243
- const info = await packageInfo(parent);
244
- if (!info)
245
- continue;
246
- const version = compatibleParentVersion(missing, info, attempted);
247
- if (!version)
248
- continue;
249
- attempted.add(`${parent}@${version}`);
250
- return { name: parent, version };
251
- }
252
- return undefined;
253
- }
254
- function nextUnusedVersion(name, info, attempted) {
255
- const preferred = info.latest
256
- ? [info.latest, ...newestFirst(info.versions)]
257
- : newestFirst(info.versions);
258
- for (const version of preferred) {
259
- if (!attempted.has(`${name}@${version}`))
260
- return version;
261
- }
262
- return undefined;
263
- }
264
- function compatibleParentVersion(missing, info, attempted) {
265
- for (const version of newestFirst(info.versions)) {
266
- if (attempted.has(`${info.name}@${version}`))
267
- continue;
268
- if (!(missing in (info.dependencies[version] ?? {})))
269
- return version;
270
- }
271
- return undefined;
272
- }
273
- async function parentPackages(missing, manifest, packageInfo) {
274
- const declared = declaredDependencies(manifest);
275
- if (missing in declared && isRegistrySpecifier(declared[missing] ?? ""))
276
- return [];
277
- const parents = [];
278
- for (const name of Object.keys(declared)) {
279
- if (name === missing || !isRegistrySpecifier(declared[name] ?? ""))
280
- continue;
281
- const info = await packageInfo(name);
282
- if (!info)
283
- continue;
284
- if (Object.values(info.dependencies).some((map) => missing in map))
285
- parents.push(name);
286
- }
287
- return parents;
288
- }
289
- function createPackageInfoLookup() {
290
- const cache = new Map();
291
- return (name) => {
292
- const cached = cache.get(name);
293
- if (cached)
294
- return cached;
295
- const pending = loadPackageInfo(name);
296
- cache.set(name, pending);
297
- void pending.then(undefined, () => {
298
- cache.delete(name);
299
- });
300
- return pending;
301
- };
302
- }
303
- async function loadPackageInfo(name) {
304
- const result = await spawn("npm", ["view", name, "--json"], {
305
- stdin: "ignore",
306
- stdout: "capture",
307
- stderr: "capture",
308
- env: registryEnv(),
309
- });
310
- if (result.exitCode !== 0)
311
- return undefined;
312
- const packument = json.parse(result.stdout);
313
- if (!object.isRecord(packument))
314
- return undefined;
315
- const versions = publishedVersions(packument);
316
- if (versions.length === 0)
317
- return undefined;
318
- return {
319
- name,
320
- versions,
321
- latest: latestTag(packument) ?? versions.at(-1),
322
- dependencies: versionDependencies(packument),
323
- };
324
- }
325
- function publishedVersions(packument) {
326
- if (typeof packument.version === "string" && !packument.versions) {
327
- return [packument.version];
328
- }
329
- const versions = packument.versions;
330
- if (Array.isArray(versions)) {
331
- return versions.filter((value) => typeof value === "string");
332
- }
333
- if (object.isRecord(versions))
334
- return Object.keys(versions);
335
- return [];
336
- }
337
- function latestTag(packument) {
338
- const tags = packument["dist-tags"];
339
- if (!object.isRecord(tags) || typeof tags.latest !== "string")
340
- return undefined;
341
- return tags.latest;
342
- }
343
- function versionDependencies(packument) {
344
- const versions = packument.versions;
345
- if (!object.isRecord(versions)) {
346
- return typeof packument.version === "string"
347
- ? { [packument.version]: stringMap(packument.dependencies) }
348
- : {};
349
- }
350
- const out = {};
351
- for (const [version, value] of Object.entries(versions)) {
352
- if (object.isRecord(value))
353
- out[version] = stringMap(value.dependencies);
354
- }
355
- return out;
356
- }
357
- function stringMap(value) {
358
- if (!object.isRecord(value))
359
- return {};
360
- const out = {};
361
- for (const [name, spec] of Object.entries(value)) {
362
- if (typeof spec === "string")
363
- out[name] = spec;
364
- }
365
- return out;
366
- }
367
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25wbS1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxNQUFNLGlCQUFpQixHQUFHO0lBQ3hCLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtDQUNWLENBQUM7QUFFWCxNQUFNLFlBQVksR0FBRyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLENBQVUsQ0FBQztBQUM1RSxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFpQzNCOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsUUFBaUMsRUFDakMsVUFBc0MsRUFBRTtJQUV4QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDO0lBQ2xELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDO0lBQ25E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QU8sRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFjO0lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc29sdmUgbnBtIGRlcGVuZGVuY3kgc3BlY2lmaWVycyBhZ2FpbnN0IHRoZSBjb25maWd1cmVkIHJlZ2lzdHJ5LlxuICpcbiAqIENhbGxlcnMgcGFzcyBhbiBhbHJlYWR5LXBhcnNlZCBgcGFja2FnZS5qc29uYC4gVGhlIGZ1bmN0aW9uIG5ldmVyIHdyaXRlcyB0aGF0XG4gKiBwcm9qZWN0OiBpdCBjb3BpZXMgdGhlIG1hbmlmZXN0IGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBwcm92ZXMgdGhhdCB0aGlzXG4gKiBCdW4gdmVyc2lvbidzIG1pc3NpbmctcGFja2FnZSBlcnJvcnMgYXJlIHBhcnNlYWJsZSwgdGhlbiBwaW5zIHVuYXZhaWxhYmxlXG4gKiBwYWNrYWdlcyAob3IgdGhlaXIgcGFyZW50cykgdW50aWwgYGJ1biBpbnN0YWxsYCBzdWNjZWVkcy4gVGhlIHJldHVybmVkIG1hcHNcbiAqIGFyZSB0aGUgcmVzb2x2YWJsZSByZWdpc3RyeSBzcGVjaWZpZXJzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBta2R0ZW1wLCBybSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkZWxpbWl0ZXIsIGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGZ1bmN0aW9uVXRpbHMsIGpzb24sIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIi4vZXhlYy50c1wiO1xuaW1wb3J0IHsgbnBtUmVnaXN0cnkgfSBmcm9tIFwiLi9wcm9qZWN0LXV0aWxzLnRzXCI7XG5cbmNvbnN0IERFUEVOREVOQ1lfRklFTERTID0gW1xuICBcImRlcGVuZGVuY2llc1wiLFxuICBcImRldkRlcGVuZGVuY2llc1wiLFxuICBcIm9wdGlvbmFsRGVwZW5kZW5jaWVzXCIsXG4gIFwicGVlckRlcGVuZGVuY2llc1wiLFxuXSBhcyBjb25zdDtcblxuY29uc3QgSU5TVEFMTF9BUkdTID0gW1wiaW5zdGFsbFwiLCBcIi0taWdub3JlLXNjcmlwdHNcIiwgXCItLW5vLWNhY2hlXCJdIGFzIGNvbnN0O1xuY29uc3QgTUFYX0lURVJBVElPTlMgPSAxMDA7XG5cbnR5cGUgRGVwZW5kZW5jeUZpZWxkID0gKHR5cGVvZiBERVBFTkRFTkNZX0ZJRUxEUylbbnVtYmVyXTtcblxudHlwZSBJbnN0YWxsUmVzdWx0ID0ge1xuICBvazogYm9vbGVhbjtcbiAgc3Rkb3V0OiBzdHJpbmc7XG4gIHN0ZGVycjogc3RyaW5nO1xuICBtaXNzaW5nOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgUGFja2FnZUluZm8gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbnM6IHN0cmluZ1tdO1xuICBsYXRlc3Q/OiBzdHJpbmc7XG4gIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG59O1xuXG50eXBlIFJlc29sdmVEZXBlbmRlbmNpZXNPcHRpb25zID0ge1xuICB2ZXJpZnk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBpbnN0YWxsPzogKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUHJvbWlzZTxJbnN0YWxsUmVzdWx0PjtcbiAgcGFja2FnZUluZm8/OiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkPjtcbn07XG5cbi8qKiBSZWdpc3RyeSBkZXBlbmRlbmN5IG1hcHMgdGhhdCBgYnVuIGluc3RhbGxgIGNhbiByZXNvbHZlLiAqL1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWROcG1EZXBlbmRlbmNpZXMgPSB7XG4gIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZGV2RGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBvcHRpb25hbERlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGVlckRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gcmVzb2x2YWJsZSBkZXBlbmRlbmN5IHNwZWNpZmllcnMgZm9yIGFuIGluLW1lbW9yeSBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBUaGUgaW5wdXQgb2JqZWN0IGlzIG5vdCBtdXRhdGVkLiBCdW4gbWlzc2luZy1wYWNrYWdlIHBhcnNpbmcgaXMgc2VsZi10ZXN0ZWRcbiAqIG9uY2UgcGVyIHByb2Nlc3MgYmVmb3JlIGFueSBpbnN0YWxsIGF0dGVtcHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlRGVwZW5kZW5jaWVzKFxuICBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IFJlc29sdmVEZXBlbmRlbmNpZXNPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFJlc29sdmVkTnBtRGVwZW5kZW5jaWVzPiB7XG4gIGNvbnN0IHdvcmtpbmcgPSBzdHJ1Y3R1cmVkQ2xvbmUobWFuaWZlc3QpO1xuICBhd2FpdCAob3B0aW9ucy52ZXJpZnkgPz8gdmVyaWZ5QnVuRXJyb3JQYXJzaW5nKSgpO1xuICBjb25zdCBpbnN0YWxsID0gb3B0aW9ucy5pbnN0YWxsID8/IGluc3RhbGxNYW5pZmVzdDtcbiAgY29uc3QgcGFja2FnZUluZm8gPSBvcHRpb25zLnBhY2thZ2VJbmZvID8/IGNyZWF0ZVBhY2thZ2VJbmZvTG9va3VwKCk7XG4gIGNvbnN0IGF0dGVtcHRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAobGV0IGl0ZXJhdGlvbiA9IDE7IGl0ZXJhdGlvbiA8PSBNQVhfSVRFUkFUSU9OUzsgaXRlcmF0aW9uICs9IDEpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbnN0YWxsKHdvcmtpbmcpO1xuICAgIGlmIChyZXN1bHQub2spIHJldHVybiBzbmFwc2hvdCh3b3JraW5nKTtcbiAgICBpZiAocmVzdWx0Lm1pc3NpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICBcImJ1biBpbnN0YWxsIGZhaWxlZCB3aXRob3V0IGEgcGFyc2VhYmxlIG1pc3NpbmcgcGFja2FnZS5cIixcbiAgICAgICAgICBcIlwiLFxuICAgICAgICAgIFwiUmF3IEJ1biBvdXRwdXQ6XCIsXG4gICAgICAgICAgYCR7cmVzdWx0LnN0ZG91dH1cXG4ke3Jlc3VsdC5zdGRlcnJ9YCxcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbWlzc2luZyBvZiByZXN1bHQubWlzc2luZykge1xuICAgICAgY29uc3QgcGluID0gYXdhaXQgcGluRm9yTWlzc2luZyhtaXNzaW5nLCB3b3JraW5nLCBwYWNrYWdlSW5mbywgYXR0ZW1wdGVkKTtcbiAgICAgIGlmIChwaW4pIGNoYW5nZWQgPSBwaW5QYWNrYWdlKHdvcmtpbmcsIHBpbi5uYW1lLCBwaW4udmVyc2lvbikgfHwgY2hhbmdlZDtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJlbWFpbmluZyByZWdpc3RyeSBwaW4gZm9yOiAke3Jlc3VsdC5taXNzaW5nLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFJlYWNoZWQgJHtNQVhfSVRFUkFUSU9OU30gaW5zdGFsbCBhdHRlbXB0cyB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBidW4gaW5zdGFsbC5gKTtcbn1cblxuY29uc3QgdmVyaWZ5QnVuRXJyb3JQYXJzaW5nID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgaW1wb3NzaWJsZSA9IGBfX25wbV9yZXNvbHZlcl9taXNzaW5nXyR7cmFuZG9tVVVJRCgpfV9fYDtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5zdGFsbE1hbmlmZXN0KHtcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIGRlcGVuZGVuY2llczogeyBbaW1wb3NzaWJsZV06IFwiMS4wLjBcIiB9LFxuICB9KTtcbiAgaWYgKHJlc3VsdC5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQnVuIHNlbGYtdGVzdCB1bmV4cGVjdGVkbHkgc3VjY2VlZGVkIGZvciAke2ltcG9zc2libGV9YCk7XG4gIH1cbiAgaWYgKCFyZXN1bHQubWlzc2luZy5pbmNsdWRlcyhpbXBvc3NpYmxlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFtcbiAgICAgICAgXCJCdW4ncyBtaXNzaW5nLXBhY2thZ2Ugb3V0cHV0IGlzIG5vdCBwYXJzZWFibGUuXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIGBFeHBlY3RlZDogJHtpbXBvc3NpYmxlfWAsXG4gICAgICAgIGBQYXJzZWQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0Lm1pc3NpbmcpfWAsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIFwiUmF3IEJ1biBvdXRwdXQ6XCIsXG4gICAgICAgIGAke3Jlc3VsdC5zdGRvdXR9XFxuJHtyZXN1bHQuc3RkZXJyfWAsXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgKTtcbiAgfVxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxNYW5pZmVzdChtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPEluc3RhbGxSZXN1bHQ+IHtcbiAgY29uc3QgZGlyID0gYXdhaXQgbWtkdGVtcChqb2luKHRtcGRpcigpLCBcIm5wbS1yZXNvbHZlci1cIikpO1xuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKGRpciwgXCJwYWNrYWdlLmpzb25cIiksIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gKTtcbiAgICBjb25zdCBbY29tbWFuZCwgLi4ucHJlZml4XSA9IGJ1bkFyZ3YoKTtcbiAgICBjb25zdCB1cmwgPSByZWdpc3RyeVVybCgpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5QXJncyA9IHVybCA/IFtcIi0tcmVnaXN0cnlcIiwgdXJsXSA6IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduKGNvbW1hbmQsIFsuLi5wcmVmaXgsIC4uLklOU1RBTExfQVJHUywgLi4ucmVnaXN0cnlBcmdzXSwge1xuICAgICAgY3dkOiBkaXIsXG4gICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgICAgZW52OiByZWdpc3RyeUVudigpLFxuICAgIH0pO1xuICAgIGNvbnN0IHN0ZG91dCA9IHJlc3VsdC5zdGRvdXQ7XG4gICAgY29uc3Qgc3RkZXJyID0gcmVzdWx0LnN0ZGVycjtcbiAgICByZXR1cm4ge1xuICAgICAgb2s6IHJlc3VsdC5leGl0Q29kZSA9PT0gMCxcbiAgICAgIHN0ZG91dCxcbiAgICAgIHN0ZGVycixcbiAgICAgIG1pc3Npbmc6IHBhcnNlTWlzc2luZ1BhY2thZ2VzKGAke3N0ZG91dH1cXG4ke3N0ZGVycn1gKSxcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJtKGRpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWlzc2luZ1BhY2thZ2VzKG91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBwYWNrYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1cmw0MDQgPVxuICAgIC8oPzpHRVR8SEVBRClcXHMraHR0cHM/OlxcL1xcL1teL1xcc10rXFwvKCg/OkBbXi9cXHNdKyg/OiUyW2ZGXXxcXC8pW14vP1xcc10rKXwoPzpbXi8/XFxzXSspKVteXFxzXSpcXHMrLVxccys0MDQvZztcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBvdXRwdXQubWF0Y2hBbGwodXJsNDA0KSkge1xuICAgIHBhY2thZ2VzLmFkZChkZWNvZGVQYWNrYWdlTmFtZShtYXRjaFsxXSA/PyBcIlwiKSk7XG4gIH1cbiAgY29uc3QgcGFja2FnZU5vdEZvdW5kID0gL3BhY2thZ2VcXHMrW1wiJ10oW15cIiddKylbXCInXVxccysoPzp3YXNcXHMrKT9ub3RcXHMrZm91bmQvZ2k7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygb3V0cHV0Lm1hdGNoQWxsKHBhY2thZ2VOb3RGb3VuZCkpIHtcbiAgICBwYWNrYWdlcy5hZGQobWF0Y2hbMV0gPz8gXCJcIik7XG4gIH1cbiAgY29uc3QgZmFpbGVkUmVzb2x2ZSA9IC9mYWlsZWRcXHMrdG9cXHMrcmVzb2x2ZVxccytbXCInXShbXlwiJ10rKVtcIiddL2dpO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG91dHB1dC5tYXRjaEFsbChmYWlsZWRSZXNvbHZlKSkge1xuICAgIHBhY2thZ2VzLmFkZChzdHJpcFZlcnNpb24obWF0Y2hbMV0gPz8gXCJcIikpO1xuICB9XG4gIGNvbnN0IGZhaWxlZEF0ID0gLygoPzpAW14vXFxzXStcXC8pP1teQFxcc10rKUBbXlxcc10rXFxzK2ZhaWxlZCB0byByZXNvbHZlL2dpO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG91dHB1dC5tYXRjaEFsbChmYWlsZWRBdCkpIHtcbiAgICBwYWNrYWdlcy5hZGQobWF0Y2hbMV0gPz8gXCJcIik7XG4gIH1cbiAgcGFja2FnZXMuZGVsZXRlKFwiXCIpO1xuICByZXR1cm4gWy4uLnBhY2thZ2VzXTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlUGFja2FnZU5hbWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBuYW1lID0gdmFsdWU7XG4gIHRyeSB7XG4gICAgbmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTGVhdmUgaXQgZW5jb2RlZCB3aGVuIHRoZSBzZWdtZW50IGlzIG5vdCBhIHZhbGlkIFVSSSBjb21wb25lbnQuXG4gIH1cbiAgcmV0dXJuIG5hbWUucmVwbGFjZSgvJTJmL2dpLCBcIi9cIik7XG59XG5cbmZ1bmN0aW9uIHN0cmlwVmVyc2lvbih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgY29uc3Qgc2xhc2ggPSB2YWx1ZS5pbmRleE9mKFwiL1wiKTtcbiAgICBjb25zdCBhdCA9IHZhbHVlLmluZGV4T2YoXCJAXCIsIHNsYXNoICsgMSk7XG4gICAgcmV0dXJuIGF0ID09PSAtMSA/IHZhbHVlIDogdmFsdWUuc2xpY2UoMCwgYXQpO1xuICB9XG4gIGNvbnN0IGF0ID0gdmFsdWUuaW5kZXhPZihcIkBcIik7XG4gIHJldHVybiBhdCA9PT0gLTEgPyB2YWx1ZSA6IHZhbHVlLnNsaWNlKDAsIGF0KTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0cnlVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG5wbVJlZ2lzdHJ5KG51bGwsIHsgb3ZlcnJpZGVPbmx5OiB0cnVlLCBlbnZWYXJzOiB0cnVlIH0pPy50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RyeUVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGNvbnN0IHJ1bnRpbWVCaW4gPSBkaXJuYW1lKHByb2Nlc3MuZXhlY1BhdGgpO1xuICBjb25zdCBwYXRoRW50cmllcyA9IChlbnYuUEFUSCA/PyBcIlwiKS5zcGxpdChkZWxpbWl0ZXIpLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKCFwYXRoRW50cmllcy5pbmNsdWRlcyhydW50aW1lQmluKSkge1xuICAgIGVudi5QQVRIID0gW3J1bnRpbWVCaW4sIC4uLnBhdGhFbnRyaWVzXS5qb2luKGRlbGltaXRlcik7XG4gIH1cbiAgY29uc3QgdXJsID0gcmVnaXN0cnlVcmwoKTtcbiAgaWYgKHVybCkge1xuICAgIGVudi5ucG1fY29uZmlnX3JlZ2lzdHJ5ID0gdXJsO1xuICAgIGVudi5OUE1fQ09ORklHX1JFR0lTVFJZID0gdXJsO1xuICAgIGVudi5CVU5fQ09ORklHX1JFR0lTVFJZID0gdXJsO1xuICB9XG4gIHJldHVybiBlbnY7XG59XG5cbmZ1bmN0aW9uIGJ1bkFyZ3YoKTogc3RyaW5nW10ge1xuICByZXR1cm4gL1xcYmJ1blxcYi9pLnRlc3QocHJvY2Vzcy5leGVjUGF0aCkgPyBbcHJvY2Vzcy5leGVjUGF0aF0gOiBbXCJidW5cIl07XG59XG5cbmZ1bmN0aW9uIHNuYXBzaG90KG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlc29sdmVkTnBtRGVwZW5kZW5jaWVzIHtcbiAgcmV0dXJuIHtcbiAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY3lNYXAobWFuaWZlc3QsIFwiZGVwZW5kZW5jaWVzXCIpLFxuICAgIGRldkRlcGVuZGVuY2llczogZGVwZW5kZW5jeU1hcChtYW5pZmVzdCwgXCJkZXZEZXBlbmRlbmNpZXNcIiksXG4gICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6IGRlcGVuZGVuY3lNYXAobWFuaWZlc3QsIFwib3B0aW9uYWxEZXBlbmRlbmNpZXNcIiksXG4gICAgcGVlckRlcGVuZGVuY2llczogZGVwZW5kZW5jeU1hcChtYW5pZmVzdCwgXCJwZWVyRGVwZW5kZW5jaWVzXCIpLFxuICAgIG92ZXJyaWRlczogb3ZlcnJpZGVNYXAobWFuaWZlc3QpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXBlbmRlbmN5TWFwKFxuICBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGZpZWxkOiBEZXBlbmRlbmN5RmllbGQsXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgdmFsdWUgPSBtYW5pZmVzdFtmaWVsZF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgc3BlY10gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSBvdXRbbmFtZV0gPSBzcGVjO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVkRGVwZW5kZW5jaWVzKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBERVBFTkRFTkNZX0ZJRUxEUykgT2JqZWN0LmFzc2lnbihvdXQsIGRlcGVuZGVuY3lNYXAobWFuaWZlc3QsIGZpZWxkKSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGlzUmVnaXN0cnlTcGVjaWZpZXIoc3BlYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhL14od29ya3NwYWNlOnxjYXRhbG9nOnxmaWxlOnxsaW5rOnxnaXRcXCt8Z2l0aHViOnxodHRwcz86fG5wbTopL2kudGVzdChzcGVjKTtcbn1cblxuZnVuY3Rpb24gb3ZlcnJpZGVNYXAobWFuaWZlc3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHZhbHVlID0gbWFuaWZlc3Qub3ZlcnJpZGVzO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiB7fTtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHNwZWNdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikgb3V0W25hbWVdID0gc3BlYztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBwaW5QYWNrYWdlKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gb3ZlcnJpZGVNYXAobWFuaWZlc3QpO1xuICBpZiAob3ZlcnJpZGVzW25hbWVdICE9PSB2ZXJzaW9uKSB7XG4gICAgb3ZlcnJpZGVzW25hbWVdID0gdmVyc2lvbjtcbiAgICBtYW5pZmVzdC5vdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gIH1cbiAgZm9yIChjb25zdCBmaWVsZCBvZiBERVBFTkRFTkNZX0ZJRUxEUykge1xuICAgIGNvbnN0IGRlcHMgPSBkZXBlbmRlbmN5TWFwKG1hbmlmZXN0LCBmaWVsZCk7XG4gICAgaWYgKG5hbWUgaW4gZGVwcyAmJiBkZXBzW25hbWVdICE9PSB2ZXJzaW9uICYmIGlzUmVnaXN0cnlTcGVjaWZpZXIoZGVwc1tuYW1lXSA/PyBcIlwiKSkge1xuICAgICAgZGVwc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICBtYW5pZmVzdFtmaWVsZF0gPSBkZXBzO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG5mdW5jdGlvbiBuZXdlc3RGaXJzdCh2ZXJzaW9uczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4udmVyc2lvbnNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PlxuICAgIHJpZ2h0LmxvY2FsZUNvbXBhcmUobGVmdCwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiBcImJhc2VcIiB9KSxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGluRm9yTWlzc2luZyhcbiAgbWlzc2luZzogc3RyaW5nLFxuICBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhY2thZ2VJbmZvOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkPixcbiAgYXR0ZW1wdGVkOiBTZXQ8c3RyaW5nPixcbik6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IHBhY2thZ2VJbmZvKG1pc3NpbmcpO1xuICBpZiAoYXZhaWxhYmxlKSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IG5leHRVbnVzZWRWZXJzaW9uKG1pc3NpbmcsIGF2YWlsYWJsZSwgYXR0ZW1wdGVkKTtcbiAgICBpZiAodmVyc2lvbikge1xuICAgICAgYXR0ZW1wdGVkLmFkZChgJHttaXNzaW5nfUAke3ZlcnNpb259YCk7XG4gICAgICByZXR1cm4geyBuYW1lOiBtaXNzaW5nLCB2ZXJzaW9uIH07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwYXJlbnQgb2YgYXdhaXQgcGFyZW50UGFja2FnZXMobWlzc2luZywgbWFuaWZlc3QsIHBhY2thZ2VJbmZvKSkge1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBwYWNrYWdlSW5mbyhwYXJlbnQpO1xuICAgIGlmICghaW5mbykgY29udGludWU7XG4gICAgY29uc3QgdmVyc2lvbiA9IGNvbXBhdGlibGVQYXJlbnRWZXJzaW9uKG1pc3NpbmcsIGluZm8sIGF0dGVtcHRlZCk7XG4gICAgaWYgKCF2ZXJzaW9uKSBjb250aW51ZTtcbiAgICBhdHRlbXB0ZWQuYWRkKGAke3BhcmVudH1AJHt2ZXJzaW9ufWApO1xuICAgIHJldHVybiB7IG5hbWU6IHBhcmVudCwgdmVyc2lvbiB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG5leHRVbnVzZWRWZXJzaW9uKFxuICBuYW1lOiBzdHJpbmcsXG4gIGluZm86IFBhY2thZ2VJbmZvLFxuICBhdHRlbXB0ZWQ6IFNldDxzdHJpbmc+LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJlZmVycmVkID0gaW5mby5sYXRlc3RcbiAgICA/IFtpbmZvLmxhdGVzdCwgLi4ubmV3ZXN0Rmlyc3QoaW5mby52ZXJzaW9ucyldXG4gICAgOiBuZXdlc3RGaXJzdChpbmZvLnZlcnNpb25zKTtcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHByZWZlcnJlZCkge1xuICAgIGlmICghYXR0ZW1wdGVkLmhhcyhgJHtuYW1lfUAke3ZlcnNpb259YCkpIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBhdGlibGVQYXJlbnRWZXJzaW9uKFxuICBtaXNzaW5nOiBzdHJpbmcsXG4gIGluZm86IFBhY2thZ2VJbmZvLFxuICBhdHRlbXB0ZWQ6IFNldDxzdHJpbmc+LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIG5ld2VzdEZpcnN0KGluZm8udmVyc2lvbnMpKSB7XG4gICAgaWYgKGF0dGVtcHRlZC5oYXMoYCR7aW5mby5uYW1lfUAke3ZlcnNpb259YCkpIGNvbnRpbnVlO1xuICAgIGlmICghKG1pc3NpbmcgaW4gKGluZm8uZGVwZW5kZW5jaWVzW3ZlcnNpb25dID8/IHt9KSkpIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcmVudFBhY2thZ2VzKFxuICBtaXNzaW5nOiBzdHJpbmcsXG4gIG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGFja2FnZUluZm86IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8UGFja2FnZUluZm8gfCB1bmRlZmluZWQ+LFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkZWNsYXJlZCA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzKG1hbmlmZXN0KTtcbiAgaWYgKG1pc3NpbmcgaW4gZGVjbGFyZWQgJiYgaXNSZWdpc3RyeVNwZWNpZmllcihkZWNsYXJlZFttaXNzaW5nXSA/PyBcIlwiKSkgcmV0dXJuIFtdO1xuICBjb25zdCBwYXJlbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGVjbGFyZWQpKSB7XG4gICAgaWYgKG5hbWUgPT09IG1pc3NpbmcgfHwgIWlzUmVnaXN0cnlTcGVjaWZpZXIoZGVjbGFyZWRbbmFtZV0gPz8gXCJcIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBwYWNrYWdlSW5mbyhuYW1lKTtcbiAgICBpZiAoIWluZm8pIGNvbnRpbnVlO1xuICAgIGlmIChPYmplY3QudmFsdWVzKGluZm8uZGVwZW5kZW5jaWVzKS5zb21lKChtYXApID0+IG1pc3NpbmcgaW4gbWFwKSkgcGFyZW50cy5wdXNoKG5hbWUpO1xuICB9XG4gIHJldHVybiBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQYWNrYWdlSW5mb0xvb2t1cCgpOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UGFja2FnZUluZm8gfCB1bmRlZmluZWQ+PigpO1xuICByZXR1cm4gKG5hbWUpID0+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobmFtZSk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBjb25zdCBwZW5kaW5nID0gbG9hZFBhY2thZ2VJbmZvKG5hbWUpO1xuICAgIGNhY2hlLnNldChuYW1lLCBwZW5kaW5nKTtcbiAgICB2b2lkIHBlbmRpbmcudGhlbih1bmRlZmluZWQsICgpID0+IHtcbiAgICAgIGNhY2hlLmRlbGV0ZShuYW1lKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBhY2thZ2VJbmZvKG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUluZm8gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd24oXCJucG1cIiwgW1widmlld1wiLCBuYW1lLCBcIi0tanNvblwiXSwge1xuICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICBlbnY6IHJlZ2lzdHJ5RW52KCksXG4gIH0pO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYWNrdW1lbnQgPSBqc29uLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChwYWNrdW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB2ZXJzaW9ucyA9IHB1Ymxpc2hlZFZlcnNpb25zKHBhY2t1bWVudCk7XG4gIGlmICh2ZXJzaW9ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB2ZXJzaW9ucyxcbiAgICBsYXRlc3Q6IGxhdGVzdFRhZyhwYWNrdW1lbnQpID8/IHZlcnNpb25zLmF0KC0xKSxcbiAgICBkZXBlbmRlbmNpZXM6IHZlcnNpb25EZXBlbmRlbmNpZXMocGFja3VtZW50KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHVibGlzaGVkVmVyc2lvbnMocGFja3VtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBwYWNrdW1lbnQudmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiAhcGFja3VtZW50LnZlcnNpb25zKSB7XG4gICAgcmV0dXJuIFtwYWNrdW1lbnQudmVyc2lvbl07XG4gIH1cbiAgY29uc3QgdmVyc2lvbnMgPSBwYWNrdW1lbnQudmVyc2lvbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KHZlcnNpb25zKSkge1xuICAgIHJldHVybiB2ZXJzaW9ucy5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIik7XG4gIH1cbiAgaWYgKG9iamVjdC5pc1JlY29yZCh2ZXJzaW9ucykpIHJldHVybiBPYmplY3Qua2V5cyh2ZXJzaW9ucyk7XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gbGF0ZXN0VGFnKHBhY2t1bWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdzID0gcGFja3VtZW50W1wiZGlzdC10YWdzXCJdO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh0YWdzKSB8fCB0eXBlb2YgdGFncy5sYXRlc3QgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0YWdzLmxhdGVzdDtcbn1cblxuZnVuY3Rpb24gdmVyc2lvbkRlcGVuZGVuY2llcyhcbiAgcGFja3VtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdmVyc2lvbnMgPSBwYWNrdW1lbnQudmVyc2lvbnM7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZlcnNpb25zKSkge1xuICAgIHJldHVybiB0eXBlb2YgcGFja3VtZW50LnZlcnNpb24gPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBbcGFja3VtZW50LnZlcnNpb25dOiBzdHJpbmdNYXAocGFja3VtZW50LmRlcGVuZGVuY2llcykgfVxuICAgICAgOiB7fTtcbiAgfVxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge307XG4gIGZvciAoY29uc3QgW3ZlcnNpb24sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2ZXJzaW9ucykpIHtcbiAgICBpZiAob2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgb3V0W3ZlcnNpb25dID0gc3RyaW5nTWFwKHZhbHVlLmRlcGVuZGVuY2llcyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gc3RyaW5nTWFwKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgc3BlY10gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSBvdXRbbmFtZV0gPSBzcGVjO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
package/src/._bin.ts DELETED
Binary file
Binary file
package/src/._bundle.ts DELETED
Binary file
Binary file
Binary file
package/src/._exec.ts DELETED
Binary file