@psync/patch-package 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/makePatch.js CHANGED
@@ -15,6 +15,7 @@ const applyPatches_1 = require("./applyPatches");
15
15
  const createIssue_1 = require("./createIssue");
16
16
  const filterFiles_1 = require("./filterFiles");
17
17
  const getPackageResolution_1 = require("./getPackageResolution");
18
+ const strictMode_1 = require("./strictMode");
18
19
  const getPackageVersion_1 = require("./getPackageVersion");
19
20
  const hash_1 = require("./hash");
20
21
  const PackageDetails_1 = require("./PackageDetails");
@@ -25,11 +26,11 @@ const resolveRelativeFileDependencies_1 = require("./resolveRelativeFileDependen
25
26
  const spawnSafe_1 = require("./spawnSafe");
26
27
  const stateFile_1 = require("./stateFile");
27
28
  function printNoPackageFoundError(packageName, packageJsonPath) {
28
- console_1.default.log(`No such package ${packageName}
29
-
29
+ console_1.default.log(`No such package ${packageName}
30
+
30
31
  File not found: ${packageJsonPath}`);
31
32
  }
32
- function makePatch({ packagePathSpecifier, appPath, packageManager, includePaths, excludePaths, patchDir, createIssue, mode, }) {
33
+ async function makePatch({ packagePathSpecifier, appPath, packageManager, includePaths, excludePaths, patchDir, createIssue, mode, strict = false, }) {
33
34
  const packageDetails = (0, PackageDetails_1.getPatchDetailsFromCliString)(packagePathSpecifier);
34
35
  if (!packageDetails) {
35
36
  console_1.default.log("No such package", packagePathSpecifier);
@@ -97,13 +98,14 @@ function makePatch({ packagePathSpecifier, appPath, packageManager, includePaths
97
98
  console_1.default.info(chalk_1.default.grey("•"), "Creating temporary folder");
98
99
  // make a blank package.json
99
100
  (0, fs_extra_1.mkdirpSync)(tmpRepoNpmRoot);
101
+ const packageResolution = (0, getPackageResolution_1.getPackageResolution)({
102
+ packageDetails,
103
+ packageManager,
104
+ appPath,
105
+ });
100
106
  (0, fs_extra_1.writeFileSync)(tmpRepoPackageJsonPath, JSON.stringify({
101
107
  dependencies: {
102
- [packageDetails.name]: (0, getPackageResolution_1.getPackageResolution)({
103
- packageDetails,
104
- packageManager,
105
- appPath,
106
- }),
108
+ [packageDetails.name]: packageResolution,
107
109
  },
108
110
  resolutions: (0, resolveRelativeFileDependencies_1.resolveRelativeFileDependencies)(appPath, appPackageJson.resolutions || {}),
109
111
  }));
@@ -213,6 +215,32 @@ function makePatch({ packagePathSpecifier, appPath, packageManager, includePaths
213
215
  (0, fs_extra_1.removeSync)((0, path_1.join)(tmpRepoPackagePath, stateFile_1.STATE_FILE_NAME));
214
216
  // also remove ignored files like before
215
217
  (0, filterFiles_1.removeIgnoredFiles)(tmpRepoPackagePath, includePaths, excludePaths);
218
+ // strict mode: prune any file in the user's copy that was not part of the
219
+ // original published tarball. This prevents `--- /dev/null` ("new file")
220
+ // entries caused by install-time file drift.
221
+ if (strict) {
222
+ try {
223
+ const baseline = await (0, strictMode_1.createStrictBaseline)({
224
+ packageName: packageDetails.name,
225
+ resolution: packageResolution,
226
+ appPath,
227
+ }).getOriginalTarballFiles();
228
+ if (baseline) {
229
+ const { pruned } = (0, strictMode_1.pruneToBaseline)(tmpRepoPackagePath, baseline);
230
+ if (pruned > 0) {
231
+ console_1.default.info(chalk_1.default.grey("•"), `Strict mode: pruned ${pruned} file${pruned === 1 ? "" : "s"} not present in the original tarball`);
232
+ }
233
+ }
234
+ else {
235
+ console_1.default.log(chalk_1.default.yellow(`⚠️ --strict was requested but the original tarball baseline could not be determined. ` +
236
+ `Falling back to non-strict patch generation. ` +
237
+ `This often happens with file: resolutions or when the registry is unreachable.`));
238
+ }
239
+ }
240
+ catch (e) {
241
+ console_1.default.log(chalk_1.default.yellow(`⚠️ --strict failed: ${e.message}. Falling back to non-strict patch generation.`));
242
+ }
243
+ }
216
244
  // stage all files
217
245
  git("add", "-f", packageDetails.path);
218
246
  // get diff of changes
@@ -231,14 +259,14 @@ function makePatch({ packagePathSpecifier, appPath, packageManager, includePaths
231
259
  }
232
260
  catch (e) {
233
261
  if (e.message.includes("Unexpected file mode string: 120000")) {
234
- console_1.default.log(`
235
- ⛔️ ${chalk_1.default.red.bold("ERROR")}
236
-
237
- Your changes involve creating symlinks. patch-package does not yet support
238
- symlinks.
239
-
240
- ️Please use ${chalk_1.default.bold("--include")} and/or ${chalk_1.default.bold("--exclude")} to narrow the scope of your patch if
241
- this was unintentional.
262
+ console_1.default.log(`
263
+ ⛔️ ${chalk_1.default.red.bold("ERROR")}
264
+
265
+ Your changes involve creating symlinks. patch-package does not yet support
266
+ symlinks.
267
+
268
+ ️Please use ${chalk_1.default.bold("--include")} and/or ${chalk_1.default.bold("--exclude")} to narrow the scope of your patch if
269
+ this was unintentional.
242
270
  `);
243
271
  }
244
272
  else {
@@ -250,23 +278,23 @@ function makePatch({ packagePathSpecifier, appPath, packageManager, includePaths
250
278
  },
251
279
  patch: diffResult.stdout.toString(),
252
280
  })));
253
- console_1.default.log(`
254
- ⛔️ ${chalk_1.default.red.bold("ERROR")}
255
-
256
- patch-package was unable to read the patch-file made by git. This should not
257
- happen.
258
-
259
- A diagnostic file was written to
260
-
261
- ${outPath}
262
-
263
- Please attach it to a github issue
264
-
265
- https://github.com/ds300/patch-package/issues/new?title=New+patch+parse+failed&body=Please+attach+the+diagnostic+file+by+dragging+it+into+here+🙏
266
-
267
- Note that this diagnostic file will contain code from the package you were
268
- attempting to patch.
269
-
281
+ console_1.default.log(`
282
+ ⛔️ ${chalk_1.default.red.bold("ERROR")}
283
+
284
+ patch-package was unable to read the patch-file made by git. This should not
285
+ happen.
286
+
287
+ A diagnostic file was written to
288
+
289
+ ${outPath}
290
+
291
+ Please attach it to a github issue
292
+
293
+ https://github.com/ds300/patch-package/issues/new?title=New+patch+parse+failed&body=Please+attach+the+diagnostic+file+by+dragging+it+into+here+🙏
294
+
295
+ Note that this diagnostic file will contain code from the package you were
296
+ attempting to patch.
297
+
270
298
  `);
271
299
  }
272
300
  process.exit(1);
@@ -427,24 +455,24 @@ function createPatchFileName({ packageDetails, packageVersion, sequenceNumber, s
427
455
  return `${nameAndVersion}${num}${name}.patch`;
428
456
  }
429
457
  function logPatchSequenceError({ patchDetails, }) {
430
- console_1.default.log(`
431
- ${chalk_1.default.red.bold("⛔ ERROR")}
432
-
433
- Failed to apply patch file ${chalk_1.default.bold(patchDetails.patchFilename)}.
434
-
435
- If this patch file is no longer useful, delete it and run
436
-
437
- ${chalk_1.default.bold(`patch-package`)}
438
-
439
- To partially apply the patch (if possible) and output a log of errors to fix, run
440
-
441
- ${chalk_1.default.bold(`patch-package --partial`)}
442
-
443
- After which you should make any required changes inside ${patchDetails.path}, and finally run
444
-
445
- ${chalk_1.default.bold(`patch-package ${patchDetails.pathSpecifier}`)}
446
-
447
- to update the patch file.
458
+ console_1.default.log(`
459
+ ${chalk_1.default.red.bold("⛔ ERROR")}
460
+
461
+ Failed to apply patch file ${chalk_1.default.bold(patchDetails.patchFilename)}.
462
+
463
+ If this patch file is no longer useful, delete it and run
464
+
465
+ ${chalk_1.default.bold(`patch-package`)}
466
+
467
+ To partially apply the patch (if possible) and output a log of errors to fix, run
468
+
469
+ ${chalk_1.default.bold(`patch-package --partial`)}
470
+
471
+ After which you should make any required changes inside ${patchDetails.path}, and finally run
472
+
473
+ ${chalk_1.default.bold(`patch-package ${patchDetails.pathSpecifier}`)}
474
+
475
+ to update the patch file.
448
476
  `);
449
477
  }
450
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZVBhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ha2VQYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXdEQSw4QkFrZ0JDO0FBMkJELHNEQTBCQztBQS9tQkQsa0RBQXlCO0FBQ3pCLHNEQUE2QjtBQUM3QiwyQkFBK0I7QUFDL0IsdUNBUWlCO0FBQ2pCLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsaURBQTJDO0FBQzNDLCtDQUtzQjtBQUV0QiwrQ0FBa0Q7QUFDbEQsaUVBQTZEO0FBQzdELDJEQUF1RDtBQUN2RCxpQ0FBaUM7QUFDakMscURBSXlCO0FBQ3pCLHlDQUE4QztBQUM5Qyx1Q0FBNkM7QUFDN0MsaUNBQStDO0FBQy9DLHVGQUFtRjtBQUNuRiwyQ0FBMkM7QUFDM0MsMkNBT29CO0FBRXBCLFNBQVMsd0JBQXdCLENBQy9CLFdBQW1CLEVBQ25CLGVBQXVCO0lBRXZCLGlCQUFPLENBQUMsR0FBRyxDQUNULG1CQUFtQixXQUFXOztvQkFFZCxlQUFlLEVBQUUsQ0FDbEMsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFnQixTQUFTLENBQUMsRUFDeEIsb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBQ1IsV0FBVyxFQUNYLElBQUksR0FVTDtJQUNDLE1BQU0sY0FBYyxHQUFHLElBQUEsNkNBQTRCLEVBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUV6RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsaUJBQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUNwRCxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsb0NBQXdCLEVBQUMsY0FBYyxDQUFDLENBQUE7SUFDdEQsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLENBQUE7SUFFN0MsaUdBQWlHO0lBQ2pH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LEdBR2I7SUFDQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQztFQUNaLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7NkJBRUUsZUFBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDOzs7O0lBSS9ELGVBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDOzs7O0lBSTNCLGVBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUM7OzBEQUdyQyxZQUFZLENBQUMsSUFDZjs7SUFFRSxlQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7OztDQUc1RCxDQUFDLENBQUE7QUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiXHJcbmltcG9ydCBjb25zb2xlIGZyb20gXCJjb25zb2xlXCJcclxuaW1wb3J0IHsgcmVuYW1lU3luYyB9IGZyb20gXCJmc1wiXHJcbmltcG9ydCB7XHJcbiAgY29weVN5bmMsXHJcbiAgZXhpc3RzU3luYyxcclxuICBta2RpcnBTeW5jLFxyXG4gIG1rZGlyU3luYyxcclxuICByZWFscGF0aFN5bmMsXHJcbiAgcmVtb3ZlU3luYyxcclxuICB3cml0ZUZpbGVTeW5jLFxyXG59IGZyb20gXCJmcy1leHRyYVwiXHJcbmltcG9ydCB7IGRpclN5bmMgfSBmcm9tIFwidG1wXCJcclxuaW1wb3J0IHsgZ3ppcFN5bmMgfSBmcm9tIFwiemxpYlwiXHJcbmltcG9ydCB7IGFwcGx5UGF0Y2ggfSBmcm9tIFwiLi9hcHBseVBhdGNoZXNcIlxyXG5pbXBvcnQge1xyXG4gIGdldFBhY2thZ2VWQ1NEZXRhaWxzLFxyXG4gIG1heWJlUHJpbnRJc3N1ZUNyZWF0aW9uUHJvbXB0LFxyXG4gIG9wZW5Jc3N1ZUNyZWF0aW9uTGluayxcclxuICBzaG91bGRSZWNvbW1lbmRJc3N1ZSxcclxufSBmcm9tIFwiLi9jcmVhdGVJc3N1ZVwiXHJcbmltcG9ydCB7IFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0UGFja2FnZU1hbmFnZXJcIlxyXG5pbXBvcnQgeyByZW1vdmVJZ25vcmVkRmlsZXMgfSBmcm9tIFwiLi9maWx0ZXJGaWxlc1wiXHJcbmltcG9ydCB7IGdldFBhY2thZ2VSZXNvbHV0aW9uIH0gZnJvbSBcIi4vZ2V0UGFja2FnZVJlc29sdXRpb25cIlxyXG5pbXBvcnQgeyBnZXRQYWNrYWdlVmVyc2lvbiB9IGZyb20gXCIuL2dldFBhY2thZ2VWZXJzaW9uXCJcclxuaW1wb3J0IHsgaGFzaEZpbGUgfSBmcm9tIFwiLi9oYXNoXCJcclxuaW1wb3J0IHtcclxuICBnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nLFxyXG4gIFBhY2thZ2VEZXRhaWxzLFxyXG4gIFBhdGNoZWRQYWNrYWdlRGV0YWlscyxcclxufSBmcm9tIFwiLi9QYWNrYWdlRGV0YWlsc1wiXHJcbmltcG9ydCB7IHBhcnNlUGF0Y2hGaWxlIH0gZnJvbSBcIi4vcGF0Y2gvcGFyc2VcIlxyXG5pbXBvcnQgeyBnZXRHcm91cGVkUGF0Y2hlcyB9IGZyb20gXCIuL3BhdGNoRnNcIlxyXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIi4vcGF0aFwiXHJcbmltcG9ydCB7IHJlc29sdmVSZWxhdGl2ZUZpbGVEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9yZXNvbHZlUmVsYXRpdmVGaWxlRGVwZW5kZW5jaWVzXCJcclxuaW1wb3J0IHsgc3Bhd25TYWZlU3luYyB9IGZyb20gXCIuL3NwYXduU2FmZVwiXHJcbmltcG9ydCB7XHJcbiAgY2xlYXJQYXRjaEFwcGxpY2F0aW9uU3RhdGUsXHJcbiAgZ2V0UGF0Y2hBcHBsaWNhdGlvblN0YXRlLFxyXG4gIFBhdGNoU3RhdGUsXHJcbiAgc2F2ZVBhdGNoQXBwbGljYXRpb25TdGF0ZSxcclxuICBTVEFURV9GSUxFX05BTUUsXHJcbiAgdmVyaWZ5QXBwbGllZFBhdGNoZXMsXHJcbn0gZnJvbSBcIi4vc3RhdGVGaWxlXCJcclxuXHJcbmZ1bmN0aW9uIHByaW50Tm9QYWNrYWdlRm91bmRFcnJvcihcclxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxyXG4gIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLFxyXG4pIHtcclxuICBjb25zb2xlLmxvZyhcclxuICAgIGBObyBzdWNoIHBhY2thZ2UgJHtwYWNrYWdlTmFtZX1cclxuXHJcbiAgRmlsZSBub3QgZm91bmQ6ICR7cGFja2FnZUpzb25QYXRofWAsXHJcbiAgKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhdGNoKHtcclxuICBwYWNrYWdlUGF0aFNwZWNpZmllcixcclxuICBhcHBQYXRoLFxyXG4gIHBhY2thZ2VNYW5hZ2VyLFxyXG4gIGluY2x1ZGVQYXRocyxcclxuICBleGNsdWRlUGF0aHMsXHJcbiAgcGF0Y2hEaXIsXHJcbiAgY3JlYXRlSXNzdWUsXHJcbiAgbW9kZSxcclxufToge1xyXG4gIHBhY2thZ2VQYXRoU3BlY2lmaWVyOiBzdHJpbmdcclxuICBhcHBQYXRoOiBzdHJpbmdcclxuICBwYWNrYWdlTWFuYWdlcjogUGFja2FnZU1hbmFnZXJcclxuICBpbmNsdWRlUGF0aHM6IFJlZ0V4cFxyXG4gIGV4Y2x1ZGVQYXRoczogUmVnRXhwXHJcbiAgcGF0Y2hEaXI6IHN0cmluZ1xyXG4gIGNyZWF0ZUlzc3VlOiBib29sZWFuXHJcbiAgbW9kZTogeyB0eXBlOiBcIm92ZXJ3cml0ZV9sYXN0XCIgfSB8IHsgdHlwZTogXCJhcHBlbmRcIjsgbmFtZT86IHN0cmluZyB9XHJcbn0pIHtcclxuICBjb25zdCBwYWNrYWdlRGV0YWlscyA9IGdldFBhdGNoRGV0YWlsc0Zyb21DbGlTdHJpbmcocGFja2FnZVBhdGhTcGVjaWZpZXIpXHJcblxyXG4gIGlmICghcGFja2FnZURldGFpbHMpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiTm8gc3VjaCBwYWNrYWdlXCIsIHBhY2thZ2VQYXRoU3BlY2lmaWVyKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBjb25zdCBzdGF0ZSA9IGdldFBhdGNoQXBwbGljYXRpb25TdGF0ZShwYWNrYWdlRGV0YWlscylcclxuICBjb25zdCBpc1JlYmFzaW5nID0gc3RhdGU/LmlzUmViYXNpbmcgPz8gZmFsc2VcclxuXHJcbiAgLy8gSWYgd2UgYXJlIHJlYmFzaW5nIGFuZCBubyBwYXRjaGVzIGhhdmUgYmVlbiBhcHBsaWVkLCAtLWFwcGVuZCBpcyB0aGUgb25seSB2YWxpZCBvcHRpb24gYmVjYXVzZVxyXG4gIC8vIHRoZXJlIGFyZSBubyBwcmV2aW91cyBwYXRjaGVzIHRvIG92ZXJ3cml0ZS91cGRhdGVcclxuICBpZiAoXHJcbiAgICBpc1JlYmFzaW5nICYmXHJcbiAgICBzdGF0ZT8ucGF0Y2hlcy5maWx0ZXIoKHApID0+IHAuZGlkQXBwbHkpLmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgbW9kZS50eXBlID09PSBcIm92ZXJ3cml0ZV9sYXN0XCJcclxuICApIHtcclxuICAgIG1vZGUgPSB7IHR5cGU6IFwiYXBwZW5kXCIsIG5hbWU6IFwiaW5pdGlhbFwiIH1cclxuICB9XHJcblxyXG4gIGlmIChpc1JlYmFzaW5nICYmIHN0YXRlKSB7XHJcbiAgICB2ZXJpZnlBcHBsaWVkUGF0Y2hlcyh7IGFwcFBhdGgsIHBhdGNoRGlyLCBzdGF0ZSB9KVxyXG4gIH1cclxuXHJcbiAgaWYgKFxyXG4gICAgbW9kZS50eXBlID09PSBcIm92ZXJ3cml0ZV9sYXN0XCIgJiZcclxuICAgIGlzUmViYXNpbmcgJiZcclxuICAgIHN0YXRlPy5wYXRjaGVzLmxlbmd0aCA9PT0gMFxyXG4gICkge1xyXG4gICAgbW9kZSA9IHsgdHlwZTogXCJhcHBlbmRcIiwgbmFtZTogXCJpbml0aWFsXCIgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZXhpc3RpbmdQYXRjaGVzID1cclxuICAgIGdldEdyb3VwZWRQYXRjaGVzKHBhdGNoRGlyKS5wYXRoU3BlY2lmaWVyVG9QYXRjaEZpbGVzW1xyXG4gICAgICBwYWNrYWdlRGV0YWlscy5wYXRoU3BlY2lmaWVyXHJcbiAgICBdIHx8IFtdXHJcblxyXG4gIC8vIGFwcGx5IGFsbCBleGlzdGluZyBwYXRjaGVzIGlmIGFwcGVuZGluZ1xyXG4gIC8vIG90aGVyd2lzZSBhcHBseSBhbGwgYnV0IHRoZSBsYXN0XHJcbiAgY29uc3QgcHJldmlvdXNseUFwcGxpZWRQYXRjaGVzID0gc3RhdGU/LnBhdGNoZXMuZmlsdGVyKChwKSA9PiBwLmRpZEFwcGx5KVxyXG4gIGNvbnN0IHBhdGNoZXNUb0FwcGx5QmVmb3JlRGlmZmluZzogUGF0Y2hlZFBhY2thZ2VEZXRhaWxzW10gPSBpc1JlYmFzaW5nXHJcbiAgICA/IG1vZGUudHlwZSA9PT0gXCJhcHBlbmRcIlxyXG4gICAgICA/IGV4aXN0aW5nUGF0Y2hlcy5zbGljZSgwLCBwcmV2aW91c2x5QXBwbGllZFBhdGNoZXMhLmxlbmd0aClcclxuICAgICAgOiBzdGF0ZSEucGF0Y2hlc1tzdGF0ZSEucGF0Y2hlcy5sZW5ndGggLSAxXS5kaWRBcHBseVxyXG4gICAgICAgID8gZXhpc3RpbmdQYXRjaGVzLnNsaWNlKDAsIHByZXZpb3VzbHlBcHBsaWVkUGF0Y2hlcyEubGVuZ3RoIC0gMSlcclxuICAgICAgICA6IGV4aXN0aW5nUGF0Y2hlcy5zbGljZSgwLCBwcmV2aW91c2x5QXBwbGllZFBhdGNoZXMhLmxlbmd0aClcclxuICAgIDogbW9kZS50eXBlID09PSBcImFwcGVuZFwiXHJcbiAgICAgID8gZXhpc3RpbmdQYXRjaGVzXHJcbiAgICAgIDogZXhpc3RpbmdQYXRjaGVzLnNsaWNlKDAsIC0xKVxyXG5cclxuICBpZiAoY3JlYXRlSXNzdWUgJiYgbW9kZS50eXBlID09PSBcImFwcGVuZFwiKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIi0tY3JlYXRlLWlzc3VlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggLS1hcHBlbmQuXCIpXHJcbiAgICBwcm9jZXNzLmV4aXQoMSlcclxuICB9XHJcblxyXG4gIGlmIChjcmVhdGVJc3N1ZSAmJiBpc1JlYmFzaW5nKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIi0tY3JlYXRlLWlzc3VlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggcmViYXNpbmcuXCIpXHJcbiAgICBwcm9jZXNzLmV4aXQoMSlcclxuICB9XHJcblxyXG4gIGNvbnN0IG51bVBhdGNoZXNBZnRlckNyZWF0ZSA9XHJcbiAgICBtb2RlLnR5cGUgPT09IFwiYXBwZW5kXCIgfHwgZXhpc3RpbmdQYXRjaGVzLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/IGV4aXN0aW5nUGF0Y2hlcy5sZW5ndGggKyAxXHJcbiAgICAgIDogZXhpc3RpbmdQYXRjaGVzLmxlbmd0aFxyXG4gIGNvbnN0IHZjcyA9IGdldFBhY2thZ2VWQ1NEZXRhaWxzKHBhY2thZ2VEZXRhaWxzKVxyXG4gIGNvbnN0IGNhbkNyZWF0ZUlzc3VlID1cclxuICAgICFpc1JlYmFzaW5nICYmXHJcbiAgICBzaG91bGRSZWNvbW1lbmRJc3N1ZSh2Y3MpICYmXHJcbiAgICBudW1QYXRjaGVzQWZ0ZXJDcmVhdGUgPT09IDEgJiZcclxuICAgIG1vZGUudHlwZSAhPT0gXCJhcHBlbmRcIlxyXG5cclxuICBjb25zdCBhcHBQYWNrYWdlSnNvbiA9IHJlcXVpcmUoam9pbihhcHBQYXRoLCBcInBhY2thZ2UuanNvblwiKSlcclxuICBjb25zdCBwYWNrYWdlUGF0aCA9IGpvaW4oYXBwUGF0aCwgcGFja2FnZURldGFpbHMucGF0aClcclxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKHBhY2thZ2VQYXRoLCBcInBhY2thZ2UuanNvblwiKVxyXG5cclxuICBpZiAoIWV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xyXG4gICAgcHJpbnROb1BhY2thZ2VGb3VuZEVycm9yKHBhY2thZ2VQYXRoU3BlY2lmaWVyLCBwYWNrYWdlSnNvblBhdGgpXHJcbiAgICBwcm9jZXNzLmV4aXQoMSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHRtcFJlcG8gPSBkaXJTeW5jKHsgdW5zYWZlQ2xlYW51cDogdHJ1ZSB9KVxyXG4gIGNvbnN0IHRtcFJlcG9QYWNrYWdlUGF0aCA9IGpvaW4odG1wUmVwby5uYW1lLCBwYWNrYWdlRGV0YWlscy5wYXRoKVxyXG4gIGNvbnN0IHRtcFJlcG9OcG1Sb290ID0gdG1wUmVwb1BhY2thZ2VQYXRoLnNsaWNlKFxyXG4gICAgMCxcclxuICAgIC1gL25vZGVfbW9kdWxlcy8ke3BhY2thZ2VEZXRhaWxzLm5hbWV9YC5sZW5ndGgsXHJcbiAgKVxyXG5cclxuICBjb25zdCB0bXBSZXBvUGFja2FnZUpzb25QYXRoID0gam9pbih0bXBSZXBvTnBtUm9vdCwgXCJwYWNrYWdlLmpzb25cIilcclxuXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHBhdGNoZXNEaXIgPSByZXNvbHZlKGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIpKVxyXG5cclxuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmV5KFwi4oCiXCIpLCBcIkNyZWF0aW5nIHRlbXBvcmFyeSBmb2xkZXJcIilcclxuXHJcbiAgICAvLyBtYWtlIGEgYmxhbmsgcGFja2FnZS5qc29uXHJcbiAgICBta2RpcnBTeW5jKHRtcFJlcG9OcG1Sb290KVxyXG4gICAgd3JpdGVGaWxlU3luYyhcclxuICAgICAgdG1wUmVwb1BhY2thZ2VKc29uUGF0aCxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIGRlcGVuZGVuY2llczoge1xyXG4gICAgICAgICAgW3BhY2thZ2VEZXRhaWxzLm5hbWVdOiBnZXRQYWNrYWdlUmVzb2x1dGlvbih7XHJcbiAgICAgICAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICAgICAgICBwYWNrYWdlTWFuYWdlcixcclxuICAgICAgICAgICAgYXBwUGF0aCxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzb2x1dGlvbnM6IHJlc29sdmVSZWxhdGl2ZUZpbGVEZXBlbmRlbmNpZXMoXHJcbiAgICAgICAgICBhcHBQYXRoLFxyXG4gICAgICAgICAgYXBwUGFja2FnZUpzb24ucmVzb2x1dGlvbnMgfHwge30sXHJcbiAgICAgICAgKSxcclxuICAgICAgfSksXHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgcGFja2FnZVZlcnNpb24gPSBnZXRQYWNrYWdlVmVyc2lvbihcclxuICAgICAgam9pbihyZXNvbHZlKHBhY2thZ2VEZXRhaWxzLnBhdGgpLCBcInBhY2thZ2UuanNvblwiKSxcclxuICAgIClcclxuXHJcbiAgICAvLyBjb3B5IC5ucG1yYy8ueWFybnJjIGluIGNhc2UgcGFja2FnZXMgYXJlIGhvc3RlZCBpbiBwcml2YXRlIHJlZ2lzdHJ5XHJcbiAgICAvLyBjb3B5IC55YXJuIGRpcmVjdG9yeSBhcyB3ZWxsIHRvIGVuc3VyZSBpbnN0YWxsYXRpb25zIHdvcmsgaW4geWFybiAyXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YWxpZ25cclxuICAgIDtbXCIubnBtcmNcIiwgXCIueWFybnJjXCIsIFwiLnlhcm5cIl0uZm9yRWFjaCgocmNGaWxlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJjUGF0aCA9IGpvaW4oYXBwUGF0aCwgcmNGaWxlKVxyXG4gICAgICBpZiAoZXhpc3RzU3luYyhyY1BhdGgpKSB7XHJcbiAgICAgICAgY29weVN5bmMocmNQYXRoLCBqb2luKHRtcFJlcG8ubmFtZSwgcmNGaWxlKSwgeyBkZXJlZmVyZW5jZTogdHJ1ZSB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gXCJ5YXJuXCIpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFxyXG4gICAgICAgIGNoYWxrLmdyZXkoXCLigKJcIiksXHJcbiAgICAgICAgYEluc3RhbGxpbmcgJHtwYWNrYWdlRGV0YWlscy5uYW1lfUAke3BhY2thZ2VWZXJzaW9ufSB3aXRoIHlhcm5gLFxyXG4gICAgICApXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gdHJ5IGZpcnN0IHdpdGhvdXQgaWdub3Jpbmcgc2NyaXB0cyBpbiBjYXNlIHRoZXkgYXJlIHJlcXVpcmVkXHJcbiAgICAgICAgLy8gdGhpcyB3b3JrcyBpbiA5OS45OSUgb2YgY2FzZXNcclxuICAgICAgICBzcGF3blNhZmVTeW5jKGB5YXJuYCwgW1wiaW5zdGFsbFwiLCBcIi0taWdub3JlLWVuZ2luZXNcIl0sIHtcclxuICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXHJcbiAgICAgICAgICBsb2dTdGRFcnJPbkVycm9yOiBmYWxzZSxcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gdHJ5IGFnYWluIHdoaWxlIGlnbm9yaW5nIHNjcmlwdHMgaW4gY2FzZSB0aGUgc2NyaXB0IGRlcGVuZHMgb25cclxuICAgICAgICAvLyBhbiBpbXBsaWNpdCBjb250ZXh0IHdoaWNoIHdlIGhhdmVuJ3QgcmVwcm9kdWNlZFxyXG4gICAgICAgIHNwYXduU2FmZVN5bmMoXHJcbiAgICAgICAgICBgeWFybmAsXHJcbiAgICAgICAgICBbXCJpbnN0YWxsXCIsIFwiLS1pZ25vcmUtZW5naW5lc1wiLCBcIi0taWdub3JlLXNjcmlwdHNcIl0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gXCJidW5cIikge1xyXG4gICAgICBjb25zb2xlLmluZm8oXHJcbiAgICAgICAgY2hhbGsuZ3JleShcIuKAolwiKSxcclxuICAgICAgICBgSW5zdGFsbGluZyAke3BhY2thZ2VEZXRhaWxzLm5hbWV9QCR7cGFja2FnZVZlcnNpb259IHdpdGggYnVuYCxcclxuICAgICAgKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHNwYXduU2FmZVN5bmMoYGJ1bmAsIFtcImluc3RhbGxcIl0sIHtcclxuICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXHJcbiAgICAgICAgICBsb2dTdGRFcnJPbkVycm9yOiBmYWxzZSxcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgc3Bhd25TYWZlU3luYyhgYnVuYCwgW1wiaW5zdGFsbFwiLCBcIi0tbm8tc2F2ZVwiXSwge1xyXG4gICAgICAgICAgY3dkOiB0bXBSZXBvTnBtUm9vdCxcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmluZm8oXHJcbiAgICAgICAgY2hhbGsuZ3JleShcIuKAolwiKSxcclxuICAgICAgICBgSW5zdGFsbGluZyAke3BhY2thZ2VEZXRhaWxzLm5hbWV9QCR7cGFja2FnZVZlcnNpb259IHdpdGggbnBtYCxcclxuICAgICAgKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIHRyeSBmaXJzdCB3aXRob3V0IGlnbm9yaW5nIHNjcmlwdHMgaW4gY2FzZSB0aGV5IGFyZSByZXF1aXJlZFxyXG4gICAgICAgIC8vIHRoaXMgd29ya3MgaW4gOTkuOTklIG9mIGNhc2VzXHJcbiAgICAgICAgc3Bhd25TYWZlU3luYyhgbnBtYCwgW1wiaVwiLCBcIi0tZm9yY2VcIl0sIHtcclxuICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXHJcbiAgICAgICAgICBsb2dTdGRFcnJPbkVycm9yOiBmYWxzZSxcclxuICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyB0cnkgYWdhaW4gd2hpbGUgaWdub3Jpbmcgc2NyaXB0cyBpbiBjYXNlIHRoZSBzY3JpcHQgZGVwZW5kcyBvblxyXG4gICAgICAgIC8vIGFuIGltcGxpY2l0IGNvbnRleHQgd2hpY2ggd2UgaGF2ZW4ndCByZXByb2R1Y2VkXHJcbiAgICAgICAgc3Bhd25TYWZlU3luYyhgbnBtYCwgW1wiaVwiLCBcIi0taWdub3JlLXNjcmlwdHNcIiwgXCItLWZvcmNlXCJdLCB7XHJcbiAgICAgICAgICBjd2Q6IHRtcFJlcG9OcG1Sb290LFxyXG4gICAgICAgICAgc3RkaW86IFwiaWdub3JlXCIsXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdpdCA9ICguLi5hcmdzOiBzdHJpbmdbXSkgPT5cclxuICAgICAgc3Bhd25TYWZlU3luYyhcImdpdFwiLCBhcmdzLCB7XHJcbiAgICAgICAgY3dkOiB0bXBSZXBvLm5hbWUsXHJcbiAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBIT01FOiB0bXBSZXBvLm5hbWUgfSxcclxuICAgICAgICBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0ICogMTAwLFxyXG4gICAgICB9KVxyXG5cclxuICAgIC8vIHJlbW92ZSBuZXN0ZWQgbm9kZV9tb2R1bGVzIGp1c3QgdG8gYmUgc2FmZVxyXG4gICAgcmVtb3ZlU3luYyhqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgXCJub2RlX21vZHVsZXNcIikpXHJcbiAgICAvLyByZW1vdmUgLmdpdCBqdXN0IHRvIGJlIHNhZmVcclxuICAgIHJlbW92ZVN5bmMoam9pbih0bXBSZXBvUGFja2FnZVBhdGgsIFwiLmdpdFwiKSlcclxuICAgIC8vIHJlbW92ZSBwYXRjaC1wYWNrYWdlIHN0YXRlIGZpbGVcclxuICAgIHJlbW92ZVN5bmMoam9pbih0bXBSZXBvUGFja2FnZVBhdGgsIFNUQVRFX0ZJTEVfTkFNRSkpXHJcblxyXG4gICAgLy8gY29tbWl0IHRoZSBwYWNrYWdlXHJcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JleShcIuKAolwiKSwgXCJEaWZmaW5nIHlvdXIgZmlsZXMgd2l0aCBjbGVhbiBmaWxlc1wiKVxyXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKHRtcFJlcG8ubmFtZSwgXCIuZ2l0aWdub3JlXCIpLCBcIiEvbm9kZV9tb2R1bGVzXFxuXFxuXCIpXHJcbiAgICBnaXQoXCJpbml0XCIpXHJcbiAgICBnaXQoXCJjb25maWdcIiwgXCItLWxvY2FsXCIsIFwidXNlci5uYW1lXCIsIFwicGF0Y2gtcGFja2FnZVwiKVxyXG4gICAgZ2l0KFwiY29uZmlnXCIsIFwiLS1sb2NhbFwiLCBcInVzZXIuZW1haWxcIiwgXCJwYXRjaEBwYWNrLmFnZVwiKVxyXG5cclxuICAgIC8vIHJlbW92ZSBpZ25vcmVkIGZpbGVzIGZpcnN0XHJcbiAgICByZW1vdmVJZ25vcmVkRmlsZXModG1wUmVwb1BhY2thZ2VQYXRoLCBpbmNsdWRlUGF0aHMsIGV4Y2x1ZGVQYXRocylcclxuXHJcbiAgICBmb3IgKGNvbnN0IHBhdGNoRGV0YWlscyBvZiBwYXRjaGVzVG9BcHBseUJlZm9yZURpZmZpbmcpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgICFhcHBseVBhdGNoKHtcclxuICAgICAgICAgIHBhdGNoRGV0YWlscyxcclxuICAgICAgICAgIHBhdGNoRGlyLFxyXG4gICAgICAgICAgcGF0Y2hGaWxlUGF0aDogam9pbihhcHBQYXRoLCBwYXRjaERpciwgcGF0Y2hEZXRhaWxzLnBhdGNoRmlsZW5hbWUpLFxyXG4gICAgICAgICAgcmV2ZXJzZTogZmFsc2UsXHJcbiAgICAgICAgICBjd2Q6IHRtcFJlcG8ubmFtZSxcclxuICAgICAgICAgIGJlc3RFZmZvcnQ6IGZhbHNlLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICkge1xyXG4gICAgICAgIC8vIFRPRE86IGFkZCBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBvbmNlIC0tcmViYXNlIGlzIGltcGxlbWVudGVkXHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICBgRmFpbGVkIHRvIGFwcGx5IHBhdGNoICR7cGF0Y2hEZXRhaWxzLnBhdGNoRmlsZW5hbWV9IHRvICR7cGFja2FnZURldGFpbHMucGF0aFNwZWNpZmllcn1gLFxyXG4gICAgICAgIClcclxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2l0KFwiYWRkXCIsIFwiLWZcIiwgcGFja2FnZURldGFpbHMucGF0aClcclxuICAgIGdpdChcImNvbW1pdFwiLCBcIi0tYWxsb3ctZW1wdHlcIiwgXCItbVwiLCBcImluaXRcIilcclxuXHJcbiAgICAvLyByZXBsYWNlIHBhY2thZ2Ugd2l0aCB1c2VyJ3MgdmVyc2lvblxyXG4gICAgcmVtb3ZlU3luYyh0bXBSZXBvUGFja2FnZVBhdGgpXHJcblxyXG4gICAgLy8gcG5wbSBpbnN0YWxscyBwYWNrYWdlcyBhcyBzeW1saW5rcywgY29weVN5bmMgd291bGQgY29weSBvbmx5IHRoZSBzeW1saW5rXHJcbiAgICBjb3B5U3luYyhyZWFscGF0aFN5bmMocGFja2FnZVBhdGgpLCB0bXBSZXBvUGFja2FnZVBhdGgpXHJcblxyXG4gICAgLy8gcmVtb3ZlIG5lc3RlZCBub2RlX21vZHVsZXMganVzdCB0byBiZSBzYWZlXHJcbiAgICByZW1vdmVTeW5jKGpvaW4odG1wUmVwb1BhY2thZ2VQYXRoLCBcIm5vZGVfbW9kdWxlc1wiKSlcclxuICAgIC8vIHJlbW92ZSAuZ2l0IGp1c3QgdG8gYmUgc2FmZVxyXG4gICAgcmVtb3ZlU3luYyhqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgXCIuZ2l0XCIpKVxyXG4gICAgLy8gcmVtb3ZlIHBhdGNoLXBhY2thZ2Ugc3RhdGUgZmlsZVxyXG4gICAgcmVtb3ZlU3luYyhqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgU1RBVEVfRklMRV9OQU1FKSlcclxuXHJcbiAgICAvLyBhbHNvIHJlbW92ZSBpZ25vcmVkIGZpbGVzIGxpa2UgYmVmb3JlXHJcbiAgICByZW1vdmVJZ25vcmVkRmlsZXModG1wUmVwb1BhY2thZ2VQYXRoLCBpbmNsdWRlUGF0aHMsIGV4Y2x1ZGVQYXRocylcclxuXHJcbiAgICAvLyBzdGFnZSBhbGwgZmlsZXNcclxuICAgIGdpdChcImFkZFwiLCBcIi1mXCIsIHBhY2thZ2VEZXRhaWxzLnBhdGgpXHJcblxyXG4gICAgLy8gZ2V0IGRpZmYgb2YgY2hhbmdlc1xyXG4gICAgY29uc3QgZGlmZlJlc3VsdCA9IGdpdChcclxuICAgICAgXCJkaWZmXCIsXHJcbiAgICAgIFwiLS1jYWNoZWRcIixcclxuICAgICAgXCItLW5vLWNvbG9yXCIsXHJcbiAgICAgIFwiLS1pZ25vcmUtc3BhY2UtYXQtZW9sXCIsXHJcbiAgICAgIFwiLS1uby1leHQtZGlmZlwiLFxyXG4gICAgICBcIi0tc3JjLXByZWZpeD1hL1wiLFxyXG4gICAgICBcIi0tZHN0LXByZWZpeD1iL1wiLFxyXG4gICAgKVxyXG5cclxuICAgIGlmIChkaWZmUmVzdWx0LnN0ZG91dC5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgYOKBie+4jyAgTm90IGNyZWF0aW5nIHBhdGNoIGZpbGUgZm9yIHBhY2thZ2UgJyR7cGFja2FnZVBhdGhTcGVjaWZpZXJ9J2AsXHJcbiAgICAgIClcclxuICAgICAgY29uc29sZS5sb2coYOKBie+4jyAgVGhlcmUgZG9uJ3QgYXBwZWFyIHRvIGJlIGFueSBjaGFuZ2VzLmApXHJcbiAgICAgIGlmIChpc1JlYmFzaW5nICYmIG1vZGUudHlwZSA9PT0gXCJvdmVyd3JpdGVfbGFzdFwiKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICBcIlxcbvCfkqEgVG8gcmVtb3ZlIGEgcGF0Y2ggZmlsZSwgZGVsZXRlIGl0IGFuZCB0aGVuIHJlaW5zdGFsbCBub2RlX21vZHVsZXMgZnJvbSBzY3JhdGNoLlwiLFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcGFyc2VQYXRjaEZpbGUoZGlmZlJlc3VsdC5zdGRvdXQudG9TdHJpbmcoKSlcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIChlIGFzIEVycm9yKS5tZXNzYWdlLmluY2x1ZGVzKFwiVW5leHBlY3RlZCBmaWxlIG1vZGUgc3RyaW5nOiAxMjAwMDBcIilcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFxyXG7im5TvuI8gJHtjaGFsay5yZWQuYm9sZChcIkVSUk9SXCIpfVxyXG5cclxuICBZb3VyIGNoYW5nZXMgaW52b2x2ZSBjcmVhdGluZyBzeW1saW5rcy4gcGF0Y2gtcGFja2FnZSBkb2VzIG5vdCB5ZXQgc3VwcG9ydFxyXG4gIHN5bWxpbmtzLlxyXG5cclxuICDvuI9QbGVhc2UgdXNlICR7Y2hhbGsuYm9sZChcIi0taW5jbHVkZVwiKX0gYW5kL29yICR7Y2hhbGsuYm9sZChcclxuICAgIFwiLS1leGNsdWRlXCIsXHJcbiAgKX0gdG8gbmFycm93IHRoZSBzY29wZSBvZiB5b3VyIHBhdGNoIGlmXHJcbiAgdGhpcyB3YXMgdW5pbnRlbnRpb25hbC5cclxuYClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBvdXRQYXRoID0gXCIuL3BhdGNoLXBhY2thZ2UtZXJyb3IuanNvbi5nelwiXHJcbiAgICAgICAgd3JpdGVGaWxlU3luYyhcclxuICAgICAgICAgIG91dFBhdGgsXHJcbiAgICAgICAgICBnemlwU3luYyhcclxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgIGVycm9yOiB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAoZSBhcyBFcnJvcikubWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHN0YWNrOiAoZSBhcyBFcnJvcikuc3RhY2ssXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwYXRjaDogZGlmZlJlc3VsdC5zdGRvdXQudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgIClcclxuICAgICAgICBjb25zb2xlLmxvZyhgXHJcbuKblO+4jyAke2NoYWxrLnJlZC5ib2xkKFwiRVJST1JcIil9XHJcblxyXG4gIHBhdGNoLXBhY2thZ2Ugd2FzIHVuYWJsZSB0byByZWFkIHRoZSBwYXRjaC1maWxlIG1hZGUgYnkgZ2l0LiBUaGlzIHNob3VsZCBub3RcclxuICBoYXBwZW4uXHJcblxyXG4gIEEgZGlhZ25vc3RpYyBmaWxlIHdhcyB3cml0dGVuIHRvXHJcblxyXG4gICAgJHtvdXRQYXRofVxyXG5cclxuICBQbGVhc2UgYXR0YWNoIGl0IHRvIGEgZ2l0aHViIGlzc3VlXHJcblxyXG4gICAgaHR0cHM6Ly9naXRodWIuY29tL2RzMzAwL3BhdGNoLXBhY2thZ2UvaXNzdWVzL25ldz90aXRsZT1OZXcrcGF0Y2grcGFyc2UrZmFpbGVkJmJvZHk9UGxlYXNlK2F0dGFjaCt0aGUrZGlhZ25vc3RpYytmaWxlK2J5K2RyYWdnaW5nK2l0K2ludG8raGVyZSvwn5mPXHJcblxyXG4gIE5vdGUgdGhhdCB0aGlzIGRpYWdub3N0aWMgZmlsZSB3aWxsIGNvbnRhaW4gY29kZSBmcm9tIHRoZSBwYWNrYWdlIHlvdSB3ZXJlXHJcbiAgYXR0ZW1wdGluZyB0byBwYXRjaC5cclxuXHJcbmApXHJcbiAgICAgIH1cclxuICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vIG1heWJlIGRlbGV0ZSBleGlzdGluZ1xyXG4gICAgaWYgKG1vZGUudHlwZSA9PT0gXCJhcHBlbmRcIiAmJiAhaXNSZWJhc2luZyAmJiBleGlzdGluZ1BhdGNoZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIC8vIGlmIHdlIGFyZSBhcHBlbmRpbmcgdG8gYW4gZXhpc3RpbmcgcGF0Y2ggdGhhdCBkb2Vzbid0IGhhdmUgYSBzZXF1ZW5jZSBudW1iZXIgbGV0J3MgcmVuYW1lIGl0XHJcbiAgICAgIGNvbnN0IHByZXZQYXRjaCA9IGV4aXN0aW5nUGF0Y2hlc1swXVxyXG4gICAgICBpZiAocHJldlBhdGNoLnNlcXVlbmNlTnVtYmVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBuZXdGaWxlTmFtZSA9IGNyZWF0ZVBhdGNoRmlsZU5hbWUoe1xyXG4gICAgICAgICAgcGFja2FnZURldGFpbHMsXHJcbiAgICAgICAgICBwYWNrYWdlVmVyc2lvbixcclxuICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiAxLFxyXG4gICAgICAgICAgc2VxdWVuY2VOYW1lOiBwcmV2UGF0Y2guc2VxdWVuY2VOYW1lID8/IFwiaW5pdGlhbFwiLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3Qgb2xkUGF0aCA9IGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIsIHByZXZQYXRjaC5wYXRjaEZpbGVuYW1lKVxyXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBqb2luKGFwcFBhdGgsIHBhdGNoRGlyLCBuZXdGaWxlTmFtZSlcclxuICAgICAgICByZW5hbWVTeW5jKG9sZFBhdGgsIG5ld1BhdGgpXHJcbiAgICAgICAgcHJldlBhdGNoLnNlcXVlbmNlTnVtYmVyID0gMVxyXG4gICAgICAgIHByZXZQYXRjaC5wYXRjaEZpbGVuYW1lID0gbmV3RmlsZU5hbWVcclxuICAgICAgICBwcmV2UGF0Y2guc2VxdWVuY2VOYW1lID0gcHJldlBhdGNoLnNlcXVlbmNlTmFtZSA/PyBcImluaXRpYWxcIlxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGFzdFBhdGNoID0gZXhpc3RpbmdQYXRjaGVzW1xyXG4gICAgICBzdGF0ZSA/IHN0YXRlLnBhdGNoZXMubGVuZ3RoIC0gMSA6IGV4aXN0aW5nUGF0Y2hlcy5sZW5ndGggLSAxXHJcbiAgICBdIGFzIFBhdGNoZWRQYWNrYWdlRGV0YWlscyB8IHVuZGVmaW5lZFxyXG4gICAgY29uc3Qgc2VxdWVuY2VOYW1lID1cclxuICAgICAgbW9kZS50eXBlID09PSBcImFwcGVuZFwiID8gbW9kZS5uYW1lIDogbGFzdFBhdGNoPy5zZXF1ZW5jZU5hbWVcclxuICAgIGNvbnN0IHNlcXVlbmNlTnVtYmVyID1cclxuICAgICAgbW9kZS50eXBlID09PSBcImFwcGVuZFwiXHJcbiAgICAgICAgPyAobGFzdFBhdGNoPy5zZXF1ZW5jZU51bWJlciA/PyAwKSArIDFcclxuICAgICAgICA6IGxhc3RQYXRjaD8uc2VxdWVuY2VOdW1iZXJcclxuXHJcbiAgICBjb25zdCBwYXRjaEZpbGVOYW1lID0gY3JlYXRlUGF0Y2hGaWxlTmFtZSh7XHJcbiAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICBwYWNrYWdlVmVyc2lvbixcclxuICAgICAgc2VxdWVuY2VOYW1lLFxyXG4gICAgICBzZXF1ZW5jZU51bWJlcixcclxuICAgIH0pXHJcblxyXG4gICAgY29uc3QgcGF0Y2hQYXRoOiBzdHJpbmcgPSBqb2luKHBhdGNoZXNEaXIsIHBhdGNoRmlsZU5hbWUpXHJcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlybmFtZShwYXRjaFBhdGgpKSkge1xyXG4gICAgICAvLyBzY29wZWQgcGFja2FnZVxyXG4gICAgICBta2RpclN5bmMoZGlybmFtZShwYXRjaFBhdGgpKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHdlIGFyZSBpbnNlcnRpbmcgYSBuZXcgcGF0Y2ggaW50byBhIHNlcXVlbmNlIHdlIG1vc3QgbGlrZWx5IG5lZWQgdG8gdXBkYXRlIHRoZSBzZXF1ZW5jZSBudW1iZXJzXHJcbiAgICBpZiAoaXNSZWJhc2luZyAmJiBtb2RlLnR5cGUgPT09IFwiYXBwZW5kXCIpIHtcclxuICAgICAgY29uc3QgcGF0Y2hlc1RvTnVkZ2UgPSBleGlzdGluZ1BhdGNoZXMuc2xpY2Uoc3RhdGUhLnBhdGNoZXMubGVuZ3RoKVxyXG4gICAgICBpZiAoc2VxdWVuY2VOdW1iZXIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInNlcXVlbmNlTnVtYmVyIGlzIHVuZGVmaW5lZCB3aGlsZSByZWJhc2luZ1wiKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwYXRjaGVzVG9OdWRnZVswXT8uc2VxdWVuY2VOdW1iZXIgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgIHBhdGNoZXNUb051ZGdlWzBdLnNlcXVlbmNlTnVtYmVyIDw9IHNlcXVlbmNlTnVtYmVyXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBuZXh0ID0gc2VxdWVuY2VOdW1iZXIgKyAxXHJcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhdGNoZXNUb051ZGdlKSB7XHJcbiAgICAgICAgICBjb25zdCBuZXdOYW1lID0gY3JlYXRlUGF0Y2hGaWxlTmFtZSh7XHJcbiAgICAgICAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICAgICAgICBwYWNrYWdlVmVyc2lvbixcclxuICAgICAgICAgICAgc2VxdWVuY2VOYW1lOiBwLnNlcXVlbmNlTmFtZSxcclxuICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXI6IG5leHQrKyxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgXCJSZW5hbWluZ1wiLFxyXG4gICAgICAgICAgICBjaGFsay5ib2xkKHAucGF0Y2hGaWxlbmFtZSksXHJcbiAgICAgICAgICAgIFwidG9cIixcclxuICAgICAgICAgICAgY2hhbGsuYm9sZChuZXdOYW1lKSxcclxuICAgICAgICAgIClcclxuICAgICAgICAgIGNvbnN0IG9sZFBhdGggPSBqb2luKGFwcFBhdGgsIHBhdGNoRGlyLCBwLnBhdGNoRmlsZW5hbWUpXHJcbiAgICAgICAgICBjb25zdCBuZXdQYXRoID0gam9pbihhcHBQYXRoLCBwYXRjaERpciwgbmV3TmFtZSlcclxuICAgICAgICAgIHJlbmFtZVN5bmMob2xkUGF0aCwgbmV3UGF0aClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB3cml0ZUZpbGVTeW5jKHBhdGNoUGF0aCwgZGlmZlJlc3VsdC5zdGRvdXQpXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYCR7Y2hhbGsuZ3JlZW4oXCLinJRcIil9IENyZWF0ZWQgZmlsZSAke2pvaW4ocGF0Y2hEaXIsIHBhdGNoRmlsZU5hbWUpfVxcbmAsXHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgcHJldlN0YXRlOiBQYXRjaFN0YXRlW10gPSBwYXRjaGVzVG9BcHBseUJlZm9yZURpZmZpbmcubWFwKFxyXG4gICAgICAocCk6IFBhdGNoU3RhdGUgPT4gKHtcclxuICAgICAgICBwYXRjaEZpbGVuYW1lOiBwLnBhdGNoRmlsZW5hbWUsXHJcbiAgICAgICAgZGlkQXBwbHk6IHRydWUsXHJcbiAgICAgICAgcGF0Y2hDb250ZW50SGFzaDogaGFzaEZpbGUoam9pbihhcHBQYXRoLCBwYXRjaERpciwgcC5wYXRjaEZpbGVuYW1lKSksXHJcbiAgICAgIH0pLFxyXG4gICAgKVxyXG4gICAgY29uc3QgbmV4dFN0YXRlOiBQYXRjaFN0YXRlW10gPSBbXHJcbiAgICAgIC4uLnByZXZTdGF0ZSxcclxuICAgICAge1xyXG4gICAgICAgIHBhdGNoRmlsZW5hbWU6IHBhdGNoRmlsZU5hbWUsXHJcbiAgICAgICAgZGlkQXBwbHk6IHRydWUsXHJcbiAgICAgICAgcGF0Y2hDb250ZW50SGFzaDogaGFzaEZpbGUocGF0Y2hQYXRoKSxcclxuICAgICAgfSxcclxuICAgIF1cclxuXHJcbiAgICAvLyBpZiBhbnkgcGF0Y2hlcyBjb21lIGFmdGVyIHRoaXMgb25lIHdlIGp1c3QgbWFkZSwgd2Ugc2hvdWxkIHJlYXBwbHkgdGhlbVxyXG4gICAgbGV0IGRpZEZhaWxXaGlsZUZpbmlzaGluZ1JlYmFzZSA9IGZhbHNlXHJcbiAgICBpZiAoaXNSZWJhc2luZykge1xyXG4gICAgICBjb25zdCBjdXJyZW50UGF0Y2hlcyA9IGdldEdyb3VwZWRQYXRjaGVzKGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIpKVxyXG4gICAgICAgIC5wYXRoU3BlY2lmaWVyVG9QYXRjaEZpbGVzW3BhY2thZ2VEZXRhaWxzLnBhdGhTcGVjaWZpZXJdXHJcblxyXG4gICAgICBjb25zdCBwcmV2aW91c2x5VW5hcHBsaWVkUGF0Y2hlcyA9IGN1cnJlbnRQYXRjaGVzLnNsaWNlKG5leHRTdGF0ZS5sZW5ndGgpXHJcbiAgICAgIGlmIChwcmV2aW91c2x5VW5hcHBsaWVkUGF0Y2hlcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgRmFzdCBmb3J3YXJkaW5nLi4uYClcclxuICAgICAgICBmb3IgKGNvbnN0IHBhdGNoIG9mIHByZXZpb3VzbHlVbmFwcGxpZWRQYXRjaGVzKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXRjaEZpbGVQYXRoID0gam9pbihhcHBQYXRoLCBwYXRjaERpciwgcGF0Y2gucGF0Y2hGaWxlbmFtZSlcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgIWFwcGx5UGF0Y2goe1xyXG4gICAgICAgICAgICAgIHBhdGNoRGV0YWlsczogcGF0Y2gsXHJcbiAgICAgICAgICAgICAgcGF0Y2hEaXIsXHJcbiAgICAgICAgICAgICAgcGF0Y2hGaWxlUGF0aCxcclxuICAgICAgICAgICAgICByZXZlcnNlOiBmYWxzZSxcclxuICAgICAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXHJcbiAgICAgICAgICAgICAgYmVzdEVmZm9ydDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZGlkRmFpbFdoaWxlRmluaXNoaW5nUmViYXNlID0gdHJ1ZVxyXG4gICAgICAgICAgICBsb2dQYXRjaFNlcXVlbmNlRXJyb3IoeyBwYXRjaERldGFpbHM6IHBhdGNoIH0pXHJcbiAgICAgICAgICAgIG5leHRTdGF0ZS5wdXNoKHtcclxuICAgICAgICAgICAgICBwYXRjaEZpbGVuYW1lOiBwYXRjaC5wYXRjaEZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgIGRpZEFwcGx5OiBmYWxzZSxcclxuICAgICAgICAgICAgICBwYXRjaENvbnRlbnRIYXNoOiBoYXNoRmlsZShwYXRjaEZpbGVQYXRoKSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Y2hhbGsuZ3JlZW4oXCLinJRcIil9ICR7cGF0Y2gucGF0Y2hGaWxlbmFtZX1gKVxyXG4gICAgICAgICAgICBuZXh0U3RhdGUucHVzaCh7XHJcbiAgICAgICAgICAgICAgcGF0Y2hGaWxlbmFtZTogcGF0Y2gucGF0Y2hGaWxlbmFtZSxcclxuICAgICAgICAgICAgICBkaWRBcHBseTogdHJ1ZSxcclxuICAgICAgICAgICAgICBwYXRjaENvbnRlbnRIYXNoOiBoYXNoRmlsZShwYXRjaEZpbGVQYXRoKSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNSZWJhc2luZyB8fCBudW1QYXRjaGVzQWZ0ZXJDcmVhdGUgPiAxKSB7XHJcbiAgICAgIHNhdmVQYXRjaEFwcGxpY2F0aW9uU3RhdGUoe1xyXG4gICAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICAgIHBhdGNoZXM6IG5leHRTdGF0ZSxcclxuICAgICAgICBpc1JlYmFzaW5nOiBkaWRGYWlsV2hpbGVGaW5pc2hpbmdSZWJhc2UsXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjbGVhclBhdGNoQXBwbGljYXRpb25TdGF0ZShwYWNrYWdlRGV0YWlscylcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2FuQ3JlYXRlSXNzdWUpIHtcclxuICAgICAgaWYgKGNyZWF0ZUlzc3VlKSB7XHJcbiAgICAgICAgb3Blbklzc3VlQ3JlYXRpb25MaW5rKHtcclxuICAgICAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICAgICAgcGF0Y2hGaWxlQ29udGVudHM6IGRpZmZSZXN1bHQuc3Rkb3V0LnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBwYWNrYWdlVmVyc2lvbixcclxuICAgICAgICAgIHBhdGNoUGF0aCxcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1heWJlUHJpbnRJc3N1ZUNyZWF0aW9uUHJvbXB0KHZjcywgcGFja2FnZURldGFpbHMsIHBhY2thZ2VNYW5hZ2VyKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgY29uc29sZS5sb2coZSlcclxuICAgIHRocm93IGVcclxuICB9IGZpbmFsbHkge1xyXG4gICAgdG1wUmVwby5yZW1vdmVDYWxsYmFjaygpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVQYXRjaEZpbGVOYW1lKHtcclxuICBwYWNrYWdlRGV0YWlscyxcclxuICBwYWNrYWdlVmVyc2lvbixcclxuICBzZXF1ZW5jZU51bWJlcixcclxuICBzZXF1ZW5jZU5hbWUsXHJcbn06IHtcclxuICBwYWNrYWdlRGV0YWlsczogUGFja2FnZURldGFpbHNcclxuICBwYWNrYWdlVmVyc2lvbjogc3RyaW5nXHJcbiAgc2VxdWVuY2VOdW1iZXI/OiBudW1iZXJcclxuICBzZXF1ZW5jZU5hbWU/OiBzdHJpbmdcclxufSkge1xyXG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IHBhY2thZ2VEZXRhaWxzLnBhY2thZ2VOYW1lc1xyXG4gICAgLm1hcCgobmFtZSkgPT4gbmFtZS5yZXBsYWNlKC9cXC8vZywgXCIrXCIpKVxyXG4gICAgLmpvaW4oXCIrK1wiKVxyXG5cclxuICBjb25zdCBuYW1lQW5kVmVyc2lvbiA9IGAke3BhY2thZ2VOYW1lc30rJHtwYWNrYWdlVmVyc2lvbn1gXHJcbiAgY29uc3QgbnVtID1cclxuICAgIHNlcXVlbmNlTnVtYmVyID09PSB1bmRlZmluZWRcclxuICAgICAgPyBcIlwiXHJcbiAgICAgIDogYCske3NlcXVlbmNlTnVtYmVyLnRvU3RyaW5nKCkucGFkU3RhcnQoMywgXCIwXCIpfWBcclxuICBjb25zdCBuYW1lID0gIXNlcXVlbmNlTmFtZSA/IFwiXCIgOiBgKyR7c2VxdWVuY2VOYW1lfWBcclxuXHJcbiAgcmV0dXJuIGAke25hbWVBbmRWZXJzaW9ufSR7bnVtfSR7bmFtZX0ucGF0Y2hgXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2dQYXRjaFNlcXVlbmNlRXJyb3Ioe1xyXG4gIHBhdGNoRGV0YWlscyxcclxufToge1xyXG4gIHBhdGNoRGV0YWlsczogUGF0Y2hlZFBhY2thZ2VEZXRhaWxzXHJcbn0pIHtcclxuICBjb25zb2xlLmxvZyhgXHJcbiR7Y2hhbGsucmVkLmJvbGQoXCLim5QgRVJST1JcIil9XHJcblxyXG5GYWlsZWQgdG8gYXBwbHkgcGF0Y2ggZmlsZSAke2NoYWxrLmJvbGQocGF0Y2hEZXRhaWxzLnBhdGNoRmlsZW5hbWUpfS5cclxuXHJcbklmIHRoaXMgcGF0Y2ggZmlsZSBpcyBubyBsb25nZXIgdXNlZnVsLCBkZWxldGUgaXQgYW5kIHJ1blxyXG5cclxuICAke2NoYWxrLmJvbGQoYHBhdGNoLXBhY2thZ2VgKX1cclxuXHJcblRvIHBhcnRpYWxseSBhcHBseSB0aGUgcGF0Y2ggKGlmIHBvc3NpYmxlKSBhbmQgb3V0cHV0IGEgbG9nIG9mIGVycm9ycyB0byBmaXgsIHJ1blxyXG5cclxuICAke2NoYWxrLmJvbGQoYHBhdGNoLXBhY2thZ2UgLS1wYXJ0aWFsYCl9XHJcblxyXG5BZnRlciB3aGljaCB5b3Ugc2hvdWxkIG1ha2UgYW55IHJlcXVpcmVkIGNoYW5nZXMgaW5zaWRlICR7XHJcbiAgICBwYXRjaERldGFpbHMucGF0aFxyXG4gIH0sIGFuZCBmaW5hbGx5IHJ1blxyXG5cclxuICAke2NoYWxrLmJvbGQoYHBhdGNoLXBhY2thZ2UgJHtwYXRjaERldGFpbHMucGF0aFNwZWNpZmllcn1gKX1cclxuXHJcbnRvIHVwZGF0ZSB0aGUgcGF0Y2ggZmlsZS5cclxuYClcclxufVxyXG4iXX0=
478
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZVBhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ha2VQYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXlEQSw4QkF5aUJDO0FBMkJELHNEQTBCQztBQXZwQkQsa0RBQXlCO0FBQ3pCLHNEQUE2QjtBQUM3QiwyQkFBK0I7QUFDL0IsdUNBUWlCO0FBQ2pCLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsaURBQTJDO0FBQzNDLCtDQUtzQjtBQUV0QiwrQ0FBa0Q7QUFDbEQsaUVBQTZEO0FBQzdELDZDQUFvRTtBQUNwRSwyREFBdUQ7QUFDdkQsaUNBQWlDO0FBQ2pDLHFEQUl5QjtBQUN6Qix5Q0FBOEM7QUFDOUMsdUNBQTZDO0FBQzdDLGlDQUErQztBQUMvQyx1RkFBbUY7QUFDbkYsMkNBQTJDO0FBQzNDLDJDQU9vQjtBQUVwQixTQUFTLHdCQUF3QixDQUMvQixXQUFtQixFQUNuQixlQUF1QjtJQUV2QixpQkFBTyxDQUFDLEdBQUcsQ0FDVCxtQkFBbUIsV0FBVzs7b0JBRWQsZUFBZSxFQUFFLENBQ2xDLENBQUE7QUFDSCxDQUFDO0FBRU0sS0FBSyxVQUFVLFNBQVMsQ0FBQyxFQUM5QixvQkFBb0IsRUFDcEIsT0FBTyxFQUNQLGNBQWMsRUFDZCxZQUFZLEVBQ1osWUFBWSxFQUNaLFFBQVEsRUFDUixXQUFXLEVBQ1gsSUFBSSxFQUNKLE1BQU0sR0FBRyxLQUFLLEdBV2Y7SUFDQyxNQUFNLGNBQWMsR0FBRyxJQUFBLDZDQUE0QixFQUFDLG9CQUFvQixDQUFDLENBQUE7SUFFekUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BCLGlCQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLENBQUE7UUFDcEQsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxJQUFBLG9DQUF3QixFQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3RELE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxV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QztFQUNaLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7NkJBRUUsZUFBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDOzs7O0lBSS9ELGVBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDOzs7O0lBSTNCLGVBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUM7OzBEQUdyQyxZQUFZLENBQUMsSUFDZjs7SUFFRSxlQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7OztDQUc1RCxDQUFDLENBQUE7QUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiXG5pbXBvcnQgY29uc29sZSBmcm9tIFwiY29uc29sZVwiXG5pbXBvcnQgeyByZW5hbWVTeW5jIH0gZnJvbSBcImZzXCJcbmltcG9ydCB7XG4gIGNvcHlTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpcnBTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgcmVtb3ZlU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbn0gZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCB7IGRpclN5bmMgfSBmcm9tIFwidG1wXCJcbmltcG9ydCB7IGd6aXBTeW5jIH0gZnJvbSBcInpsaWJcIlxuaW1wb3J0IHsgYXBwbHlQYXRjaCB9IGZyb20gXCIuL2FwcGx5UGF0Y2hlc1wiXG5pbXBvcnQge1xuICBnZXRQYWNrYWdlVkNTRGV0YWlscyxcbiAgbWF5YmVQcmludElzc3VlQ3JlYXRpb25Qcm9tcHQsXG4gIG9wZW5Jc3N1ZUNyZWF0aW9uTGluayxcbiAgc2hvdWxkUmVjb21tZW5kSXNzdWUsXG59IGZyb20gXCIuL2NyZWF0ZUlzc3VlXCJcbmltcG9ydCB7IFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0UGFja2FnZU1hbmFnZXJcIlxuaW1wb3J0IHsgcmVtb3ZlSWdub3JlZEZpbGVzIH0gZnJvbSBcIi4vZmlsdGVyRmlsZXNcIlxuaW1wb3J0IHsgZ2V0UGFja2FnZVJlc29sdXRpb24gfSBmcm9tIFwiLi9nZXRQYWNrYWdlUmVzb2x1dGlvblwiXG5pbXBvcnQgeyBjcmVhdGVTdHJpY3RCYXNlbGluZSwgcHJ1bmVUb0Jhc2VsaW5lIH0gZnJvbSBcIi4vc3RyaWN0TW9kZVwiXG5pbXBvcnQgeyBnZXRQYWNrYWdlVmVyc2lvbiB9IGZyb20gXCIuL2dldFBhY2thZ2VWZXJzaW9uXCJcbmltcG9ydCB7IGhhc2hGaWxlIH0gZnJvbSBcIi4vaGFzaFwiXG5pbXBvcnQge1xuICBnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nLFxuICBQYWNrYWdlRGV0YWlscyxcbiAgUGF0Y2hlZFBhY2thZ2VEZXRhaWxzLFxufSBmcm9tIFwiLi9QYWNrYWdlRGV0YWlsc1wiXG5pbXBvcnQgeyBwYXJzZVBhdGNoRmlsZSB9IGZyb20gXCIuL3BhdGNoL3BhcnNlXCJcbmltcG9ydCB7IGdldEdyb3VwZWRQYXRjaGVzIH0gZnJvbSBcIi4vcGF0Y2hGc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIi4vcGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlUmVsYXRpdmVGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcIi4vcmVzb2x2ZVJlbGF0aXZlRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBzcGF3blNhZmVTeW5jIH0gZnJvbSBcIi4vc3Bhd25TYWZlXCJcbmltcG9ydCB7XG4gIGNsZWFyUGF0Y2hBcHBsaWNhdGlvblN0YXRlLFxuICBnZXRQYXRjaEFwcGxpY2F0aW9uU3RhdGUsXG4gIFBhdGNoU3RhdGUsXG4gIHNhdmVQYXRjaEFwcGxpY2F0aW9uU3RhdGUsXG4gIFNUQVRFX0ZJTEVfTkFNRSxcbiAgdmVyaWZ5QXBwbGllZFBhdGNoZXMsXG59IGZyb20gXCIuL3N0YXRlRmlsZVwiXG5cbmZ1bmN0aW9uIHByaW50Tm9QYWNrYWdlRm91bmRFcnJvcihcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgcGFja2FnZUpzb25QYXRoOiBzdHJpbmcsXG4pIHtcbiAgY29uc29sZS5sb2coXG4gICAgYE5vIHN1Y2ggcGFja2FnZSAke3BhY2thZ2VOYW1lfVxuXG4gIEZpbGUgbm90IGZvdW5kOiAke3BhY2thZ2VKc29uUGF0aH1gLFxuICApXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWtlUGF0Y2goe1xuICBwYWNrYWdlUGF0aFNwZWNpZmllcixcbiAgYXBwUGF0aCxcbiAgcGFja2FnZU1hbmFnZXIsXG4gIGluY2x1ZGVQYXRocyxcbiAgZXhjbHVkZVBhdGhzLFxuICBwYXRjaERpcixcbiAgY3JlYXRlSXNzdWUsXG4gIG1vZGUsXG4gIHN0cmljdCA9IGZhbHNlLFxufToge1xuICBwYWNrYWdlUGF0aFNwZWNpZmllcjogc3RyaW5nXG4gIGFwcFBhdGg6IHN0cmluZ1xuICBwYWNrYWdlTWFuYWdlcjogUGFja2FnZU1hbmFnZXJcbiAgaW5jbHVkZVBhdGhzOiBSZWdFeHBcbiAgZXhjbHVkZVBhdGhzOiBSZWdFeHBcbiAgcGF0Y2hEaXI6IHN0cmluZ1xuICBjcmVhdGVJc3N1ZTogYm9vbGVhblxuICBtb2RlOiB7IHR5cGU6IFwib3ZlcndyaXRlX2xhc3RcIiB9IHwgeyB0eXBlOiBcImFwcGVuZFwiOyBuYW1lPzogc3RyaW5nIH1cbiAgc3RyaWN0PzogYm9vbGVhblxufSkge1xuICBjb25zdCBwYWNrYWdlRGV0YWlscyA9IGdldFBhdGNoRGV0YWlsc0Zyb21DbGlTdHJpbmcocGFja2FnZVBhdGhTcGVjaWZpZXIpXG5cbiAgaWYgKCFwYWNrYWdlRGV0YWlscykge1xuICAgIGNvbnNvbGUubG9nKFwiTm8gc3VjaCBwYWNrYWdlXCIsIHBhY2thZ2VQYXRoU3BlY2lmaWVyKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSBnZXRQYXRjaEFwcGxpY2F0aW9uU3RhdGUocGFja2FnZURldGFpbHMpXG4gIGNvbnN0IGlzUmViYXNpbmcgPSBzdGF0ZT8uaXNSZWJhc2luZyA/PyBmYWxzZVxuXG4gIC8vIElmIHdlIGFyZSByZWJhc2luZyBhbmQgbm8gcGF0Y2hlcyBoYXZlIGJlZW4gYXBwbGllZCwgLS1hcHBlbmQgaXMgdGhlIG9ubHkgdmFsaWQgb3B0aW9uIGJlY2F1c2VcbiAgLy8gdGhlcmUgYXJlIG5vIHByZXZpb3VzIHBhdGNoZXMgdG8gb3ZlcndyaXRlL3VwZGF0ZVxuICBpZiAoXG4gICAgaXNSZWJhc2luZyAmJlxuICAgIHN0YXRlPy5wYXRjaGVzLmZpbHRlcigocCkgPT4gcC5kaWRBcHBseSkubGVuZ3RoID09PSAwICYmXG4gICAgbW9kZS50eXBlID09PSBcIm92ZXJ3cml0ZV9sYXN0XCJcbiAgKSB7XG4gICAgbW9kZSA9IHsgdHlwZTogXCJhcHBlbmRcIiwgbmFtZTogXCJpbml0aWFsXCIgfVxuICB9XG5cbiAgaWYgKGlzUmViYXNpbmcgJiYgc3RhdGUpIHtcbiAgICB2ZXJpZnlBcHBsaWVkUGF0Y2hlcyh7IGFwcFBhdGgsIHBhdGNoRGlyLCBzdGF0ZSB9KVxuICB9XG5cbiAgaWYgKFxuICAgIG1vZGUudHlwZSA9PT0gXCJvdmVyd3JpdGVfbGFzdFwiICYmXG4gICAgaXNSZWJhc2luZyAmJlxuICAgIHN0YXRlPy5wYXRjaGVzLmxlbmd0aCA9PT0gMFxuICApIHtcbiAgICBtb2RlID0geyB0eXBlOiBcImFwcGVuZFwiLCBuYW1lOiBcImluaXRpYWxcIiB9XG4gIH1cblxuICBjb25zdCBleGlzdGluZ1BhdGNoZXMgPVxuICAgIGdldEdyb3VwZWRQYXRjaGVzKHBhdGNoRGlyKS5wYXRoU3BlY2lmaWVyVG9QYXRjaEZpbGVzW1xuICAgICAgcGFja2FnZURldGFpbHMucGF0aFNwZWNpZmllclxuICAgIF0gfHwgW11cblxuICAvLyBhcHBseSBhbGwgZXhpc3RpbmcgcGF0Y2hlcyBpZiBhcHBlbmRpbmdcbiAgLy8gb3RoZXJ3aXNlIGFwcGx5IGFsbCBidXQgdGhlIGxhc3RcbiAgY29uc3QgcHJldmlvdXNseUFwcGxpZWRQYXRjaGVzID0gc3RhdGU/LnBhdGNoZXMuZmlsdGVyKChwKSA9PiBwLmRpZEFwcGx5KVxuICBjb25zdCBwYXRjaGVzVG9BcHBseUJlZm9yZURpZmZpbmc6IFBhdGNoZWRQYWNrYWdlRGV0YWlsc1tdID0gaXNSZWJhc2luZ1xuICAgID8gbW9kZS50eXBlID09PSBcImFwcGVuZFwiXG4gICAgICA/IGV4aXN0aW5nUGF0Y2hlcy5zbGljZSgwLCBwcmV2aW91c2x5QXBwbGllZFBhdGNoZXMhLmxlbmd0aClcbiAgICAgIDogc3RhdGUhLnBhdGNoZXNbc3RhdGUhLnBhdGNoZXMubGVuZ3RoIC0gMV0uZGlkQXBwbHlcbiAgICAgICAgPyBleGlzdGluZ1BhdGNoZXMuc2xpY2UoMCwgcHJldmlvdXNseUFwcGxpZWRQYXRjaGVzIS5sZW5ndGggLSAxKVxuICAgICAgICA6IGV4aXN0aW5nUGF0Y2hlcy5zbGljZSgwLCBwcmV2aW91c2x5QXBwbGllZFBhdGNoZXMhLmxlbmd0aClcbiAgICA6IG1vZGUudHlwZSA9PT0gXCJhcHBlbmRcIlxuICAgICAgPyBleGlzdGluZ1BhdGNoZXNcbiAgICAgIDogZXhpc3RpbmdQYXRjaGVzLnNsaWNlKDAsIC0xKVxuXG4gIGlmIChjcmVhdGVJc3N1ZSAmJiBtb2RlLnR5cGUgPT09IFwiYXBwZW5kXCIpIHtcbiAgICBjb25zb2xlLmxvZyhcIi0tY3JlYXRlLWlzc3VlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggLS1hcHBlbmQuXCIpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cblxuICBpZiAoY3JlYXRlSXNzdWUgJiYgaXNSZWJhc2luZykge1xuICAgIGNvbnNvbGUubG9nKFwiLS1jcmVhdGUtaXNzdWUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCByZWJhc2luZy5cIilcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuXG4gIGNvbnN0IG51bVBhdGNoZXNBZnRlckNyZWF0ZSA9XG4gICAgbW9kZS50eXBlID09PSBcImFwcGVuZFwiIHx8IGV4aXN0aW5nUGF0Y2hlcy5sZW5ndGggPT09IDBcbiAgICAgID8gZXhpc3RpbmdQYXRjaGVzLmxlbmd0aCArIDFcbiAgICAgIDogZXhpc3RpbmdQYXRjaGVzLmxlbmd0aFxuICBjb25zdCB2Y3MgPSBnZXRQYWNrYWdlVkNTRGV0YWlscyhwYWNrYWdlRGV0YWlscylcbiAgY29uc3QgY2FuQ3JlYXRlSXNzdWUgPVxuICAgICFpc1JlYmFzaW5nICYmXG4gICAgc2hvdWxkUmVjb21tZW5kSXNzdWUodmNzKSAmJlxuICAgIG51bVBhdGNoZXNBZnRlckNyZWF0ZSA9PT0gMSAmJlxuICAgIG1vZGUudHlwZSAhPT0gXCJhcHBlbmRcIlxuXG4gIGNvbnN0IGFwcFBhY2thZ2VKc29uID0gcmVxdWlyZShqb2luKGFwcFBhdGgsIFwicGFja2FnZS5qc29uXCIpKVxuICBjb25zdCBwYWNrYWdlUGF0aCA9IGpvaW4oYXBwUGF0aCwgcGFja2FnZURldGFpbHMucGF0aClcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbihwYWNrYWdlUGF0aCwgXCJwYWNrYWdlLmpzb25cIilcblxuICBpZiAoIWV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgIHByaW50Tm9QYWNrYWdlRm91bmRFcnJvcihwYWNrYWdlUGF0aFNwZWNpZmllciwgcGFja2FnZUpzb25QYXRoKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG5cbiAgY29uc3QgdG1wUmVwbyA9IGRpclN5bmMoeyB1bnNhZmVDbGVhbnVwOiB0cnVlIH0pXG4gIGNvbnN0IHRtcFJlcG9QYWNrYWdlUGF0aCA9IGpvaW4odG1wUmVwby5uYW1lLCBwYWNrYWdlRGV0YWlscy5wYXRoKVxuICBjb25zdCB0bXBSZXBvTnBtUm9vdCA9IHRtcFJlcG9QYWNrYWdlUGF0aC5zbGljZShcbiAgICAwLFxuICAgIC1gL25vZGVfbW9kdWxlcy8ke3BhY2thZ2VEZXRhaWxzLm5hbWV9YC5sZW5ndGgsXG4gIClcblxuICBjb25zdCB0bXBSZXBvUGFja2FnZUpzb25QYXRoID0gam9pbih0bXBSZXBvTnBtUm9vdCwgXCJwYWNrYWdlLmpzb25cIilcblxuICB0cnkge1xuICAgIGNvbnN0IHBhdGNoZXNEaXIgPSByZXNvbHZlKGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIpKVxuXG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZXkoXCLigKJcIiksIFwiQ3JlYXRpbmcgdGVtcG9yYXJ5IGZvbGRlclwiKVxuXG4gICAgLy8gbWFrZSBhIGJsYW5rIHBhY2thZ2UuanNvblxuICAgIG1rZGlycFN5bmModG1wUmVwb05wbVJvb3QpXG4gICAgY29uc3QgcGFja2FnZVJlc29sdXRpb24gPSBnZXRQYWNrYWdlUmVzb2x1dGlvbih7XG4gICAgICBwYWNrYWdlRGV0YWlscyxcbiAgICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgYXBwUGF0aCxcbiAgICB9KVxuICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICB0bXBSZXBvUGFja2FnZUpzb25QYXRoLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBkZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICBbcGFja2FnZURldGFpbHMubmFtZV06IHBhY2thZ2VSZXNvbHV0aW9uLFxuICAgICAgICB9LFxuICAgICAgICByZXNvbHV0aW9uczogcmVzb2x2ZVJlbGF0aXZlRmlsZURlcGVuZGVuY2llcyhcbiAgICAgICAgICBhcHBQYXRoLFxuICAgICAgICAgIGFwcFBhY2thZ2VKc29uLnJlc29sdXRpb25zIHx8IHt9LFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgcGFja2FnZVZlcnNpb24gPSBnZXRQYWNrYWdlVmVyc2lvbihcbiAgICAgIGpvaW4ocmVzb2x2ZShwYWNrYWdlRGV0YWlscy5wYXRoKSwgXCJwYWNrYWdlLmpzb25cIiksXG4gICAgKVxuXG4gICAgLy8gY29weSAubnBtcmMvLnlhcm5yYyBpbiBjYXNlIHBhY2thZ2VzIGFyZSBob3N0ZWQgaW4gcHJpdmF0ZSByZWdpc3RyeVxuICAgIC8vIGNvcHkgLnlhcm4gZGlyZWN0b3J5IGFzIHdlbGwgdG8gZW5zdXJlIGluc3RhbGxhdGlvbnMgd29yayBpbiB5YXJuIDJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YWxpZ25cbiAgICA7W1wiLm5wbXJjXCIsIFwiLnlhcm5yY1wiLCBcIi55YXJuXCJdLmZvckVhY2goKHJjRmlsZSkgPT4ge1xuICAgICAgY29uc3QgcmNQYXRoID0gam9pbihhcHBQYXRoLCByY0ZpbGUpXG4gICAgICBpZiAoZXhpc3RzU3luYyhyY1BhdGgpKSB7XG4gICAgICAgIGNvcHlTeW5jKHJjUGF0aCwgam9pbih0bXBSZXBvLm5hbWUsIHJjRmlsZSksIHsgZGVyZWZlcmVuY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSBcInlhcm5cIikge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5ncmV5KFwi4oCiXCIpLFxuICAgICAgICBgSW5zdGFsbGluZyAke3BhY2thZ2VEZXRhaWxzLm5hbWV9QCR7cGFja2FnZVZlcnNpb259IHdpdGggeWFybmAsXG4gICAgICApXG4gICAgICB0cnkge1xuICAgICAgICAvLyB0cnkgZmlyc3Qgd2l0aG91dCBpZ25vcmluZyBzY3JpcHRzIGluIGNhc2UgdGhleSBhcmUgcmVxdWlyZWRcbiAgICAgICAgLy8gdGhpcyB3b3JrcyBpbiA5OS45OSUgb2YgY2FzZXNcbiAgICAgICAgc3Bhd25TYWZlU3luYyhgeWFybmAsIFtcImluc3RhbGxcIiwgXCItLWlnbm9yZS1lbmdpbmVzXCJdLCB7XG4gICAgICAgICAgY3dkOiB0bXBSZXBvTnBtUm9vdCxcbiAgICAgICAgICBsb2dTdGRFcnJPbkVycm9yOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gdHJ5IGFnYWluIHdoaWxlIGlnbm9yaW5nIHNjcmlwdHMgaW4gY2FzZSB0aGUgc2NyaXB0IGRlcGVuZHMgb25cbiAgICAgICAgLy8gYW4gaW1wbGljaXQgY29udGV4dCB3aGljaCB3ZSBoYXZlbid0IHJlcHJvZHVjZWRcbiAgICAgICAgc3Bhd25TYWZlU3luYyhcbiAgICAgICAgICBgeWFybmAsXG4gICAgICAgICAgW1wiaW5zdGFsbFwiLCBcIi0taWdub3JlLWVuZ2luZXNcIiwgXCItLWlnbm9yZS1zY3JpcHRzXCJdLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFja2FnZU1hbmFnZXIgPT09IFwiYnVuXCIpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuZ3JleShcIuKAolwiKSxcbiAgICAgICAgYEluc3RhbGxpbmcgJHtwYWNrYWdlRGV0YWlscy5uYW1lfUAke3BhY2thZ2VWZXJzaW9ufSB3aXRoIGJ1bmAsXG4gICAgICApXG4gICAgICB0cnkge1xuICAgICAgICBzcGF3blNhZmVTeW5jKGBidW5gLCBbXCJpbnN0YWxsXCJdLCB7XG4gICAgICAgICAgY3dkOiB0bXBSZXBvTnBtUm9vdCxcbiAgICAgICAgICBsb2dTdGRFcnJPbkVycm9yOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc3Bhd25TYWZlU3luYyhgYnVuYCwgW1wiaW5zdGFsbFwiLCBcIi0tbm8tc2F2ZVwiXSwge1xuICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuZ3JleShcIuKAolwiKSxcbiAgICAgICAgYEluc3RhbGxpbmcgJHtwYWNrYWdlRGV0YWlscy5uYW1lfUAke3BhY2thZ2VWZXJzaW9ufSB3aXRoIG5wbWAsXG4gICAgICApXG4gICAgICB0cnkge1xuICAgICAgICAvLyB0cnkgZmlyc3Qgd2l0aG91dCBpZ25vcmluZyBzY3JpcHRzIGluIGNhc2UgdGhleSBhcmUgcmVxdWlyZWRcbiAgICAgICAgLy8gdGhpcyB3b3JrcyBpbiA5OS45OSUgb2YgY2FzZXNcbiAgICAgICAgc3Bhd25TYWZlU3luYyhgbnBtYCwgW1wiaVwiLCBcIi0tZm9yY2VcIl0sIHtcbiAgICAgICAgICBjd2Q6IHRtcFJlcG9OcG1Sb290LFxuICAgICAgICAgIGxvZ1N0ZEVyck9uRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyB0cnkgYWdhaW4gd2hpbGUgaWdub3Jpbmcgc2NyaXB0cyBpbiBjYXNlIHRoZSBzY3JpcHQgZGVwZW5kcyBvblxuICAgICAgICAvLyBhbiBpbXBsaWNpdCBjb250ZXh0IHdoaWNoIHdlIGhhdmVuJ3QgcmVwcm9kdWNlZFxuICAgICAgICBzcGF3blNhZmVTeW5jKGBucG1gLCBbXCJpXCIsIFwiLS1pZ25vcmUtc2NyaXB0c1wiLCBcIi0tZm9yY2VcIl0sIHtcbiAgICAgICAgICBjd2Q6IHRtcFJlcG9OcG1Sb290LFxuICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGdpdCA9ICguLi5hcmdzOiBzdHJpbmdbXSkgPT5cbiAgICAgIHNwYXduU2FmZVN5bmMoXCJnaXRcIiwgYXJncywge1xuICAgICAgICBjd2Q6IHRtcFJlcG8ubmFtZSxcbiAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBIT01FOiB0bXBSZXBvLm5hbWUgfSxcbiAgICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCAqIDEwMCxcbiAgICAgIH0pXG5cbiAgICAvLyByZW1vdmUgbmVzdGVkIG5vZGVfbW9kdWxlcyBqdXN0IHRvIGJlIHNhZmVcbiAgICByZW1vdmVTeW5jKGpvaW4odG1wUmVwb1BhY2thZ2VQYXRoLCBcIm5vZGVfbW9kdWxlc1wiKSlcbiAgICAvLyByZW1vdmUgLmdpdCBqdXN0IHRvIGJlIHNhZmVcbiAgICByZW1vdmVTeW5jKGpvaW4odG1wUmVwb1BhY2thZ2VQYXRoLCBcIi5naXRcIikpXG4gICAgLy8gcmVtb3ZlIHBhdGNoLXBhY2thZ2Ugc3RhdGUgZmlsZVxuICAgIHJlbW92ZVN5bmMoam9pbih0bXBSZXBvUGFja2FnZVBhdGgsIFNUQVRFX0ZJTEVfTkFNRSkpXG5cbiAgICAvLyBjb21taXQgdGhlIHBhY2thZ2VcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JleShcIuKAolwiKSwgXCJEaWZmaW5nIHlvdXIgZmlsZXMgd2l0aCBjbGVhbiBmaWxlc1wiKVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbih0bXBSZXBvLm5hbWUsIFwiLmdpdGlnbm9yZVwiKSwgXCIhL25vZGVfbW9kdWxlc1xcblxcblwiKVxuICAgIGdpdChcImluaXRcIilcbiAgICBnaXQoXCJjb25maWdcIiwgXCItLWxvY2FsXCIsIFwidXNlci5uYW1lXCIsIFwicGF0Y2gtcGFja2FnZVwiKVxuICAgIGdpdChcImNvbmZpZ1wiLCBcIi0tbG9jYWxcIiwgXCJ1c2VyLmVtYWlsXCIsIFwicGF0Y2hAcGFjay5hZ2VcIilcblxuICAgIC8vIHJlbW92ZSBpZ25vcmVkIGZpbGVzIGZpcnN0XG4gICAgcmVtb3ZlSWdub3JlZEZpbGVzKHRtcFJlcG9QYWNrYWdlUGF0aCwgaW5jbHVkZVBhdGhzLCBleGNsdWRlUGF0aHMpXG5cbiAgICBmb3IgKGNvbnN0IHBhdGNoRGV0YWlscyBvZiBwYXRjaGVzVG9BcHBseUJlZm9yZURpZmZpbmcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWFwcGx5UGF0Y2goe1xuICAgICAgICAgIHBhdGNoRGV0YWlscyxcbiAgICAgICAgICBwYXRjaERpcixcbiAgICAgICAgICBwYXRjaEZpbGVQYXRoOiBqb2luKGFwcFBhdGgsIHBhdGNoRGlyLCBwYXRjaERldGFpbHMucGF0Y2hGaWxlbmFtZSksXG4gICAgICAgICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgICAgICAgY3dkOiB0bXBSZXBvLm5hbWUsXG4gICAgICAgICAgYmVzdEVmZm9ydDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApIHtcbiAgICAgICAgLy8gVE9ETzogYWRkIGJldHRlciBlcnJvciBtZXNzYWdlIG9uY2UgLS1yZWJhc2UgaXMgaW1wbGVtZW50ZWRcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYEZhaWxlZCB0byBhcHBseSBwYXRjaCAke3BhdGNoRGV0YWlscy5wYXRjaEZpbGVuYW1lfSB0byAke3BhY2thZ2VEZXRhaWxzLnBhdGhTcGVjaWZpZXJ9YCxcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cbiAgICB9XG4gICAgZ2l0KFwiYWRkXCIsIFwiLWZcIiwgcGFja2FnZURldGFpbHMucGF0aClcbiAgICBnaXQoXCJjb21taXRcIiwgXCItLWFsbG93LWVtcHR5XCIsIFwiLW1cIiwgXCJpbml0XCIpXG5cbiAgICAvLyByZXBsYWNlIHBhY2thZ2Ugd2l0aCB1c2VyJ3MgdmVyc2lvblxuICAgIHJlbW92ZVN5bmModG1wUmVwb1BhY2thZ2VQYXRoKVxuXG4gICAgLy8gcG5wbSBpbnN0YWxscyBwYWNrYWdlcyBhcyBzeW1saW5rcywgY29weVN5bmMgd291bGQgY29weSBvbmx5IHRoZSBzeW1saW5rXG4gICAgY29weVN5bmMocmVhbHBhdGhTeW5jKHBhY2thZ2VQYXRoKSwgdG1wUmVwb1BhY2thZ2VQYXRoKVxuXG4gICAgLy8gcmVtb3ZlIG5lc3RlZCBub2RlX21vZHVsZXMganVzdCB0byBiZSBzYWZlXG4gICAgcmVtb3ZlU3luYyhqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgXCJub2RlX21vZHVsZXNcIikpXG4gICAgLy8gcmVtb3ZlIC5naXQganVzdCB0byBiZSBzYWZlXG4gICAgcmVtb3ZlU3luYyhqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgXCIuZ2l0XCIpKVxuICAgIC8vIHJlbW92ZSBwYXRjaC1wYWNrYWdlIHN0YXRlIGZpbGVcbiAgICByZW1vdmVTeW5jKGpvaW4odG1wUmVwb1BhY2thZ2VQYXRoLCBTVEFURV9GSUxFX05BTUUpKVxuXG4gICAgLy8gYWxzbyByZW1vdmUgaWdub3JlZCBmaWxlcyBsaWtlIGJlZm9yZVxuICAgIHJlbW92ZUlnbm9yZWRGaWxlcyh0bXBSZXBvUGFja2FnZVBhdGgsIGluY2x1ZGVQYXRocywgZXhjbHVkZVBhdGhzKVxuXG4gICAgLy8gc3RyaWN0IG1vZGU6IHBydW5lIGFueSBmaWxlIGluIHRoZSB1c2VyJ3MgY29weSB0aGF0IHdhcyBub3QgcGFydCBvZiB0aGVcbiAgICAvLyBvcmlnaW5hbCBwdWJsaXNoZWQgdGFyYmFsbC4gVGhpcyBwcmV2ZW50cyBgLS0tIC9kZXYvbnVsbGAgKFwibmV3IGZpbGVcIilcbiAgICAvLyBlbnRyaWVzIGNhdXNlZCBieSBpbnN0YWxsLXRpbWUgZmlsZSBkcmlmdC5cbiAgICBpZiAoc3RyaWN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlbGluZSA9IGF3YWl0IGNyZWF0ZVN0cmljdEJhc2VsaW5lKHtcbiAgICAgICAgICBwYWNrYWdlTmFtZTogcGFja2FnZURldGFpbHMubmFtZSxcbiAgICAgICAgICByZXNvbHV0aW9uOiBwYWNrYWdlUmVzb2x1dGlvbixcbiAgICAgICAgICBhcHBQYXRoLFxuICAgICAgICB9KS5nZXRPcmlnaW5hbFRhcmJhbGxGaWxlcygpXG4gICAgICAgIGlmIChiYXNlbGluZSkge1xuICAgICAgICAgIGNvbnN0IHsgcHJ1bmVkIH0gPSBwcnVuZVRvQmFzZWxpbmUodG1wUmVwb1BhY2thZ2VQYXRoLCBiYXNlbGluZSlcbiAgICAgICAgICBpZiAocHJ1bmVkID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICBjaGFsay5ncmV5KFwi4oCiXCIpLFxuICAgICAgICAgICAgICBgU3RyaWN0IG1vZGU6IHBydW5lZCAke3BydW5lZH0gZmlsZSR7cHJ1bmVkID09PSAxID8gXCJcIiA6IFwic1wifSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdGFyYmFsbGAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBg4pqg77iPICAtLXN0cmljdCB3YXMgcmVxdWVzdGVkIGJ1dCB0aGUgb3JpZ2luYWwgdGFyYmFsbCBiYXNlbGluZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gYCArXG4gICAgICAgICAgICAgICAgYEZhbGxpbmcgYmFjayB0byBub24tc3RyaWN0IHBhdGNoIGdlbmVyYXRpb24uIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIG9mdGVuIGhhcHBlbnMgd2l0aCBmaWxlOiByZXNvbHV0aW9ucyBvciB3aGVuIHRoZSByZWdpc3RyeSBpcyB1bnJlYWNoYWJsZS5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgYOKaoO+4jyAgLS1zdHJpY3QgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfS4gRmFsbGluZyBiYWNrIHRvIG5vbi1zdHJpY3QgcGF0Y2ggZ2VuZXJhdGlvbi5gLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzdGFnZSBhbGwgZmlsZXNcbiAgICBnaXQoXCJhZGRcIiwgXCItZlwiLCBwYWNrYWdlRGV0YWlscy5wYXRoKVxuXG4gICAgLy8gZ2V0IGRpZmYgb2YgY2hhbmdlc1xuICAgIGNvbnN0IGRpZmZSZXN1bHQgPSBnaXQoXG4gICAgICBcImRpZmZcIixcbiAgICAgIFwiLS1jYWNoZWRcIixcbiAgICAgIFwiLS1uby1jb2xvclwiLFxuICAgICAgXCItLWlnbm9yZS1zcGFjZS1hdC1lb2xcIixcbiAgICAgIFwiLS1uby1leHQtZGlmZlwiLFxuICAgICAgXCItLXNyYy1wcmVmaXg9YS9cIixcbiAgICAgIFwiLS1kc3QtcHJlZml4PWIvXCIsXG4gICAgKVxuXG4gICAgaWYgKGRpZmZSZXN1bHQuc3Rkb3V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGDigYnvuI8gIE5vdCBjcmVhdGluZyBwYXRjaCBmaWxlIGZvciBwYWNrYWdlICcke3BhY2thZ2VQYXRoU3BlY2lmaWVyfSdgLFxuICAgICAgKVxuICAgICAgY29uc29sZS5sb2coYOKBie+4jyAgVGhlcmUgZG9uJ3QgYXBwZWFyIHRvIGJlIGFueSBjaGFuZ2VzLmApXG4gICAgICBpZiAoaXNSZWJhc2luZyAmJiBtb2RlLnR5cGUgPT09IFwib3ZlcndyaXRlX2xhc3RcIikge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBcIlxcbvCfkqEgVG8gcmVtb3ZlIGEgcGF0Y2ggZmlsZSwgZGVsZXRlIGl0IGFuZCB0aGVuIHJlaW5zdGFsbCBub2RlX21vZHVsZXMgZnJvbSBzY3JhdGNoLlwiLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBwYXJzZVBhdGNoRmlsZShkaWZmUmVzdWx0LnN0ZG91dC50b1N0cmluZygpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGUgYXMgRXJyb3IpLm1lc3NhZ2UuaW5jbHVkZXMoXCJVbmV4cGVjdGVkIGZpbGUgbW9kZSBzdHJpbmc6IDEyMDAwMFwiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBcbuKblO+4jyAke2NoYWxrLnJlZC5ib2xkKFwiRVJST1JcIil9XG5cbiAgWW91ciBjaGFuZ2VzIGludm9sdmUgY3JlYXRpbmcgc3ltbGlua3MuIHBhdGNoLXBhY2thZ2UgZG9lcyBub3QgeWV0IHN1cHBvcnRcbiAgc3ltbGlua3MuXG5cbiAg77iPUGxlYXNlIHVzZSAke2NoYWxrLmJvbGQoXCItLWluY2x1ZGVcIil9IGFuZC9vciAke2NoYWxrLmJvbGQoXG4gICAgXCItLWV4Y2x1ZGVcIixcbiAgKX0gdG8gbmFycm93IHRoZSBzY29wZSBvZiB5b3VyIHBhdGNoIGlmXG4gIHRoaXMgd2FzIHVuaW50ZW50aW9uYWwuXG5gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3V0UGF0aCA9IFwiLi9wYXRjaC1wYWNrYWdlLWVycm9yLmpzb24uZ3pcIlxuICAgICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIG91dFBhdGgsXG4gICAgICAgICAgZ3ppcFN5bmMoXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogKGUgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgc3RhY2s6IChlIGFzIEVycm9yKS5zdGFjayxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGF0Y2g6IGRpZmZSZXN1bHQuc3Rkb3V0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIGNvbnNvbGUubG9nKGBcbuKblO+4jyAke2NoYWxrLnJlZC5ib2xkKFwiRVJST1JcIil9XG5cbiAgcGF0Y2gtcGFja2FnZSB3YXMgdW5hYmxlIHRvIHJlYWQgdGhlIHBhdGNoLWZpbGUgbWFkZSBieSBnaXQuIFRoaXMgc2hvdWxkIG5vdFxuICBoYXBwZW4uXG5cbiAgQSBkaWFnbm9zdGljIGZpbGUgd2FzIHdyaXR0ZW4gdG9cblxuICAgICR7b3V0UGF0aH1cblxuICBQbGVhc2UgYXR0YWNoIGl0IHRvIGEgZ2l0aHViIGlzc3VlXG5cbiAgICBodHRwczovL2dpdGh1Yi5jb20vZHMzMDAvcGF0Y2gtcGFja2FnZS9pc3N1ZXMvbmV3P3RpdGxlPU5ldytwYXRjaCtwYXJzZStmYWlsZWQmYm9keT1QbGVhc2UrYXR0YWNoK3RoZStkaWFnbm9zdGljK2ZpbGUrYnkrZHJhZ2dpbmcraXQraW50bytoZXJlK/CfmY9cblxuICBOb3RlIHRoYXQgdGhpcyBkaWFnbm9zdGljIGZpbGUgd2lsbCBjb250YWluIGNvZGUgZnJvbSB0aGUgcGFja2FnZSB5b3Ugd2VyZVxuICBhdHRlbXB0aW5nIHRvIHBhdGNoLlxuXG5gKVxuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBtYXliZSBkZWxldGUgZXhpc3RpbmdcbiAgICBpZiAobW9kZS50eXBlID09PSBcImFwcGVuZFwiICYmICFpc1JlYmFzaW5nICYmIGV4aXN0aW5nUGF0Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGlmIHdlIGFyZSBhcHBlbmRpbmcgdG8gYW4gZXhpc3RpbmcgcGF0Y2ggdGhhdCBkb2Vzbid0IGhhdmUgYSBzZXF1ZW5jZSBudW1iZXIgbGV0J3MgcmVuYW1lIGl0XG4gICAgICBjb25zdCBwcmV2UGF0Y2ggPSBleGlzdGluZ1BhdGNoZXNbMF1cbiAgICAgIGlmIChwcmV2UGF0Y2guc2VxdWVuY2VOdW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBuZXdGaWxlTmFtZSA9IGNyZWF0ZVBhdGNoRmlsZU5hbWUoe1xuICAgICAgICAgIHBhY2thZ2VEZXRhaWxzLFxuICAgICAgICAgIHBhY2thZ2VWZXJzaW9uLFxuICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiAxLFxuICAgICAgICAgIHNlcXVlbmNlTmFtZTogcHJldlBhdGNoLnNlcXVlbmNlTmFtZSA/PyBcImluaXRpYWxcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgb2xkUGF0aCA9IGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIsIHByZXZQYXRjaC5wYXRjaEZpbGVuYW1lKVxuICAgICAgICBjb25zdCBuZXdQYXRoID0gam9pbihhcHBQYXRoLCBwYXRjaERpciwgbmV3RmlsZU5hbWUpXG4gICAgICAgIHJlbmFtZVN5bmMob2xkUGF0aCwgbmV3UGF0aClcbiAgICAgICAgcHJldlBhdGNoLnNlcXVlbmNlTnVtYmVyID0gMVxuICAgICAgICBwcmV2UGF0Y2gucGF0Y2hGaWxlbmFtZSA9IG5ld0ZpbGVOYW1lXG4gICAgICAgIHByZXZQYXRjaC5zZXF1ZW5jZU5hbWUgPSBwcmV2UGF0Y2guc2VxdWVuY2VOYW1lID8/IFwiaW5pdGlhbFwiXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdFBhdGNoID0gZXhpc3RpbmdQYXRjaGVzW1xuICAgICAgc3RhdGUgPyBzdGF0ZS5wYXRjaGVzLmxlbmd0aCAtIDEgOiBleGlzdGluZ1BhdGNoZXMubGVuZ3RoIC0gMVxuICAgIF0gYXMgUGF0Y2hlZFBhY2thZ2VEZXRhaWxzIHwgdW5kZWZpbmVkXG4gICAgY29uc3Qgc2VxdWVuY2VOYW1lID1cbiAgICAgIG1vZGUudHlwZSA9PT0gXCJhcHBlbmRcIiA/IG1vZGUubmFtZSA6IGxhc3RQYXRjaD8uc2VxdWVuY2VOYW1lXG4gICAgY29uc3Qgc2VxdWVuY2VOdW1iZXIgPVxuICAgICAgbW9kZS50eXBlID09PSBcImFwcGVuZFwiXG4gICAgICAgID8gKGxhc3RQYXRjaD8uc2VxdWVuY2VOdW1iZXIgPz8gMCkgKyAxXG4gICAgICAgIDogbGFzdFBhdGNoPy5zZXF1ZW5jZU51bWJlclxuXG4gICAgY29uc3QgcGF0Y2hGaWxlTmFtZSA9IGNyZWF0ZVBhdGNoRmlsZU5hbWUoe1xuICAgICAgcGFja2FnZURldGFpbHMsXG4gICAgICBwYWNrYWdlVmVyc2lvbixcbiAgICAgIHNlcXVlbmNlTmFtZSxcbiAgICAgIHNlcXVlbmNlTnVtYmVyLFxuICAgIH0pXG5cbiAgICBjb25zdCBwYXRjaFBhdGg6IHN0cmluZyA9IGpvaW4ocGF0Y2hlc0RpciwgcGF0Y2hGaWxlTmFtZSlcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlybmFtZShwYXRjaFBhdGgpKSkge1xuICAgICAgLy8gc2NvcGVkIHBhY2thZ2VcbiAgICAgIG1rZGlyU3luYyhkaXJuYW1lKHBhdGNoUGF0aCkpXG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIGluc2VydGluZyBhIG5ldyBwYXRjaCBpbnRvIGEgc2VxdWVuY2Ugd2UgbW9zdCBsaWtlbHkgbmVlZCB0byB1cGRhdGUgdGhlIHNlcXVlbmNlIG51bWJlcnNcbiAgICBpZiAoaXNSZWJhc2luZyAmJiBtb2RlLnR5cGUgPT09IFwiYXBwZW5kXCIpIHtcbiAgICAgIGNvbnN0IHBhdGNoZXNUb051ZGdlID0gZXhpc3RpbmdQYXRjaGVzLnNsaWNlKHN0YXRlIS5wYXRjaGVzLmxlbmd0aClcbiAgICAgIGlmIChzZXF1ZW5jZU51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInNlcXVlbmNlTnVtYmVyIGlzIHVuZGVmaW5lZCB3aGlsZSByZWJhc2luZ1wiKVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBwYXRjaGVzVG9OdWRnZVswXT8uc2VxdWVuY2VOdW1iZXIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYXRjaGVzVG9OdWRnZVswXS5zZXF1ZW5jZU51bWJlciA8PSBzZXF1ZW5jZU51bWJlclxuICAgICAgKSB7XG4gICAgICAgIGxldCBuZXh0ID0gc2VxdWVuY2VOdW1iZXIgKyAxXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwYXRjaGVzVG9OdWRnZSkge1xuICAgICAgICAgIGNvbnN0IG5ld05hbWUgPSBjcmVhdGVQYXRjaEZpbGVOYW1lKHtcbiAgICAgICAgICAgIHBhY2thZ2VEZXRhaWxzLFxuICAgICAgICAgICAgcGFja2FnZVZlcnNpb24sXG4gICAgICAgICAgICBzZXF1ZW5jZU5hbWU6IHAuc2VxdWVuY2VOYW1lLFxuICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXI6IG5leHQrKyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgXCJSZW5hbWluZ1wiLFxuICAgICAgICAgICAgY2hhbGsuYm9sZChwLnBhdGNoRmlsZW5hbWUpLFxuICAgICAgICAgICAgXCJ0b1wiLFxuICAgICAgICAgICAgY2hhbGsuYm9sZChuZXdOYW1lKSxcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3Qgb2xkUGF0aCA9IGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIsIHAucGF0Y2hGaWxlbmFtZSlcbiAgICAgICAgICBjb25zdCBuZXdQYXRoID0gam9pbihhcHBQYXRoLCBwYXRjaERpciwgbmV3TmFtZSlcbiAgICAgICAgICByZW5hbWVTeW5jKG9sZFBhdGgsIG5ld1BhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZUZpbGVTeW5jKHBhdGNoUGF0aCwgZGlmZlJlc3VsdC5zdGRvdXQpXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtjaGFsay5ncmVlbihcIuKclFwiKX0gQ3JlYXRlZCBmaWxlICR7am9pbihwYXRjaERpciwgcGF0Y2hGaWxlTmFtZSl9XFxuYCxcbiAgICApXG5cbiAgICBjb25zdCBwcmV2U3RhdGU6IFBhdGNoU3RhdGVbXSA9IHBhdGNoZXNUb0FwcGx5QmVmb3JlRGlmZmluZy5tYXAoXG4gICAgICAocCk6IFBhdGNoU3RhdGUgPT4gKHtcbiAgICAgICAgcGF0Y2hGaWxlbmFtZTogcC5wYXRjaEZpbGVuYW1lLFxuICAgICAgICBkaWRBcHBseTogdHJ1ZSxcbiAgICAgICAgcGF0Y2hDb250ZW50SGFzaDogaGFzaEZpbGUoam9pbihhcHBQYXRoLCBwYXRjaERpciwgcC5wYXRjaEZpbGVuYW1lKSksXG4gICAgICB9KSxcbiAgICApXG4gICAgY29uc3QgbmV4dFN0YXRlOiBQYXRjaFN0YXRlW10gPSBbXG4gICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICB7XG4gICAgICAgIHBhdGNoRmlsZW5hbWU6IHBhdGNoRmlsZU5hbWUsXG4gICAgICAgIGRpZEFwcGx5OiB0cnVlLFxuICAgICAgICBwYXRjaENvbnRlbnRIYXNoOiBoYXNoRmlsZShwYXRjaFBhdGgpLFxuICAgICAgfSxcbiAgICBdXG5cbiAgICAvLyBpZiBhbnkgcGF0Y2hlcyBjb21lIGFmdGVyIHRoaXMgb25lIHdlIGp1c3QgbWFkZSwgd2Ugc2hvdWxkIHJlYXBwbHkgdGhlbVxuICAgIGxldCBkaWRGYWlsV2hpbGVGaW5pc2hpbmdSZWJhc2UgPSBmYWxzZVxuICAgIGlmIChpc1JlYmFzaW5nKSB7XG4gICAgICBjb25zdCBjdXJyZW50UGF0Y2hlcyA9IGdldEdyb3VwZWRQYXRjaGVzKGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIpKVxuICAgICAgICAucGF0aFNwZWNpZmllclRvUGF0Y2hGaWxlc1twYWNrYWdlRGV0YWlscy5wYXRoU3BlY2lmaWVyXVxuXG4gICAgICBjb25zdCBwcmV2aW91c2x5VW5hcHBsaWVkUGF0Y2hlcyA9IGN1cnJlbnRQYXRjaGVzLnNsaWNlKG5leHRTdGF0ZS5sZW5ndGgpXG4gICAgICBpZiAocHJldmlvdXNseVVuYXBwbGllZFBhdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBGYXN0IGZvcndhcmRpbmcuLi5gKVxuICAgICAgICBmb3IgKGNvbnN0IHBhdGNoIG9mIHByZXZpb3VzbHlVbmFwcGxpZWRQYXRjaGVzKSB7XG4gICAgICAgICAgY29uc3QgcGF0Y2hGaWxlUGF0aCA9IGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIsIHBhdGNoLnBhdGNoRmlsZW5hbWUpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWFwcGx5UGF0Y2goe1xuICAgICAgICAgICAgICBwYXRjaERldGFpbHM6IHBhdGNoLFxuICAgICAgICAgICAgICBwYXRjaERpcixcbiAgICAgICAgICAgICAgcGF0Y2hGaWxlUGF0aCxcbiAgICAgICAgICAgICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgICAgICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgYmVzdEVmZm9ydDogZmFsc2UsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZGlkRmFpbFdoaWxlRmluaXNoaW5nUmViYXNlID0gdHJ1ZVxuICAgICAgICAgICAgbG9nUGF0Y2hTZXF1ZW5jZUVycm9yKHsgcGF0Y2hEZXRhaWxzOiBwYXRjaCB9KVxuICAgICAgICAgICAgbmV4dFN0YXRlLnB1c2goe1xuICAgICAgICAgICAgICBwYXRjaEZpbGVuYW1lOiBwYXRjaC5wYXRjaEZpbGVuYW1lLFxuICAgICAgICAgICAgICBkaWRBcHBseTogZmFsc2UsXG4gICAgICAgICAgICAgIHBhdGNoQ29udGVudEhhc2g6IGhhc2hGaWxlKHBhdGNoRmlsZVBhdGgpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Y2hhbGsuZ3JlZW4oXCLinJRcIil9ICR7cGF0Y2gucGF0Y2hGaWxlbmFtZX1gKVxuICAgICAgICAgICAgbmV4dFN0YXRlLnB1c2goe1xuICAgICAgICAgICAgICBwYXRjaEZpbGVuYW1lOiBwYXRjaC5wYXRjaEZpbGVuYW1lLFxuICAgICAgICAgICAgICBkaWRBcHBseTogdHJ1ZSxcbiAgICAgICAgICAgICAgcGF0Y2hDb250ZW50SGFzaDogaGFzaEZpbGUocGF0Y2hGaWxlUGF0aCksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1JlYmFzaW5nIHx8IG51bVBhdGNoZXNBZnRlckNyZWF0ZSA+IDEpIHtcbiAgICAgIHNhdmVQYXRjaEFwcGxpY2F0aW9uU3RhdGUoe1xuICAgICAgICBwYWNrYWdlRGV0YWlscyxcbiAgICAgICAgcGF0Y2hlczogbmV4dFN0YXRlLFxuICAgICAgICBpc1JlYmFzaW5nOiBkaWRGYWlsV2hpbGVGaW5pc2hpbmdSZWJhc2UsXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBjbGVhclBhdGNoQXBwbGljYXRpb25TdGF0ZShwYWNrYWdlRGV0YWlscylcbiAgICB9XG5cbiAgICBpZiAoY2FuQ3JlYXRlSXNzdWUpIHtcbiAgICAgIGlmIChjcmVhdGVJc3N1ZSkge1xuICAgICAgICBvcGVuSXNzdWVDcmVhdGlvbkxpbmsoe1xuICAgICAgICAgIHBhY2thZ2VEZXRhaWxzLFxuICAgICAgICAgIHBhdGNoRmlsZUNvbnRlbnRzOiBkaWZmUmVzdWx0LnN0ZG91dC50b1N0cmluZygpLFxuICAgICAgICAgIHBhY2thZ2VWZXJzaW9uLFxuICAgICAgICAgIHBhdGNoUGF0aCxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heWJlUHJpbnRJc3N1ZUNyZWF0aW9uUHJvbXB0KHZjcywgcGFja2FnZURldGFpbHMsIHBhY2thZ2VNYW5hZ2VyKVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gICAgdGhyb3cgZVxuICB9IGZpbmFsbHkge1xuICAgIHRtcFJlcG8ucmVtb3ZlQ2FsbGJhY2soKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhdGNoRmlsZU5hbWUoe1xuICBwYWNrYWdlRGV0YWlscyxcbiAgcGFja2FnZVZlcnNpb24sXG4gIHNlcXVlbmNlTnVtYmVyLFxuICBzZXF1ZW5jZU5hbWUsXG59OiB7XG4gIHBhY2thZ2VEZXRhaWxzOiBQYWNrYWdlRGV0YWlsc1xuICBwYWNrYWdlVmVyc2lvbjogc3RyaW5nXG4gIHNlcXVlbmNlTnVtYmVyPzogbnVtYmVyXG4gIHNlcXVlbmNlTmFtZT86IHN0cmluZ1xufSkge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBwYWNrYWdlRGV0YWlscy5wYWNrYWdlTmFtZXNcbiAgICAubWFwKChuYW1lKSA9PiBuYW1lLnJlcGxhY2UoL1xcLy9nLCBcIitcIikpXG4gICAgLmpvaW4oXCIrK1wiKVxuXG4gIGNvbnN0IG5hbWVBbmRWZXJzaW9uID0gYCR7cGFja2FnZU5hbWVzfSske3BhY2thZ2VWZXJzaW9ufWBcbiAgY29uc3QgbnVtID1cbiAgICBzZXF1ZW5jZU51bWJlciA9PT0gdW5kZWZpbmVkXG4gICAgICA/IFwiXCJcbiAgICAgIDogYCske3NlcXVlbmNlTnVtYmVyLnRvU3RyaW5nKCkucGFkU3RhcnQoMywgXCIwXCIpfWBcbiAgY29uc3QgbmFtZSA9ICFzZXF1ZW5jZU5hbWUgPyBcIlwiIDogYCske3NlcXVlbmNlTmFtZX1gXG5cbiAgcmV0dXJuIGAke25hbWVBbmRWZXJzaW9ufSR7bnVtfSR7bmFtZX0ucGF0Y2hgXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2dQYXRjaFNlcXVlbmNlRXJyb3Ioe1xuICBwYXRjaERldGFpbHMsXG59OiB7XG4gIHBhdGNoRGV0YWlsczogUGF0Y2hlZFBhY2thZ2VEZXRhaWxzXG59KSB7XG4gIGNvbnNvbGUubG9nKGBcbiR7Y2hhbGsucmVkLmJvbGQoXCLim5QgRVJST1JcIil9XG5cbkZhaWxlZCB0byBhcHBseSBwYXRjaCBmaWxlICR7Y2hhbGsuYm9sZChwYXRjaERldGFpbHMucGF0Y2hGaWxlbmFtZSl9LlxuXG5JZiB0aGlzIHBhdGNoIGZpbGUgaXMgbm8gbG9uZ2VyIHVzZWZ1bCwgZGVsZXRlIGl0IGFuZCBydW5cblxuICAke2NoYWxrLmJvbGQoYHBhdGNoLXBhY2thZ2VgKX1cblxuVG8gcGFydGlhbGx5IGFwcGx5IHRoZSBwYXRjaCAoaWYgcG9zc2libGUpIGFuZCBvdXRwdXQgYSBsb2cgb2YgZXJyb3JzIHRvIGZpeCwgcnVuXG5cbiAgJHtjaGFsay5ib2xkKGBwYXRjaC1wYWNrYWdlIC0tcGFydGlhbGApfVxuXG5BZnRlciB3aGljaCB5b3Ugc2hvdWxkIG1ha2UgYW55IHJlcXVpcmVkIGNoYW5nZXMgaW5zaWRlICR7XG4gICAgcGF0Y2hEZXRhaWxzLnBhdGhcbiAgfSwgYW5kIGZpbmFsbHkgcnVuXG5cbiAgJHtjaGFsay5ib2xkKGBwYXRjaC1wYWNrYWdlICR7cGF0Y2hEZXRhaWxzLnBhdGhTcGVjaWZpZXJ9YCl9XG5cbnRvIHVwZGF0ZSB0aGUgcGF0Y2ggZmlsZS5cbmApXG59XG4iXX0=
@@ -1,9 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseBunLockfile = parseBunLockfile;
4
+ exports.parseBunLockTextFile = parseBunLockTextFile;
4
5
  const child_process_1 = require("child_process");
5
- // Adapted from https://github.com/oven-sh/bun/blob/main/packages/bun-vscode/src/features/lockfile.ts,
6
- // rewritten to use spawnSync instead of spawn.
6
+ const fs_extra_1 = require("fs-extra");
7
+ /**
8
+ * Parses the legacy `bun.lockb` binary lockfile (Bun < 1.2) by running
9
+ * `bun <path>`, which prints the lockfile in yarn-v1 text format.
10
+ *
11
+ * Returns the yarn-v1 text so it can be fed to `@yarnpkg/lockfile`'s parser.
12
+ */
7
13
  function parseBunLockfile(lockFilePath) {
8
14
  const process = (0, child_process_1.spawnSync)("bun", [lockFilePath], {
9
15
  stdio: ["ignore", "pipe", "pipe"],
@@ -13,4 +19,83 @@ function parseBunLockfile(lockFilePath) {
13
19
  }
14
20
  return process.stdout.toString();
15
21
  }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VCdW5Mb2NrZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUJ1bkxvY2tmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsNENBVUM7QUFkRCxpREFBeUM7QUFFekMsc0dBQXNHO0FBQ3RHLCtDQUErQztBQUMvQyxTQUFnQixnQkFBZ0IsQ0FBQyxZQUFvQjtJQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFTLEVBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7UUFDL0MsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7S0FDbEMsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN4RSxDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQTtBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxyXG5cclxuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9ibG9iL21haW4vcGFja2FnZXMvYnVuLXZzY29kZS9zcmMvZmVhdHVyZXMvbG9ja2ZpbGUudHMsXHJcbi8vIHJld3JpdHRlbiB0byB1c2Ugc3Bhd25TeW5jIGluc3RlYWQgb2Ygc3Bhd24uXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1bkxvY2tmaWxlKGxvY2tGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBwcm9jZXNzID0gc3Bhd25TeW5jKFwiYnVuXCIsIFtsb2NrRmlsZVBhdGhdLCB7XHJcbiAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXHJcbiAgfSlcclxuICBpZiAocHJvY2Vzcy5zdGF0dXMgIT09IDApIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYEJ1biBleGl0ZWQgd2l0aCBjb2RlOiAke3Byb2Nlc3Muc3RhdHVzfVxcbiR7cHJvY2Vzcy5zdGRlcnIudG9TdHJpbmcoKX1gLFxyXG4gICAgKVxyXG4gIH1cclxuICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQudG9TdHJpbmcoKVxyXG59XHJcbiJdfQ==
22
+ /**
23
+ * Parses the new `bun.lock` text/JSONC lockfile (Bun >= 1.2, including
24
+ * 1.3.14) and converts it into a yarn-v1-lockfile-compatible object so the
25
+ * rest of the resolution logic can treat bun like yarn.
26
+ *
27
+ * Each package entry in `bun.lock` has the form:
28
+ *
29
+ * "name": ["full-specifier@version", "path", { ...metadata }, "integrity"]
30
+ *
31
+ * This is transformed to yarn v1 shape:
32
+ *
33
+ * "full-specifier@version": { version: "version", resolved: undefined }
34
+ *
35
+ * The `resolved` URL is not stored in `bun.lock` (only the integrity hash),
36
+ * so it is left `undefined`. The downstream resolution logic already falls
37
+ * back to the version/alias/file specifier when `resolved` is missing.
38
+ */
39
+ function parseBunLockTextFile(lockFilePath) {
40
+ const raw = (0, fs_extra_1.readFileSync)(lockFilePath, "utf8");
41
+ const cleaned = stripJsonc(raw);
42
+ let data;
43
+ try {
44
+ data = JSON.parse(cleaned);
45
+ }
46
+ catch (e) {
47
+ throw new Error(`Could not parse bun.lock file at ${lockFilePath}: ${e.message}`);
48
+ }
49
+ const packages = data.packages ?? {};
50
+ const result = {};
51
+ for (const entry of Object.values(packages)) {
52
+ if (!Array.isArray(entry))
53
+ continue;
54
+ const specifier = entry[0];
55
+ if (typeof specifier !== "string")
56
+ continue;
57
+ const version = extractVersion(specifier);
58
+ result[specifier] = { version, resolved: undefined };
59
+ }
60
+ return result;
61
+ }
62
+ /**
63
+ * Extracts the version (or meaningful resolution token) from a bun.lock
64
+ * package specifier.
65
+ *
66
+ * Specifier forms handled:
67
+ * "name@1.2.3"
68
+ * "@scope/name@1.2.3"
69
+ * "npm:other-name@1.2.3"
70
+ * "file:./path"
71
+ * "workspace:^"
72
+ * "link:./path"
73
+ */
74
+ function extractVersion(specifier) {
75
+ const prefixMatch = specifier.match(/^(npm:|file:|workspace:|link:)/);
76
+ if (prefixMatch) {
77
+ const rest = specifier.slice(prefixMatch[0].length);
78
+ const atIdx = rest.lastIndexOf("@");
79
+ if (atIdx > 0) {
80
+ return rest.slice(atIdx + 1);
81
+ }
82
+ return rest;
83
+ }
84
+ const atIdx = specifier.lastIndexOf("@");
85
+ if (atIdx > 0) {
86
+ return specifier.slice(atIdx + 1);
87
+ }
88
+ return specifier;
89
+ }
90
+ /**
91
+ * Strips JSONC extensions (// comments and trailing commas) so the file can
92
+ * be parsed with `JSON.parse`. Bun's `bun.lock` allows both.
93
+ */
94
+ function stripJsonc(text) {
95
+ // Strip single-line `//` comments. (bun.lock does not use block comments.)
96
+ let out = text.replace(/^\s*\/\/.*$/gm, "");
97
+ // Remove trailing commas before } or ]
98
+ out = out.replace(/,(\s*[}\]])/g, "$1");
99
+ return out;
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VCdW5Mb2NrZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUJ1bkxvY2tmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0EsNENBVUM7QUFtQkQsb0RBdUJDO0FBN0RELGlEQUF5QztBQUN6Qyx1Q0FBdUM7QUFFdkM7Ozs7O0dBS0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxZQUFvQjtJQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFTLEVBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7UUFDL0MsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7S0FDbEMsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN4RSxDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQTtBQUNsQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsWUFBb0I7SUFFcEIsTUFBTSxHQUFHLEdBQUcsSUFBQSx1QkFBWSxFQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUM5QyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDL0IsSUFBSSxJQUE0QyxDQUFBO0lBQ2hELElBQUksQ0FBQztRQUNILElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FDYixvQ0FBb0MsWUFBWSxLQUFNLENBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FDNUUsQ0FBQTtJQUNILENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQTtJQUNwQyxNQUFNLE1BQU0sR0FBMkQsRUFBRSxDQUFBO0lBQ3pFLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLFNBQVE7UUFDbkMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzFCLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUTtZQUFFLFNBQVE7UUFDM0MsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3pDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUE7SUFDdEQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsU0FBaUI7SUFDdkMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO0lBQ3JFLElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNuQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDZCxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ25DLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxVQUFVLENBQUMsSUFBWTtJQUM5QiwyRUFBMkU7SUFDM0UsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDM0MsdUNBQXVDO0lBQ3ZDLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN2QyxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnMtZXh0cmFcIlxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbGVnYWN5IGBidW4ubG9ja2JgIGJpbmFyeSBsb2NrZmlsZSAoQnVuIDwgMS4yKSBieSBydW5uaW5nXG4gKiBgYnVuIDxwYXRoPmAsIHdoaWNoIHByaW50cyB0aGUgbG9ja2ZpbGUgaW4geWFybi12MSB0ZXh0IGZvcm1hdC5cbiAqXG4gKiBSZXR1cm5zIHRoZSB5YXJuLXYxIHRleHQgc28gaXQgY2FuIGJlIGZlZCB0byBgQHlhcm5wa2cvbG9ja2ZpbGVgJ3MgcGFyc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCdW5Mb2NrZmlsZShsb2NrRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb2Nlc3MgPSBzcGF3blN5bmMoXCJidW5cIiwgW2xvY2tGaWxlUGF0aF0sIHtcbiAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gIH0pXG4gIGlmIChwcm9jZXNzLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBCdW4gZXhpdGVkIHdpdGggY29kZTogJHtwcm9jZXNzLnN0YXR1c31cXG4ke3Byb2Nlc3Muc3RkZXJyLnRvU3RyaW5nKCl9YCxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHByb2Nlc3Muc3Rkb3V0LnRvU3RyaW5nKClcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG5ldyBgYnVuLmxvY2tgIHRleHQvSlNPTkMgbG9ja2ZpbGUgKEJ1biA+PSAxLjIsIGluY2x1ZGluZ1xuICogMS4zLjE0KSBhbmQgY29udmVydHMgaXQgaW50byBhIHlhcm4tdjEtbG9ja2ZpbGUtY29tcGF0aWJsZSBvYmplY3Qgc28gdGhlXG4gKiByZXN0IG9mIHRoZSByZXNvbHV0aW9uIGxvZ2ljIGNhbiB0cmVhdCBidW4gbGlrZSB5YXJuLlxuICpcbiAqIEVhY2ggcGFja2FnZSBlbnRyeSBpbiBgYnVuLmxvY2tgIGhhcyB0aGUgZm9ybTpcbiAqXG4gKiAgIFwibmFtZVwiOiBbXCJmdWxsLXNwZWNpZmllckB2ZXJzaW9uXCIsIFwicGF0aFwiLCB7IC4uLm1ldGFkYXRhIH0sIFwiaW50ZWdyaXR5XCJdXG4gKlxuICogVGhpcyBpcyB0cmFuc2Zvcm1lZCB0byB5YXJuIHYxIHNoYXBlOlxuICpcbiAqICAgXCJmdWxsLXNwZWNpZmllckB2ZXJzaW9uXCI6IHsgdmVyc2lvbjogXCJ2ZXJzaW9uXCIsIHJlc29sdmVkOiB1bmRlZmluZWQgfVxuICpcbiAqIFRoZSBgcmVzb2x2ZWRgIFVSTCBpcyBub3Qgc3RvcmVkIGluIGBidW4ubG9ja2AgKG9ubHkgdGhlIGludGVncml0eSBoYXNoKSxcbiAqIHNvIGl0IGlzIGxlZnQgYHVuZGVmaW5lZGAuIFRoZSBkb3duc3RyZWFtIHJlc29sdXRpb24gbG9naWMgYWxyZWFkeSBmYWxsc1xuICogYmFjayB0byB0aGUgdmVyc2lvbi9hbGlhcy9maWxlIHNwZWNpZmllciB3aGVuIGByZXNvbHZlZGAgaXMgbWlzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnVuTG9ja1RleHRGaWxlKFxuICBsb2NrRmlsZVBhdGg6IHN0cmluZyxcbik6IFJlY29yZDxzdHJpbmcsIHsgdmVyc2lvbjogc3RyaW5nOyByZXNvbHZlZD86IHN0cmluZyB9PiB7XG4gIGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhsb2NrRmlsZVBhdGgsIFwidXRmOFwiKVxuICBjb25zdCBjbGVhbmVkID0gc3RyaXBKc29uYyhyYXcpXG4gIGxldCBkYXRhOiB7IHBhY2thZ2VzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuICB0cnkge1xuICAgIGRhdGEgPSBKU09OLnBhcnNlKGNsZWFuZWQpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ291bGQgbm90IHBhcnNlIGJ1bi5sb2NrIGZpbGUgYXQgJHtsb2NrRmlsZVBhdGh9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWAsXG4gICAgKVxuICB9XG4gIGNvbnN0IHBhY2thZ2VzID0gZGF0YS5wYWNrYWdlcyA/PyB7fVxuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHsgdmVyc2lvbjogc3RyaW5nOyByZXNvbHZlZD86IHN0cmluZyB9PiA9IHt9XG4gIGZvciAoY29uc3QgZW50cnkgb2YgT2JqZWN0LnZhbHVlcyhwYWNrYWdlcykpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cnkpKSBjb250aW51ZVxuICAgIGNvbnN0IHNwZWNpZmllciA9IGVudHJ5WzBdXG4gICAgaWYgKHR5cGVvZiBzcGVjaWZpZXIgIT09IFwic3RyaW5nXCIpIGNvbnRpbnVlXG4gICAgY29uc3QgdmVyc2lvbiA9IGV4dHJhY3RWZXJzaW9uKHNwZWNpZmllcilcbiAgICByZXN1bHRbc3BlY2lmaWVyXSA9IHsgdmVyc2lvbiwgcmVzb2x2ZWQ6IHVuZGVmaW5lZCB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSB2ZXJzaW9uIChvciBtZWFuaW5nZnVsIHJlc29sdXRpb24gdG9rZW4pIGZyb20gYSBidW4ubG9ja1xuICogcGFja2FnZSBzcGVjaWZpZXIuXG4gKlxuICogU3BlY2lmaWVyIGZvcm1zIGhhbmRsZWQ6XG4gKiAgIFwibmFtZUAxLjIuM1wiXG4gKiAgIFwiQHNjb3BlL25hbWVAMS4yLjNcIlxuICogICBcIm5wbTpvdGhlci1uYW1lQDEuMi4zXCJcbiAqICAgXCJmaWxlOi4vcGF0aFwiXG4gKiAgIFwid29ya3NwYWNlOl5cIlxuICogICBcImxpbms6Li9wYXRoXCJcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFZlcnNpb24oc3BlY2lmaWVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcmVmaXhNYXRjaCA9IHNwZWNpZmllci5tYXRjaCgvXihucG06fGZpbGU6fHdvcmtzcGFjZTp8bGluazopLylcbiAgaWYgKHByZWZpeE1hdGNoKSB7XG4gICAgY29uc3QgcmVzdCA9IHNwZWNpZmllci5zbGljZShwcmVmaXhNYXRjaFswXS5sZW5ndGgpXG4gICAgY29uc3QgYXRJZHggPSByZXN0Lmxhc3RJbmRleE9mKFwiQFwiKVxuICAgIGlmIChhdElkeCA+IDApIHtcbiAgICAgIHJldHVybiByZXN0LnNsaWNlKGF0SWR4ICsgMSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3RcbiAgfVxuICBjb25zdCBhdElkeCA9IHNwZWNpZmllci5sYXN0SW5kZXhPZihcIkBcIilcbiAgaWYgKGF0SWR4ID4gMCkge1xuICAgIHJldHVybiBzcGVjaWZpZXIuc2xpY2UoYXRJZHggKyAxKVxuICB9XG4gIHJldHVybiBzcGVjaWZpZXJcbn1cblxuLyoqXG4gKiBTdHJpcHMgSlNPTkMgZXh0ZW5zaW9ucyAoLy8gY29tbWVudHMgYW5kIHRyYWlsaW5nIGNvbW1hcykgc28gdGhlIGZpbGUgY2FuXG4gKiBiZSBwYXJzZWQgd2l0aCBgSlNPTi5wYXJzZWAuIEJ1bidzIGBidW4ubG9ja2AgYWxsb3dzIGJvdGguXG4gKi9cbmZ1bmN0aW9uIHN0cmlwSnNvbmModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gU3RyaXAgc2luZ2xlLWxpbmUgYC8vYCBjb21tZW50cy4gKGJ1bi5sb2NrIGRvZXMgbm90IHVzZSBibG9jayBjb21tZW50cy4pXG4gIGxldCBvdXQgPSB0ZXh0LnJlcGxhY2UoL15cXHMqXFwvXFwvLiokL2dtLCBcIlwiKVxuICAvLyBSZW1vdmUgdHJhaWxpbmcgY29tbWFzIGJlZm9yZSB9IG9yIF1cbiAgb3V0ID0gb3V0LnJlcGxhY2UoLywoXFxzKlt9XFxdXSkvZywgXCIkMVwiKVxuICByZXR1cm4gb3V0XG59XG4iXX0=