@mnaoumov/typescript-dev-toolkit 3.4.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -225,8 +225,13 @@ async function generateLibraryExports(options = {}) {
225
225
  throw new Error("Package exports have changed. Please review the changes and commit them.");
226
226
  }
227
227
  }
228
- async function generateLibraryIndex() {
229
- await generateIndex(import_repo_paths.RepoPaths.Src);
228
+ async function generateLibraryIndex(options = {}) {
229
+ const excludedPaths = new Set((options.excludeFromIndex ?? []).map((path) => (0, import_path.join)(path.replaceAll("\\", "/")).replace(/\/$/, "")));
230
+ const unmatchedPaths = new Set(excludedPaths);
231
+ await generateIndex({ excludedPaths, folder: import_repo_paths.RepoPaths.Src, unmatchedPaths });
232
+ if (unmatchedPaths.size > 0) {
233
+ throw new Error(`excludeFromIndex names no module the barrels would export: ${[...unmatchedPaths].join(", ")}.`);
234
+ }
230
235
  }
231
236
  async function runBuildSteps(steps = LIBRARY_BUILD_STEPS) {
232
237
  for (const step of steps) {
@@ -360,9 +365,10 @@ function collectEnvironmentDirectives(params) {
360
365
  }
361
366
  return directivesByFile;
362
367
  }
363
- async function generateIndex(folder) {
368
+ async function generateIndex(params) {
369
+ const { folder } = params;
364
370
  const dirents = await (0, import_fs.readdirPosix)(folder, { withFileTypes: true });
365
- const maybeLines = await (0, import_async.asyncMap)(dirents, (dirent) => handleIndexDirent(folder, dirent));
371
+ const maybeLines = await (0, import_async.asyncMap)(dirents, (dirent) => handleIndexDirent(params, dirent));
366
372
  const lines = maybeLines.filter((line) => line !== void 0);
367
373
  if (lines.length === 0) {
368
374
  return "skipped" /* Skipped */;
@@ -377,14 +383,20 @@ async function getLibFiles() {
377
383
  (file) => file.endsWith(import_repo_paths.RepoPaths.TsExtension) && !file.endsWith(import_repo_paths.RepoPaths.DtsExtension) && !file.endsWith(".test.ts") && !file.includes(`/${import_repo_paths.RepoPaths.TestHelpers}/`)
378
384
  );
379
385
  }
380
- async function handleIndexDirent(folder, dirent) {
386
+ async function handleIndexDirent(params, dirent) {
387
+ const { excludedPaths, folder, unmatchedPaths } = params;
381
388
  if (isExcludedFromIndex(folder, dirent)) {
382
389
  return;
383
390
  }
391
+ const path = (0, import_path.join)(folder, dirent.name);
392
+ if (excludedPaths.has(path)) {
393
+ unmatchedPaths.delete(path);
394
+ return;
395
+ }
384
396
  let sourceFile;
385
397
  let name;
386
398
  if (dirent.isDirectory()) {
387
- const result = await generateIndex((0, import_path.join)(folder, dirent.name));
399
+ const result = await generateIndex({ ...params, folder: path });
388
400
  if (result !== "success" /* Success */) {
389
401
  return;
390
402
  }
@@ -545,4 +557,4 @@ async function writeSubpathPackageJson(folder, packageJson) {
545
557
  generateLibraryIndex,
546
558
  runBuildSteps
547
559
  });
548
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVwZW5kZW5jaWVzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiBhIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzb1xuICogYSBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbnRyaWVzIGZvciBmaWxlcyB0aGF0IGFyZSBub3QgYnVpbHQgZnJvbSBhIHNvdXJjZSBmb2xkZXIgKGEgZm9sZGVyIG9mIHNoYXJlZCBgdHNjb25maWdgIHByZXNldHMsIGFtYmllbnQgYC5kLnRzYFxuICAgKiBmaWxlcyksIGtleWVkIGJ5IHN1YnBhdGguIFRoZXkgZ28gaW50byB0aGUgbWFwIGFmdGVyIHRoZSBnZW5lcmF0ZWQgZW50cmllcywgYXMgZ2l2ZW4sIGFuZCBjb3VudCB0b3dhcmQgaXRzIGNoYW5nZVxuICAgKiBjaGVjazsgbm8gc3VicGF0aCBzdHViIGlzIHdyaXR0ZW4gZm9yIHRoZW0uIEEga2V5IGEgc291cmNlIGZvbGRlciBhbHJlYWR5IGdlbmVyYXRlcyB0aHJvd3MuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRXhwb3J0cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFBhY2thZ2VKc29uLkV4cG9ydHM+PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwb3J0IGNvbmRpdGlvbiB0byBwdXQgZmlyc3QgaW4gZXZlcnkgZW50cnksIG1hcHBpbmcgdGhlIHN1YnBhdGggb250byBpdHMgVHlwZVNjcmlwdCBzb3VyY2UuIE9ubHkgYVxuICAgKiByZXBvc2l0b3J5IGhvbGRpbmcgc2V2ZXJhbCBwYWNrYWdlcyB0aGF0IGltcG9ydCBlYWNoIG90aGVyIG5lZWRzIG9uZTsgbm90aGluZyBvdXRzaWRlIGl0IHNldHMgdGhlIGNvbmRpdGlvbiwgYW5kXG4gICAqIHRoZSBzb3VyY2VzIGl0IHBvaW50cyBhdCBkbyBub3Qgc2hpcCwgc28gdGhlIHB1Ymxpc2ggaGFzIHRvIHN0cmlwIGl0IGFnYWluLiBPbWl0dGVkLCB0aGUgbWFwIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG50eXBlIE1vZHVsZUZvcm1hdCA9ICdjanMnIHwgJ2VzbSc7XG5cbmNvbnN0IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUyA9IG5ldyBTZXQoWydub2RlJ10pO1xuXG4vLyBUaGUgbGlicyB0aGF0IGRlc2NyaWJlIGEgaG9zdCdzIGdsb2JhbHMgcmF0aGVyIHRoYW4gdGhlIGxhbmd1YWdlLCB3aGljaCBjb25zdW1lcnMgY29uZmxpY3Qgb3Zlci4gRWFjaCBkZWNsYXJhdGlvblxuLy8gZ2V0cyB0aGUgb25lcyBpdCB1c2VzOyBldmVyeSBvdGhlciBsaWIgaXMgc2hhcmVkIHRocm91Z2ggYGxpYnJhcnktcmVmZXJlbmNlc2AuXG5jb25zdCBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gWydkb20nLCAnc2NyaXB0aG9zdCcsICd3ZWJ3b3JrZXInXTtcbmNvbnN0IE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UID0gJy9ub2RlX21vZHVsZXMvQHR5cGVzL25vZGUvJztcbmNvbnN0IExJQl9SRVBMQUNFTUVOVF9SRUdfRVhQID0gL1xcL25vZGVfbW9kdWxlc1xcL0B0eXBlc2NyaXB0XFwvbGliLSg/PExpYj5bXi9dKylcXC8oPzxTdWJMaWI+LispXFwuZFxcLnRzJC87XG5cbi8vIFRoZSBkZWNsYXJhdGlvbiB0aGF0IGNhcnJpZXMgb25seSB0aGUgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlcy4gRXZlcnkgZGVjbGFyYXRpb24gYnV0IHRoZSByb290IG9uZSByZWZlcmVuY2VzXG4vLyBpdCwgcmF0aGVyIHRoYW4gdGhlIHJvb3QgYmFycmVsLCB3aGljaCB3b3VsZCBsb2FkIGV2ZXJ5IG1vZHVsZSBvZiB0aGUgcGFja2FnZSwgb3B0aW9uYWwgcGVlcnMnIHR5cGVzIGluY2x1ZGVkLlxuY29uc3QgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSA9ICdsaWJyYXJ5LXJlZmVyZW5jZXMnO1xuLy8gU3BlbGxlZCBhcGFydCBvbiBwdXJwb3NlOiB7QGxpbmsgY29sbGVjdEFsbExpYnN9IHNjYW5zIGV2ZXJ5IHNvdXJjZSBmaWxlIG9mIHRoZSBwYWNrYWdlIGJlaW5nIGJ1aWx0IGZvciB0aGVcbi8vIGRpcmVjdGl2ZSwgdGhpcyBvbmUgaW5jbHVkZWQsIHNvIGEgbGl0ZXJhbCBvbmUgaGVyZSB3b3VsZCBiZSByZWFkIGFzIGEgbGliIHRoaXMgcGFja2FnZSBuZWVkcy5cbmNvbnN0IFJFRkVSRU5DRV9MSUJfRElSRUNUSVZFID0gWyc8cmVmZXJlbmNlJywgJ2xpYj0nXS5qb2luKCcgJyk7XG5jb25zdCBSRUZFUkVOQ0VfTElCX1JFR19FWFAgPSAvXFwvXFwvXFwvIDxyZWZlcmVuY2UgbGliPVwiKD88TGliPlteXCJdKylcIiBcXC8+L2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIHR5cGUtb25seSBpbXBvcnQsIGUuZy4gYGltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7YC5cbmNvbnN0IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUCA9IC9eaW1wb3J0IHR5cGUgKD88Q2xhdXNlPi4rPykgZnJvbSAnKD88U3BlY2lmaWVyPlteLiddW14nXSopJzskL2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIGlubGluZSBpbXBvcnQgdHlwZSBub2RlLCBlLmcuIGBpbXBvcnQoXCJ0eXBlLWZlc3RcIikuUHJvbWlzYWJsZWAuXG5jb25zdCBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQID0gL2ltcG9ydFxcKFwiKD88U3BlY2lmaWVyPlteLlwiXVteXCJdKilcIlxcKS9nO1xuXG5jb25zdCBTVEFUSUNfSU1QT1JUX1JFR19FWFAgPSAvZnJvbSAnKD88SW1wb3J0UGF0aD4uKz8pXFwudHMnOy9nbTtcblxuLy8gSW5saW5lIGltcG9ydC10eXBlIG5vZGVzIChgdHlwZW9mIGltcG9ydCgnLi9mb28udHMnKWApIHByZXNlcnZlIHRoZSBzb3VyY2UgcXVvdGUgc3R5bGUuXG4vLyBIYW5kLWF1dGhvcmVkIGAuZC50c2AgZmlsZXMgZW1pdCBzaW5nbGUgcXVvdGVzOyB0c2MtZ2VuZXJhdGVkIGRlY2xhcmF0aW9ucyBlbWl0IGRvdWJsZSBxdW90ZXMuXG4vLyBDYXB0dXJlIHRoZSBxdW90ZSBhbmQgcmV1c2UgaXQgaW4gdGhlIHJlcGxhY2VtZW50IHNvIGJvdGggc3R5bGVzIGFyZSByZXdyaXR0ZW4uXG5jb25zdCBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQID0gL2ltcG9ydFxcKCg/PFF1b3RlPlsnXCJdKSg/PEltcG9ydFBhdGg+Lis/KVxcLnRzXFxrPFF1b3RlPlxcKS9nbTtcblxuZW51bSBHZW5lcmF0ZUluZGV4UmVzdWx0IHtcbiAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgU3VjY2VzcyA9ICdzdWNjZXNzJ1xufVxuXG5pbnRlcmZhY2UgQWRkRW52aXJvbm1lbnRHbG9iYWxzUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliczogU2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHN5bWJvbDogVHNTeW1ib2w7XG4gIHJlYWRvbmx5IHR5cGVzOiBTZXQ8c3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGZvcm1hdDogTW9kdWxlRm9ybWF0O1xuICByZWFkb25seSBsaWJGaWxlczogc3RyaW5nW107XG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5OiAoaXNFc206IGJvb2xlYW4pID0+IFBsdWdpbjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uRmlsZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZHVsZURpcmVjdG9yeTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlc1BhcmFtcyB7XG4gIHJlYWRvbmx5IGF2YWlsYWJsZVR5cGVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkcy4gRXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gcmVmZXJlbmNlcyBhIGBsaWJyYXJ5LXJlZmVyZW5jZXNgXG4gKiBkZWNsYXJhdGlvbiBiZXNpZGUgaXQgYnkgcGF0aCwgbmV2ZXIgdGhlIHJvb3Q6IHRoZSByb290IGJhcnJlbCByZS1leHBvcnRzIGV2ZXJ5IG1vZHVsZSwgc28gcmVmZXJlbmNpbmcgaXQgbWFkZSBlYWNoXG4gKiBzdWJwYXRoIGxvYWQgdGhlIHdob2xlIHBhY2thZ2UsIGFuZCBhIGNvbnN1bWVyIHR5cGUtY2hlY2tpbmcgd2l0aCBgc2tpcExpYkNoZWNrOiBmYWxzZWAgdGhlbiBuZWVkZWQgZXZlcnkgb3B0aW9uYWxcbiAqIHBlZXIgaW5zdGFsbGVkLlxuICpcbiAqIGBsaWJyYXJ5LXJlZmVyZW5jZXNgIGNhcnJpZXMgb25seSB0aGUgbGlicyB0aGF0IGRlc2NyaWJlIHRoZSBsYW5ndWFnZSAoYGVzMjAyMmAsIGBlc25leHQuZGlzcG9zYWJsZWApLCB3aGljaCBub1xuICogY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBvbmVzIHRoYXQgZGVzY3JpYmUgYSBob3N0IChgZG9tYCwgYGRvbS5pdGVyYWJsZWAsIGB3ZWJ3b3JrZXJgKSBhbmQgYHR5cGVzPVwibm9kZVwiYCBnb1xuICogb25seSBpbnRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCBuYW1lIG9uZSBvZiB0aGVpciBnbG9iYWxzLCBmb3VuZCBieSByZXNvbHZpbmcgZXZlcnkgbmFtZSBpbiB0aGUgZW1pdHRlZFxuICogZGVjbGFyYXRpb25zIHdpdGggdGhlIHR5cGUgY2hlY2tlci4gT3RoZXJ3aXNlIGEgYnJvd3NlciBjb25zdW1lciBvZiBhIHB1cmUgc3VicGF0aCBnb3QgYWxsIG9mIGBAdHlwZXMvbm9kZWAsIGFuZCBpdHNcbiAqIGBzZXRUaW1lb3V0YCByZXR1cm5lZCBgTm9kZUpTLlRpbWVvdXRgLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICogQHRocm93cyBJZiBhIHNvdXJjZSBtb2R1bGUgaXMgbmFtZWQgYGxpYnJhcnktcmVmZXJlbmNlc2AsIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgYCR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn1gKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNyYy8ke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259IGNvbGxpZGVzIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lLmApO1xuICB9XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAndHNjJyB9KSwgJy0tcHJvamVjdCcsICcuL3RzY29uZmlnLnR5cGVzLmpzb24nXSk7XG5cbiAgY29uc3QgbGlicmFyeUZpbGVOYW1lID0gZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsICdsaWJyYXJ5LnRzJykpID8gJ2xpYnJhcnknIDogJ2luZGV4JztcbiAgY29uc3QgYWxsTGlicyA9IGF3YWl0IGNvbGxlY3RBbGxMaWJzKCk7XG4gIGNvbnN0IGFsbFR5cGVzID0gY29sbGVjdEFsbFR5cGVzKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhhbGxUeXBlcyk7XG4gIC8vIE9ubHkgdGhlIGxpYnMgbm8gY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBlbnZpcm9ubWVudCBnbG9iYWxzIGdvIHRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCB1c2UgdGhlbS5cbiAgY29uc3Qgc2hhcmVkRGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzLmZpbHRlcigobGliKSA9PiAhaXNFbnZpcm9ubWVudExpYihsaWIpKSk7XG5cbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuXG4gIGNvbnN0IHNyY0ZpbGVzID0gYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZWNsYXJhdGlvbkZpbGVzID0gc3JjRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSk7XG4gIGNvbnN0IGVudmlyb25tZW50RGlyZWN0aXZlcyA9IGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMoeyBhdmFpbGFibGVUeXBlczogYWxsVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGZpbGUpO1xuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBjdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IG10c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbik7XG5cbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGN0c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG10c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGxldCBjdHNDb250ZW50ID0gdG9DdHNDb250ZW50KGNvbnRlbnQpO1xuICAgIGxldCBtdHNDb250ZW50ID0gdG9NdHNDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgaWYgKG5hbWUgPT09IGxpYnJhcnlGaWxlTmFtZSAmJiBmb2xkZXIgPT09ICcuJykge1xuICAgICAgY3RzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWxlRGlyZWN0aXZlcyA9IGVudmlyb25tZW50RGlyZWN0aXZlcy5nZXQoZmlsZSkgPz8gJyc7XG4gICAgICBjdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogY3RzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuQ2pzIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkVzbSB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoY3RzUGF0aCwgY3RzQ29udGVudCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKG10c1BhdGgsIG10c0NvbnRlbnQpO1xuICB9XG59XG5cbi8qKlxuICogUmVnZW5lcmF0ZXMgdGhlIGBleHBvcnRzYCBtYXAgb2YgdGhlIHBhY2thZ2UncyBgcGFja2FnZS5qc29uYCBmcm9tIGl0cyBzb3VyY2UgZm9sZGVycywgYW5kIHdyaXRlcyBhIGBwYWNrYWdlLmpzb25gXG4gKiBzdHViIHBlciBzdWJwYXRoIGZvciByZXNvbHZlcnMgdGhhdCBkbyBub3QgcmVhZCBgZXhwb3J0c2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFwIGlzIGN1cnJlbnQuXG4gKiBAdGhyb3dzIElmIHRoZSBtYXAgY2hhbmdlZCwgc28gdGhlIGNoYW5nZSBnZXRzIHJldmlld2VkIGFuZCBjb21taXR0ZWQgcmF0aGVyIHRoYW4gc2hpcHBlZCB1bnNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzKG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhZGRpdGlvbmFsRXhwb3J0cyA9IHt9LCBzb3VyY2VDb25kaXRpb24gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNyY0ZvbGRlcnM6IHN0cmluZ1tdID0gW1JlcG9QYXRocy5TcmNdO1xuXG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSk7XG5cbiAgICBpZiAocGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuU3R5bGVzKSB8fCBwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNyY0ZvbGRlcnMucHVzaChwYXRoKTtcbiAgfVxuXG4gIHNyY0ZvbGRlcnMuc29ydCgpO1xuXG4gIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oYXN5bmMgKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgY29uc3Qgb2xkRXhwb3J0cyA9IHBhY2thZ2VKc29uLmV4cG9ydHM7XG4gICAgY29uc3QgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucyA9IHt9O1xuICAgIHBhY2thZ2VKc29uLmV4cG9ydHMgPSBleHBvcnRDb25kaXRpb25zO1xuICAgIGZvciAoY29uc3Qgc3JjRm9sZGVyIG9mIHNyY0ZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IGZhbHNlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IHRydWUsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnBhdGgsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsRXhwb3J0cykpIHtcbiAgICAgIGlmIChleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWRkaXRpb25hbCBleHBvcnQgJyR7c3VicGF0aH0nIGNvbGxpZGVzIHdpdGggYW4gZW50cnkgZ2VuZXJhdGVkIGZyb20gYSBzb3VyY2UgZm9sZGVyLmApO1xuICAgICAgfVxuXG4gICAgICBleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdID0gZW50cnk7XG4gICAgfVxuXG4gICAgaXNDaGFuZ2VkID0gIWlzRGVlcEVxdWFsKG9sZEV4cG9ydHMsIHBhY2thZ2VKc29uLmV4cG9ydHMpO1xuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBjaGFuZ2VkIGluIHRoZSBgZWRpdFBhY2thZ2VKc29uYCwgRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYWNrYWdlIGV4cG9ydHMgaGF2ZSBjaGFuZ2VkLiBQbGVhc2UgcmV2aWV3IHRoZSBjaGFuZ2VzIGFuZCBjb21taXQgdGhlbS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBgaW5kZXgudHNgIGJhcnJlbCBpbiBldmVyeSBzb3VyY2UgZm9sZGVyIHRoYXQgaGFzIHNvbWV0aGluZyB0byBleHBvcnQsIHJlLWV4cG9ydGluZyBlYWNoIG1vZHVsZSBhbmRcbiAqIGVhY2ggc3ViLWJhcnJlbCB1bmRlciBpdHMgb3duIG5hbWUuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYXJyZWxzIGhhdmUgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5SW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdlbmVyYXRlSW5kZXgoUmVwb1BhdGhzLlNyYyk7XG59XG5cbi8qKlxuICogUnVucyBlYWNoIG5hbWVkIG5wbSBzY3JpcHQgdGhlIHBhY2thZ2UgZGVmaW5lcywgaW4gb3JkZXIsIHNraXBwaW5nIHRoZSBvbmVzIGl0IGRvZXMgbm90IGRlZmluZS5cbiAqXG4gKiBAcGFyYW0gc3RlcHMgLSBUaGUgbnBtIHNjcmlwdCBuYW1lcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBzdGVwIGhhcyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5CdWlsZFN0ZXBzKHN0ZXBzOiByZWFkb25seSBzdHJpbmdbXSA9IExJQlJBUllfQlVJTERfU1RFUFMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoc3RlcCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIHdoYXQgYSBjb25zdW1lciBuZWVkcyBsb2FkZWQgZm9yIG9uZSBzeW1ib2wgYSBkZWNsYXJhdGlvbiBuYW1lcy4gQSBzeW1ib2wgYW55IEVTIGxpYiBkZWNsYXJlcyBuZWVkcyBub3RoaW5nLFxuICogYmVjYXVzZSBubyBjb25zdW1lciBjb25mbGljdHMgd2l0aCB0aG9zZSBsaWJzLiBPdGhlcndpc2UgZWFjaCBlbnZpcm9ubWVudCBsaWIgdGhhdCBkZWNsYXJlcyBpdCBhZGRzIGl0c2VsZiwgYW5kXG4gKiBmYWlsaW5nIHRoYXQgYEB0eXBlcy9ub2RlYCBhZGRzIGBub2RlYC4gQSBzeW1ib2wgZGVjbGFyZWQgaW4gdGhlIHBhY2thZ2UncyBvd24gZmlsZXMgYWRkcyBub3RoaW5nOiB0aGUgZGVjbGFyYXRpb25cbiAqIHRoYXQgaG9sZHMgaXQgY2FycmllcyBpdHMgb3duIGRpcmVjdGl2ZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzeW1ib2wsIHRoZSBwcm9ncmFtIGl0IHdhcyByZXNvbHZlZCBpbiwgYW5kIHRoZSBzZXRzIHRvIGFkZCB0by5cbiAqL1xuZnVuY3Rpb24gYWRkRW52aXJvbm1lbnRHbG9iYWxzKHBhcmFtczogQWRkRW52aXJvbm1lbnRHbG9iYWxzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgbGlicywgcHJvZ3JhbSwgc3ltYm9sLCB0eXBlcyB9ID0gcGFyYW1zO1xuICBjb25zdCBlbnZpcm9ubWVudExpYnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpc05vZGUgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN5bWJvbC5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICAgIGlmIChwcm9ncmFtLmlzU291cmNlRmlsZURlZmF1bHRMaWJyYXJ5KHNvdXJjZUZpbGUpKSB7XG4gICAgICBjb25zdCBsaWIgPSB0b0xpYk5hbWUoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgICBpZiAoIWlzRW52aXJvbm1lbnRMaWIobGliKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbnZpcm9ubWVudExpYnMucHVzaChsaWIpO1xuICAgIH0gZWxzZSBpZiAoc291cmNlRmlsZS5maWxlTmFtZS5pbmNsdWRlcyhOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCkpIHtcbiAgICAgIGlzTm9kZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVudmlyb25tZW50TGlicy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBsaWIgb2YgZW52aXJvbm1lbnRMaWJzKSB7XG4gICAgICBsaWJzLmFkZChsaWIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc05vZGUpIHtcbiAgICB0eXBlcy5hZGQoJ25vZGUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMobGliczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7XG4gICAgbGlic1xuICAgICAgLm1hcCgobGliKSA9PiBgLy8vICR7UkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkV9XCIke2xpYn1cIiAvPmApXG4gICAgICAuam9pbignXFxuJylcbiAgfVxcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKHR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlcy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiBgJHtcbiAgICAgIHR5cGVzXG4gICAgICAgIC5tYXAoKHR5cGUpID0+IGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIiR7dHlwZX1cIiAvPmApXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH1cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlGb3JtYXQocGFyYW1zOiBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBmb3JtYXQsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBleHRlbnNpb24gPSBmb3JtYXQgPT09ICdjanMnID8gUmVwb1BhdGhzLkNqc0V4dGVuc2lvbiA6IFJlcG9QYXRocy5NanNFeHRlbnNpb247XG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogQnVpbGRPcHRpb25zID0ge1xuICAgIC8vIEV4cGxpY2l0LCBiZWNhdXNlIGVzYnVpbGQgb3RoZXJ3aXNlIHRha2VzIHRoZSBmb2xkZXIgaXRzIHNlcnZpY2UgcHJvY2VzcyBzdGFydGVkIGluLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGVzYnVpbGQncyBvd24gb3B0aW9uIG5hbWUuXG4gICAgYWJzV29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBiYW5uZXI6IHtcbiAgICAgIGpzOiBMSUJSQVJZX0JBTk5FUlxuICAgIH0sXG4gICAgYnVuZGxlOiBmYWxzZSxcbiAgICBlbnRyeVBvaW50czogbGliRmlsZXMsXG4gICAgZm9ybWF0LFxuICAgIGxvZ0xldmVsOiAnaW5mbycsXG4gICAgb3V0ZGlyOiBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBmb3JtYXQpLFxuICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgcGx1Z2luczogW1xuICAgICAgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkoZm9ybWF0ID09PSAnZXNtJyksXG4gICAgICBmaXhFc21QbHVnaW4oKSxcbiAgICAgIGNoYW5nZUV4dGVuc2lvblBsdWdpbihleHRlbnNpb24pXG4gICAgXSxcbiAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgIHRhcmdldDogJ0VTMjAyMicsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgd3JpdGU6IGZhbHNlXG4gIH07XG5cbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgY29udGV4dChidWlsZE9wdGlvbnMpO1xuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkQ29udGV4dC5yZWJ1aWxkKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUocGFyYW1zOiBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGRlY2xhcmF0aW9uRmlsZVBhdGgsIGV4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpYnJhcnlGaWxlUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIG1vZHVsZURpcmVjdG9yeSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIGV4dGVuc2lvbik7XG4gIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZU5hdGl2ZShkaXJuYW1lKGRlY2xhcmF0aW9uRmlsZVBhdGgpLCBsaWJyYXJ5RmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICB9XG4gIHJldHVybiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiR7cmVsYXRpdmVQYXRofVwiIC8+XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFsbExpYnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAvLyBUaGUgUkVTT0xWRUQgb3B0aW9ucywgYmVjYXVzZSBhIHBhY2thZ2UncyBgdHNjb25maWcuanNvbmAgaW5oZXJpdHMgYGxpYmAgZnJvbSB0aGUgc2hhcmVkIGJhc2UuIFRoZSByZXNvbHZlZFxuICAvLyBuYW1lcyBhcmUgZmlsZSBuYW1lcyAoYGxpYi5kb20uaXRlcmFibGUuZC50c2ApLCBzbyB0aGV5IGFyZSBtYXBwZWQgYmFjayBvbnRvIHRoZSBuYW1lcyBhIGRpcmVjdGl2ZSB0YWtlcy5cbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBsaWJzID0gbmV3IFNldCgob3B0aW9ucy5saWIgPz8gW10pLm1hcCgobGliKSA9PiB0b0xpYk5hbWUobGliKSkpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoJy50cycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gcmVhZEZpbGVTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSksICd1dGYtOCcpO1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGl0cyBvbmUgZ3JvdXAsIHNvIG5vIGZhbGxiYWNrIGZvciBhIG1pc3Npbmcgb25lIGlzIG5lZWRlZC5cbiAgICBmb3IgKGNvbnN0IFssIGxpYl0gb2Ygc291cmNlQ29udGVudC5tYXRjaEFsbChSRUZFUkVOQ0VfTElCX1JFR19FWFApKSB7XG4gICAgICBsaWJzLmFkZChTdHJpbmcobGliKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gWy4uLmxpYnNdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEFsbFR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICByZXR1cm4gKG9wdGlvbnMudHlwZXMgPz8gW10pXG4gICAgLmZpbHRlcigodHlwZSkgPT4gREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTLmhhcyh0eXBlKSlcbiAgICAuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzKHBhcmFtczogQ29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlc1BhcmFtcyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB7IGF2YWlsYWJsZVR5cGVzLCBkZWNsYXJhdGlvbkZpbGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oe1xuICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucywgbm9FbWl0OiB0cnVlIH0sXG4gICAgcm9vdE5hbWVzOiBkZWNsYXJhdGlvbkZpbGVzLm1hcCgoZmlsZSkgPT4gcmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSlcbiAgfSk7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXNCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgLy8gVGhlIHByb2dyYW0gd2FzIGhhbmRlZCBldmVyeSBvbmUgb2YgdGhlc2UgYXMgYSByb290IG5hbWUsIHNvIGVhY2ggb25lIGlzIGluIGl0LlxuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBlbnN1cmVOb25OdWxsYWJsZShwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICAgIGNvbnN0IGxpYnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCB0eXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgICAgaWYgKGlzSWRlbnRpZmllcihub2RlKSB8fCBpc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUpO1xuICAgICAgICBpZiAoc3ltYm9sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRFbnZpcm9ubWVudEdsb2JhbHMoeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2w6IHJlc29sdmVBbGlhcyhjaGVja2VyLCBzeW1ib2wpLCB0eXBlcyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgICB9XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG5cbiAgICBjb25zdCBuZWVkZWRUeXBlcyA9IFsuLi50eXBlc10uZmlsdGVyKCh0eXBlKSA9PiBhdmFpbGFibGVUeXBlcy5pbmNsdWRlcyh0eXBlKSk7XG4gICAgaWYgKGxpYnMuc2l6ZSA+IDAgfHwgbmVlZGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgZGlyZWN0aXZlc0J5RmlsZS5zZXQoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIChsaWJzLnNpemUgPiAwID8gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKFsuLi5saWJzXS5zb3J0KCkpIDogJycpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMobmVlZGVkVHlwZXMuc29ydCgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlyZWN0aXZlc0J5RmlsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleChmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8R2VuZXJhdGVJbmRleFJlc3VsdD4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpclBvc2l4KGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBtYXliZUxpbmVzID0gYXdhaXQgYXN5bmNNYXAoZGlyZW50cywgKGRpcmVudCkgPT4gaGFuZGxlSW5kZXhEaXJlbnQoZm9sZGVyLCBkaXJlbnQpKTtcbiAgY29uc3QgbGluZXMgPSBtYXliZUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU2tpcHBlZDtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlKGpvaW4oZm9sZGVyLCBSZXBvUGF0aHMuSW5kZXhUcyksIGxpbmVzKTtcbiAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGliRmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LnRzJylcbiAgICAmJiAhZmlsZS5pbmNsdWRlcyhgLyR7UmVwb1BhdGhzLlRlc3RIZWxwZXJzfS9gKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbmRleERpcmVudChmb2xkZXI6IHN0cmluZywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXIsIGRpcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSkpO1xuICAgIGlmIChyZXN1bHQgIT09IEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKGRpcmVudC5uYW1lLCBSZXBvUGF0aHMuSW5kZXhUcykpO1xuICAgIG5hbWUgPSBkaXJlbnQubmFtZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGRpcmVudC5uYW1lKTtcbiAgICBuYW1lID0gYmFzZW5hbWUoZGlyZW50Lm5hbWUsIGV4dGVuc2lvbik7XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoZGlyZW50Lm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGBleHBvcnQgKiBhcyAnJHtuYW1lfScgZnJvbSAnJHtzb3VyY2VGaWxlfSc7YDtcbn1cblxuZnVuY3Rpb24gaXNFbnZpcm9ubWVudExpYihsaWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4gbGliLnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFuYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgfHwgbmFtZS5lbmRzV2l0aCgnLnRlc3QudHMnKSB8fCBuYW1lID09PSAnc2V0dXAudHMnIHx8IG5hbWUuZW5kc1dpdGgoJy1zZXR1cC50cycpO1xufVxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IGJvb2xlYW4ge1xuICBjb25zdCBleGNsdWRlZE5hbWVzOiByZWFkb25seSBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuSW5kZXhUcywgUmVwb1BhdGhzLlR5cGVzLCBSZXBvUGF0aHMuU3R5bGVzLCBSZXBvUGF0aHMuVGVzdEhlbHBlcnNdO1xuICBjb25zdCBpc0V4Y2x1ZGVkRW50cnkgPSBleGNsdWRlZE5hbWVzLmluY2x1ZGVzKGRpcmVudC5uYW1lKSB8fCBkaXJlbnQubmFtZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSB8fCBmb2xkZXIuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICByZXR1cm4gaXNFeGNsdWRlZEVudHJ5IHx8IChkaXJlbnQuaXNGaWxlKCkgJiYgaXNFeGNsdWRlZEZpbGVOYW1lKGRpcmVudC5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBbGlhcyhjaGVja2VyOiBUeXBlQ2hlY2tlciwgc3ltYm9sOiBUc1N5bWJvbCk6IFRzU3ltYm9sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2UgLS0gYFN5bWJvbEZsYWdzYCBpcyBhIGJpdCBzZXQuXG4gIHJldHVybiAoc3ltYm9sLmZsYWdzICYgU3ltYm9sRmxhZ3MuQWxpYXMpID09PSAwID8gc3ltYm9sIDogY2hlY2tlci5nZXRBbGlhc2VkU3ltYm9sKHN5bWJvbCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldEV4cG9ydChwYXJhbXM6IFNldEV4cG9ydFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGltcG9ydFBhdGggPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBzcmNGb2xkZXIsXG4gICAgcmVwbGFjZXI6IFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLFxuICAgIHNlYXJjaFZhbHVlOiBSZXBvUGF0aHMuU3JjXG4gIH0pO1xuICBjb25zdCBjb25kaXRpb25QYXRoID0gaXNXaWxkY2FyZCA/IGAke2ltcG9ydFBhdGh9LyR7UmVwb1BhdGhzLkFueX1gIDogaW1wb3J0UGF0aDtcbiAgY29uc3QgZG10c1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueURtdHMgOiBSZXBvUGF0aHMuSW5kZXhEbXRzIH0pO1xuICBjb25zdCBkY3RzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RGN0cyA6IFJlcG9QYXRocy5JbmRleERjdHMgfSk7XG4gIGNvbnN0IGRtdHNGb2xkZXJQYXRoID0gZGlybmFtZShkbXRzUGF0aCk7XG4gIGNvbnN0IGRjdHNGb2xkZXJQYXRoID0gZGlybmFtZShkY3RzUGF0aCk7XG5cbiAgaWYgKCFpc1dpbGRjYXJkICYmICFleGlzdHNTeW5jKGRjdHNQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlzVHlwZXNPbmx5ID0gaW1wb3J0UGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICBjb25zdCBtanNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkVzbSwgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlNanMgOiBSZXBvUGF0aHMuSW5kZXhNanMgfSk7XG4gIGNvbnN0IGNqc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuQ2pzLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueUNqcyA6IFJlcG9QYXRocy5JbmRleENqcyB9KTtcblxuICBpZiAoaXNUeXBlc09ubHkpIHtcbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoXG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKFJlcG9QYXRocy5TcmMsIGltcG9ydFBhdGgsIGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55VHMgOiBSZXBvUGF0aHMuSW5kZXhUcykpO1xuXG4gICAgZXhwb3J0Q29uZGl0aW9uc1tjb25kaXRpb25QYXRoXSA9IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgICAgLy8gRmlyc3QsIHNvIGl0IHdpbnMgd2hlcmV2ZXIgaXQgaXMgc2V0OiBpbnNpZGUgdGhlIHJlcG9zaXRvcnksIGJlZm9yZSBhbnl0aGluZyBpcyBidWlsdC5cbiAgICAgIC4uLihzb3VyY2VDb25kaXRpb24gIT09IHVuZGVmaW5lZCAmJiB7IFtzb3VyY2VDb25kaXRpb25dOiBzb3VyY2VQYXRoIH0pLFxuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aCxcbiAgICAgICAgZGVmYXVsdDogbWpzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBjanNQYXRoXG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgIH07XG4gIH1cblxuICBpZiAoaW1wb3J0UGF0aCA9PT0gUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIgYXMgc3RyaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc1dpbGRjYXJkKSB7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBpbXBvcnRQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICAgICAgOiB7IG1haW46IHJlbGF0aXZlKGltcG9ydFBhdGgsIGNqc1BhdGgpLCBtb2R1bGU6IHJlbGF0aXZlKGltcG9ydFBhdGgsIG1qc1BhdGgpLCB0eXBlOiAnbW9kdWxlJywgdHlwZXM6IHJlbGF0aXZlKGltcG9ydFBhdGgsIGRjdHNQYXRoKSB9XG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KGRjdHNGb2xkZXJQYXRoKSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZSwgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VKc29uRm9sZGVyUGF0aCA9IGpvaW4oaW1wb3J0UGF0aCwgbmFtZSk7XG4gICAgY29uc3QgdHlwZXMgPSByZWxhdGl2ZShwYWNrYWdlSnNvbkZvbGRlclBhdGgsIGpvaW4oZGN0c0ZvbGRlclBhdGgsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpO1xuICAgIGF3YWl0IHdyaXRlU3VicGF0aFBhY2thZ2VKc29uKFxuICAgICAgcGFja2FnZUpzb25Gb2xkZXJQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlcyB9XG4gICAgICAgIDoge1xuICAgICAgICAgIG1haW46IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5DanNFeHRlbnNpb24pKSxcbiAgICAgICAgICBtb2R1bGU6IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkbXRzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5NanNFeHRlbnNpb24pKSxcbiAgICAgICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICAgICAgICB0eXBlc1xuICAgICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0N0c0NvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+LmNqc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5janMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuXG4gIC8vIEEgYC5kLmN0c2AgZmlsZSBpcyBhIENvbW1vbkpTIG1vZHVsZS4gVHlwZS1vbmx5IGltcG9ydHMgb2YgYSBiYXJlIHNwZWNpZmllciByZXNvbHZpbmcgdG8gYW5cbiAgLy8gRVNNLW9ubHkgcGFja2FnZSBuZWVkIGEgYHJlc29sdXRpb24tbW9kZWAgYXR0cmlidXRlLCBlbHNlIGB0c2NgIHJlcG9ydHMgVFMxNTQxIC8gVFMxNTQyLlxuICAvLyBQYXNzaW5nIGAnaW1wb3J0J2AgaXMgdmFsaWQgZm9yIENvbW1vbkpTIHRhcmdldHMgdG9vLCBzbyBldmVyeSBiYXJlIHNwZWNpZmllciByZWNlaXZlcyBpdC5cbiAgLy8gVGhlIEVTTSBgLmQubXRzYCBuZWVkcyBubyBzdWNoIGF0dHJpYnV0ZSwgc28gdGhpcyB0cmFuc2Zvcm0gcnVucyBvbiBDb21tb25KUyBjb250ZW50IG9ubHkuXG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0IHR5cGUgJDxDbGF1c2U+IGZyb20gXFwnJDxTcGVjaWZpZXI+XFwnIHdpdGggeyBcXCdyZXNvbHV0aW9uLW1vZGVcXCc6IFxcJ2ltcG9ydFxcJyB9OycsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoXCIkPFNwZWNpZmllcj5cIiwgeyB3aXRoOiB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH0gfSknLFxuICAgIHNlYXJjaFZhbHVlOiBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b0Rpc3RQYXRoKHBhcmFtczogVG9EaXN0UGF0aFBhcmFtcyk6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIHBhcmFtcy5mb3JtYXQsIHBhcmFtcy5pbXBvcnRQYXRoLCBwYXJhbXMubmFtZSkpO1xufVxuXG5mdW5jdGlvbiB0b0xpYk5hbWUobGliRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEEgbGliIGEgcGFja2FnZSByZXBsYWNlZCAoYEB0eXBlc2NyaXB0L2xpYi1kb21gLCBgQHR5cGVzY3JpcHQvbGliLWRvbS9pdGVyYWJsZS5kLnRzYCkgaXMgbmFtZWQgYnkgaXRzIHBhdGgsIG5vdCBieVxuICAvLyBpdHMgZmlsZSBuYW1lLCB3aGljaCBpcyBgaW5kZXguZC50c2AgZm9yIHRoZSBsaWIncyByb290LlxuICBjb25zdCByZXBsYWNlbWVudE1hdGNoID0gTElCX1JFUExBQ0VNRU5UX1JFR19FWFAuZXhlYyhsaWJGaWxlUGF0aCk7XG4gIGlmIChyZXBsYWNlbWVudE1hdGNoPy5ncm91cHMgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGJvdGggZ3JvdXBzLlxuICAgIGNvbnN0IGxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snTGliJ10pO1xuICAgIGNvbnN0IHN1YkxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snU3ViTGliJ10pO1xuICAgIHJldHVybiAoc3ViTGliID09PSAnaW5kZXgnID8gbGliIDogYCR7bGlifS4ke3N1YkxpYi5yZXBsYWNlQWxsKCcvJywgJy4nKX1gKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHJldHVybiBiYXNlbmFtZShsaWJGaWxlUGF0aCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ebGliXFwuLywgJycpLnJlcGxhY2UoL1xcLmRcXC50cyQvLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHRvTXRzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtdHNDb250ZW50ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY29udGVudCxcbiAgICByZXBsYWNlcjogJ2Zyb20gXFwnJDxJbXBvcnRQYXRoPi5tanNcXCc7JyxcbiAgICBzZWFyY2hWYWx1ZTogU1RBVElDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbXRzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8SW1wb3J0UGF0aD4ubWpzJDxRdW90ZT4pJyxcbiAgICBzZWFyY2hWYWx1ZTogRFlOQU1JQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oZm9sZGVyOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUpzb24oam9pbihmb2xkZXIsIFJlcG9QYXRocy5QYWNrYWdlSnNvbiksIHBhY2thZ2VKc29uKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF1QkEsbUJBQXlCO0FBQ3pCLDBCQUE0QjtBQUM1QixrQkFPTztBQUNQLG9CQUEyQjtBQUMzQix5QkFBa0M7QUFDbEMscUJBQXdCO0FBQ3hCLHFCQUdPO0FBQ1Asc0JBS087QUFDUCx1QkFHTztBQUNQLDBCQUFvQjtBQUNwQix3QkFNTztBQUlQLG1CQUEyQjtBQUMzQixxQ0FBc0M7QUFDdEMsNEJBQTZCO0FBQzdCLCtCQUFpQztBQUNqQyxpQ0FBOEI7QUFDOUIsNEJBQXlCO0FBQ3pCLGdCQUE2QjtBQUM3QixrQkFBMEI7QUFDMUIscUJBQStCO0FBQy9CLGlCQUFnQztBQUNoQyw2QkFBbUM7QUFDbkMsd0JBQTBCO0FBQzFCLGtCQUE2QjtBQUt0QixNQUFNLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU3ZCLE1BQU0sc0JBQXlDO0FBQUEsRUFDcEQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFPTyxNQUFNLG1CQUFtQjtBQWtDaEMsTUFBTSw4QkFBOEIsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUlwRCxNQUFNLDJCQUE4QyxDQUFDLE9BQU8sY0FBYyxXQUFXO0FBQ3JGLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sMEJBQTBCO0FBSWhDLE1BQU0sK0JBQStCO0FBR3JDLE1BQU0sMEJBQTBCLENBQUMsY0FBYyxNQUFNLEVBQUUsS0FBSyxHQUFHO0FBQy9ELE1BQU0sd0JBQXdCO0FBRzlCLE1BQU0sMkJB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
560
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVwZW5kZW5jaWVzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiBhIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzb1xuICogYSBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbnRyaWVzIGZvciBmaWxlcyB0aGF0IGFyZSBub3QgYnVpbHQgZnJvbSBhIHNvdXJjZSBmb2xkZXIgKGEgZm9sZGVyIG9mIHNoYXJlZCBgdHNjb25maWdgIHByZXNldHMsIGFtYmllbnQgYC5kLnRzYFxuICAgKiBmaWxlcyksIGtleWVkIGJ5IHN1YnBhdGguIFRoZXkgZ28gaW50byB0aGUgbWFwIGFmdGVyIHRoZSBnZW5lcmF0ZWQgZW50cmllcywgYXMgZ2l2ZW4sIGFuZCBjb3VudCB0b3dhcmQgaXRzIGNoYW5nZVxuICAgKiBjaGVjazsgbm8gc3VicGF0aCBzdHViIGlzIHdyaXR0ZW4gZm9yIHRoZW0uIEEga2V5IGEgc291cmNlIGZvbGRlciBhbHJlYWR5IGdlbmVyYXRlcyB0aHJvd3MuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRXhwb3J0cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFBhY2thZ2VKc29uLkV4cG9ydHM+PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwb3J0IGNvbmRpdGlvbiB0byBwdXQgZmlyc3QgaW4gZXZlcnkgZW50cnksIG1hcHBpbmcgdGhlIHN1YnBhdGggb250byBpdHMgVHlwZVNjcmlwdCBzb3VyY2UuIE9ubHkgYVxuICAgKiByZXBvc2l0b3J5IGhvbGRpbmcgc2V2ZXJhbCBwYWNrYWdlcyB0aGF0IGltcG9ydCBlYWNoIG90aGVyIG5lZWRzIG9uZTsgbm90aGluZyBvdXRzaWRlIGl0IHNldHMgdGhlIGNvbmRpdGlvbiwgYW5kXG4gICAqIHRoZSBzb3VyY2VzIGl0IHBvaW50cyBhdCBkbyBub3Qgc2hpcCwgc28gdGhlIHB1Ymxpc2ggaGFzIHRvIHN0cmlwIGl0IGFnYWluLiBPbWl0dGVkLCB0aGUgbWFwIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlJbmRleH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVMaWJyYXJ5SW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBtb2R1bGVzIG9yIGZvbGRlcnMgdG8gbGVhdmUgb2ZmIHRoZSBnZW5lcmF0ZWQgYmFycmVscywgYXMgcGF0aHMgZnJvbSB0aGUgcGFja2FnZSByb290XG4gICAqIChgc3JjL2RlbW8tdmF1bHQtYnV0dG9ucy50c2AsIGBzcmMvdGVzdC1ydW5uZXJzL2ludGVncmF0aW9uYCkuIEEgbW9kdWxlIHRoYXQgbmVlZHMgYW4gb3B0aW9uYWwgcGVlciwgb3Igb25lIHRoYXRcbiAgICogcnVucyBjb2RlIGF0IGxvYWQgdGltZSB3aGljaCBvbmx5IHdvcmtzIGluc2lkZSBhIHRlc3QgcnVubmVyLCBnb2VzIGhlcmUsIHNvIGltcG9ydGluZyBhIGJhcnJlbCBuZXZlciBsb2FkcyBpdC4gSXQgaXNcbiAgICogc3RpbGwgYnVpbHQgYW5kIHN0YXlzIHJlYWNoYWJsZSB0aHJvdWdoIGl0cyBvd24gc3VicGF0aCBleHBvcnQuIEEgcGF0aCB0aGF0IG5hbWVzIG5vdGhpbmcgdGhlIGJhcnJlbHMgd291bGQgZXhwb3J0XG4gICAqIHRocm93cywgc28gYSByZW5hbWUgY2Fubm90IHF1aWV0bHkgcHV0IHRoZSBtb2R1bGUgYmFjay5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVGcm9tSW5kZXg/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbn1cblxudHlwZSBNb2R1bGVGb3JtYXQgPSAnY2pzJyB8ICdlc20nO1xuXG5jb25zdCBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMgPSBuZXcgU2V0KFsnbm9kZSddKTtcblxuLy8gVGhlIGxpYnMgdGhhdCBkZXNjcmliZSBhIGhvc3QncyBnbG9iYWxzIHJhdGhlciB0aGFuIHRoZSBsYW5ndWFnZSwgd2hpY2ggY29uc3VtZXJzIGNvbmZsaWN0IG92ZXIuIEVhY2ggZGVjbGFyYXRpb25cbi8vIGdldHMgdGhlIG9uZXMgaXQgdXNlczsgZXZlcnkgb3RoZXIgbGliIGlzIHNoYXJlZCB0aHJvdWdoIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLlxuY29uc3QgRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFsnZG9tJywgJ3NjcmlwdGhvc3QnLCAnd2Vid29ya2VyJ107XG5jb25zdCBOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCA9ICcvbm9kZV9tb2R1bGVzL0B0eXBlcy9ub2RlLyc7XG5jb25zdCBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUCA9IC9cXC9ub2RlX21vZHVsZXNcXC9AdHlwZXNjcmlwdFxcL2xpYi0oPzxMaWI+W14vXSspXFwvKD88U3ViTGliPi4rKVxcLmRcXC50cyQvO1xuXG4vLyBUaGUgZGVjbGFyYXRpb24gdGhhdCBjYXJyaWVzIG9ubHkgdGhlIGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZXMuIEV2ZXJ5IGRlY2xhcmF0aW9uIGJ1dCB0aGUgcm9vdCBvbmUgcmVmZXJlbmNlc1xuLy8gaXQsIHJhdGhlciB0aGFuIHRoZSByb290IGJhcnJlbCwgd2hpY2ggd291bGQgbG9hZCBldmVyeSBtb2R1bGUgb2YgdGhlIHBhY2thZ2UsIG9wdGlvbmFsIHBlZXJzJyB0eXBlcyBpbmNsdWRlZC5cbmNvbnN0IExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgPSAnbGlicmFyeS1yZWZlcmVuY2VzJztcbi8vIFNwZWxsZWQgYXBhcnQgb24gcHVycG9zZToge0BsaW5rIGNvbGxlY3RBbGxMaWJzfSBzY2FucyBldmVyeSBzb3VyY2UgZmlsZSBvZiB0aGUgcGFja2FnZSBiZWluZyBidWlsdCBmb3IgdGhlXG4vLyBkaXJlY3RpdmUsIHRoaXMgb25lIGluY2x1ZGVkLCBzbyBhIGxpdGVyYWwgb25lIGhlcmUgd291bGQgYmUgcmVhZCBhcyBhIGxpYiB0aGlzIHBhY2thZ2UgbmVlZHMuXG5jb25zdCBSRUZFUkVOQ0VfTElCX0RJUkVDVElWRSA9IFsnPHJlZmVyZW5jZScsICdsaWI9J10uam9pbignICcpO1xuY29uc3QgUkVGRVJFTkNFX0xJQl9SRUdfRVhQID0gL1xcL1xcL1xcLyA8cmVmZXJlbmNlIGxpYj1cIig/PExpYj5bXlwiXSspXCIgXFwvPi9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSB0eXBlLW9ubHkgaW1wb3J0LCBlLmcuIGBpbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO2AuXG5jb25zdCBCQVJFX1RZUEVfSU1QT1JUX1JFR19FWFAgPSAvXmltcG9ydCB0eXBlICg/PENsYXVzZT4uKz8pIGZyb20gJyg/PFNwZWNpZmllcj5bXi4nXVteJ10qKSc7JC9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSBpbmxpbmUgaW1wb3J0IHR5cGUgbm9kZSwgZS5nLiBgaW1wb3J0KFwidHlwZS1mZXN0XCIpLlByb21pc2FibGVgLlxuY29uc3QgQkFSRV9JTkxJTkVfSU1QT1JUX1RZUEVfUkVHX0VYUCA9IC9pbXBvcnRcXChcIig/PFNwZWNpZmllcj5bXi5cIl1bXlwiXSopXCJcXCkvZztcblxuY29uc3QgU1RBVElDX0lNUE9SVF9SRUdfRVhQID0gL2Zyb20gJyg/PEltcG9ydFBhdGg+Lis/KVxcLnRzJzsvZ207XG5cbi8vIElubGluZSBpbXBvcnQtdHlwZSBub2RlcyAoYHR5cGVvZiBpbXBvcnQoJy4vZm9vLnRzJylgKSBwcmVzZXJ2ZSB0aGUgc291cmNlIHF1b3RlIHN0eWxlLlxuLy8gSGFuZC1hdXRob3JlZCBgLmQudHNgIGZpbGVzIGVtaXQgc2luZ2xlIHF1b3RlczsgdHNjLWdlbmVyYXRlZCBkZWNsYXJhdGlvbnMgZW1pdCBkb3VibGUgcXVvdGVzLlxuLy8gQ2FwdHVyZSB0aGUgcXVvdGUgYW5kIHJldXNlIGl0IGluIHRoZSByZXBsYWNlbWVudCBzbyBib3RoIHN0eWxlcyBhcmUgcmV3cml0dGVuLlxuY29uc3QgRFlOQU1JQ19JTVBPUlRfUkVHX0VYUCA9IC9pbXBvcnRcXCgoPzxRdW90ZT5bJ1wiXSkoPzxJbXBvcnRQYXRoPi4rPylcXC50c1xcazxRdW90ZT5cXCkvZ207XG5cbmVudW0gR2VuZXJhdGVJbmRleFJlc3VsdCB7XG4gIFNraXBwZWQgPSAnc2tpcHBlZCcsXG4gIFN1Y2Nlc3MgPSAnc3VjY2Vzcydcbn1cblxuaW50ZXJmYWNlIEFkZEVudmlyb25tZW50R2xvYmFsc1BhcmFtcyB7XG4gIHJlYWRvbmx5IGxpYnM6IFNldDxzdHJpbmc+O1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtO1xuICByZWFkb25seSBzeW1ib2w6IFRzU3ltYm9sO1xuICByZWFkb25seSB0eXBlczogU2V0PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IE1vZHVsZUZvcm1hdDtcbiAgcmVhZG9ubHkgbGliRmlsZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeTogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbmludGVyZmFjZSBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMge1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBtb2R1bGVEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXNQYXJhbXMge1xuICByZWFkb25seSBhdmFpbGFibGVUeXBlczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uRmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVJbmRleFBhcmFtcyB7XG4gIHJlYWRvbmx5IGV4Y2x1ZGVkUGF0aHM6IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IGZvbGRlcjogc3RyaW5nO1xuICByZWFkb25seSB1bm1hdGNoZWRQYXRoczogU2V0PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkcy4gRXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gcmVmZXJlbmNlcyBhIGBsaWJyYXJ5LXJlZmVyZW5jZXNgXG4gKiBkZWNsYXJhdGlvbiBiZXNpZGUgaXQgYnkgcGF0aCwgbmV2ZXIgdGhlIHJvb3Q6IHRoZSByb290IGJhcnJlbCByZS1leHBvcnRzIGV2ZXJ5IG1vZHVsZSwgc28gcmVmZXJlbmNpbmcgaXQgbWFkZSBlYWNoXG4gKiBzdWJwYXRoIGxvYWQgdGhlIHdob2xlIHBhY2thZ2UsIGFuZCBhIGNvbnN1bWVyIHR5cGUtY2hlY2tpbmcgd2l0aCBgc2tpcExpYkNoZWNrOiBmYWxzZWAgdGhlbiBuZWVkZWQgZXZlcnkgb3B0aW9uYWxcbiAqIHBlZXIgaW5zdGFsbGVkLlxuICpcbiAqIGBsaWJyYXJ5LXJlZmVyZW5jZXNgIGNhcnJpZXMgb25seSB0aGUgbGlicyB0aGF0IGRlc2NyaWJlIHRoZSBsYW5ndWFnZSAoYGVzMjAyMmAsIGBlc25leHQuZGlzcG9zYWJsZWApLCB3aGljaCBub1xuICogY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBvbmVzIHRoYXQgZGVzY3JpYmUgYSBob3N0IChgZG9tYCwgYGRvbS5pdGVyYWJsZWAsIGB3ZWJ3b3JrZXJgKSBhbmQgYHR5cGVzPVwibm9kZVwiYCBnb1xuICogb25seSBpbnRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCBuYW1lIG9uZSBvZiB0aGVpciBnbG9iYWxzLCBmb3VuZCBieSByZXNvbHZpbmcgZXZlcnkgbmFtZSBpbiB0aGUgZW1pdHRlZFxuICogZGVjbGFyYXRpb25zIHdpdGggdGhlIHR5cGUgY2hlY2tlci4gT3RoZXJ3aXNlIGEgYnJvd3NlciBjb25zdW1lciBvZiBhIHB1cmUgc3VicGF0aCBnb3QgYWxsIG9mIGBAdHlwZXMvbm9kZWAsIGFuZCBpdHNcbiAqIGBzZXRUaW1lb3V0YCByZXR1cm5lZCBgTm9kZUpTLlRpbWVvdXRgLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICogQHRocm93cyBJZiBhIHNvdXJjZSBtb2R1bGUgaXMgbmFtZWQgYGxpYnJhcnktcmVmZXJlbmNlc2AsIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgYCR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn1gKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNyYy8ke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259IGNvbGxpZGVzIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lLmApO1xuICB9XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAndHNjJyB9KSwgJy0tcHJvamVjdCcsICcuL3RzY29uZmlnLnR5cGVzLmpzb24nXSk7XG5cbiAgY29uc3QgbGlicmFyeUZpbGVOYW1lID0gZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsICdsaWJyYXJ5LnRzJykpID8gJ2xpYnJhcnknIDogJ2luZGV4JztcbiAgY29uc3QgYWxsTGlicyA9IGF3YWl0IGNvbGxlY3RBbGxMaWJzKCk7XG4gIGNvbnN0IGFsbFR5cGVzID0gY29sbGVjdEFsbFR5cGVzKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhhbGxUeXBlcyk7XG4gIC8vIE9ubHkgdGhlIGxpYnMgbm8gY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBlbnZpcm9ubWVudCBnbG9iYWxzIGdvIHRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCB1c2UgdGhlbS5cbiAgY29uc3Qgc2hhcmVkRGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzLmZpbHRlcigobGliKSA9PiAhaXNFbnZpcm9ubWVudExpYihsaWIpKSk7XG5cbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuXG4gIGNvbnN0IHNyY0ZpbGVzID0gYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZWNsYXJhdGlvbkZpbGVzID0gc3JjRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSk7XG4gIGNvbnN0IGVudmlyb25tZW50RGlyZWN0aXZlcyA9IGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMoeyBhdmFpbGFibGVUeXBlczogYWxsVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGZpbGUpO1xuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBjdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IG10c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbik7XG5cbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGN0c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG10c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGxldCBjdHNDb250ZW50ID0gdG9DdHNDb250ZW50KGNvbnRlbnQpO1xuICAgIGxldCBtdHNDb250ZW50ID0gdG9NdHNDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgaWYgKG5hbWUgPT09IGxpYnJhcnlGaWxlTmFtZSAmJiBmb2xkZXIgPT09ICcuJykge1xuICAgICAgY3RzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWxlRGlyZWN0aXZlcyA9IGVudmlyb25tZW50RGlyZWN0aXZlcy5nZXQoZmlsZSkgPz8gJyc7XG4gICAgICBjdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogY3RzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuQ2pzIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkVzbSB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoY3RzUGF0aCwgY3RzQ29udGVudCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKG10c1BhdGgsIG10c0NvbnRlbnQpO1xuICB9XG59XG5cbi8qKlxuICogUmVnZW5lcmF0ZXMgdGhlIGBleHBvcnRzYCBtYXAgb2YgdGhlIHBhY2thZ2UncyBgcGFja2FnZS5qc29uYCBmcm9tIGl0cyBzb3VyY2UgZm9sZGVycywgYW5kIHdyaXRlcyBhIGBwYWNrYWdlLmpzb25gXG4gKiBzdHViIHBlciBzdWJwYXRoIGZvciByZXNvbHZlcnMgdGhhdCBkbyBub3QgcmVhZCBgZXhwb3J0c2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFwIGlzIGN1cnJlbnQuXG4gKiBAdGhyb3dzIElmIHRoZSBtYXAgY2hhbmdlZCwgc28gdGhlIGNoYW5nZSBnZXRzIHJldmlld2VkIGFuZCBjb21taXR0ZWQgcmF0aGVyIHRoYW4gc2hpcHBlZCB1bnNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzKG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhZGRpdGlvbmFsRXhwb3J0cyA9IHt9LCBzb3VyY2VDb25kaXRpb24gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNyY0ZvbGRlcnM6IHN0cmluZ1tdID0gW1JlcG9QYXRocy5TcmNdO1xuXG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSk7XG5cbiAgICBpZiAocGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuU3R5bGVzKSB8fCBwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNyY0ZvbGRlcnMucHVzaChwYXRoKTtcbiAgfVxuXG4gIHNyY0ZvbGRlcnMuc29ydCgpO1xuXG4gIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oYXN5bmMgKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgY29uc3Qgb2xkRXhwb3J0cyA9IHBhY2thZ2VKc29uLmV4cG9ydHM7XG4gICAgY29uc3QgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucyA9IHt9O1xuICAgIHBhY2thZ2VKc29uLmV4cG9ydHMgPSBleHBvcnRDb25kaXRpb25zO1xuICAgIGZvciAoY29uc3Qgc3JjRm9sZGVyIG9mIHNyY0ZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IGZhbHNlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IHRydWUsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnBhdGgsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsRXhwb3J0cykpIHtcbiAgICAgIGlmIChleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWRkaXRpb25hbCBleHBvcnQgJyR7c3VicGF0aH0nIGNvbGxpZGVzIHdpdGggYW4gZW50cnkgZ2VuZXJhdGVkIGZyb20gYSBzb3VyY2UgZm9sZGVyLmApO1xuICAgICAgfVxuXG4gICAgICBleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdID0gZW50cnk7XG4gICAgfVxuXG4gICAgaXNDaGFuZ2VkID0gIWlzRGVlcEVxdWFsKG9sZEV4cG9ydHMsIHBhY2thZ2VKc29uLmV4cG9ydHMpO1xuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBjaGFuZ2VkIGluIHRoZSBgZWRpdFBhY2thZ2VKc29uYCwgRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYWNrYWdlIGV4cG9ydHMgaGF2ZSBjaGFuZ2VkLiBQbGVhc2UgcmV2aWV3IHRoZSBjaGFuZ2VzIGFuZCBjb21taXQgdGhlbS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBgaW5kZXgudHNgIGJhcnJlbCBpbiBldmVyeSBzb3VyY2UgZm9sZGVyIHRoYXQgaGFzIHNvbWV0aGluZyB0byBleHBvcnQsIHJlLWV4cG9ydGluZyBlYWNoIG1vZHVsZSBhbmRcbiAqIGVhY2ggc3ViLWJhcnJlbCB1bmRlciBpdHMgb3duIG5hbWUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFycmVscyBoYXZlIGJlZW4gd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGlicmFyeUluZGV4KG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV4Y2x1ZGVkUGF0aHMgPSBuZXcgU2V0KChvcHRpb25zLmV4Y2x1ZGVGcm9tSW5kZXggPz8gW10pLm1hcCgocGF0aCkgPT4gam9pbihwYXRoLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpKS5yZXBsYWNlKC9cXC8kLywgJycpKSk7XG4gIGNvbnN0IHVubWF0Y2hlZFBhdGhzID0gbmV3IFNldChleGNsdWRlZFBhdGhzKTtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleCh7IGV4Y2x1ZGVkUGF0aHMsIGZvbGRlcjogUmVwb1BhdGhzLlNyYywgdW5tYXRjaGVkUGF0aHMgfSk7XG5cbiAgaWYgKHVubWF0Y2hlZFBhdGhzLnNpemUgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBleGNsdWRlRnJvbUluZGV4IG5hbWVzIG5vIG1vZHVsZSB0aGUgYmFycmVscyB3b3VsZCBleHBvcnQ6ICR7Wy4uLnVubWF0Y2hlZFBhdGhzXS5qb2luKCcsICcpfS5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgZWFjaCBuYW1lZCBucG0gc2NyaXB0IHRoZSBwYWNrYWdlIGRlZmluZXMsIGluIG9yZGVyLCBza2lwcGluZyB0aGUgb25lcyBpdCBkb2VzIG5vdCBkZWZpbmUuXG4gKlxuICogQHBhcmFtIHN0ZXBzIC0gVGhlIG5wbSBzY3JpcHQgbmFtZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlcnkgc3RlcCBoYXMgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwcyhzdGVwczogcmVhZG9ubHkgc3RyaW5nW10gPSBMSUJSQVJZX0JVSUxEX1NURVBTKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKHN0ZXApO1xuICB9XG59XG5cbi8qKlxuICogQWRkcyB3aGF0IGEgY29uc3VtZXIgbmVlZHMgbG9hZGVkIGZvciBvbmUgc3ltYm9sIGEgZGVjbGFyYXRpb24gbmFtZXMuIEEgc3ltYm9sIGFueSBFUyBsaWIgZGVjbGFyZXMgbmVlZHMgbm90aGluZyxcbiAqIGJlY2F1c2Ugbm8gY29uc3VtZXIgY29uZmxpY3RzIHdpdGggdGhvc2UgbGlicy4gT3RoZXJ3aXNlIGVhY2ggZW52aXJvbm1lbnQgbGliIHRoYXQgZGVjbGFyZXMgaXQgYWRkcyBpdHNlbGYsIGFuZFxuICogZmFpbGluZyB0aGF0IGBAdHlwZXMvbm9kZWAgYWRkcyBgbm9kZWAuIEEgc3ltYm9sIGRlY2xhcmVkIGluIHRoZSBwYWNrYWdlJ3Mgb3duIGZpbGVzIGFkZHMgbm90aGluZzogdGhlIGRlY2xhcmF0aW9uXG4gKiB0aGF0IGhvbGRzIGl0IGNhcnJpZXMgaXRzIG93biBkaXJlY3RpdmVzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc3ltYm9sLCB0aGUgcHJvZ3JhbSBpdCB3YXMgcmVzb2x2ZWQgaW4sIGFuZCB0aGUgc2V0cyB0byBhZGQgdG8uXG4gKi9cbmZ1bmN0aW9uIGFkZEVudmlyb25tZW50R2xvYmFscyhwYXJhbXM6IEFkZEVudmlyb25tZW50R2xvYmFsc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGxpYnMsIHByb2dyYW0sIHN5bWJvbCwgdHlwZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgZW52aXJvbm1lbnRMaWJzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaXNOb2RlID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBzeW1ib2wuZGVjbGFyYXRpb25zID8/IFtdKSB7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKTtcbiAgICBpZiAocHJvZ3JhbS5pc1NvdXJjZUZpbGVEZWZhdWx0TGlicmFyeShzb3VyY2VGaWxlKSkge1xuICAgICAgY29uc3QgbGliID0gdG9MaWJOYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgICAgaWYgKCFpc0Vudmlyb25tZW50TGliKGxpYikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZW52aXJvbm1lbnRMaWJzLnB1c2gobGliKTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZUZpbGUuZmlsZU5hbWUuaW5jbHVkZXMoTk9ERV9UWVBFU19QQVRIX1NFR01FTlQpKSB7XG4gICAgICBpc05vZGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbnZpcm9ubWVudExpYnMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgbGliIG9mIGVudmlyb25tZW50TGlicykge1xuICAgICAgbGlicy5hZGQobGliKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNOb2RlKSB7XG4gICAgdHlwZXMuYWRkKCdub2RlJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGxpYnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke1xuICAgIGxpYnNcbiAgICAgIC5tYXAoKGxpYikgPT4gYC8vLyAke1JFRkVSRU5DRV9MSUJfRElSRUNUSVZFfVwiJHtsaWJ9XCIgLz5gKVxuICAgICAgLmpvaW4oJ1xcbicpXG4gIH1cXG5gO1xufVxuXG5mdW5jdGlvbiBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyh0eXBlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZXMubGVuZ3RoID09PSAwXG4gICAgPyAnJ1xuICAgIDogYCR7XG4gICAgICB0eXBlc1xuICAgICAgICAubWFwKCh0eXBlKSA9PiBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIke3R5cGV9XCIgLz5gKVxuICAgICAgICAuam9pbignXFxuJylcbiAgICB9XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5Rm9ybWF0KHBhcmFtczogQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZm9ybWF0LCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgZXh0ZW5zaW9uID0gZm9ybWF0ID09PSAnY2pzJyA/IFJlcG9QYXRocy5DanNFeHRlbnNpb24gOiBSZXBvUGF0aHMuTWpzRXh0ZW5zaW9uO1xuICBjb25zdCBidWlsZE9wdGlvbnM6IEJ1aWxkT3B0aW9ucyA9IHtcbiAgICAvLyBFeHBsaWNpdCwgYmVjYXVzZSBlc2J1aWxkIG90aGVyd2lzZSB0YWtlcyB0aGUgZm9sZGVyIGl0cyBzZXJ2aWNlIHByb2Nlc3Mgc3RhcnRlZCBpbi5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBlc2J1aWxkJ3Mgb3duIG9wdGlvbiBuYW1lLlxuICAgIGFic1dvcmtpbmdEaXI6IHByb2Nlc3MuY3dkKCksXG4gICAgYmFubmVyOiB7XG4gICAgICBqczogTElCUkFSWV9CQU5ORVJcbiAgICB9LFxuICAgIGJ1bmRsZTogZmFsc2UsXG4gICAgZW50cnlQb2ludHM6IGxpYkZpbGVzLFxuICAgIGZvcm1hdCxcbiAgICBsb2dMZXZlbDogJ2luZm8nLFxuICAgIG91dGRpcjogam9pbihSZXBvUGF0aHMuRGlzdExpYiwgZm9ybWF0KSxcbiAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5KGZvcm1hdCA9PT0gJ2VzbScpLFxuICAgICAgZml4RXNtUGx1Z2luKCksXG4gICAgICBjaGFuZ2VFeHRlbnNpb25QbHVnaW4oZXh0ZW5zaW9uKVxuICAgIF0sXG4gICAgc291cmNlbWFwOiAnaW5saW5lJyxcbiAgICB0YXJnZXQ6ICdFUzIwMjInLFxuICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgIHdyaXRlOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IGNvbnRleHQoYnVpbGRPcHRpb25zKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQucmVidWlsZCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGJ1aWxkQ29udGV4dC5kaXNwb3NlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHBhcmFtczogQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBkZWNsYXJhdGlvbkZpbGVQYXRoLCBleHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBsaWJyYXJ5RmlsZVBhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBtb2R1bGVEaXJlY3RvcnksIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBleHRlbnNpb24pO1xuICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVOYXRpdmUoZGlybmFtZShkZWNsYXJhdGlvbkZpbGVQYXRoKSwgbGlicmFyeUZpbGVQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgfVxuICByZXR1cm4gYC8vLyA8cmVmZXJlbmNlIHBhdGg9XCIke3JlbGF0aXZlUGF0aH1cIiAvPlxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RBbGxMaWJzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgLy8gVGhlIFJFU09MVkVEIG9wdGlvbnMsIGJlY2F1c2UgYSBwYWNrYWdlJ3MgYHRzY29uZmlnLmpzb25gIGluaGVyaXRzIGBsaWJgIGZyb20gdGhlIHNoYXJlZCBiYXNlLiBUaGUgcmVzb2x2ZWRcbiAgLy8gbmFtZXMgYXJlIGZpbGUgbmFtZXMgKGBsaWIuZG9tLml0ZXJhYmxlLmQudHNgKSwgc28gdGhleSBhcmUgbWFwcGVkIGJhY2sgb250byB0aGUgbmFtZXMgYSBkaXJlY3RpdmUgdGFrZXMuXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgY29uc3QgbGlicyA9IG5ldyBTZXQoKG9wdGlvbnMubGliID8/IFtdKS5tYXAoKGxpYikgPT4gdG9MaWJOYW1lKGxpYikpKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKCcudHMnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlQ29udGVudCA9IHJlYWRGaWxlU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcbiAgICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGFsd2F5cyBjYXB0dXJlcyBpdHMgb25lIGdyb3VwLCBzbyBubyBmYWxsYmFjayBmb3IgYSBtaXNzaW5nIG9uZSBpcyBuZWVkZWQuXG4gICAgZm9yIChjb25zdCBbLCBsaWJdIG9mIHNvdXJjZUNvbnRlbnQubWF0Y2hBbGwoUkVGRVJFTkNFX0xJQl9SRUdfRVhQKSkge1xuICAgICAgbGlicy5hZGQoU3RyaW5nKGxpYikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFsuLi5saWJzXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBbGxUeXBlcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgcmV0dXJuIChvcHRpb25zLnR5cGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHR5cGUpID0+IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUy5oYXModHlwZSkpXG4gICAgLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlcyhwYXJhbXM6IENvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXNQYXJhbXMpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgeyBhdmFpbGFibGVUeXBlcywgZGVjbGFyYXRpb25GaWxlcyB9ID0gcGFyYW1zO1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKHtcbiAgICBvcHRpb25zOiB7IC4uLm9wdGlvbnMsIG5vRW1pdDogdHJ1ZSB9LFxuICAgIHJvb3ROYW1lczogZGVjbGFyYXRpb25GaWxlcy5tYXAoKGZpbGUpID0+IHJlc29sdmVOYXRpdmUoUmVwb1BhdGhzLlNyYywgZmlsZSkpXG4gIH0pO1xuICBjb25zdCBjaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCBkaXJlY3RpdmVzQnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZGVjbGFyYXRpb25GaWxlcykge1xuICAgIC8vIFRoZSBwcm9ncmFtIHdhcyBoYW5kZWQgZXZlcnkgb25lIG9mIHRoZXNlIGFzIGEgcm9vdCBuYW1lLCBzbyBlYWNoIG9uZSBpcyBpbiBpdC5cbiAgICBjb25zdCBzb3VyY2VGaWxlID0gZW5zdXJlTm9uTnVsbGFibGUocHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJlc29sdmVOYXRpdmUoUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgICBjb25zdCBsaWJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICAgIGlmIChpc0lkZW50aWZpZXIobm9kZSkgfHwgaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihub2RlKTtcbiAgICAgICAgaWYgKHN5bWJvbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWRkRW52aXJvbm1lbnRHbG9iYWxzKHsgbGlicywgcHJvZ3JhbSwgc3ltYm9sOiByZXNvbHZlQWxpYXMoY2hlY2tlciwgc3ltYm9sKSwgdHlwZXMgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gICAgfVxuICAgIHZpc2l0KHNvdXJjZUZpbGUpO1xuXG4gICAgY29uc3QgbmVlZGVkVHlwZXMgPSBbLi4udHlwZXNdLmZpbHRlcigodHlwZSkgPT4gYXZhaWxhYmxlVHlwZXMuaW5jbHVkZXModHlwZSkpO1xuICAgIGlmIChsaWJzLnNpemUgPiAwIHx8IG5lZWRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGRpcmVjdGl2ZXNCeUZpbGUuc2V0KFxuICAgICAgICBmaWxlLFxuICAgICAgICAobGlicy5zaXplID4gMCA/IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhbLi4ubGlic10uc29ydCgpKSA6ICcnKSArIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKG5lZWRlZFR5cGVzLnNvcnQoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpcmVjdGl2ZXNCeUZpbGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXgocGFyYW1zOiBHZW5lcmF0ZUluZGV4UGFyYW1zKTogUHJvbWlzZTxHZW5lcmF0ZUluZGV4UmVzdWx0PiB7XG4gIGNvbnN0IHsgZm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyUG9zaXgoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG1heWJlTGluZXMgPSBhd2FpdCBhc3luY01hcChkaXJlbnRzLCAoZGlyZW50KSA9PiBoYW5kbGVJbmRleERpcmVudChwYXJhbXMsIGRpcmVudCkpO1xuICBjb25zdCBsaW5lcyA9IG1heWJlTGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGUoam9pbihmb2xkZXIsIFJlcG9QYXRocy5JbmRleFRzKSwgbGluZXMpO1xuICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMaWJGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICByZXR1cm4gZmlsZXMuZmlsdGVyKChmaWxlKSA9PlxuICAgIGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKVxuICAgICYmICFmaWxlLmluY2x1ZGVzKGAvJHtSZXBvUGF0aHMuVGVzdEhlbHBlcnN9L2ApXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUluZGV4RGlyZW50KHBhcmFtczogR2VuZXJhdGVJbmRleFBhcmFtcywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGV4Y2x1ZGVkUGF0aHMsIGZvbGRlciwgdW5tYXRjaGVkUGF0aHMgfSA9IHBhcmFtcztcbiAgaWYgKGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyLCBkaXJlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGF0aCA9IGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSk7XG4gIGlmIChleGNsdWRlZFBhdGhzLmhhcyhwYXRoKSkge1xuICAgIHVubWF0Y2hlZFBhdGhzLmRlbGV0ZShwYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KHsgLi4ucGFyYW1zLCBmb2xkZXI6IHBhdGggfSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNvdXJjZUZpbGUgPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oZGlyZW50Lm5hbWUsIFJlcG9QYXRocy5JbmRleFRzKSk7XG4gICAgbmFtZSA9IGRpcmVudC5uYW1lO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZGlyZW50Lm5hbWUpO1xuICAgIG5hbWUgPSBiYXNlbmFtZShkaXJlbnQubmFtZSwgZXh0ZW5zaW9uKTtcbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShkaXJlbnQubmFtZSk7XG4gIH1cblxuICByZXR1cm4gYGV4cG9ydCAqIGFzICcke25hbWV9JyBmcm9tICcke3NvdXJjZUZpbGV9JztgO1xufVxuXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50TGliKGxpYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBsaWIuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzKGNoZWNrZXI6IFR5cGVDaGVja2VyLCBzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBgU3ltYm9sRmxhZ3NgIGlzIGEgYml0IHNldC5cbiAgcmV0dXJuIChzeW1ib2wuZmxhZ3MgJiBTeW1ib2xGbGFncy5BbGlhcykgPT09IDAgPyBzeW1ib2wgOiBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2woc3ltYm9sKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTGliTmFtZShsaWJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQSBsaWIgYSBwYWNrYWdlIHJlcGxhY2VkIChgQHR5cGVzY3JpcHQvbGliLWRvbWAsIGBAdHlwZXNjcmlwdC9saWItZG9tL2l0ZXJhYmxlLmQudHNgKSBpcyBuYW1lZCBieSBpdHMgcGF0aCwgbm90IGJ5XG4gIC8vIGl0cyBmaWxlIG5hbWUsIHdoaWNoIGlzIGBpbmRleC5kLnRzYCBmb3IgdGhlIGxpYidzIHJvb3QuXG4gIGNvbnN0IHJlcGxhY2VtZW50TWF0Y2ggPSBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUC5leGVjKGxpYkZpbGVQYXRoKTtcbiAgaWYgKHJlcGxhY2VtZW50TWF0Y2g/Lmdyb3VwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgYm90aCBncm91cHMuXG4gICAgY29uc3QgbGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydMaWInXSk7XG4gICAgY29uc3Qgc3ViTGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydTdWJMaWInXSk7XG4gICAgcmV0dXJuIChzdWJMaWIgPT09ICdpbmRleCcgPyBsaWIgOiBgJHtsaWJ9LiR7c3ViTGliLnJlcGxhY2VBbGwoJy8nLCAnLicpfWApLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VuYW1lKGxpYkZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15saWJcXC4vLCAnJykucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcnKTtcbn1cblxuZnVuY3Rpb24gdG9NdHNDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG10c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+Lm1qc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBtdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5tanMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihmb2xkZXI6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlSnNvbihqb2luKGZvbGRlciwgUmVwb1BhdGhzLlBhY2thZ2VKc29uKSwgcGFja2FnZUpzb24pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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
@@ -52,6 +52,19 @@ export interface GenerateLibraryExportsOptions {
52
52
  */
53
53
  readonly sourceCondition?: string | undefined;
54
54
  }
55
+ /**
56
+ * Options for {@link generateLibraryIndex}.
57
+ */
58
+ export interface GenerateLibraryIndexOptions {
59
+ /**
60
+ * Source modules or folders to leave off the generated barrels, as paths from the package root
61
+ * (`src/demo-vault-buttons.ts`, `src/test-runners/integration`). A module that needs an optional peer, or one that
62
+ * runs code at load time which only works inside a test runner, goes here, so importing a barrel never loads it. It is
63
+ * still built and stays reachable through its own subpath export. A path that names nothing the barrels would export
64
+ * throws, so a rename cannot quietly put the module back.
65
+ */
66
+ readonly excludeFromIndex?: readonly string[] | undefined;
67
+ }
55
68
  /**
56
69
  * Removes everything an earlier build left: `dist/`, the generated `index.ts` barrels, the `.d.ts` files `tsc` wrote
57
70
  * beside the sources (hand-authored ones under `@types` stay), and the per-subpath `package.json` stubs.
@@ -102,9 +115,10 @@ export declare function generateLibraryExports(options?: GenerateLibraryExportsO
102
115
  * Generates an `index.ts` barrel in every source folder that has something to export, re-exporting each module and
103
116
  * each sub-barrel under its own name.
104
117
  *
118
+ * @param options - The options.
105
119
  * @returns A {@link Promise} that resolves when the barrels have been written.
106
120
  */
107
- export declare function generateLibraryIndex(): Promise<void>;
121
+ export declare function generateLibraryIndex(options?: GenerateLibraryIndexOptions): Promise<void>;
108
122
  /**
109
123
  * Runs each named npm script the package defines, in order, skipping the ones it does not define.
110
124
  *
@@ -79,6 +79,8 @@ var import_typescript = require('typescript');
79
79
  var import_npm = require('./npm.cjs');
80
80
  var import_repo_paths = require('./repo-paths.cjs');
81
81
  const DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS = [import_repo_paths.RepoPaths.DistLib, "bin"];
82
+ const ELECTRON_BUILTIN_PACKAGE_NAMES = /* @__PURE__ */ new Set(["electron", "original-fs"]);
83
+ const NODE_SCHEME = "node:";
82
84
  const DECLARATION_FILE_PATTERN = /\.d\.(?:cts|mts|ts)$/u;
83
85
  const SCANNED_FILE_PATTERN = /\.(?:cjs|cts|js|mjs|mts|ts)$/u;
84
86
  const TYPES_SCOPE = "@types/";
@@ -129,12 +131,13 @@ function getImportSpecifiers(sourceText) {
129
131
  return importedFiles.map((importedFile) => importedFile.fileName);
130
132
  }
131
133
  function getPackageName(specifier) {
132
- if (specifier.startsWith(".") || specifier.startsWith("/") || (0, import_node_module.isBuiltin)(specifier)) {
134
+ if (specifier.startsWith(".") || specifier.startsWith("/") || specifier.startsWith(NODE_SCHEME) || (0, import_node_module.isBuiltin)(specifier)) {
133
135
  return null;
134
136
  }
135
137
  const segments = specifier.split("/");
136
138
  const segmentCount = specifier.startsWith("@") ? SCOPED_PACKAGE_NAME_SEGMENT_COUNT : 1;
137
- return segments.slice(0, segmentCount).join("/");
139
+ const packageName = segments.slice(0, segmentCount).join("/");
140
+ return ELECTRON_BUILTIN_PACKAGE_NAMES.has(packageName) ? null : packageName;
138
141
  }
139
142
  function getTypesPackageName(packageName) {
140
143
  return TYPES_SCOPE + packageName.replace(/^@/u, "").replace("/", "__");
@@ -144,4 +147,4 @@ function getTypesPackageName(packageName) {
144
147
  DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS,
145
148
  validateDependencies
146
149
  });
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZhaWxzIHRoZSBidWlsZCB3aGVuIHRoZSBwdWJsaXNoZWQgb3V0cHV0IGltcG9ydHMgYSBwYWNrYWdlIHRoYXQgYHBhY2thZ2UuanNvbmAgZG9lcyBub3QgaW5zdGFsbCBmb3IgYSBjb25zdW1lci5cbiAqXG4gKiBFdmVyeSBiYXJlIHNwZWNpZmllciBpbiB0aGUgc2Nhbm5lZCBmb2xkZXJzIChgZGlzdC9saWJgIGFuZCBgYmluYCBieSBkZWZhdWx0LCBjb2RlIGFuZCBkZWNsYXJhdGlvbnMsIEVTTSBhbmRcbiAqIENvbW1vbkpTKSBtdXN0IG5hbWUgYSBwYWNrYWdlIGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCwgdGhlIHBhY2thZ2UgaXRzZWxmLFxuICogb3IgYSBOb2RlIGJ1aWx0aW47IGEgZGVjbGFyYXRpb24gZmlsZSdzIGltcG9ydCBtYXkgYWxzbyBiZSBzZXJ2ZWQgYnkgdGhlIHBhY2thZ2UncyBgQHR5cGVzYCBvbmUuIEEgcGFja2FnZSBpblxuICogYGRldkRlcGVuZGVuY2llc2Agb25seSBpcyBwcmVzZW50IGluIHRoZSBwYWNrYWdlJ3Mgb3duIHJlcG9zaXRvcnkgYW5kIGFic2VudCBmcm9tIGFcbiAqIGNvbnN1bWVyJ3MgaW5zdGFsbCwgc28gbm90aGluZyB0aGVyZSBmYWlscywgYW5kIHRoZSBjb25zdW1lciBnZXRzIGBDYW5ub3QgZmluZCBtb2R1bGVgLlxuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgaXNCdWlsdGluIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBwcmVQcm9jZXNzRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuL25wbS50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuXG4vKipcbiAqIFRoZSBmb2xkZXJzIHtAbGluayB2YWxpZGF0ZURlcGVuZGVuY2llc30gc2NhbnMgd2hlbiBub25lIGFyZSBnaXZlbi5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVkFMSURBVEVfREVQRU5ERU5DSUVTX0ZPTERFUlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5EaXN0TGliLCAnYmluJ107XG5cbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTiA9IC9cXC5kXFwuKD86Y3RzfG10c3x0cykkL3U7XG5jb25zdCBTQ0FOTkVEX0ZJTEVfUEFUVEVSTiA9IC9cXC4oPzpjanN8Y3RzfGpzfG1qc3xtdHN8dHMpJC91O1xuY29uc3QgVFlQRVNfU0NPUEUgPSAnQHR5cGVzLyc7XG5jb25zdCBTQ09QRURfUEFDS0FHRV9OQU1FX1NFR01FTlRfQ09VTlQgPSAyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB2YWxpZGF0ZURlcGVuZGVuY2llc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVEZXBlbmRlbmNpZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXJzIHRvIHNjYW4sIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyLiBBIGZvbGRlciB0aGF0IGRvZXMgbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1ZBTElEQVRFX0RFUEVOREVOQ0lFU19GT0xERVJTfVxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVycz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGV2ZXJ5IGJhcmUgaW1wb3J0IGluIHRoZSBwdWJsaXNoZWQgb3V0cHV0IG5hbWVzIGEgcGFja2FnZSBhIGNvbnN1bWVyIGluc3RhbGxzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggZm9sZGVycyBhcmUgc2Nhbm5lZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBpbXBvcnQgaXMgZGVjbGFyZWQuXG4gKiBAdGhyb3dzIElmIGFueSBpbXBvcnQgbmFtZXMgYSBwYWNrYWdlIHRoYXQgaXMgbm90IGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCxcbiAqIHRoZSBwYWNrYWdlIGl0c2VsZiwgb3IgYSBOb2RlIGJ1aWx0aW4uIFRoZSBlcnJvciBsaXN0cyBlYWNoIG9mZmVuZGluZyBmaWxlIGFuZCBzcGVjaWZpZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZURlcGVuZGVuY2llcyhvcHRpb25zOiBWYWxpZGF0ZURlcGVuZGVuY2llc09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocm9vdCk7XG4gIGNvbnN0IGluc3RhbGxlZFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoW1xuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pXG4gIF0pO1xuICBpZiAocGFja2FnZUpzb24ubmFtZSkge1xuICAgIGluc3RhbGxlZFBhY2thZ2VOYW1lcy5hZGQocGFja2FnZUpzb24ubmFtZSk7XG4gIH1cblxuICBjb25zdCB1bmRlY2xhcmVkSW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmb2xkZXIgb2Ygb3B0aW9ucy5mb2xkZXJzID8/IERFRkFVTFRfVkFMSURBVEVfREVQRU5ERU5DSUVTX0ZPTERFUlMpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGF3YWl0IGdldEZpbGVQYXRocyhqb2luKHJvb3QsIGZvbGRlcikpKSB7XG4gICAgICBjb25zdCBpc0RlY2xhcmF0aW9uRmlsZSA9IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTi50ZXN0KGZpbGVQYXRoKTtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIGdldEltcG9ydFNwZWNpZmllcnMoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcik7XG4gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PT0gbnVsbCB8fCBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlY2xhcmF0aW9uRmlsZSAmJiBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKGdldFR5cGVzUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHVuZGVjbGFyZWRJbXBvcnRzLnB1c2goYCR7cmVsYXRpdmUocm9vdCwgZmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpfTogJHtzcGVjaWZpZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHVuZGVjbGFyZWRJbXBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHB1Ymxpc2hlZCBvdXRwdXQgaW1wb3J0cyBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW4gZGVwZW5kZW5jaWVzLCBvcHRpb25hbERlcGVuZGVuY2llcyBvciBwZWVyRGVwZW5kZW5jaWVzOlxcbiR7dW5kZWNsYXJlZEltcG9ydHMuam9pbignXFxuJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgc2Nhbm5lZCBmaWxlcyB1bmRlciBhIGZvbGRlciwgcmVjdXJzaXZlbHkuXG4gKlxuICogQHBhcmFtIGZvbGRlciAtIFRoZSBhYnNvbHV0ZSBmb2xkZXIgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRocyBvZiB0aGUgc2Nhbm5lZCBmaWxlcywgb3Igbm9uZSB3aGVuIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVQYXRocyhmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFleGlzdHNTeW5jKGZvbGRlcikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBTQ0FOTkVEX0ZJTEVfUEFUVEVSTi50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKVxuICAgIC5zb3J0KCk7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIG1vZHVsZSBzcGVjaWZpZXJzIGEgc291cmNlIGZpbGUgaW1wb3J0cywgcmVxdWlyZXMgb3IgcmVmZXJlbmNlcywgaWdub3Jpbmcgc3RyaW5ncyBhbmQgY29tbWVudHMuXG4gKlxuICogQHBhcmFtIHNvdXJjZVRleHQgLSBUaGUgc291cmNlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlIHNwZWNpZmllcnMuXG4gKi9cbmZ1bmN0aW9uIGdldEltcG9ydFNwZWNpZmllcnMoc291cmNlVGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB7IGltcG9ydGVkRmlsZXMgfSA9IHByZVByb2Nlc3NGaWxlKHNvdXJjZVRleHQsIHRydWUsIHRydWUpO1xuICByZXR1cm4gaW1wb3J0ZWRGaWxlcy5tYXAoKGltcG9ydGVkRmlsZSkgPT4gaW1wb3J0ZWRGaWxlLmZpbGVOYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYWNrYWdlIGEgYmFyZSBzcGVjaWZpZXIgbmFtZXMuXG4gKlxuICogQHBhcmFtIHNwZWNpZmllciAtIFRoZSBtb2R1bGUgc3BlY2lmaWVyLlxuICogQHJldHVybnMgVGhlIHBhY2thZ2UgbmFtZSwgb3IgYG51bGxgIGZvciBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggb3IgYSBOb2RlIGJ1aWx0aW4uXG4gKi9cbmZ1bmN0aW9uIGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcjogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLicpIHx8IHNwZWNpZmllci5zdGFydHNXaXRoKCcvJykgfHwgaXNCdWlsdGluKHNwZWNpZmllcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNlZ21lbnRzID0gc3BlY2lmaWVyLnNwbGl0KCcvJyk7XG4gIGNvbnN0IHNlZ21lbnRDb3VudCA9IHNwZWNpZmllci5zdGFydHNXaXRoKCdAJykgPyBTQ09QRURfUEFDS0FHRV9OQU1FX1NFR01FTlRfQ09VTlQgOiAxO1xuICByZXR1cm4gc2VnbWVudHMuc2xpY2UoMCwgc2VnbWVudENvdW50KS5qb2luKCcvJyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgRGVmaW5pdGVseVR5cGVkIHBhY2thZ2UgdGhhdCBkZWNsYXJlcyBhIHBhY2thZ2UncyB0eXBlcywgd2hpY2ggaXMgd2hhdCBhIGRlY2xhcmF0aW9uIGZpbGUncyBpbXBvcnQgb2ZcbiAqIHRoYXQgcGFja2FnZSByZXNvbHZlcyB0byB3aGVuIHRoZSBwYWNrYWdlIHNoaXBzIG5vIHR5cGVzIG9mIGl0cyBvd24gKGBlc3RyZWVgIOKGkiBgQHR5cGVzL2VzdHJlZWAsXG4gKiBgQHNjb3BlL25hbWVgIOKGkiBgQHR5cGVzL3Njb3BlX19uYW1lYCkuXG4gKlxuICogQHBhcmFtIHBhY2thZ2VOYW1lIC0gVGhlIHBhY2thZ2UgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBgQHR5cGVzYCBwYWNrYWdlIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGdldFR5cGVzUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBUWVBFU19TQ09QRSArIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15AL3UsICcnKS5yZXBsYWNlKCcvJywgJ19fJyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBLHFCQUEyQjtBQUMzQixzQkFHTztBQUNQLHlCQUEwQjtBQUMxQix1QkFHTztBQUNQLDBCQUFvQjtBQUNwQix3QkFBK0I7QUFFL0IsaUJBQWdDO0FBQ2hDLHdCQUEwQjtBQUtuQixNQUFNLHdDQUEyRCxDQUFDLDRCQUFVLFNBQVMsS0FBSztBQUVqRyxNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLHVCQUF1QjtBQUM3QixNQUFNLGNBQWM7QUFDcEIsTUFBTSxvQ0FBb0M7QUFzQjFDLGVBQXNCLHFCQUFxQixVQUF1QyxDQUFDLEdBQWtCO0FBQ25HLFFBQU0sT0FBTyxvQkFBQUEsUUFBUSxJQUFJO0FBQ3pCLFFBQU0sY0FBYyxV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
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZhaWxzIHRoZSBidWlsZCB3aGVuIHRoZSBwdWJsaXNoZWQgb3V0cHV0IGltcG9ydHMgYSBwYWNrYWdlIHRoYXQgYHBhY2thZ2UuanNvbmAgZG9lcyBub3QgaW5zdGFsbCBmb3IgYSBjb25zdW1lci5cbiAqXG4gKiBFdmVyeSBiYXJlIHNwZWNpZmllciBpbiB0aGUgc2Nhbm5lZCBmb2xkZXJzIChgZGlzdC9saWJgIGFuZCBgYmluYCBieSBkZWZhdWx0LCBjb2RlIGFuZCBkZWNsYXJhdGlvbnMsIEVTTSBhbmRcbiAqIENvbW1vbkpTKSBtdXN0IG5hbWUgYSBwYWNrYWdlIGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCwgdGhlIHBhY2thZ2UgaXRzZWxmLFxuICogb3IgYSBidWlsdGluIChhbnkgYG5vZGU6YCBzcGVjaWZpZXIsIE5vZGUncyBvd24sIGFuZCBFbGVjdHJvbidzIGBlbGVjdHJvbmAgYW5kIGBvcmlnaW5hbC1mc2ApOyBhIGRlY2xhcmF0aW9uXG4gKiBmaWxlJ3MgaW1wb3J0IG1heSBhbHNvIGJlIHNlcnZlZCBieSB0aGUgcGFja2FnZSdzIGBAdHlwZXNgIG9uZS4gQSBwYWNrYWdlIGluXG4gKiBgZGV2RGVwZW5kZW5jaWVzYCBvbmx5IGlzIHByZXNlbnQgaW4gdGhlIHBhY2thZ2UncyBvd24gcmVwb3NpdG9yeSBhbmQgYWJzZW50IGZyb20gYVxuICogY29uc3VtZXIncyBpbnN0YWxsLCBzbyBub3RoaW5nIHRoZXJlIGZhaWxzLCBhbmQgdGhlIGNvbnN1bWVyIGdldHMgYENhbm5vdCBmaW5kIG1vZHVsZWAuXG4gKi9cblxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBpc0J1aWx0aW4gfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQge1xuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHByZVByb2Nlc3NGaWxlIH0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IFJlcG9QYXRocyB9IGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5cbi8qKlxuICogVGhlIGZvbGRlcnMge0BsaW5rIHZhbGlkYXRlRGVwZW5kZW5jaWVzfSBzY2FucyB3aGVuIG5vbmUgYXJlIGdpdmVuLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9WQUxJREFURV9ERVBFTkRFTkNJRVNfRk9MREVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbUmVwb1BhdGhzLkRpc3RMaWIsICdiaW4nXTtcblxuLyoqXG4gKiBUaGUgbW9kdWxlcyBFbGVjdHJvbiBwcm92aWRlcyB0byBpdHMgb3duIHByb2Nlc3Nlcywgd2hpY2ggbm8gcGFja2FnZSBpbnN0YWxsczogTm9kZSdzIGBpc0J1aWx0aW5gIGRvZXMgbm90IGtub3cgdGhlbS5cbiAqIGBlbGVjdHJvbmAgYWxzbyBjb3ZlcnMgaXRzIGBlbGVjdHJvbi9tYWluYCwgYGVsZWN0cm9uL3JlbmRlcmVyYCBhbmQgYGVsZWN0cm9uL2NvbW1vbmAgc3VicGF0aHMuXG4gKi9cbmNvbnN0IEVMRUNUUk9OX0JVSUxUSU5fUEFDS0FHRV9OQU1FUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoWydlbGVjdHJvbicsICdvcmlnaW5hbC1mcyddKTtcbmNvbnN0IE5PREVfU0NIRU1FID0gJ25vZGU6JztcbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTiA9IC9cXC5kXFwuKD86Y3RzfG10c3x0cykkL3U7XG5jb25zdCBTQ0FOTkVEX0ZJTEVfUEFUVEVSTiA9IC9cXC4oPzpjanN8Y3RzfGpzfG1qc3xtdHN8dHMpJC91O1xuY29uc3QgVFlQRVNfU0NPUEUgPSAnQHR5cGVzLyc7XG5jb25zdCBTQ09QRURfUEFDS0FHRV9OQU1FX1NFR01FTlRfQ09VTlQgPSAyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB2YWxpZGF0ZURlcGVuZGVuY2llc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVEZXBlbmRlbmNpZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXJzIHRvIHNjYW4sIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyLiBBIGZvbGRlciB0aGF0IGRvZXMgbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1ZBTElEQVRFX0RFUEVOREVOQ0lFU19GT0xERVJTfVxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVycz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGV2ZXJ5IGJhcmUgaW1wb3J0IGluIHRoZSBwdWJsaXNoZWQgb3V0cHV0IG5hbWVzIGEgcGFja2FnZSBhIGNvbnN1bWVyIGluc3RhbGxzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggZm9sZGVycyBhcmUgc2Nhbm5lZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBpbXBvcnQgaXMgZGVjbGFyZWQuXG4gKiBAdGhyb3dzIElmIGFueSBpbXBvcnQgbmFtZXMgYSBwYWNrYWdlIHRoYXQgaXMgbm90IGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCxcbiAqIHRoZSBwYWNrYWdlIGl0c2VsZiwgb3IgYSBOb2RlIGJ1aWx0aW4uIFRoZSBlcnJvciBsaXN0cyBlYWNoIG9mZmVuZGluZyBmaWxlIGFuZCBzcGVjaWZpZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZURlcGVuZGVuY2llcyhvcHRpb25zOiBWYWxpZGF0ZURlcGVuZGVuY2llc09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocm9vdCk7XG4gIGNvbnN0IGluc3RhbGxlZFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoW1xuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pXG4gIF0pO1xuICBpZiAocGFja2FnZUpzb24ubmFtZSkge1xuICAgIGluc3RhbGxlZFBhY2thZ2VOYW1lcy5hZGQocGFja2FnZUpzb24ubmFtZSk7XG4gIH1cblxuICBjb25zdCB1bmRlY2xhcmVkSW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmb2xkZXIgb2Ygb3B0aW9ucy5mb2xkZXJzID8/IERFRkFVTFRfVkFMSURBVEVfREVQRU5ERU5DSUVTX0ZPTERFUlMpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGF3YWl0IGdldEZpbGVQYXRocyhqb2luKHJvb3QsIGZvbGRlcikpKSB7XG4gICAgICBjb25zdCBpc0RlY2xhcmF0aW9uRmlsZSA9IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTi50ZXN0KGZpbGVQYXRoKTtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIGdldEltcG9ydFNwZWNpZmllcnMoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcik7XG4gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PT0gbnVsbCB8fCBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlY2xhcmF0aW9uRmlsZSAmJiBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKGdldFR5cGVzUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHVuZGVjbGFyZWRJbXBvcnRzLnB1c2goYCR7cmVsYXRpdmUocm9vdCwgZmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpfTogJHtzcGVjaWZpZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHVuZGVjbGFyZWRJbXBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHB1Ymxpc2hlZCBvdXRwdXQgaW1wb3J0cyBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW4gZGVwZW5kZW5jaWVzLCBvcHRpb25hbERlcGVuZGVuY2llcyBvciBwZWVyRGVwZW5kZW5jaWVzOlxcbiR7dW5kZWNsYXJlZEltcG9ydHMuam9pbignXFxuJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgc2Nhbm5lZCBmaWxlcyB1bmRlciBhIGZvbGRlciwgcmVjdXJzaXZlbHkuXG4gKlxuICogQHBhcmFtIGZvbGRlciAtIFRoZSBhYnNvbHV0ZSBmb2xkZXIgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRocyBvZiB0aGUgc2Nhbm5lZCBmaWxlcywgb3Igbm9uZSB3aGVuIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVQYXRocyhmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFleGlzdHNTeW5jKGZvbGRlcikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBTQ0FOTkVEX0ZJTEVfUEFUVEVSTi50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKVxuICAgIC5zb3J0KCk7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIG1vZHVsZSBzcGVjaWZpZXJzIGEgc291cmNlIGZpbGUgaW1wb3J0cywgcmVxdWlyZXMgb3IgcmVmZXJlbmNlcywgaWdub3Jpbmcgc3RyaW5ncyBhbmQgY29tbWVudHMuXG4gKlxuICogQHBhcmFtIHNvdXJjZVRleHQgLSBUaGUgc291cmNlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlIHNwZWNpZmllcnMuXG4gKi9cbmZ1bmN0aW9uIGdldEltcG9ydFNwZWNpZmllcnMoc291cmNlVGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB7IGltcG9ydGVkRmlsZXMgfSA9IHByZVByb2Nlc3NGaWxlKHNvdXJjZVRleHQsIHRydWUsIHRydWUpO1xuICByZXR1cm4gaW1wb3J0ZWRGaWxlcy5tYXAoKGltcG9ydGVkRmlsZSkgPT4gaW1wb3J0ZWRGaWxlLmZpbGVOYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYWNrYWdlIGEgYmFyZSBzcGVjaWZpZXIgbmFtZXMuXG4gKlxuICogQHBhcmFtIHNwZWNpZmllciAtIFRoZSBtb2R1bGUgc3BlY2lmaWVyLlxuICogQHJldHVybnMgVGhlIHBhY2thZ2UgbmFtZSwgb3IgYG51bGxgIGZvciBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgsIGEgYnVpbHRpbiBvZiBOb2RlIG9yIEVsZWN0cm9uLCBvciBhbnlcbiAqIGBub2RlOmAtc2NoZW1lIHNwZWNpZmllcjogbm8gcGFja2FnZSBuYW1lIGNhbiBzdGFydCB3aXRoIGBub2RlOmAsIGFuZCBFbGVjdHJvbidzIGBub2RlOm9yaWdpbmFsLWZzYCBpcyBvbmUgTm9kZSdzIG93blxuICogbGlzdCBsYWNrcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgaWYgKFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCcuJykgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aChOT0RFX1NDSEVNRSkgfHwgaXNCdWlsdGluKHNwZWNpZmllcilcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzZWdtZW50cyA9IHNwZWNpZmllci5zcGxpdCgnLycpO1xuICBjb25zdCBzZWdtZW50Q291bnQgPSBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnQCcpID8gU0NPUEVEX1BBQ0tBR0VfTkFNRV9TRUdNRU5UX0NPVU5UIDogMTtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBzZWdtZW50cy5zbGljZSgwLCBzZWdtZW50Q291bnQpLmpvaW4oJy8nKTtcbiAgcmV0dXJuIEVMRUNUUk9OX0JVSUxUSU5fUEFDS0FHRV9OQU1FUy5oYXMocGFja2FnZU5hbWUpID8gbnVsbCA6IHBhY2thZ2VOYW1lO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIERlZmluaXRlbHlUeXBlZCBwYWNrYWdlIHRoYXQgZGVjbGFyZXMgYSBwYWNrYWdlJ3MgdHlwZXMsIHdoaWNoIGlzIHdoYXQgYSBkZWNsYXJhdGlvbiBmaWxlJ3MgaW1wb3J0IG9mXG4gKiB0aGF0IHBhY2thZ2UgcmVzb2x2ZXMgdG8gd2hlbiB0aGUgcGFja2FnZSBzaGlwcyBubyB0eXBlcyBvZiBpdHMgb3duIChgZXN0cmVlYCDihpIgYEB0eXBlcy9lc3RyZWVgLFxuICogYEBzY29wZS9uYW1lYCDihpIgYEB0eXBlcy9zY29wZV9fbmFtZWApLlxuICpcbiAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBwYWNrYWdlIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgYEB0eXBlc2AgcGFja2FnZSBuYW1lLlxuICovXG5mdW5jdGlvbiBnZXRUeXBlc1BhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gVFlQRVNfU0NPUEUgKyBwYWNrYWdlTmFtZS5yZXBsYWNlKC9eQC91LCAnJykucmVwbGFjZSgnLycsICdfXycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQSxxQkFBMkI7QUFDM0Isc0JBR087QUFDUCx5QkFBMEI7QUFDMUIsdUJBR087QUFDUCwwQkFBb0I7QUFDcEIsd0JBQStCO0FBRS9CLGlCQUFnQztBQUNoQyx3QkFBMEI7QUFLbkIsTUFBTSx3Q0FBMkQsQ0FBQyw0QkFBVSxTQUFTLEtBQUs7QUFNakcsTUFBTSxpQ0FBc0Qsb0JBQUksSUFBSSxDQUFDLFlBQVksYUFBYSxDQUFDO0FBQy9GLE1BQU0sY0FBYztBQUNwQixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLHVCQUF1QjtBQUM3QixNQUFNLGNBQWM7QUFDcEIsTUFBTSxvQ0FBb0M7QUFzQjFDLGVBQXNCLHFCQUFxQixVQUF1QyxDQUFDLEdBQWtCO0FBQ25HLFFBQU0sT0FBTyxvQkFBQUEsUUFBUSxJQUFJO0FBQ3pCLFFBQU0sY0FBYyxVQUFNLDRCQUFnQixJQUFJO0FBQzlDLFFBQU0sd0JBQXdCLG9CQUFJLElBQUk7QUFBQSxJQUNwQyxHQUFHLE9BQU8sS0FBSyxZQUFZLGdCQUFnQixDQUFDLENBQUM7QUFBQSxJQUM3QyxHQUFHLE9BQU8sS0FBSyxZQUFZLHdCQUF3QixDQUFDLENBQUM7QUFBQSxJQUNyRCxHQUFHLE9BQU8sS0FBSyxZQUFZLG9CQUFvQixDQUFDLENBQUM7QUFBQSxFQUNuRCxDQUFDO0FBQ0QsTUFBSSxZQUFZLE1BQU07QUFDcEIsMEJBQXNCLElBQUksWUFBWSxJQUFJO0FBQUEsRUFDNUM7QUFFQSxRQUFNLG9CQUE4QixDQUFDO0FBQ3JDLGFBQVcsVUFBVSxRQUFRLFdBQVcsdUNBQXVDO0FBQzdFLGVBQVcsWUFBWSxNQUFNLGlCQUFhLHVCQUFLLE1BQU0sTUFBTSxDQUFDLEdBQUc7QUFDN0QsWUFBTSxvQkFBb0IseUJBQXlCLEtBQUssUUFBUTtBQUNoRSxpQkFBVyxhQUFhLG9CQUFvQixVQUFNLDBCQUFTLFVBQVUsT0FBTyxDQUFDLEdBQUc7QUFDOUUsY0FBTSxjQUFjLGVBQWUsU0FBUztBQUM1QyxZQUFJLGdCQUFnQixRQUFRLHNCQUFzQixJQUFJLFdBQVcsR0FBRztBQUNsRTtBQUFBLFFBQ0Y7QUFDQSxZQUFJLHFCQUFxQixzQkFBc0IsSUFBSSxvQkFBb0IsV0FBVyxDQUFDLEdBQUc7QUFDcEY7QUFBQSxRQUNGO0FBQ0EsMEJBQWtCLEtBQUssT0FBRywyQkFBUyxNQUFNLFFBQVEsRUFBRSxXQUFXLE1BQU0sR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQUEsTUFDMUY7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksa0JBQWtCLFNBQVMsR0FBRztBQUNoQyxVQUFNLElBQUk7QUFBQSxNQUNSO0FBQUEsRUFBa0gsa0JBQWtCLEtBQUssSUFBSSxDQUFDO0FBQUEsSUFDaEo7QUFBQSxFQUNGO0FBQ0Y7QUFRQSxlQUFlLGFBQWEsUUFBbUM7QUFDN0QsTUFBSSxLQUFDLDJCQUFXLE1BQU0sR0FBRztBQUN2QixXQUFPLENBQUM7QUFBQSxFQUNWO0FBRUEsUUFBTSxVQUFVLFVBQU0seUJBQVEsUUFBUSxFQUFFLFdBQVcsTUFBTSxlQUFlLEtBQUssQ0FBQztBQUM5RSxTQUFPLFFBQ0osT0FBTyxDQUFDLFVBQVUsTUFBTSxPQUFPLEtBQUsscUJBQXFCLEtBQUssTUFBTSxJQUFJLENBQUMsRUFDekUsSUFBSSxDQUFDLGNBQVUsdUJBQUssTUFBTSxZQUFZLE1BQU0sSUFBSSxDQUFDLEVBQ2pELEtBQUs7QUFDVjtBQVFBLFNBQVMsb0JBQW9CLFlBQThCO0FBQ3pELFFBQU0sRUFBRSxjQUFjLFFBQUksa0NBQWUsWUFBWSxNQUFNLElBQUk7QUFDL0QsU0FBTyxjQUFjLElBQUksQ0FBQyxpQkFBaUIsYUFBYSxRQUFRO0FBQ2xFO0FBVUEsU0FBUyxlQUFlLFdBQWtDO0FBQ3hELE1BQ0UsVUFBVSxXQUFXLEdBQUcsS0FBSyxVQUFVLFdBQVcsR0FBRyxLQUFLLFVBQVUsV0FBVyxXQUFXLFNBQUssOEJBQVUsU0FBUyxHQUNsSDtBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxXQUFXLFVBQVUsTUFBTSxHQUFHO0FBQ3BDLFFBQU0sZUFBZSxVQUFVLFdBQVcsR0FBRyxJQUFJLG9DQUFvQztBQUNyRixRQUFNLGNBQWMsU0FBUyxNQUFNLEdBQUcsWUFBWSxFQUFFLEtBQUssR0FBRztBQUM1RCxTQUFPLCtCQUErQixJQUFJLFdBQVcsSUFBSSxPQUFPO0FBQ2xFO0FBVUEsU0FBUyxvQkFBb0IsYUFBNkI7QUFDeEQsU0FBTyxjQUFjLFlBQVksUUFBUSxPQUFPLEVBQUUsRUFBRSxRQUFRLEtBQUssSUFBSTtBQUN2RTsiLCJuYW1lcyI6WyJwcm9jZXNzIl19
@@ -6,7 +6,8 @@
6
6
  *
7
7
  * Every bare specifier in the scanned folders (`dist/lib` and `bin` by default, code and declarations, ESM and
8
8
  * CommonJS) must name a package in `dependencies`, `optionalDependencies` or `peerDependencies`, the package itself,
9
- * or a Node builtin; a declaration file's import may also be served by the package's `@types` one. A package in
9
+ * or a builtin (any `node:` specifier, Node's own, and Electron's `electron` and `original-fs`); a declaration
10
+ * file's import may also be served by the package's `@types` one. A package in
10
11
  * `devDependencies` only is present in the package's own repository and absent from a
11
12
  * consumer's install, so nothing there fails, and the consumer gets `Cannot find module`.
12
13
  */
@@ -52,6 +52,19 @@ export interface GenerateLibraryExportsOptions {
52
52
  */
53
53
  readonly sourceCondition?: string | undefined;
54
54
  }
55
+ /**
56
+ * Options for {@link generateLibraryIndex}.
57
+ */
58
+ export interface GenerateLibraryIndexOptions {
59
+ /**
60
+ * Source modules or folders to leave off the generated barrels, as paths from the package root
61
+ * (`src/demo-vault-buttons.ts`, `src/test-runners/integration`). A module that needs an optional peer, or one that
62
+ * runs code at load time which only works inside a test runner, goes here, so importing a barrel never loads it. It is
63
+ * still built and stays reachable through its own subpath export. A path that names nothing the barrels would export
64
+ * throws, so a rename cannot quietly put the module back.
65
+ */
66
+ readonly excludeFromIndex?: readonly string[] | undefined;
67
+ }
55
68
  /**
56
69
  * Removes everything an earlier build left: `dist/`, the generated `index.ts` barrels, the `.d.ts` files `tsc` wrote
57
70
  * beside the sources (hand-authored ones under `@types` stay), and the per-subpath `package.json` stubs.
@@ -102,9 +115,10 @@ export declare function generateLibraryExports(options?: GenerateLibraryExportsO
102
115
  * Generates an `index.ts` barrel in every source folder that has something to export, re-exporting each module and
103
116
  * each sub-barrel under its own name.
104
117
  *
118
+ * @param options - The options.
105
119
  * @returns A {@link Promise} that resolves when the barrels have been written.
106
120
  */
107
- export declare function generateLibraryIndex(): Promise<void>;
121
+ export declare function generateLibraryIndex(options?: GenerateLibraryIndexOptions): Promise<void>;
108
122
  /**
109
123
  * Runs each named npm script the package defines, in order, skipping the ones it does not define.
110
124
  *
@@ -208,8 +208,13 @@ async function generateLibraryExports(options = {}) {
208
208
  throw new Error("Package exports have changed. Please review the changes and commit them.");
209
209
  }
210
210
  }
211
- async function generateLibraryIndex() {
212
- await generateIndex(RepoPaths.Src);
211
+ async function generateLibraryIndex(options = {}) {
212
+ const excludedPaths = new Set((options.excludeFromIndex ?? []).map((path) => join(path.replaceAll("\\", "/")).replace(/\/$/, "")));
213
+ const unmatchedPaths = new Set(excludedPaths);
214
+ await generateIndex({ excludedPaths, folder: RepoPaths.Src, unmatchedPaths });
215
+ if (unmatchedPaths.size > 0) {
216
+ throw new Error(`excludeFromIndex names no module the barrels would export: ${[...unmatchedPaths].join(", ")}.`);
217
+ }
213
218
  }
214
219
  async function runBuildSteps(steps = LIBRARY_BUILD_STEPS) {
215
220
  for (const step of steps) {
@@ -343,9 +348,10 @@ function collectEnvironmentDirectives(params) {
343
348
  }
344
349
  return directivesByFile;
345
350
  }
346
- async function generateIndex(folder) {
351
+ async function generateIndex(params) {
352
+ const { folder } = params;
347
353
  const dirents = await readdirPosix(folder, { withFileTypes: true });
348
- const maybeLines = await asyncMap(dirents, (dirent) => handleIndexDirent(folder, dirent));
354
+ const maybeLines = await asyncMap(dirents, (dirent) => handleIndexDirent(params, dirent));
349
355
  const lines = maybeLines.filter((line) => line !== void 0);
350
356
  if (lines.length === 0) {
351
357
  return "skipped" /* Skipped */;
@@ -360,14 +366,20 @@ async function getLibFiles() {
360
366
  (file) => file.endsWith(RepoPaths.TsExtension) && !file.endsWith(RepoPaths.DtsExtension) && !file.endsWith(".test.ts") && !file.includes(`/${RepoPaths.TestHelpers}/`)
361
367
  );
362
368
  }
363
- async function handleIndexDirent(folder, dirent) {
369
+ async function handleIndexDirent(params, dirent) {
370
+ const { excludedPaths, folder, unmatchedPaths } = params;
364
371
  if (isExcludedFromIndex(folder, dirent)) {
365
372
  return;
366
373
  }
374
+ const path = join(folder, dirent.name);
375
+ if (excludedPaths.has(path)) {
376
+ unmatchedPaths.delete(path);
377
+ return;
378
+ }
367
379
  let sourceFile;
368
380
  let name;
369
381
  if (dirent.isDirectory()) {
370
- const result = await generateIndex(join(folder, dirent.name));
382
+ const result = await generateIndex({ ...params, folder: path });
371
383
  if (result !== "success" /* Success */) {
372
384
  return;
373
385
  }
@@ -527,4 +539,4 @@ export {
527
539
  generateLibraryIndex,
528
540
  runBuildSteps
529
541
  };
530
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVwZW5kZW5jaWVzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiBhIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzb1xuICogYSBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbnRyaWVzIGZvciBmaWxlcyB0aGF0IGFyZSBub3QgYnVpbHQgZnJvbSBhIHNvdXJjZSBmb2xkZXIgKGEgZm9sZGVyIG9mIHNoYXJlZCBgdHNjb25maWdgIHByZXNldHMsIGFtYmllbnQgYC5kLnRzYFxuICAgKiBmaWxlcyksIGtleWVkIGJ5IHN1YnBhdGguIFRoZXkgZ28gaW50byB0aGUgbWFwIGFmdGVyIHRoZSBnZW5lcmF0ZWQgZW50cmllcywgYXMgZ2l2ZW4sIGFuZCBjb3VudCB0b3dhcmQgaXRzIGNoYW5nZVxuICAgKiBjaGVjazsgbm8gc3VicGF0aCBzdHViIGlzIHdyaXR0ZW4gZm9yIHRoZW0uIEEga2V5IGEgc291cmNlIGZvbGRlciBhbHJlYWR5IGdlbmVyYXRlcyB0aHJvd3MuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRXhwb3J0cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFBhY2thZ2VKc29uLkV4cG9ydHM+PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwb3J0IGNvbmRpdGlvbiB0byBwdXQgZmlyc3QgaW4gZXZlcnkgZW50cnksIG1hcHBpbmcgdGhlIHN1YnBhdGggb250byBpdHMgVHlwZVNjcmlwdCBzb3VyY2UuIE9ubHkgYVxuICAgKiByZXBvc2l0b3J5IGhvbGRpbmcgc2V2ZXJhbCBwYWNrYWdlcyB0aGF0IGltcG9ydCBlYWNoIG90aGVyIG5lZWRzIG9uZTsgbm90aGluZyBvdXRzaWRlIGl0IHNldHMgdGhlIGNvbmRpdGlvbiwgYW5kXG4gICAqIHRoZSBzb3VyY2VzIGl0IHBvaW50cyBhdCBkbyBub3Qgc2hpcCwgc28gdGhlIHB1Ymxpc2ggaGFzIHRvIHN0cmlwIGl0IGFnYWluLiBPbWl0dGVkLCB0aGUgbWFwIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG50eXBlIE1vZHVsZUZvcm1hdCA9ICdjanMnIHwgJ2VzbSc7XG5cbmNvbnN0IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUyA9IG5ldyBTZXQoWydub2RlJ10pO1xuXG4vLyBUaGUgbGlicyB0aGF0IGRlc2NyaWJlIGEgaG9zdCdzIGdsb2JhbHMgcmF0aGVyIHRoYW4gdGhlIGxhbmd1YWdlLCB3aGljaCBjb25zdW1lcnMgY29uZmxpY3Qgb3Zlci4gRWFjaCBkZWNsYXJhdGlvblxuLy8gZ2V0cyB0aGUgb25lcyBpdCB1c2VzOyBldmVyeSBvdGhlciBsaWIgaXMgc2hhcmVkIHRocm91Z2ggYGxpYnJhcnktcmVmZXJlbmNlc2AuXG5jb25zdCBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gWydkb20nLCAnc2NyaXB0aG9zdCcsICd3ZWJ3b3JrZXInXTtcbmNvbnN0IE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UID0gJy9ub2RlX21vZHVsZXMvQHR5cGVzL25vZGUvJztcbmNvbnN0IExJQl9SRVBMQUNFTUVOVF9SRUdfRVhQID0gL1xcL25vZGVfbW9kdWxlc1xcL0B0eXBlc2NyaXB0XFwvbGliLSg/PExpYj5bXi9dKylcXC8oPzxTdWJMaWI+LispXFwuZFxcLnRzJC87XG5cbi8vIFRoZSBkZWNsYXJhdGlvbiB0aGF0IGNhcnJpZXMgb25seSB0aGUgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlcy4gRXZlcnkgZGVjbGFyYXRpb24gYnV0IHRoZSByb290IG9uZSByZWZlcmVuY2VzXG4vLyBpdCwgcmF0aGVyIHRoYW4gdGhlIHJvb3QgYmFycmVsLCB3aGljaCB3b3VsZCBsb2FkIGV2ZXJ5IG1vZHVsZSBvZiB0aGUgcGFja2FnZSwgb3B0aW9uYWwgcGVlcnMnIHR5cGVzIGluY2x1ZGVkLlxuY29uc3QgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSA9ICdsaWJyYXJ5LXJlZmVyZW5jZXMnO1xuLy8gU3BlbGxlZCBhcGFydCBvbiBwdXJwb3NlOiB7QGxpbmsgY29sbGVjdEFsbExpYnN9IHNjYW5zIGV2ZXJ5IHNvdXJjZSBmaWxlIG9mIHRoZSBwYWNrYWdlIGJlaW5nIGJ1aWx0IGZvciB0aGVcbi8vIGRpcmVjdGl2ZSwgdGhpcyBvbmUgaW5jbHVkZWQsIHNvIGEgbGl0ZXJhbCBvbmUgaGVyZSB3b3VsZCBiZSByZWFkIGFzIGEgbGliIHRoaXMgcGFja2FnZSBuZWVkcy5cbmNvbnN0IFJFRkVSRU5DRV9MSUJfRElSRUNUSVZFID0gWyc8cmVmZXJlbmNlJywgJ2xpYj0nXS5qb2luKCcgJyk7XG5jb25zdCBSRUZFUkVOQ0VfTElCX1JFR19FWFAgPSAvXFwvXFwvXFwvIDxyZWZlcmVuY2UgbGliPVwiKD88TGliPlteXCJdKylcIiBcXC8+L2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIHR5cGUtb25seSBpbXBvcnQsIGUuZy4gYGltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7YC5cbmNvbnN0IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUCA9IC9eaW1wb3J0IHR5cGUgKD88Q2xhdXNlPi4rPykgZnJvbSAnKD88U3BlY2lmaWVyPlteLiddW14nXSopJzskL2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIGlubGluZSBpbXBvcnQgdHlwZSBub2RlLCBlLmcuIGBpbXBvcnQoXCJ0eXBlLWZlc3RcIikuUHJvbWlzYWJsZWAuXG5jb25zdCBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQID0gL2ltcG9ydFxcKFwiKD88U3BlY2lmaWVyPlteLlwiXVteXCJdKilcIlxcKS9nO1xuXG5jb25zdCBTVEFUSUNfSU1QT1JUX1JFR19FWFAgPSAvZnJvbSAnKD88SW1wb3J0UGF0aD4uKz8pXFwudHMnOy9nbTtcblxuLy8gSW5saW5lIGltcG9ydC10eXBlIG5vZGVzIChgdHlwZW9mIGltcG9ydCgnLi9mb28udHMnKWApIHByZXNlcnZlIHRoZSBzb3VyY2UgcXVvdGUgc3R5bGUuXG4vLyBIYW5kLWF1dGhvcmVkIGAuZC50c2AgZmlsZXMgZW1pdCBzaW5nbGUgcXVvdGVzOyB0c2MtZ2VuZXJhdGVkIGRlY2xhcmF0aW9ucyBlbWl0IGRvdWJsZSBxdW90ZXMuXG4vLyBDYXB0dXJlIHRoZSBxdW90ZSBhbmQgcmV1c2UgaXQgaW4gdGhlIHJlcGxhY2VtZW50IHNvIGJvdGggc3R5bGVzIGFyZSByZXdyaXR0ZW4uXG5jb25zdCBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQID0gL2ltcG9ydFxcKCg/PFF1b3RlPlsnXCJdKSg/PEltcG9ydFBhdGg+Lis/KVxcLnRzXFxrPFF1b3RlPlxcKS9nbTtcblxuZW51bSBHZW5lcmF0ZUluZGV4UmVzdWx0IHtcbiAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgU3VjY2VzcyA9ICdzdWNjZXNzJ1xufVxuXG5pbnRlcmZhY2UgQWRkRW52aXJvbm1lbnRHbG9iYWxzUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliczogU2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHN5bWJvbDogVHNTeW1ib2w7XG4gIHJlYWRvbmx5IHR5cGVzOiBTZXQ8c3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGZvcm1hdDogTW9kdWxlRm9ybWF0O1xuICByZWFkb25seSBsaWJGaWxlczogc3RyaW5nW107XG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5OiAoaXNFc206IGJvb2xlYW4pID0+IFBsdWdpbjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uRmlsZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZHVsZURpcmVjdG9yeTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlc1BhcmFtcyB7XG4gIHJlYWRvbmx5IGF2YWlsYWJsZVR5cGVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkcy4gRXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gcmVmZXJlbmNlcyBhIGBsaWJyYXJ5LXJlZmVyZW5jZXNgXG4gKiBkZWNsYXJhdGlvbiBiZXNpZGUgaXQgYnkgcGF0aCwgbmV2ZXIgdGhlIHJvb3Q6IHRoZSByb290IGJhcnJlbCByZS1leHBvcnRzIGV2ZXJ5IG1vZHVsZSwgc28gcmVmZXJlbmNpbmcgaXQgbWFkZSBlYWNoXG4gKiBzdWJwYXRoIGxvYWQgdGhlIHdob2xlIHBhY2thZ2UsIGFuZCBhIGNvbnN1bWVyIHR5cGUtY2hlY2tpbmcgd2l0aCBgc2tpcExpYkNoZWNrOiBmYWxzZWAgdGhlbiBuZWVkZWQgZXZlcnkgb3B0aW9uYWxcbiAqIHBlZXIgaW5zdGFsbGVkLlxuICpcbiAqIGBsaWJyYXJ5LXJlZmVyZW5jZXNgIGNhcnJpZXMgb25seSB0aGUgbGlicyB0aGF0IGRlc2NyaWJlIHRoZSBsYW5ndWFnZSAoYGVzMjAyMmAsIGBlc25leHQuZGlzcG9zYWJsZWApLCB3aGljaCBub1xuICogY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBvbmVzIHRoYXQgZGVzY3JpYmUgYSBob3N0IChgZG9tYCwgYGRvbS5pdGVyYWJsZWAsIGB3ZWJ3b3JrZXJgKSBhbmQgYHR5cGVzPVwibm9kZVwiYCBnb1xuICogb25seSBpbnRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCBuYW1lIG9uZSBvZiB0aGVpciBnbG9iYWxzLCBmb3VuZCBieSByZXNvbHZpbmcgZXZlcnkgbmFtZSBpbiB0aGUgZW1pdHRlZFxuICogZGVjbGFyYXRpb25zIHdpdGggdGhlIHR5cGUgY2hlY2tlci4gT3RoZXJ3aXNlIGEgYnJvd3NlciBjb25zdW1lciBvZiBhIHB1cmUgc3VicGF0aCBnb3QgYWxsIG9mIGBAdHlwZXMvbm9kZWAsIGFuZCBpdHNcbiAqIGBzZXRUaW1lb3V0YCByZXR1cm5lZCBgTm9kZUpTLlRpbWVvdXRgLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICogQHRocm93cyBJZiBhIHNvdXJjZSBtb2R1bGUgaXMgbmFtZWQgYGxpYnJhcnktcmVmZXJlbmNlc2AsIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgYCR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn1gKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNyYy8ke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259IGNvbGxpZGVzIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lLmApO1xuICB9XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAndHNjJyB9KSwgJy0tcHJvamVjdCcsICcuL3RzY29uZmlnLnR5cGVzLmpzb24nXSk7XG5cbiAgY29uc3QgbGlicmFyeUZpbGVOYW1lID0gZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsICdsaWJyYXJ5LnRzJykpID8gJ2xpYnJhcnknIDogJ2luZGV4JztcbiAgY29uc3QgYWxsTGlicyA9IGF3YWl0IGNvbGxlY3RBbGxMaWJzKCk7XG4gIGNvbnN0IGFsbFR5cGVzID0gY29sbGVjdEFsbFR5cGVzKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhhbGxUeXBlcyk7XG4gIC8vIE9ubHkgdGhlIGxpYnMgbm8gY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBlbnZpcm9ubWVudCBnbG9iYWxzIGdvIHRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCB1c2UgdGhlbS5cbiAgY29uc3Qgc2hhcmVkRGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzLmZpbHRlcigobGliKSA9PiAhaXNFbnZpcm9ubWVudExpYihsaWIpKSk7XG5cbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuXG4gIGNvbnN0IHNyY0ZpbGVzID0gYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZWNsYXJhdGlvbkZpbGVzID0gc3JjRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSk7XG4gIGNvbnN0IGVudmlyb25tZW50RGlyZWN0aXZlcyA9IGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMoeyBhdmFpbGFibGVUeXBlczogYWxsVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGZpbGUpO1xuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBjdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IG10c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbik7XG5cbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGN0c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG10c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGxldCBjdHNDb250ZW50ID0gdG9DdHNDb250ZW50KGNvbnRlbnQpO1xuICAgIGxldCBtdHNDb250ZW50ID0gdG9NdHNDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgaWYgKG5hbWUgPT09IGxpYnJhcnlGaWxlTmFtZSAmJiBmb2xkZXIgPT09ICcuJykge1xuICAgICAgY3RzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWxlRGlyZWN0aXZlcyA9IGVudmlyb25tZW50RGlyZWN0aXZlcy5nZXQoZmlsZSkgPz8gJyc7XG4gICAgICBjdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogY3RzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuQ2pzIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkVzbSB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoY3RzUGF0aCwgY3RzQ29udGVudCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKG10c1BhdGgsIG10c0NvbnRlbnQpO1xuICB9XG59XG5cbi8qKlxuICogUmVnZW5lcmF0ZXMgdGhlIGBleHBvcnRzYCBtYXAgb2YgdGhlIHBhY2thZ2UncyBgcGFja2FnZS5qc29uYCBmcm9tIGl0cyBzb3VyY2UgZm9sZGVycywgYW5kIHdyaXRlcyBhIGBwYWNrYWdlLmpzb25gXG4gKiBzdHViIHBlciBzdWJwYXRoIGZvciByZXNvbHZlcnMgdGhhdCBkbyBub3QgcmVhZCBgZXhwb3J0c2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFwIGlzIGN1cnJlbnQuXG4gKiBAdGhyb3dzIElmIHRoZSBtYXAgY2hhbmdlZCwgc28gdGhlIGNoYW5nZSBnZXRzIHJldmlld2VkIGFuZCBjb21taXR0ZWQgcmF0aGVyIHRoYW4gc2hpcHBlZCB1bnNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzKG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhZGRpdGlvbmFsRXhwb3J0cyA9IHt9LCBzb3VyY2VDb25kaXRpb24gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNyY0ZvbGRlcnM6IHN0cmluZ1tdID0gW1JlcG9QYXRocy5TcmNdO1xuXG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSk7XG5cbiAgICBpZiAocGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuU3R5bGVzKSB8fCBwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNyY0ZvbGRlcnMucHVzaChwYXRoKTtcbiAgfVxuXG4gIHNyY0ZvbGRlcnMuc29ydCgpO1xuXG4gIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oYXN5bmMgKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgY29uc3Qgb2xkRXhwb3J0cyA9IHBhY2thZ2VKc29uLmV4cG9ydHM7XG4gICAgY29uc3QgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucyA9IHt9O1xuICAgIHBhY2thZ2VKc29uLmV4cG9ydHMgPSBleHBvcnRDb25kaXRpb25zO1xuICAgIGZvciAoY29uc3Qgc3JjRm9sZGVyIG9mIHNyY0ZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IGZhbHNlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IHRydWUsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnBhdGgsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsRXhwb3J0cykpIHtcbiAgICAgIGlmIChleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWRkaXRpb25hbCBleHBvcnQgJyR7c3VicGF0aH0nIGNvbGxpZGVzIHdpdGggYW4gZW50cnkgZ2VuZXJhdGVkIGZyb20gYSBzb3VyY2UgZm9sZGVyLmApO1xuICAgICAgfVxuXG4gICAgICBleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdID0gZW50cnk7XG4gICAgfVxuXG4gICAgaXNDaGFuZ2VkID0gIWlzRGVlcEVxdWFsKG9sZEV4cG9ydHMsIHBhY2thZ2VKc29uLmV4cG9ydHMpO1xuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBjaGFuZ2VkIGluIHRoZSBgZWRpdFBhY2thZ2VKc29uYCwgRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYWNrYWdlIGV4cG9ydHMgaGF2ZSBjaGFuZ2VkLiBQbGVhc2UgcmV2aWV3IHRoZSBjaGFuZ2VzIGFuZCBjb21taXQgdGhlbS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBgaW5kZXgudHNgIGJhcnJlbCBpbiBldmVyeSBzb3VyY2UgZm9sZGVyIHRoYXQgaGFzIHNvbWV0aGluZyB0byBleHBvcnQsIHJlLWV4cG9ydGluZyBlYWNoIG1vZHVsZSBhbmRcbiAqIGVhY2ggc3ViLWJhcnJlbCB1bmRlciBpdHMgb3duIG5hbWUuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYXJyZWxzIGhhdmUgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5SW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdlbmVyYXRlSW5kZXgoUmVwb1BhdGhzLlNyYyk7XG59XG5cbi8qKlxuICogUnVucyBlYWNoIG5hbWVkIG5wbSBzY3JpcHQgdGhlIHBhY2thZ2UgZGVmaW5lcywgaW4gb3JkZXIsIHNraXBwaW5nIHRoZSBvbmVzIGl0IGRvZXMgbm90IGRlZmluZS5cbiAqXG4gKiBAcGFyYW0gc3RlcHMgLSBUaGUgbnBtIHNjcmlwdCBuYW1lcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBzdGVwIGhhcyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5CdWlsZFN0ZXBzKHN0ZXBzOiByZWFkb25seSBzdHJpbmdbXSA9IExJQlJBUllfQlVJTERfU1RFUFMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoc3RlcCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIHdoYXQgYSBjb25zdW1lciBuZWVkcyBsb2FkZWQgZm9yIG9uZSBzeW1ib2wgYSBkZWNsYXJhdGlvbiBuYW1lcy4gQSBzeW1ib2wgYW55IEVTIGxpYiBkZWNsYXJlcyBuZWVkcyBub3RoaW5nLFxuICogYmVjYXVzZSBubyBjb25zdW1lciBjb25mbGljdHMgd2l0aCB0aG9zZSBsaWJzLiBPdGhlcndpc2UgZWFjaCBlbnZpcm9ubWVudCBsaWIgdGhhdCBkZWNsYXJlcyBpdCBhZGRzIGl0c2VsZiwgYW5kXG4gKiBmYWlsaW5nIHRoYXQgYEB0eXBlcy9ub2RlYCBhZGRzIGBub2RlYC4gQSBzeW1ib2wgZGVjbGFyZWQgaW4gdGhlIHBhY2thZ2UncyBvd24gZmlsZXMgYWRkcyBub3RoaW5nOiB0aGUgZGVjbGFyYXRpb25cbiAqIHRoYXQgaG9sZHMgaXQgY2FycmllcyBpdHMgb3duIGRpcmVjdGl2ZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzeW1ib2wsIHRoZSBwcm9ncmFtIGl0IHdhcyByZXNvbHZlZCBpbiwgYW5kIHRoZSBzZXRzIHRvIGFkZCB0by5cbiAqL1xuZnVuY3Rpb24gYWRkRW52aXJvbm1lbnRHbG9iYWxzKHBhcmFtczogQWRkRW52aXJvbm1lbnRHbG9iYWxzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgbGlicywgcHJvZ3JhbSwgc3ltYm9sLCB0eXBlcyB9ID0gcGFyYW1zO1xuICBjb25zdCBlbnZpcm9ubWVudExpYnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpc05vZGUgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN5bWJvbC5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICAgIGlmIChwcm9ncmFtLmlzU291cmNlRmlsZURlZmF1bHRMaWJyYXJ5KHNvdXJjZUZpbGUpKSB7XG4gICAgICBjb25zdCBsaWIgPSB0b0xpYk5hbWUoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgICBpZiAoIWlzRW52aXJvbm1lbnRMaWIobGliKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbnZpcm9ubWVudExpYnMucHVzaChsaWIpO1xuICAgIH0gZWxzZSBpZiAoc291cmNlRmlsZS5maWxlTmFtZS5pbmNsdWRlcyhOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCkpIHtcbiAgICAgIGlzTm9kZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVudmlyb25tZW50TGlicy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBsaWIgb2YgZW52aXJvbm1lbnRMaWJzKSB7XG4gICAgICBsaWJzLmFkZChsaWIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc05vZGUpIHtcbiAgICB0eXBlcy5hZGQoJ25vZGUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMobGliczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7XG4gICAgbGlic1xuICAgICAgLm1hcCgobGliKSA9PiBgLy8vICR7UkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkV9XCIke2xpYn1cIiAvPmApXG4gICAgICAuam9pbignXFxuJylcbiAgfVxcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKHR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlcy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiBgJHtcbiAgICAgIHR5cGVzXG4gICAgICAgIC5tYXAoKHR5cGUpID0+IGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIiR7dHlwZX1cIiAvPmApXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH1cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlGb3JtYXQocGFyYW1zOiBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBmb3JtYXQsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBleHRlbnNpb24gPSBmb3JtYXQgPT09ICdjanMnID8gUmVwb1BhdGhzLkNqc0V4dGVuc2lvbiA6IFJlcG9QYXRocy5NanNFeHRlbnNpb247XG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogQnVpbGRPcHRpb25zID0ge1xuICAgIC8vIEV4cGxpY2l0LCBiZWNhdXNlIGVzYnVpbGQgb3RoZXJ3aXNlIHRha2VzIHRoZSBmb2xkZXIgaXRzIHNlcnZpY2UgcHJvY2VzcyBzdGFydGVkIGluLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGVzYnVpbGQncyBvd24gb3B0aW9uIG5hbWUuXG4gICAgYWJzV29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBiYW5uZXI6IHtcbiAgICAgIGpzOiBMSUJSQVJZX0JBTk5FUlxuICAgIH0sXG4gICAgYnVuZGxlOiBmYWxzZSxcbiAgICBlbnRyeVBvaW50czogbGliRmlsZXMsXG4gICAgZm9ybWF0LFxuICAgIGxvZ0xldmVsOiAnaW5mbycsXG4gICAgb3V0ZGlyOiBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBmb3JtYXQpLFxuICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgcGx1Z2luczogW1xuICAgICAgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkoZm9ybWF0ID09PSAnZXNtJyksXG4gICAgICBmaXhFc21QbHVnaW4oKSxcbiAgICAgIGNoYW5nZUV4dGVuc2lvblBsdWdpbihleHRlbnNpb24pXG4gICAgXSxcbiAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgIHRhcmdldDogJ0VTMjAyMicsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgd3JpdGU6IGZhbHNlXG4gIH07XG5cbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgY29udGV4dChidWlsZE9wdGlvbnMpO1xuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkQ29udGV4dC5yZWJ1aWxkKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUocGFyYW1zOiBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGRlY2xhcmF0aW9uRmlsZVBhdGgsIGV4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpYnJhcnlGaWxlUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIG1vZHVsZURpcmVjdG9yeSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIGV4dGVuc2lvbik7XG4gIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZU5hdGl2ZShkaXJuYW1lKGRlY2xhcmF0aW9uRmlsZVBhdGgpLCBsaWJyYXJ5RmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICB9XG4gIHJldHVybiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiR7cmVsYXRpdmVQYXRofVwiIC8+XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFsbExpYnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAvLyBUaGUgUkVTT0xWRUQgb3B0aW9ucywgYmVjYXVzZSBhIHBhY2thZ2UncyBgdHNjb25maWcuanNvbmAgaW5oZXJpdHMgYGxpYmAgZnJvbSB0aGUgc2hhcmVkIGJhc2UuIFRoZSByZXNvbHZlZFxuICAvLyBuYW1lcyBhcmUgZmlsZSBuYW1lcyAoYGxpYi5kb20uaXRlcmFibGUuZC50c2ApLCBzbyB0aGV5IGFyZSBtYXBwZWQgYmFjayBvbnRvIHRoZSBuYW1lcyBhIGRpcmVjdGl2ZSB0YWtlcy5cbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBsaWJzID0gbmV3IFNldCgob3B0aW9ucy5saWIgPz8gW10pLm1hcCgobGliKSA9PiB0b0xpYk5hbWUobGliKSkpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoJy50cycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gcmVhZEZpbGVTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSksICd1dGYtOCcpO1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGl0cyBvbmUgZ3JvdXAsIHNvIG5vIGZhbGxiYWNrIGZvciBhIG1pc3Npbmcgb25lIGlzIG5lZWRlZC5cbiAgICBmb3IgKGNvbnN0IFssIGxpYl0gb2Ygc291cmNlQ29udGVudC5tYXRjaEFsbChSRUZFUkVOQ0VfTElCX1JFR19FWFApKSB7XG4gICAgICBsaWJzLmFkZChTdHJpbmcobGliKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gWy4uLmxpYnNdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEFsbFR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICByZXR1cm4gKG9wdGlvbnMudHlwZXMgPz8gW10pXG4gICAgLmZpbHRlcigodHlwZSkgPT4gREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTLmhhcyh0eXBlKSlcbiAgICAuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzKHBhcmFtczogQ29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlc1BhcmFtcyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB7IGF2YWlsYWJsZVR5cGVzLCBkZWNsYXJhdGlvbkZpbGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oe1xuICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucywgbm9FbWl0OiB0cnVlIH0sXG4gICAgcm9vdE5hbWVzOiBkZWNsYXJhdGlvbkZpbGVzLm1hcCgoZmlsZSkgPT4gcmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSlcbiAgfSk7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXNCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgLy8gVGhlIHByb2dyYW0gd2FzIGhhbmRlZCBldmVyeSBvbmUgb2YgdGhlc2UgYXMgYSByb290IG5hbWUsIHNvIGVhY2ggb25lIGlzIGluIGl0LlxuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBlbnN1cmVOb25OdWxsYWJsZShwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICAgIGNvbnN0IGxpYnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCB0eXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgICAgaWYgKGlzSWRlbnRpZmllcihub2RlKSB8fCBpc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUpO1xuICAgICAgICBpZiAoc3ltYm9sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRFbnZpcm9ubWVudEdsb2JhbHMoeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2w6IHJlc29sdmVBbGlhcyhjaGVja2VyLCBzeW1ib2wpLCB0eXBlcyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgICB9XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG5cbiAgICBjb25zdCBuZWVkZWRUeXBlcyA9IFsuLi50eXBlc10uZmlsdGVyKCh0eXBlKSA9PiBhdmFpbGFibGVUeXBlcy5pbmNsdWRlcyh0eXBlKSk7XG4gICAgaWYgKGxpYnMuc2l6ZSA+IDAgfHwgbmVlZGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgZGlyZWN0aXZlc0J5RmlsZS5zZXQoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIChsaWJzLnNpemUgPiAwID8gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKFsuLi5saWJzXS5zb3J0KCkpIDogJycpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMobmVlZGVkVHlwZXMuc29ydCgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlyZWN0aXZlc0J5RmlsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleChmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8R2VuZXJhdGVJbmRleFJlc3VsdD4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpclBvc2l4KGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBtYXliZUxpbmVzID0gYXdhaXQgYXN5bmNNYXAoZGlyZW50cywgKGRpcmVudCkgPT4gaGFuZGxlSW5kZXhEaXJlbnQoZm9sZGVyLCBkaXJlbnQpKTtcbiAgY29uc3QgbGluZXMgPSBtYXliZUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU2tpcHBlZDtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlKGpvaW4oZm9sZGVyLCBSZXBvUGF0aHMuSW5kZXhUcyksIGxpbmVzKTtcbiAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGliRmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LnRzJylcbiAgICAmJiAhZmlsZS5pbmNsdWRlcyhgLyR7UmVwb1BhdGhzLlRlc3RIZWxwZXJzfS9gKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbmRleERpcmVudChmb2xkZXI6IHN0cmluZywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXIsIGRpcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSkpO1xuICAgIGlmIChyZXN1bHQgIT09IEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKGRpcmVudC5uYW1lLCBSZXBvUGF0aHMuSW5kZXhUcykpO1xuICAgIG5hbWUgPSBkaXJlbnQubmFtZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGRpcmVudC5uYW1lKTtcbiAgICBuYW1lID0gYmFzZW5hbWUoZGlyZW50Lm5hbWUsIGV4dGVuc2lvbik7XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoZGlyZW50Lm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGBleHBvcnQgKiBhcyAnJHtuYW1lfScgZnJvbSAnJHtzb3VyY2VGaWxlfSc7YDtcbn1cblxuZnVuY3Rpb24gaXNFbnZpcm9ubWVudExpYihsaWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4gbGliLnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFuYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgfHwgbmFtZS5lbmRzV2l0aCgnLnRlc3QudHMnKSB8fCBuYW1lID09PSAnc2V0dXAudHMnIHx8IG5hbWUuZW5kc1dpdGgoJy1zZXR1cC50cycpO1xufVxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IGJvb2xlYW4ge1xuICBjb25zdCBleGNsdWRlZE5hbWVzOiByZWFkb25seSBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuSW5kZXhUcywgUmVwb1BhdGhzLlR5cGVzLCBSZXBvUGF0aHMuU3R5bGVzLCBSZXBvUGF0aHMuVGVzdEhlbHBlcnNdO1xuICBjb25zdCBpc0V4Y2x1ZGVkRW50cnkgPSBleGNsdWRlZE5hbWVzLmluY2x1ZGVzKGRpcmVudC5uYW1lKSB8fCBkaXJlbnQubmFtZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSB8fCBmb2xkZXIuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICByZXR1cm4gaXNFeGNsdWRlZEVudHJ5IHx8IChkaXJlbnQuaXNGaWxlKCkgJiYgaXNFeGNsdWRlZEZpbGVOYW1lKGRpcmVudC5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBbGlhcyhjaGVja2VyOiBUeXBlQ2hlY2tlciwgc3ltYm9sOiBUc1N5bWJvbCk6IFRzU3ltYm9sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2UgLS0gYFN5bWJvbEZsYWdzYCBpcyBhIGJpdCBzZXQuXG4gIHJldHVybiAoc3ltYm9sLmZsYWdzICYgU3ltYm9sRmxhZ3MuQWxpYXMpID09PSAwID8gc3ltYm9sIDogY2hlY2tlci5nZXRBbGlhc2VkU3ltYm9sKHN5bWJvbCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldEV4cG9ydChwYXJhbXM6IFNldEV4cG9ydFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGltcG9ydFBhdGggPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBzcmNGb2xkZXIsXG4gICAgcmVwbGFjZXI6IFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLFxuICAgIHNlYXJjaFZhbHVlOiBSZXBvUGF0aHMuU3JjXG4gIH0pO1xuICBjb25zdCBjb25kaXRpb25QYXRoID0gaXNXaWxkY2FyZCA/IGAke2ltcG9ydFBhdGh9LyR7UmVwb1BhdGhzLkFueX1gIDogaW1wb3J0UGF0aDtcbiAgY29uc3QgZG10c1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueURtdHMgOiBSZXBvUGF0aHMuSW5kZXhEbXRzIH0pO1xuICBjb25zdCBkY3RzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RGN0cyA6IFJlcG9QYXRocy5JbmRleERjdHMgfSk7XG4gIGNvbnN0IGRtdHNGb2xkZXJQYXRoID0gZGlybmFtZShkbXRzUGF0aCk7XG4gIGNvbnN0IGRjdHNGb2xkZXJQYXRoID0gZGlybmFtZShkY3RzUGF0aCk7XG5cbiAgaWYgKCFpc1dpbGRjYXJkICYmICFleGlzdHNTeW5jKGRjdHNQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlzVHlwZXNPbmx5ID0gaW1wb3J0UGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICBjb25zdCBtanNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkVzbSwgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlNanMgOiBSZXBvUGF0aHMuSW5kZXhNanMgfSk7XG4gIGNvbnN0IGNqc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuQ2pzLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueUNqcyA6IFJlcG9QYXRocy5JbmRleENqcyB9KTtcblxuICBpZiAoaXNUeXBlc09ubHkpIHtcbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoXG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKFJlcG9QYXRocy5TcmMsIGltcG9ydFBhdGgsIGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55VHMgOiBSZXBvUGF0aHMuSW5kZXhUcykpO1xuXG4gICAgZXhwb3J0Q29uZGl0aW9uc1tjb25kaXRpb25QYXRoXSA9IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgICAgLy8gRmlyc3QsIHNvIGl0IHdpbnMgd2hlcmV2ZXIgaXQgaXMgc2V0OiBpbnNpZGUgdGhlIHJlcG9zaXRvcnksIGJlZm9yZSBhbnl0aGluZyBpcyBidWlsdC5cbiAgICAgIC4uLihzb3VyY2VDb25kaXRpb24gIT09IHVuZGVmaW5lZCAmJiB7IFtzb3VyY2VDb25kaXRpb25dOiBzb3VyY2VQYXRoIH0pLFxuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aCxcbiAgICAgICAgZGVmYXVsdDogbWpzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBjanNQYXRoXG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgIH07XG4gIH1cblxuICBpZiAoaW1wb3J0UGF0aCA9PT0gUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIgYXMgc3RyaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc1dpbGRjYXJkKSB7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBpbXBvcnRQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICAgICAgOiB7IG1haW46IHJlbGF0aXZlKGltcG9ydFBhdGgsIGNqc1BhdGgpLCBtb2R1bGU6IHJlbGF0aXZlKGltcG9ydFBhdGgsIG1qc1BhdGgpLCB0eXBlOiAnbW9kdWxlJywgdHlwZXM6IHJlbGF0aXZlKGltcG9ydFBhdGgsIGRjdHNQYXRoKSB9XG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KGRjdHNGb2xkZXJQYXRoKSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZSwgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VKc29uRm9sZGVyUGF0aCA9IGpvaW4oaW1wb3J0UGF0aCwgbmFtZSk7XG4gICAgY29uc3QgdHlwZXMgPSByZWxhdGl2ZShwYWNrYWdlSnNvbkZvbGRlclBhdGgsIGpvaW4oZGN0c0ZvbGRlclBhdGgsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpO1xuICAgIGF3YWl0IHdyaXRlU3VicGF0aFBhY2thZ2VKc29uKFxuICAgICAgcGFja2FnZUpzb25Gb2xkZXJQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlcyB9XG4gICAgICAgIDoge1xuICAgICAgICAgIG1haW46IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5DanNFeHRlbnNpb24pKSxcbiAgICAgICAgICBtb2R1bGU6IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkbXRzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5NanNFeHRlbnNpb24pKSxcbiAgICAgICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICAgICAgICB0eXBlc1xuICAgICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0N0c0NvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+LmNqc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5janMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuXG4gIC8vIEEgYC5kLmN0c2AgZmlsZSBpcyBhIENvbW1vbkpTIG1vZHVsZS4gVHlwZS1vbmx5IGltcG9ydHMgb2YgYSBiYXJlIHNwZWNpZmllciByZXNvbHZpbmcgdG8gYW5cbiAgLy8gRVNNLW9ubHkgcGFja2FnZSBuZWVkIGEgYHJlc29sdXRpb24tbW9kZWAgYXR0cmlidXRlLCBlbHNlIGB0c2NgIHJlcG9ydHMgVFMxNTQxIC8gVFMxNTQyLlxuICAvLyBQYXNzaW5nIGAnaW1wb3J0J2AgaXMgdmFsaWQgZm9yIENvbW1vbkpTIHRhcmdldHMgdG9vLCBzbyBldmVyeSBiYXJlIHNwZWNpZmllciByZWNlaXZlcyBpdC5cbiAgLy8gVGhlIEVTTSBgLmQubXRzYCBuZWVkcyBubyBzdWNoIGF0dHJpYnV0ZSwgc28gdGhpcyB0cmFuc2Zvcm0gcnVucyBvbiBDb21tb25KUyBjb250ZW50IG9ubHkuXG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0IHR5cGUgJDxDbGF1c2U+IGZyb20gXFwnJDxTcGVjaWZpZXI+XFwnIHdpdGggeyBcXCdyZXNvbHV0aW9uLW1vZGVcXCc6IFxcJ2ltcG9ydFxcJyB9OycsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoXCIkPFNwZWNpZmllcj5cIiwgeyB3aXRoOiB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH0gfSknLFxuICAgIHNlYXJjaFZhbHVlOiBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b0Rpc3RQYXRoKHBhcmFtczogVG9EaXN0UGF0aFBhcmFtcyk6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIHBhcmFtcy5mb3JtYXQsIHBhcmFtcy5pbXBvcnRQYXRoLCBwYXJhbXMubmFtZSkpO1xufVxuXG5mdW5jdGlvbiB0b0xpYk5hbWUobGliRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEEgbGliIGEgcGFja2FnZSByZXBsYWNlZCAoYEB0eXBlc2NyaXB0L2xpYi1kb21gLCBgQHR5cGVzY3JpcHQvbGliLWRvbS9pdGVyYWJsZS5kLnRzYCkgaXMgbmFtZWQgYnkgaXRzIHBhdGgsIG5vdCBieVxuICAvLyBpdHMgZmlsZSBuYW1lLCB3aGljaCBpcyBgaW5kZXguZC50c2AgZm9yIHRoZSBsaWIncyByb290LlxuICBjb25zdCByZXBsYWNlbWVudE1hdGNoID0gTElCX1JFUExBQ0VNRU5UX1JFR19FWFAuZXhlYyhsaWJGaWxlUGF0aCk7XG4gIGlmIChyZXBsYWNlbWVudE1hdGNoPy5ncm91cHMgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGJvdGggZ3JvdXBzLlxuICAgIGNvbnN0IGxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snTGliJ10pO1xuICAgIGNvbnN0IHN1YkxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snU3ViTGliJ10pO1xuICAgIHJldHVybiAoc3ViTGliID09PSAnaW5kZXgnID8gbGliIDogYCR7bGlifS4ke3N1YkxpYi5yZXBsYWNlQWxsKCcvJywgJy4nKX1gKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHJldHVybiBiYXNlbmFtZShsaWJGaWxlUGF0aCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ebGliXFwuLywgJycpLnJlcGxhY2UoL1xcLmRcXC50cyQvLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHRvTXRzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtdHNDb250ZW50ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY29udGVudCxcbiAgICByZXBsYWNlcjogJ2Zyb20gXFwnJDxJbXBvcnRQYXRoPi5tanNcXCc7JyxcbiAgICBzZWFyY2hWYWx1ZTogU1RBVElDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbXRzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8SW1wb3J0UGF0aD4ubWpzJDxRdW90ZT4pJyxcbiAgICBzZWFyY2hWYWx1ZTogRFlOQU1JQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oZm9sZGVyOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUpzb24oam9pbihmb2xkZXIsIFJlcG9QYXRocy5QYWNrYWdlSnNvbiksIHBhY2thZ2VKc29uKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkEsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxtQkFBbUI7QUFDNUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxlQUFlO0FBQ3hCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRSxZQUFZO0FBQUEsRUFDWixXQUFXO0FBQUEsT0FDTjtBQUNQLE9BQU8sYUFBYTtBQUNwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsb0JBQW9CO0FBS3RCLE1BQU0saUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTdkIsTUFBTSxzQkFBeUM7QUFBQSxFQUNwRDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQU9PLE1BQU0sbUJBQW1CO0FBa0NoQyxNQUFNLDhCQUE4QixvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0FBSXBELE1BQU0sMkJBQThDLENBQUMsT0FBTyxjQUFjLFdBQVc7QUFDckYsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSwwQkFBMEI7QUFJaEMsTUFBTSwrQkFBK0I7QUFHckMsTUFBTSwwQkFBMEIsQ0FBQyxjQUFjLE1BQU0sRUFBRSxLQUFLLEdBQUc7QUFDL0QsTUFBTSx3QkFBd0I7QUFHOUIsTUFBTSwyQkFBMkI7QUFHakMsTUFBTSxrQ0FBa0M7QUFFeEMsTUFBTSx3QkFBd0I7QUFLOUIsTUFBTSx5QkFBeUI7QUFrRC9CLGVBQXNCLG9CQUFtQztBQUN2RCxRQUFNLFdBQVc7QUFDakIsYUFBVyxRQUFRLE1BQU0sYUFBYSxVQUFVLEtBQUssRUFBRSxXQUFXLEtBQUssQ0FBQyxHQUFHO0FBQ3pFLFFBQUksU0FBUyxJQUFJLE1BQU0sVUFBVSxTQUFtQjtBQUNsRCxZQUFNLEdBQUcsS0FBSyxVQUFVLEtBQUssSUFBSSxDQUFDO0FBQUEsSUFDcEM7QUFFQSxRQUFJLEtBQUssU0FBUyxVQUFVLFlBQVksS0FBSyxDQUFDLEtBQUssTUFBTSxHQUFHLEVBQUUsU0FBUyxVQUFVLEtBQUssR0FBRztBQUN2RixZQUFNLEdBQUcsS0FBSyxVQUFVLEtBQUssSUFBSSxDQUFDO0FBQUEsSUFDcEM7QUFBQSxFQUNGO0FBRUEsYUFBVyxRQUFRLE1BQU0sYUFBYSxVQUFVLGVBQWUsRUFBRSxXQUFXLEtBQUssQ0FBQyxHQUFHO0FBQ25GLFFBQUssU0FBUyxJQUFJLE1BQU0sVUFBVSxlQUEyQixTQUFTLFVBQVUsZUFBMEIsS0FBSyxXQUFXLFVBQVUsV0FBVyxHQUFHO0FBQ2hKO0FBQUEsSUFDRjtBQUVBLFVBQU0sR0FBRyxJQUFJO0FBQUEsRUFDZjtBQUNGO0FBVUEsZUFBc0IsYUFBYSxVQUErQixDQUFDLEdBQWtCO0FBQ25GLFFBQU0sRUFBRSwwQkFBMEIsQ0FBQyxVQUEyQixpQkFBaUIsRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQzlGLFFBQU0sV0FBVyxNQUFNLFlBQVk7QUFDbkMsUUFBTSxtQkFBbUIsRUFBRSxRQUFRLE9BQU8sVUFBVSx3QkFBd0IsQ0FBQztBQUM3RSxRQUFNLG1CQUFtQixFQUFFLFFBQVEsT0FBTyxVQUFVLHdCQUF3QixDQUFDO0FBQy9FO0FBc0JBLGVBQXNCLG9CQUFtQztBQUN2RCxNQUFJLFdBQVcsS0FBSyxVQUFVLEtBQUssR0FBRyw0QkFBNEIsR0FBRyxVQUFVLFdBQVcsRUFBRSxDQUFDLEdBQUc7QUFDOUYsVUFBTSxJQUFJLE1BQU0sT0FBTyw0QkFBNEIsR0FBRyxVQUFVLFdBQVcsNERBQTREO0FBQUEsRUFDekk7QUFFQSxRQUFNLGFBQWEsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLE1BQU0sTUFBTSxDQUFDLEdBQUcsYUFBYSx1QkFBdUIsQ0FBQztBQUVqRyxRQUFNLGtCQUFrQixXQUFXLEtBQUssVUFBVSxLQUFLLFlBQVksQ0FBQyxJQUFJLFlBQVk7QUFDcEYsUUFBTSxVQUFVLE1BQU0sZUFBZTtBQUNyQyxRQUFNLFdBQVcsZ0JBQWdCO0FBQ2pDLFFBQU0sYUFBYSwrQkFBK0IsT0FBTyxJQUFJLGlDQUFpQyxRQUFRO0FBRXRHLFFBQU0sbUJBQW1CLCtCQUErQixRQUFRLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBRXZHLFFBQU0sTUFBTSxLQUFLLFVBQVUsU0FBUyxVQUFVLEdBQUcsR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ3ZFLFFBQU0sTUFBTSxLQUFLLFVBQVUsU0FBUyxVQUFVLEdBQUcsR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ3ZFLFFBQU0sVUFBVSxLQUFLLFVBQVUsU0FBUyxVQUFVLEtBQUssK0JBQStCLFVBQVUsYUFBYSxHQUFHLGdCQUFnQjtBQUNoSSxRQUFNLFVBQVUsS0FBSyxVQUFVLFNBQVMsVUFBVSxLQUFLLCtCQUErQixVQUFVLGFBQWEsR0FBRyxnQkFBZ0I7QUFFaEksUUFBTSxXQUFXLE1BQU0sYUFBYSxVQUFVLEtBQUssRUFBRSxXQUFXLEtBQUssQ0FBQztBQUN0RSxRQUFNLG1CQUFtQixTQUFTLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxVQUFVLFlBQVksS0FBSyxDQUFDLEtBQUssV0FBVyxVQUFVLFdBQVcsQ0FBQztBQUNuSSxRQUFNLHdCQUF3Qiw2QkFBNkIsRUFBRSxnQkFBZ0IsVUFBVSxpQkFBaUIsQ0FBQztBQUV6RyxhQUFXLFFBQVEsa0JBQWtCO0FBQ25DLFVBQU0sU0FBUyxRQUFRLElBQUk7QUFDM0IsVUFBTSxPQUFPLFNBQVMsTUFBTSxVQUFVLFlBQVk7QUFDbEQsVUFBTSxVQUFVLE1BQU0sU0FBUyxLQUFLLFVBQVUsS0FBSyxJQUFJLEdBQUcsT0FBTztBQUVqRSxVQUFNLFVBQVUsS0FBSyxVQUFVLFNBQVMsVUFBVSxLQUFLLFFBQVEsT0FBTyxVQUFVLGFBQWE7QUFDN0YsVUFBTSxVQUFVLEtBQUssVUFBVSxTQUFTLFVBQVUsS0FBSyxRQUFRLE9BQU8sVUFBVSxhQUFhO0FBRTdGLFVBQU0sTUFBTSxRQUFRLE9BQU8sR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2pELFVBQU0sTUFBTSxRQUFRLE9BQU8sR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBRWpELFFBQUksYUFBYSxhQUFhLE9BQU87QUFDckMsUUFBSSxhQUFhLGFBQWEsT0FBTztBQUVyQyxRQUFJLFNBQVMsbUJBQW1CLFdBQVcsS0FBSztBQUM5QyxtQkFBYSxhQUFhO0FBQzFCLG1CQUFhLGFBQWE7QUFBQSxJQUM1QixPQUFPO0FBQ0wsWUFBTSxpQkFBaUIsc0JBQXNCLElBQUksSUFBSSxLQUFLO0FBQzFELG1CQUFhLDRCQUE0QixFQUFFLHFCQUFxQixTQUFTLFdBQVcsVUFBVSxlQUFlLGlCQUFpQixVQUFVLElBQUksQ0FBQyxJQUN6SSxpQkFBaUI7QUFDckIsbUJBQWEsNEJBQTRCLEVBQUUscUJBQXFCLFNBQVMsV0FBVyxVQUFVLGVBQWUsaUJBQWlCLFVBQVUsSUFBSSxDQUFDLElBQ3pJLGlCQUFpQjtBQUFBLElBQ3ZCO0FBRUEsVUFBTSxVQUFVLFNBQVMsVUFBVTtBQUNuQyxVQUFNLFVBQVUsU0FBUyxVQUFVO0FBQUEsRUFDckM7QUFDRjtBQVVBLGVBQXNCLHVCQUF1QixVQUF5QyxDQUFDLEdBQWtCO0FBQ3ZHLFFBQU0sRUFBRSxvQkFBb0IsQ0FBQyxHQUFHLGdCQUFnQixJQUFJO0FBQ3BELFFBQU0sYUFBdUIsQ0FBQyxVQUFVLEdBQUc7QUFFM0MsYUFBVyxVQUFVLE1BQU0sYUFBYSxVQUFVLEtBQUssRUFBRSxXQUFXLE1BQU0sZUFBZSxLQUFLLENBQUMsR0FBRztBQUNoRyxRQUFJLENBQUMsT0FBTyxZQUFZLEdBQUc7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxPQUFPLEtBQUssT0FBTyxZQUFZLE9BQU8sSUFBSTtBQUVoRCxRQUFJLEtBQUssU0FBUyxVQUFVLE1BQU0sS0FBSyxLQUFLLFNBQVMsVUFBVSxXQUFXLEdBQUc7QUFDM0U7QUFBQSxJQUNGO0FBRUEsZUFBVyxLQUFLLElBQUk7QUFBQSxFQUN0QjtBQUVBLGFBQVcsS0FBSztBQUVoQixNQUFJLFlBQVk7QUFFaEIsUUFBTSxnQkFBZ0IsT0FBTyxnQkFBZ0I7QUFDM0MsVUFBTSxhQUFhLFlBQVk7QUFDL0IsVUFBTSxtQkFBaUQsQ0FBQztBQUN4RCxnQkFBWSxVQUFVO0FBQ3RCLGVBQVcsYUFBYSxZQUFZO0FBQ2xDLFlBQU0sVUFBVSxFQUFFLGtCQUFrQixZQUFZLE9BQU8saUJBQWlCLFVBQVUsQ0FBQztBQUNuRixZQUFNLFVBQVUsRUFBRSxrQkFBa0IsWUFBWSxNQUFNLGlCQUFpQixVQUFVLENBQUM7QUFBQSxJQUNwRjtBQUVBLGVBQVcsQ0FBQyxTQUFTLEtBQUssS0FBSyxPQUFPLFFBQVEsaUJBQWlCLEdBQUc7QUFDaEUsVUFBSSxpQkFBaUIsT0FBTyxNQUFNLFFBQVc7QUFDM0MsY0FBTSxJQUFJLE1BQU0sMEJBQTBCLE9BQU8sMERBQTBEO0FBQUEsTUFDN0c7QUFFQSx1QkFBaUIsT0FBTyxJQUFJO0FBQUEsSUFDOUI7QUFFQSxnQkFBWSxDQUFDLFlBQVksWUFBWSxZQUFZLE9BQU87QUFBQSxFQUMxRCxDQUFDO0FBR0QsTUFBSSxXQUFXO0FBQ2IsVUFBTSxJQUFJLE1BQU0sMEVBQTBFO0FBQUEsRUFDNUY7QUFDRjtBQVFBLGVBQXNCLHVCQUFzQztBQUMxRCxRQUFNLGNBQWMsVUFBVSxHQUFHO0FBQ25DO0FBUUEsZUFBc0IsY0FBYyxRQUEyQixxQkFBb0M7QUFDakcsYUFBVyxRQUFRLE9BQU87QUFDeEIsVUFBTSxlQUFlLElBQUk7QUFBQSxFQUMzQjtBQUNGO0FBVUEsU0FBUyxzQkFBc0IsUUFBMkM7QUFDeEUsUUFBTSxFQUFFLE1BQU0sU0FBUyxRQUFRLE1BQU0sSUFBSTtBQUN6QyxRQUFNLGtCQUE0QixDQUFDO0FBQ25DLE1BQUksU0FBUztBQUViLGFBQVcsZUFBZSxPQUFPLGdCQUFnQixDQUFDLEdBQUc7QUFDbkQsVUFBTSxhQUFhLFlBQVksY0FBYztBQUM3QyxRQUFJLFFBQVEsMkJBQTJCLFVBQVUsR0FBRztBQUNsRCxZQUFNLE1BQU0sVUFBVSxXQUFXLFFBQVE7QUFDekMsVUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUc7QUFDMUI7QUFBQSxNQUNGO0FBQ0Esc0JBQWdCLEtBQUssR0FBRztBQUFBLElBQzFCLFdBQVcsV0FBVyxTQUFTLFNBQVMsdUJBQXVCLEdBQUc7QUFDaEUsZUFBUztBQUFBLElBQ1g7QUFBQSxFQUNGO0FBRUEsTUFBSSxnQkFBZ0IsU0FBUyxHQUFHO0FBQzlCLGVBQVcsT0FBTyxpQkFBaUI7QUFDakMsV0FBSyxJQUFJLEdBQUc7QUFBQSxJQUNkO0FBQUEsRUFDRixXQUFXLFFBQVE7QUFDakIsVUFBTSxJQUFJLE1BQU07QUFBQSxFQUNsQjtBQUNGO0FBRUEsU0FBUywrQkFBK0IsTUFBd0I7QUFDOUQsU0FBTyxHQUNMLEtBQ0csSUFBSSxDQUFDLFFBQVEsT0FBTyx1QkFBdUIsSUFBSSxHQUFHLE1BQU0sRUFDeEQsS0FBSyxJQUFJLENBQ2Q7QUFBQTtBQUNGO0FBRUEsU0FBUyxpQ0FBaUMsT0FBeUI7QUFDakUsU0FBTyxNQUFNLFdBQVcsSUFDcEIsS0FDQSxHQUNBLE1BQ0csSUFBSSxDQUFDLFNBQVMseUJBQXlCLElBQUksTUFBTSxFQUNqRCxLQUFLLElBQUksQ0FDZDtBQUFBO0FBQ0o7QUFFQSxlQUFlLG1CQUFtQixRQUFpRDtBQUNqRixRQUFNLEVBQUUsUUFBUSxVQUFVLHdCQUF3QixJQUFJO0FBQ3RELFFBQU0sWUFBWSxXQUFXLFFBQVEsVUFBVSxlQUFlLFVBQVU7QUFDeEUsUUFBTSxlQUE2QjtBQUFBO0FBQUE7QUFBQSxJQUdqQyxlQUFlLFFBQVEsSUFBSTtBQUFBLElBQzNCLFFBQVE7QUFBQSxNQUNOLElBQUk7QUFBQSxJQUNOO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUixhQUFhO0FBQUEsSUFDYjtBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsUUFBUSxLQUFLLFVBQVUsU0FBUyxNQUFNO0FBQUEsSUFDdEMsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLE1BQ1Asd0JBQXdCLFdBQVcsS0FBSztBQUFBLE1BQ3hDLGFBQWE7QUFBQSxNQUNiLHNCQUFzQixTQUFTO0FBQUEsSUFDakM7QUFBQSxJQUNBLFdBQVc7QUFBQSxJQUNYLFFBQVE7QUFBQSxJQUNSLGFBQWE7QUFBQSxJQUNiLE9BQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxlQUFlLE1BQU0sUUFBUSxZQUFZO0FBQy9DLE1BQUk7QUFDRixVQUFNLGFBQWEsUUFBUTtBQUFBLEVBQzdCLFVBQUU7QUFDQSxVQUFNLGFBQWEsUUFBUTtBQUFBLEVBQzdCO0FBQ0Y7QUFFQSxTQUFTLDRCQUE0QixRQUFtRDtBQUN0RixRQUFNLEVBQUUscUJBQXFCLFdBQVcsZ0JBQWdCLElBQUk7QUFDNUQsUUFBTSxrQkFBa0IsS0FBSyxVQUFVLFNBQVMsaUJBQWlCLCtCQUErQixTQUFTO0FBQ3pHLE1BQUksZUFBZSxlQUFlLFFBQVEsbUJBQW1CLEdBQUcsZUFBZSxFQUFFLFdBQVcsTUFBTSxHQUFHO0FBQ3JHLE1BQUksQ0FBQyxhQUFhLFdBQVcsR0FBRyxHQUFHO0FBQ2pDLG1CQUFlLEtBQUssWUFBWTtBQUFBLEVBQ2xDO0FBQ0EsU0FBTyx3QkFBd0IsWUFBWTtBQUFBO0FBQzdDO0FBRUEsZUFBZSxpQkFBb0M7QUFHakQsUUFBTSxFQUFFLFFBQVEsSUFBSSxjQUFjLFVBQVUsWUFBWTtBQUN4RCxRQUFNLE9BQU8sSUFBSSxLQUFLLFFBQVEsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVyRSxhQUFXLFFBQVEsTUFBTSxhQUFhLFVBQVUsS0FBSyxFQUFFLFdBQVcsS0FBSyxDQUFDLEdBQUc7QUFDekUsUUFBSSxDQUFDLEtBQUssU0FBUyxLQUFLLEdBQUc7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxnQkFBZ0IsYUFBYSxLQUFLLFVBQVUsS0FBSyxJQUFJLEdBQUcsT0FBTztBQUVyRSxlQUFXLENBQUMsRUFBRSxHQUFHLEtBQUssY0FBYyxTQUFTLHFCQUFxQixHQUFHO0FBQ25FLFdBQUssSUFBSSxPQUFPLEdBQUcsRUFBRSxZQUFZLENBQUM7QUFBQSxJQUNwQztBQUFBLEVBQ0Y7QUFFQSxTQUFPLENBQUMsR0FBRyxJQUFJLEVBQUUsS0FBSztBQUN4QjtBQUVBLFNBQVMsa0JBQTRCO0FBQ25DLFFBQU0sRUFBRSxRQUFRLElBQUksY0FBYyxVQUFVLFlBQVk7QUFDeEQsVUFBUSxRQUFRLFNBQVMsQ0FBQyxHQUN2QixPQUFPLENBQUMsU0FBUyw0QkFBNEIsSUFBSSxJQUFJLENBQUMsRUFDdEQsS0FBSztBQUNWO0FBRUEsU0FBUyw2QkFBNkIsUUFBaUU7QUFDckcsUUFBTSxFQUFFLGdCQUFnQixpQkFBaUIsSUFBSTtBQUM3QyxRQUFNLEVBQUUsUUFBUSxJQUFJLGNBQWMsVUFBVSxZQUFZO0FBQ3hELFFBQU0sVUFBVSxjQUFjO0FBQUEsSUFDNUIsU0FBUyxFQUFFLEdBQUcsU0FBUyxRQUFRLEtBQUs7QUFBQSxJQUNwQyxXQUFXLGlCQUFpQixJQUFJLENBQUMsU0FBUyxjQUFjLFVBQVUsS0FBSyxJQUFJLENBQUM7QUFBQSxFQUM5RSxDQUFDO0FBQ0QsUUFBTSxVQUFVLFFBQVEsZUFBZTtBQUN2QyxRQUFNLG1CQUFtQixvQkFBSSxJQUFvQjtBQUVqRCxhQUFXLFFBQVEsa0JBQWtCO0FBTW5DLFFBQVNBLFNBQVQsU0FBZSxNQUFrQjtBQUMvQixVQUFJLGFBQWEsSUFBSSxLQUFLLGdCQUFnQixJQUFJLEdBQUc7QUFDL0MsY0FBTSxTQUFTLFFBQVEsb0JBQW9CLElBQUk7QUFDL0MsWUFBSSxXQUFXLFFBQVc7QUFDeEIsZ0NBQXNCLEVBQUUsTUFBTSxTQUFTLFFBQVEsYUFBYSxTQUFTLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFBQSxRQUN2RjtBQUFBLE1BQ0Y7QUFDQSxtQkFBYSxNQUFNQSxNQUFLO0FBQUEsSUFDMUI7QUFSUyxnQkFBQUE7QUFKVCxVQUFNLGFBQWEsa0JBQWtCLFFBQVEsY0FBYyxjQUFjLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUM5RixVQUFNLE9BQU8sb0JBQUksSUFBWTtBQUM3QixVQUFNLFFBQVEsb0JBQUksSUFBWTtBQVc5QixJQUFBQSxPQUFNLFVBQVU7QUFFaEIsVUFBTSxjQUFjLENBQUMsR0FBRyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsZUFBZSxTQUFTLElBQUksQ0FBQztBQUM3RSxRQUFJLEtBQUssT0FBTyxLQUFLLFlBQVksU0FBUyxHQUFHO0FBQzNDLHVCQUFpQjtBQUFBLFFBQ2Y7QUFBQSxTQUNDLEtBQUssT0FBTyxJQUFJLCtCQUErQixDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0saUNBQWlDLFlBQVksS0FBSyxDQUFDO0FBQUEsTUFDL0g7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVBLGVBQWUsY0FBYyxRQUE4QztBQUN6RSxRQUFNLFVBQVUsTUFBTSxhQUFhLFFBQVEsRUFBRSxlQUFlLEtBQUssQ0FBQztBQUNsRSxRQUFNLGFBQWEsTUFBTSxTQUFTLFNBQVMsQ0FBQyxXQUFXLGtCQUFrQixRQUFRLE1BQU0sQ0FBQztBQUN4RixRQUFNLFFBQVEsV0FBVyxPQUFPLENBQUMsU0FBUyxTQUFTLE1BQVM7QUFFNUQsTUFBSSxNQUFNLFdBQVcsR0FBRztBQUN0QixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUyxLQUFLLFFBQVEsVUFBVSxPQUFPLEdBQUcsS0FBSztBQUNyRCxTQUFPO0FBQ1Q7QUFFQSxlQUFlLGNBQWlDO0FBQzlDLE1BQUksUUFBUSxNQUFNLGFBQWEsVUFBVSxLQUFLLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDakUsVUFBUSxNQUFNLElBQUksQ0FBQyxTQUFTLG9CQUFvQixLQUFLLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUMxRSxTQUFPLE1BQU07QUFBQSxJQUFPLENBQUMsU0FDbkIsS0FBSyxTQUFTLFVBQVUsV0FBVyxLQUFLLENBQUMsS0FBSyxTQUFTLFVBQVUsWUFBWSxLQUFLLENBQUMsS0FBSyxTQUFTLFVBQVUsS0FDeEcsQ0FBQyxLQUFLLFNBQVMsSUFBSSxVQUFVLFdBQVcsR0FBRztBQUFBLEVBQ2hEO0FBQ0Y7QUFFQSxlQUFlLGtCQUFrQixRQUFnQixRQUE2QztBQUM1RixNQUFJLG9CQUFvQixRQUFRLE1BQU0sR0FBRztBQUN2QztBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0osTUFBSTtBQUNKLE1BQUksT0FBTyxZQUFZLEdBQUc7QUFDeEIsVUFBTSxTQUFTLE1BQU0sY0FBYyxLQUFLLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDNUQsUUFBSSxXQUFXLHlCQUE2QjtBQUMxQztBQUFBLElBQ0Y7QUFDQSxpQkFBYSxvQkFBb0IsS0FBSyxPQUFPLE1BQU0sVUFBVSxPQUFPLENBQUM7QUFDckUsV0FBTyxPQUFPO0FBQUEsRUFDaEIsT0FBTztBQUNMLFVBQU0sWUFBWSxRQUFRLE9BQU8sSUFBSTtBQUNyQyxXQUFPLFNBQVMsT0FBTyxNQUFNLFNBQVM7QUFDdEMsaUJBQWEsb0JBQW9CLE9BQU8sSUFBSTtBQUFBLEVBQzlDO0FBRUEsU0FBTyxnQkFBZ0IsSUFBSSxXQUFXLFVBQVU7QUFDbEQ7QUFFQSxTQUFTLGlCQUFpQixLQUFzQjtBQUM5QyxTQUFPLHlCQUF5QixLQUFLLENBQUMsV0FBVyxJQUFJLFdBQVcsTUFBTSxDQUFDO0FBQ3pFO0FBRUEsU0FBUyxtQkFBbUIsTUFBdUI7QUFDakQsU0FBTyxDQUFDLEtBQUssU0FBUyxVQUFVLFdBQVcsS0FBSyxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsY0FBYyxLQUFLLFNBQVMsV0FBVztBQUMvSDtBQUVBLFNBQVMsb0JBQW9CLFFBQWdCLFFBQXlCO0FBQ3BFLFFBQU0sZ0JBQW1DLENBQUMsVUFBVSxTQUFTLFVBQVUsT0FBTyxVQUFVLFFBQVEsVUFBVSxXQUFXO0FBQ3JILFFBQU0sa0JBQWtCLGNBQWMsU0FBUyxPQUFPLElBQUksS0FBSyxPQUFPLEtBQUssU0FBUyxVQUFVLFlBQVksS0FBSyxPQUFPLE1BQU0sR0FBRyxFQUFFLFNBQVMsVUFBVSxLQUFLO0FBQ3pKLFNBQU8sbUJBQW9CLE9BQU8sT0FBTyxLQUFLLG1CQUFtQixPQUFPLElBQUk7QUFDOUU7QUFFQSxTQUFTLGFBQWEsU0FBc0IsUUFBNEI7QUFFdEUsVUFBUSxPQUFPLFFBQVEsWUFBWSxXQUFXLElBQUksU0FBUyxRQUFRLGlCQUFpQixNQUFNO0FBQzVGO0FBRUEsZUFBZSxVQUFVLFFBQXdDO0FBQy9ELFFBQU0sRUFBRSxrQkFBa0IsWUFBWSxpQkFBaUIsVUFBVSxJQUFJO0FBQ3JFLFFBQU0sYUFBYSxXQUFXO0FBQUEsSUFDNUIsU0FBUztBQUFBLElBQ1QsVUFBVSxVQUFVO0FBQUEsSUFDcEIsYUFBYSxVQUFVO0FBQUEsRUFDekIsQ0FBQztBQUNELFFBQU0sZ0JBQWdCLGFBQWEsR0FBRyxVQUFVLElBQUksVUFBVSxHQUFHLEtBQUs7QUFDdEUsUUFBTSxXQUFXLFdBQVcsRUFBRSxRQUFRLFVBQVUsS0FBSyxZQUFZLE1BQU0sYUFBYSxVQUFVLFVBQVUsVUFBVSxVQUFVLENBQUM7QUFDN0gsUUFBTSxXQUFXLFdBQVcsRUFBRSxRQUFRLFVBQVUsS0FBSyxZQUFZLE1BQU0sYUFBYSxVQUFVLFVBQVUsVUFBVSxVQUFVLENBQUM7QUFDN0gsUUFBTSxpQkFBaUIsUUFBUSxRQUFRO0FBQ3ZDLFFBQU0saUJBQWlCLFFBQVEsUUFBUTtBQUV2QyxNQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsUUFBUSxHQUFHO0FBQ3hDO0FBQUEsRUFDRjtBQUVBLFFBQU0sY0FBYyxXQUFXLFNBQVMsVUFBVSxLQUFLO0FBQ3ZELFFBQU0sVUFBVSxXQUFXLEVBQUUsUUFBUSxVQUFVLEtBQUssWUFBWSxNQUFNLGFBQWEsVUFBVSxTQUFTLFVBQVUsU0FBUyxDQUFDO0FBQzFILFFBQU0sVUFBVSxXQUFXLEVBQUUsUUFBUSxVQUFVLEtBQUssWUFBWSxNQUFNLGFBQWEsVUFBVSxTQUFTLFVBQVUsU0FBUyxDQUFDO0FBRTFILE1BQUksYUFBYTtBQUNmLHFCQUFpQixhQUFhLElBQUk7QUFBQSxNQUNoQyxRQUFRO0FBQUEsUUFDTixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsU0FBUztBQUFBLFFBQ1AsT0FBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQUEsRUFDRixPQUFPO0FBQ0wsVUFBTSxhQUFhLG9CQUFvQixLQUFLLFVBQVUsS0FBSyxZQUFZLGFBQWEsVUFBVSxRQUFRLFVBQVUsT0FBTyxDQUFDO0FBRXhILHFCQUFpQixhQUFhLElBQUk7QUFBQTtBQUFBO0FBQUEsTUFHaEMsR0FBSSxvQkFBb0IsVUFBYSxFQUFFLENBQUMsZUFBZSxHQUFHLFdBQVc7QUFBQSxNQUNyRSxRQUFRO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxTQUFTO0FBQUEsTUFDWDtBQUFBLE1BQ0EsU0FBUztBQUFBLFFBQ1AsT0FBTztBQUFBLFFBQ1AsU0FBUztBQUFBLE1BQ1g7QUFBQTtBQUFBLElBRUY7QUFBQSxFQUNGO0FBRUEsTUFBSSxlQUFlLFVBQVUsZUFBeUI7QUFDcEQ7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLFlBQVk7QUFDZixVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0EsY0FDSSxFQUFFLE1BQU0sVUFBVSxPQUFPLFNBQVMsWUFBWSxRQUFRLEVBQUUsSUFDeEQsRUFBRSxNQUFNLFNBQVMsWUFBWSxPQUFPLEdBQUcsUUFBUSxTQUFTLFlBQVksT0FBTyxHQUFHLE1BQU0sVUFBVSxPQUFPLFNBQVMsWUFBWSxRQUFRLEVBQUU7QUFBQSxJQUMxSTtBQUNBO0FBQUEsRUFDRjtBQUVBLGFBQVcsUUFBUSxNQUFNLGFBQWEsY0FBYyxHQUFHO0FBQ3JELFFBQUksQ0FBQyxLQUFLLFNBQVMsVUFBVSxhQUFhLEdBQUc7QUFDM0M7QUFBQSxJQUNGO0FBQ0EsVUFBTSxPQUFPLFNBQVMsTUFBTSxVQUFVLGFBQWE7QUFDbkQsVUFBTSx3QkFBd0IsS0FBSyxZQUFZLElBQUk7QUFDbkQsVUFBTSxRQUFRLFNBQVMsdUJBQXVCLEtBQUssZ0JBQWdCLE9BQU8sVUFBVSxhQUFhLENBQUM7QUFDbEcsVUFBTTtBQUFBLE1BQ0o7QUFBQSxNQUNBLGNBQ0ksRUFBRSxNQUFNLFVBQVUsTUFBTSxJQUN4QjtBQUFBLFFBQ0EsTUFBTSxTQUFTLHVCQUF1QixLQUFLLGdCQUFnQixPQUFPLFVBQVUsWUFBWSxDQUFDO0FBQUEsUUFDekYsUUFBUSxTQUFTLHVCQUF1QixLQUFLLGdCQUFnQixPQUFPLFVBQVUsWUFBWSxDQUFDO0FBQUEsUUFDM0YsTUFBTTtBQUFBLFFBQ047QUFBQSxNQUNGO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsYUFBYSxTQUF5QjtBQUM3QyxNQUFJLGFBQWEsV0FBVztBQUFBLElBQzFCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDRCxlQUFhLFdBQVc7QUFBQSxJQUN0QixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBTUQsZUFBYSxXQUFXO0FBQUEsSUFDdEIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNELFNBQU8sV0FBVztBQUFBLElBQ2hCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDSDtBQUVBLFNBQVMsV0FBVyxRQUFrQztBQUNwRCxTQUFPLG9CQUFvQixLQUFLLFVBQVUsU0FBUyxPQUFPLFFBQVEsT0FBTyxZQUFZLE9BQU8sSUFBSSxDQUFDO0FBQ25HO0FBRUEsU0FBUyxVQUFVLGFBQTZCO0FBRzlDLFFBQU0sbUJBQW1CLHdCQUF3QixLQUFLLFdBQVc7QUFDakUsTUFBSSxrQkFBa0IsV0FBVyxRQUFXO0FBRTFDLFVBQU0sTUFBTSxPQUFPLGlCQUFpQixPQUFPLEtBQUssQ0FBQztBQUNqRCxVQUFNLFNBQVMsT0FBTyxpQkFBaUIsT0FBTyxRQUFRLENBQUM7QUFDdkQsWUFBUSxXQUFXLFVBQVUsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLFdBQVcsS0FBSyxHQUFHLENBQUMsSUFBSSxZQUFZO0FBQUEsRUFDMUY7QUFDQSxTQUFPLFNBQVMsV0FBVyxFQUFFLFlBQVksRUFBRSxRQUFRLFVBQVUsRUFBRSxFQUFFLFFBQVEsWUFBWSxFQUFFO0FBQ3pGO0FBRUEsU0FBUyxhQUFhLFNBQXlCO0FBQzdDLFFBQU0sYUFBYSxXQUFXO0FBQUEsSUFDNUIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNELFNBQU8sV0FBVztBQUFBLElBQ2hCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDSDtBQUVBLGVBQWUsd0JBQXdCLFFBQWdCLGFBQXlDO0FBQzlGLFFBQU0sTUFBTSxRQUFRLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDdkMsUUFBTSxVQUFVLEtBQUssUUFBUSxVQUFVLFdBQVcsR0FBRyxXQUFXO0FBQ2xFOyIsIm5hbWVzIjpbInZpc2l0Il19
542
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVwZW5kZW5jaWVzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiBhIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzb1xuICogYSBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbnRyaWVzIGZvciBmaWxlcyB0aGF0IGFyZSBub3QgYnVpbHQgZnJvbSBhIHNvdXJjZSBmb2xkZXIgKGEgZm9sZGVyIG9mIHNoYXJlZCBgdHNjb25maWdgIHByZXNldHMsIGFtYmllbnQgYC5kLnRzYFxuICAgKiBmaWxlcyksIGtleWVkIGJ5IHN1YnBhdGguIFRoZXkgZ28gaW50byB0aGUgbWFwIGFmdGVyIHRoZSBnZW5lcmF0ZWQgZW50cmllcywgYXMgZ2l2ZW4sIGFuZCBjb3VudCB0b3dhcmQgaXRzIGNoYW5nZVxuICAgKiBjaGVjazsgbm8gc3VicGF0aCBzdHViIGlzIHdyaXR0ZW4gZm9yIHRoZW0uIEEga2V5IGEgc291cmNlIGZvbGRlciBhbHJlYWR5IGdlbmVyYXRlcyB0aHJvd3MuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRXhwb3J0cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFBhY2thZ2VKc29uLkV4cG9ydHM+PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwb3J0IGNvbmRpdGlvbiB0byBwdXQgZmlyc3QgaW4gZXZlcnkgZW50cnksIG1hcHBpbmcgdGhlIHN1YnBhdGggb250byBpdHMgVHlwZVNjcmlwdCBzb3VyY2UuIE9ubHkgYVxuICAgKiByZXBvc2l0b3J5IGhvbGRpbmcgc2V2ZXJhbCBwYWNrYWdlcyB0aGF0IGltcG9ydCBlYWNoIG90aGVyIG5lZWRzIG9uZTsgbm90aGluZyBvdXRzaWRlIGl0IHNldHMgdGhlIGNvbmRpdGlvbiwgYW5kXG4gICAqIHRoZSBzb3VyY2VzIGl0IHBvaW50cyBhdCBkbyBub3Qgc2hpcCwgc28gdGhlIHB1Ymxpc2ggaGFzIHRvIHN0cmlwIGl0IGFnYWluLiBPbWl0dGVkLCB0aGUgbWFwIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlJbmRleH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVMaWJyYXJ5SW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBtb2R1bGVzIG9yIGZvbGRlcnMgdG8gbGVhdmUgb2ZmIHRoZSBnZW5lcmF0ZWQgYmFycmVscywgYXMgcGF0aHMgZnJvbSB0aGUgcGFja2FnZSByb290XG4gICAqIChgc3JjL2RlbW8tdmF1bHQtYnV0dG9ucy50c2AsIGBzcmMvdGVzdC1ydW5uZXJzL2ludGVncmF0aW9uYCkuIEEgbW9kdWxlIHRoYXQgbmVlZHMgYW4gb3B0aW9uYWwgcGVlciwgb3Igb25lIHRoYXRcbiAgICogcnVucyBjb2RlIGF0IGxvYWQgdGltZSB3aGljaCBvbmx5IHdvcmtzIGluc2lkZSBhIHRlc3QgcnVubmVyLCBnb2VzIGhlcmUsIHNvIGltcG9ydGluZyBhIGJhcnJlbCBuZXZlciBsb2FkcyBpdC4gSXQgaXNcbiAgICogc3RpbGwgYnVpbHQgYW5kIHN0YXlzIHJlYWNoYWJsZSB0aHJvdWdoIGl0cyBvd24gc3VicGF0aCBleHBvcnQuIEEgcGF0aCB0aGF0IG5hbWVzIG5vdGhpbmcgdGhlIGJhcnJlbHMgd291bGQgZXhwb3J0XG4gICAqIHRocm93cywgc28gYSByZW5hbWUgY2Fubm90IHF1aWV0bHkgcHV0IHRoZSBtb2R1bGUgYmFjay5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVGcm9tSW5kZXg/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbn1cblxudHlwZSBNb2R1bGVGb3JtYXQgPSAnY2pzJyB8ICdlc20nO1xuXG5jb25zdCBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMgPSBuZXcgU2V0KFsnbm9kZSddKTtcblxuLy8gVGhlIGxpYnMgdGhhdCBkZXNjcmliZSBhIGhvc3QncyBnbG9iYWxzIHJhdGhlciB0aGFuIHRoZSBsYW5ndWFnZSwgd2hpY2ggY29uc3VtZXJzIGNvbmZsaWN0IG92ZXIuIEVhY2ggZGVjbGFyYXRpb25cbi8vIGdldHMgdGhlIG9uZXMgaXQgdXNlczsgZXZlcnkgb3RoZXIgbGliIGlzIHNoYXJlZCB0aHJvdWdoIGBsaWJyYXJ5LXJlZmVyZW5jZXNgLlxuY29uc3QgRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFsnZG9tJywgJ3NjcmlwdGhvc3QnLCAnd2Vid29ya2VyJ107XG5jb25zdCBOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCA9ICcvbm9kZV9tb2R1bGVzL0B0eXBlcy9ub2RlLyc7XG5jb25zdCBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUCA9IC9cXC9ub2RlX21vZHVsZXNcXC9AdHlwZXNjcmlwdFxcL2xpYi0oPzxMaWI+W14vXSspXFwvKD88U3ViTGliPi4rKVxcLmRcXC50cyQvO1xuXG4vLyBUaGUgZGVjbGFyYXRpb24gdGhhdCBjYXJyaWVzIG9ubHkgdGhlIGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZXMuIEV2ZXJ5IGRlY2xhcmF0aW9uIGJ1dCB0aGUgcm9vdCBvbmUgcmVmZXJlbmNlc1xuLy8gaXQsIHJhdGhlciB0aGFuIHRoZSByb290IGJhcnJlbCwgd2hpY2ggd291bGQgbG9hZCBldmVyeSBtb2R1bGUgb2YgdGhlIHBhY2thZ2UsIG9wdGlvbmFsIHBlZXJzJyB0eXBlcyBpbmNsdWRlZC5cbmNvbnN0IExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgPSAnbGlicmFyeS1yZWZlcmVuY2VzJztcbi8vIFNwZWxsZWQgYXBhcnQgb24gcHVycG9zZToge0BsaW5rIGNvbGxlY3RBbGxMaWJzfSBzY2FucyBldmVyeSBzb3VyY2UgZmlsZSBvZiB0aGUgcGFja2FnZSBiZWluZyBidWlsdCBmb3IgdGhlXG4vLyBkaXJlY3RpdmUsIHRoaXMgb25lIGluY2x1ZGVkLCBzbyBhIGxpdGVyYWwgb25lIGhlcmUgd291bGQgYmUgcmVhZCBhcyBhIGxpYiB0aGlzIHBhY2thZ2UgbmVlZHMuXG5jb25zdCBSRUZFUkVOQ0VfTElCX0RJUkVDVElWRSA9IFsnPHJlZmVyZW5jZScsICdsaWI9J10uam9pbignICcpO1xuY29uc3QgUkVGRVJFTkNFX0xJQl9SRUdfRVhQID0gL1xcL1xcL1xcLyA8cmVmZXJlbmNlIGxpYj1cIig/PExpYj5bXlwiXSspXCIgXFwvPi9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSB0eXBlLW9ubHkgaW1wb3J0LCBlLmcuIGBpbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO2AuXG5jb25zdCBCQVJFX1RZUEVfSU1QT1JUX1JFR19FWFAgPSAvXmltcG9ydCB0eXBlICg/PENsYXVzZT4uKz8pIGZyb20gJyg/PFNwZWNpZmllcj5bXi4nXVteJ10qKSc7JC9nbTtcblxuLy8gQSBiYXJlLXNwZWNpZmllciAobm9uLXJlbGF0aXZlKSBpbmxpbmUgaW1wb3J0IHR5cGUgbm9kZSwgZS5nLiBgaW1wb3J0KFwidHlwZS1mZXN0XCIpLlByb21pc2FibGVgLlxuY29uc3QgQkFSRV9JTkxJTkVfSU1QT1JUX1RZUEVfUkVHX0VYUCA9IC9pbXBvcnRcXChcIig/PFNwZWNpZmllcj5bXi5cIl1bXlwiXSopXCJcXCkvZztcblxuY29uc3QgU1RBVElDX0lNUE9SVF9SRUdfRVhQID0gL2Zyb20gJyg/PEltcG9ydFBhdGg+Lis/KVxcLnRzJzsvZ207XG5cbi8vIElubGluZSBpbXBvcnQtdHlwZSBub2RlcyAoYHR5cGVvZiBpbXBvcnQoJy4vZm9vLnRzJylgKSBwcmVzZXJ2ZSB0aGUgc291cmNlIHF1b3RlIHN0eWxlLlxuLy8gSGFuZC1hdXRob3JlZCBgLmQudHNgIGZpbGVzIGVtaXQgc2luZ2xlIHF1b3RlczsgdHNjLWdlbmVyYXRlZCBkZWNsYXJhdGlvbnMgZW1pdCBkb3VibGUgcXVvdGVzLlxuLy8gQ2FwdHVyZSB0aGUgcXVvdGUgYW5kIHJldXNlIGl0IGluIHRoZSByZXBsYWNlbWVudCBzbyBib3RoIHN0eWxlcyBhcmUgcmV3cml0dGVuLlxuY29uc3QgRFlOQU1JQ19JTVBPUlRfUkVHX0VYUCA9IC9pbXBvcnRcXCgoPzxRdW90ZT5bJ1wiXSkoPzxJbXBvcnRQYXRoPi4rPylcXC50c1xcazxRdW90ZT5cXCkvZ207XG5cbmVudW0gR2VuZXJhdGVJbmRleFJlc3VsdCB7XG4gIFNraXBwZWQgPSAnc2tpcHBlZCcsXG4gIFN1Y2Nlc3MgPSAnc3VjY2Vzcydcbn1cblxuaW50ZXJmYWNlIEFkZEVudmlyb25tZW50R2xvYmFsc1BhcmFtcyB7XG4gIHJlYWRvbmx5IGxpYnM6IFNldDxzdHJpbmc+O1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtO1xuICByZWFkb25seSBzeW1ib2w6IFRzU3ltYm9sO1xuICByZWFkb25seSB0eXBlczogU2V0PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IE1vZHVsZUZvcm1hdDtcbiAgcmVhZG9ubHkgbGliRmlsZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeTogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbmludGVyZmFjZSBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMge1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBtb2R1bGVEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXNQYXJhbXMge1xuICByZWFkb25seSBhdmFpbGFibGVUeXBlczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uRmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVJbmRleFBhcmFtcyB7XG4gIHJlYWRvbmx5IGV4Y2x1ZGVkUGF0aHM6IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IGZvbGRlcjogc3RyaW5nO1xuICByZWFkb25seSB1bm1hdGNoZWRQYXRoczogU2V0PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkcy4gRXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gcmVmZXJlbmNlcyBhIGBsaWJyYXJ5LXJlZmVyZW5jZXNgXG4gKiBkZWNsYXJhdGlvbiBiZXNpZGUgaXQgYnkgcGF0aCwgbmV2ZXIgdGhlIHJvb3Q6IHRoZSByb290IGJhcnJlbCByZS1leHBvcnRzIGV2ZXJ5IG1vZHVsZSwgc28gcmVmZXJlbmNpbmcgaXQgbWFkZSBlYWNoXG4gKiBzdWJwYXRoIGxvYWQgdGhlIHdob2xlIHBhY2thZ2UsIGFuZCBhIGNvbnN1bWVyIHR5cGUtY2hlY2tpbmcgd2l0aCBgc2tpcExpYkNoZWNrOiBmYWxzZWAgdGhlbiBuZWVkZWQgZXZlcnkgb3B0aW9uYWxcbiAqIHBlZXIgaW5zdGFsbGVkLlxuICpcbiAqIGBsaWJyYXJ5LXJlZmVyZW5jZXNgIGNhcnJpZXMgb25seSB0aGUgbGlicyB0aGF0IGRlc2NyaWJlIHRoZSBsYW5ndWFnZSAoYGVzMjAyMmAsIGBlc25leHQuZGlzcG9zYWJsZWApLCB3aGljaCBub1xuICogY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBvbmVzIHRoYXQgZGVzY3JpYmUgYSBob3N0IChgZG9tYCwgYGRvbS5pdGVyYWJsZWAsIGB3ZWJ3b3JrZXJgKSBhbmQgYHR5cGVzPVwibm9kZVwiYCBnb1xuICogb25seSBpbnRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCBuYW1lIG9uZSBvZiB0aGVpciBnbG9iYWxzLCBmb3VuZCBieSByZXNvbHZpbmcgZXZlcnkgbmFtZSBpbiB0aGUgZW1pdHRlZFxuICogZGVjbGFyYXRpb25zIHdpdGggdGhlIHR5cGUgY2hlY2tlci4gT3RoZXJ3aXNlIGEgYnJvd3NlciBjb25zdW1lciBvZiBhIHB1cmUgc3VicGF0aCBnb3QgYWxsIG9mIGBAdHlwZXMvbm9kZWAsIGFuZCBpdHNcbiAqIGBzZXRUaW1lb3V0YCByZXR1cm5lZCBgTm9kZUpTLlRpbWVvdXRgLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICogQHRocm93cyBJZiBhIHNvdXJjZSBtb2R1bGUgaXMgbmFtZWQgYGxpYnJhcnktcmVmZXJlbmNlc2AsIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgYCR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn1gKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNyYy8ke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259IGNvbGxpZGVzIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lLmApO1xuICB9XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAndHNjJyB9KSwgJy0tcHJvamVjdCcsICcuL3RzY29uZmlnLnR5cGVzLmpzb24nXSk7XG5cbiAgY29uc3QgbGlicmFyeUZpbGVOYW1lID0gZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsICdsaWJyYXJ5LnRzJykpID8gJ2xpYnJhcnknIDogJ2luZGV4JztcbiAgY29uc3QgYWxsTGlicyA9IGF3YWl0IGNvbGxlY3RBbGxMaWJzKCk7XG4gIGNvbnN0IGFsbFR5cGVzID0gY29sbGVjdEFsbFR5cGVzKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhhbGxUeXBlcyk7XG4gIC8vIE9ubHkgdGhlIGxpYnMgbm8gY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBlbnZpcm9ubWVudCBnbG9iYWxzIGdvIHRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCB1c2UgdGhlbS5cbiAgY29uc3Qgc2hhcmVkRGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzLmZpbHRlcigobGliKSA9PiAhaXNFbnZpcm9ubWVudExpYihsaWIpKSk7XG5cbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuXG4gIGNvbnN0IHNyY0ZpbGVzID0gYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZWNsYXJhdGlvbkZpbGVzID0gc3JjRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSk7XG4gIGNvbnN0IGVudmlyb25tZW50RGlyZWN0aXZlcyA9IGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMoeyBhdmFpbGFibGVUeXBlczogYWxsVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGZpbGUpO1xuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBjdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IG10c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbik7XG5cbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGN0c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG10c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGxldCBjdHNDb250ZW50ID0gdG9DdHNDb250ZW50KGNvbnRlbnQpO1xuICAgIGxldCBtdHNDb250ZW50ID0gdG9NdHNDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgaWYgKG5hbWUgPT09IGxpYnJhcnlGaWxlTmFtZSAmJiBmb2xkZXIgPT09ICcuJykge1xuICAgICAgY3RzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWxlRGlyZWN0aXZlcyA9IGVudmlyb25tZW50RGlyZWN0aXZlcy5nZXQoZmlsZSkgPz8gJyc7XG4gICAgICBjdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogY3RzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuQ2pzIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkVzbSB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoY3RzUGF0aCwgY3RzQ29udGVudCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKG10c1BhdGgsIG10c0NvbnRlbnQpO1xuICB9XG59XG5cbi8qKlxuICogUmVnZW5lcmF0ZXMgdGhlIGBleHBvcnRzYCBtYXAgb2YgdGhlIHBhY2thZ2UncyBgcGFja2FnZS5qc29uYCBmcm9tIGl0cyBzb3VyY2UgZm9sZGVycywgYW5kIHdyaXRlcyBhIGBwYWNrYWdlLmpzb25gXG4gKiBzdHViIHBlciBzdWJwYXRoIGZvciByZXNvbHZlcnMgdGhhdCBkbyBub3QgcmVhZCBgZXhwb3J0c2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFwIGlzIGN1cnJlbnQuXG4gKiBAdGhyb3dzIElmIHRoZSBtYXAgY2hhbmdlZCwgc28gdGhlIGNoYW5nZSBnZXRzIHJldmlld2VkIGFuZCBjb21taXR0ZWQgcmF0aGVyIHRoYW4gc2hpcHBlZCB1bnNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzKG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhZGRpdGlvbmFsRXhwb3J0cyA9IHt9LCBzb3VyY2VDb25kaXRpb24gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNyY0ZvbGRlcnM6IHN0cmluZ1tdID0gW1JlcG9QYXRocy5TcmNdO1xuXG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSk7XG5cbiAgICBpZiAocGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuU3R5bGVzKSB8fCBwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNyY0ZvbGRlcnMucHVzaChwYXRoKTtcbiAgfVxuXG4gIHNyY0ZvbGRlcnMuc29ydCgpO1xuXG4gIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oYXN5bmMgKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgY29uc3Qgb2xkRXhwb3J0cyA9IHBhY2thZ2VKc29uLmV4cG9ydHM7XG4gICAgY29uc3QgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucyA9IHt9O1xuICAgIHBhY2thZ2VKc29uLmV4cG9ydHMgPSBleHBvcnRDb25kaXRpb25zO1xuICAgIGZvciAoY29uc3Qgc3JjRm9sZGVyIG9mIHNyY0ZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IGZhbHNlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IHRydWUsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnBhdGgsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsRXhwb3J0cykpIHtcbiAgICAgIGlmIChleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWRkaXRpb25hbCBleHBvcnQgJyR7c3VicGF0aH0nIGNvbGxpZGVzIHdpdGggYW4gZW50cnkgZ2VuZXJhdGVkIGZyb20gYSBzb3VyY2UgZm9sZGVyLmApO1xuICAgICAgfVxuXG4gICAgICBleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdID0gZW50cnk7XG4gICAgfVxuXG4gICAgaXNDaGFuZ2VkID0gIWlzRGVlcEVxdWFsKG9sZEV4cG9ydHMsIHBhY2thZ2VKc29uLmV4cG9ydHMpO1xuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBjaGFuZ2VkIGluIHRoZSBgZWRpdFBhY2thZ2VKc29uYCwgRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYWNrYWdlIGV4cG9ydHMgaGF2ZSBjaGFuZ2VkLiBQbGVhc2UgcmV2aWV3IHRoZSBjaGFuZ2VzIGFuZCBjb21taXQgdGhlbS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBgaW5kZXgudHNgIGJhcnJlbCBpbiBldmVyeSBzb3VyY2UgZm9sZGVyIHRoYXQgaGFzIHNvbWV0aGluZyB0byBleHBvcnQsIHJlLWV4cG9ydGluZyBlYWNoIG1vZHVsZSBhbmRcbiAqIGVhY2ggc3ViLWJhcnJlbCB1bmRlciBpdHMgb3duIG5hbWUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFycmVscyBoYXZlIGJlZW4gd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGlicmFyeUluZGV4KG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV4Y2x1ZGVkUGF0aHMgPSBuZXcgU2V0KChvcHRpb25zLmV4Y2x1ZGVGcm9tSW5kZXggPz8gW10pLm1hcCgocGF0aCkgPT4gam9pbihwYXRoLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpKS5yZXBsYWNlKC9cXC8kLywgJycpKSk7XG4gIGNvbnN0IHVubWF0Y2hlZFBhdGhzID0gbmV3IFNldChleGNsdWRlZFBhdGhzKTtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleCh7IGV4Y2x1ZGVkUGF0aHMsIGZvbGRlcjogUmVwb1BhdGhzLlNyYywgdW5tYXRjaGVkUGF0aHMgfSk7XG5cbiAgaWYgKHVubWF0Y2hlZFBhdGhzLnNpemUgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBleGNsdWRlRnJvbUluZGV4IG5hbWVzIG5vIG1vZHVsZSB0aGUgYmFycmVscyB3b3VsZCBleHBvcnQ6ICR7Wy4uLnVubWF0Y2hlZFBhdGhzXS5qb2luKCcsICcpfS5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgZWFjaCBuYW1lZCBucG0gc2NyaXB0IHRoZSBwYWNrYWdlIGRlZmluZXMsIGluIG9yZGVyLCBza2lwcGluZyB0aGUgb25lcyBpdCBkb2VzIG5vdCBkZWZpbmUuXG4gKlxuICogQHBhcmFtIHN0ZXBzIC0gVGhlIG5wbSBzY3JpcHQgbmFtZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlcnkgc3RlcCBoYXMgcnVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwcyhzdGVwczogcmVhZG9ubHkgc3RyaW5nW10gPSBMSUJSQVJZX0JVSUxEX1NURVBTKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKHN0ZXApO1xuICB9XG59XG5cbi8qKlxuICogQWRkcyB3aGF0IGEgY29uc3VtZXIgbmVlZHMgbG9hZGVkIGZvciBvbmUgc3ltYm9sIGEgZGVjbGFyYXRpb24gbmFtZXMuIEEgc3ltYm9sIGFueSBFUyBsaWIgZGVjbGFyZXMgbmVlZHMgbm90aGluZyxcbiAqIGJlY2F1c2Ugbm8gY29uc3VtZXIgY29uZmxpY3RzIHdpdGggdGhvc2UgbGlicy4gT3RoZXJ3aXNlIGVhY2ggZW52aXJvbm1lbnQgbGliIHRoYXQgZGVjbGFyZXMgaXQgYWRkcyBpdHNlbGYsIGFuZFxuICogZmFpbGluZyB0aGF0IGBAdHlwZXMvbm9kZWAgYWRkcyBgbm9kZWAuIEEgc3ltYm9sIGRlY2xhcmVkIGluIHRoZSBwYWNrYWdlJ3Mgb3duIGZpbGVzIGFkZHMgbm90aGluZzogdGhlIGRlY2xhcmF0aW9uXG4gKiB0aGF0IGhvbGRzIGl0IGNhcnJpZXMgaXRzIG93biBkaXJlY3RpdmVzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc3ltYm9sLCB0aGUgcHJvZ3JhbSBpdCB3YXMgcmVzb2x2ZWQgaW4sIGFuZCB0aGUgc2V0cyB0byBhZGQgdG8uXG4gKi9cbmZ1bmN0aW9uIGFkZEVudmlyb25tZW50R2xvYmFscyhwYXJhbXM6IEFkZEVudmlyb25tZW50R2xvYmFsc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGxpYnMsIHByb2dyYW0sIHN5bWJvbCwgdHlwZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgZW52aXJvbm1lbnRMaWJzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaXNOb2RlID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBzeW1ib2wuZGVjbGFyYXRpb25zID8/IFtdKSB7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKTtcbiAgICBpZiAocHJvZ3JhbS5pc1NvdXJjZUZpbGVEZWZhdWx0TGlicmFyeShzb3VyY2VGaWxlKSkge1xuICAgICAgY29uc3QgbGliID0gdG9MaWJOYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgICAgaWYgKCFpc0Vudmlyb25tZW50TGliKGxpYikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZW52aXJvbm1lbnRMaWJzLnB1c2gobGliKTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZUZpbGUuZmlsZU5hbWUuaW5jbHVkZXMoTk9ERV9UWVBFU19QQVRIX1NFR01FTlQpKSB7XG4gICAgICBpc05vZGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbnZpcm9ubWVudExpYnMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgbGliIG9mIGVudmlyb25tZW50TGlicykge1xuICAgICAgbGlicy5hZGQobGliKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNOb2RlKSB7XG4gICAgdHlwZXMuYWRkKCdub2RlJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGxpYnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke1xuICAgIGxpYnNcbiAgICAgIC5tYXAoKGxpYikgPT4gYC8vLyAke1JFRkVSRU5DRV9MSUJfRElSRUNUSVZFfVwiJHtsaWJ9XCIgLz5gKVxuICAgICAgLmpvaW4oJ1xcbicpXG4gIH1cXG5gO1xufVxuXG5mdW5jdGlvbiBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyh0eXBlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZXMubGVuZ3RoID09PSAwXG4gICAgPyAnJ1xuICAgIDogYCR7XG4gICAgICB0eXBlc1xuICAgICAgICAubWFwKCh0eXBlKSA9PiBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIke3R5cGV9XCIgLz5gKVxuICAgICAgICAuam9pbignXFxuJylcbiAgICB9XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5Rm9ybWF0KHBhcmFtczogQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZm9ybWF0LCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgZXh0ZW5zaW9uID0gZm9ybWF0ID09PSAnY2pzJyA/IFJlcG9QYXRocy5DanNFeHRlbnNpb24gOiBSZXBvUGF0aHMuTWpzRXh0ZW5zaW9uO1xuICBjb25zdCBidWlsZE9wdGlvbnM6IEJ1aWxkT3B0aW9ucyA9IHtcbiAgICAvLyBFeHBsaWNpdCwgYmVjYXVzZSBlc2J1aWxkIG90aGVyd2lzZSB0YWtlcyB0aGUgZm9sZGVyIGl0cyBzZXJ2aWNlIHByb2Nlc3Mgc3RhcnRlZCBpbi5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBlc2J1aWxkJ3Mgb3duIG9wdGlvbiBuYW1lLlxuICAgIGFic1dvcmtpbmdEaXI6IHByb2Nlc3MuY3dkKCksXG4gICAgYmFubmVyOiB7XG4gICAgICBqczogTElCUkFSWV9CQU5ORVJcbiAgICB9LFxuICAgIGJ1bmRsZTogZmFsc2UsXG4gICAgZW50cnlQb2ludHM6IGxpYkZpbGVzLFxuICAgIGZvcm1hdCxcbiAgICBsb2dMZXZlbDogJ2luZm8nLFxuICAgIG91dGRpcjogam9pbihSZXBvUGF0aHMuRGlzdExpYiwgZm9ybWF0KSxcbiAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5KGZvcm1hdCA9PT0gJ2VzbScpLFxuICAgICAgZml4RXNtUGx1Z2luKCksXG4gICAgICBjaGFuZ2VFeHRlbnNpb25QbHVnaW4oZXh0ZW5zaW9uKVxuICAgIF0sXG4gICAgc291cmNlbWFwOiAnaW5saW5lJyxcbiAgICB0YXJnZXQ6ICdFUzIwMjInLFxuICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgIHdyaXRlOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IGNvbnRleHQoYnVpbGRPcHRpb25zKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQucmVidWlsZCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGJ1aWxkQ29udGV4dC5kaXNwb3NlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHBhcmFtczogQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBkZWNsYXJhdGlvbkZpbGVQYXRoLCBleHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBsaWJyYXJ5RmlsZVBhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBtb2R1bGVEaXJlY3RvcnksIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBleHRlbnNpb24pO1xuICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVOYXRpdmUoZGlybmFtZShkZWNsYXJhdGlvbkZpbGVQYXRoKSwgbGlicmFyeUZpbGVQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgfVxuICByZXR1cm4gYC8vLyA8cmVmZXJlbmNlIHBhdGg9XCIke3JlbGF0aXZlUGF0aH1cIiAvPlxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RBbGxMaWJzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgLy8gVGhlIFJFU09MVkVEIG9wdGlvbnMsIGJlY2F1c2UgYSBwYWNrYWdlJ3MgYHRzY29uZmlnLmpzb25gIGluaGVyaXRzIGBsaWJgIGZyb20gdGhlIHNoYXJlZCBiYXNlLiBUaGUgcmVzb2x2ZWRcbiAgLy8gbmFtZXMgYXJlIGZpbGUgbmFtZXMgKGBsaWIuZG9tLml0ZXJhYmxlLmQudHNgKSwgc28gdGhleSBhcmUgbWFwcGVkIGJhY2sgb250byB0aGUgbmFtZXMgYSBkaXJlY3RpdmUgdGFrZXMuXG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgY29uc3QgbGlicyA9IG5ldyBTZXQoKG9wdGlvbnMubGliID8/IFtdKS5tYXAoKGxpYikgPT4gdG9MaWJOYW1lKGxpYikpKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKCcudHMnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlQ29udGVudCA9IHJlYWRGaWxlU3luYyhqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcbiAgICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGFsd2F5cyBjYXB0dXJlcyBpdHMgb25lIGdyb3VwLCBzbyBubyBmYWxsYmFjayBmb3IgYSBtaXNzaW5nIG9uZSBpcyBuZWVkZWQuXG4gICAgZm9yIChjb25zdCBbLCBsaWJdIG9mIHNvdXJjZUNvbnRlbnQubWF0Y2hBbGwoUkVGRVJFTkNFX0xJQl9SRUdfRVhQKSkge1xuICAgICAgbGlicy5hZGQoU3RyaW5nKGxpYikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFsuLi5saWJzXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RBbGxUeXBlcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgcmV0dXJuIChvcHRpb25zLnR5cGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHR5cGUpID0+IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUy5oYXModHlwZSkpXG4gICAgLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlcyhwYXJhbXM6IENvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXNQYXJhbXMpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgeyBhdmFpbGFibGVUeXBlcywgZGVjbGFyYXRpb25GaWxlcyB9ID0gcGFyYW1zO1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKHtcbiAgICBvcHRpb25zOiB7IC4uLm9wdGlvbnMsIG5vRW1pdDogdHJ1ZSB9LFxuICAgIHJvb3ROYW1lczogZGVjbGFyYXRpb25GaWxlcy5tYXAoKGZpbGUpID0+IHJlc29sdmVOYXRpdmUoUmVwb1BhdGhzLlNyYywgZmlsZSkpXG4gIH0pO1xuICBjb25zdCBjaGVja2VyID0gcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuICBjb25zdCBkaXJlY3RpdmVzQnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZGVjbGFyYXRpb25GaWxlcykge1xuICAgIC8vIFRoZSBwcm9ncmFtIHdhcyBoYW5kZWQgZXZlcnkgb25lIG9mIHRoZXNlIGFzIGEgcm9vdCBuYW1lLCBzbyBlYWNoIG9uZSBpcyBpbiBpdC5cbiAgICBjb25zdCBzb3VyY2VGaWxlID0gZW5zdXJlTm9uTnVsbGFibGUocHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJlc29sdmVOYXRpdmUoUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgICBjb25zdCBsaWJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICAgIGlmIChpc0lkZW50aWZpZXIobm9kZSkgfHwgaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihub2RlKTtcbiAgICAgICAgaWYgKHN5bWJvbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWRkRW52aXJvbm1lbnRHbG9iYWxzKHsgbGlicywgcHJvZ3JhbSwgc3ltYm9sOiByZXNvbHZlQWxpYXMoY2hlY2tlciwgc3ltYm9sKSwgdHlwZXMgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gICAgfVxuICAgIHZpc2l0KHNvdXJjZUZpbGUpO1xuXG4gICAgY29uc3QgbmVlZGVkVHlwZXMgPSBbLi4udHlwZXNdLmZpbHRlcigodHlwZSkgPT4gYXZhaWxhYmxlVHlwZXMuaW5jbHVkZXModHlwZSkpO1xuICAgIGlmIChsaWJzLnNpemUgPiAwIHx8IG5lZWRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGRpcmVjdGl2ZXNCeUZpbGUuc2V0KFxuICAgICAgICBmaWxlLFxuICAgICAgICAobGlicy5zaXplID4gMCA/IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhbLi4ubGlic10uc29ydCgpKSA6ICcnKSArIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKG5lZWRlZFR5cGVzLnNvcnQoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpcmVjdGl2ZXNCeUZpbGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXgocGFyYW1zOiBHZW5lcmF0ZUluZGV4UGFyYW1zKTogUHJvbWlzZTxHZW5lcmF0ZUluZGV4UmVzdWx0PiB7XG4gIGNvbnN0IHsgZm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyUG9zaXgoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG1heWJlTGluZXMgPSBhd2FpdCBhc3luY01hcChkaXJlbnRzLCAoZGlyZW50KSA9PiBoYW5kbGVJbmRleERpcmVudChwYXJhbXMsIGRpcmVudCkpO1xuICBjb25zdCBsaW5lcyA9IG1heWJlTGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGUoam9pbihmb2xkZXIsIFJlcG9QYXRocy5JbmRleFRzKSwgbGluZXMpO1xuICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMaWJGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICByZXR1cm4gZmlsZXMuZmlsdGVyKChmaWxlKSA9PlxuICAgIGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKVxuICAgICYmICFmaWxlLmluY2x1ZGVzKGAvJHtSZXBvUGF0aHMuVGVzdEhlbHBlcnN9L2ApXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUluZGV4RGlyZW50KHBhcmFtczogR2VuZXJhdGVJbmRleFBhcmFtcywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGV4Y2x1ZGVkUGF0aHMsIGZvbGRlciwgdW5tYXRjaGVkUGF0aHMgfSA9IHBhcmFtcztcbiAgaWYgKGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyLCBkaXJlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGF0aCA9IGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSk7XG4gIGlmIChleGNsdWRlZFBhdGhzLmhhcyhwYXRoKSkge1xuICAgIHVubWF0Y2hlZFBhdGhzLmRlbGV0ZShwYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KHsgLi4ucGFyYW1zLCBmb2xkZXI6IHBhdGggfSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNvdXJjZUZpbGUgPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oZGlyZW50Lm5hbWUsIFJlcG9QYXRocy5JbmRleFRzKSk7XG4gICAgbmFtZSA9IGRpcmVudC5uYW1lO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZGlyZW50Lm5hbWUpO1xuICAgIG5hbWUgPSBiYXNlbmFtZShkaXJlbnQubmFtZSwgZXh0ZW5zaW9uKTtcbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShkaXJlbnQubmFtZSk7XG4gIH1cblxuICByZXR1cm4gYGV4cG9ydCAqIGFzICcke25hbWV9JyBmcm9tICcke3NvdXJjZUZpbGV9JztgO1xufVxuXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50TGliKGxpYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBsaWIuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzKGNoZWNrZXI6IFR5cGVDaGVja2VyLCBzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBgU3ltYm9sRmxhZ3NgIGlzIGEgYml0IHNldC5cbiAgcmV0dXJuIChzeW1ib2wuZmxhZ3MgJiBTeW1ib2xGbGFncy5BbGlhcykgPT09IDAgPyBzeW1ib2wgOiBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2woc3ltYm9sKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTGliTmFtZShsaWJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQSBsaWIgYSBwYWNrYWdlIHJlcGxhY2VkIChgQHR5cGVzY3JpcHQvbGliLWRvbWAsIGBAdHlwZXNjcmlwdC9saWItZG9tL2l0ZXJhYmxlLmQudHNgKSBpcyBuYW1lZCBieSBpdHMgcGF0aCwgbm90IGJ5XG4gIC8vIGl0cyBmaWxlIG5hbWUsIHdoaWNoIGlzIGBpbmRleC5kLnRzYCBmb3IgdGhlIGxpYidzIHJvb3QuXG4gIGNvbnN0IHJlcGxhY2VtZW50TWF0Y2ggPSBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUC5leGVjKGxpYkZpbGVQYXRoKTtcbiAgaWYgKHJlcGxhY2VtZW50TWF0Y2g/Lmdyb3VwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgYm90aCBncm91cHMuXG4gICAgY29uc3QgbGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydMaWInXSk7XG4gICAgY29uc3Qgc3ViTGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydTdWJMaWInXSk7XG4gICAgcmV0dXJuIChzdWJMaWIgPT09ICdpbmRleCcgPyBsaWIgOiBgJHtsaWJ9LiR7c3ViTGliLnJlcGxhY2VBbGwoJy8nLCAnLicpfWApLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VuYW1lKGxpYkZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15saWJcXC4vLCAnJykucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcnKTtcbn1cblxuZnVuY3Rpb24gdG9NdHNDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG10c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+Lm1qc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBtdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5tanMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihmb2xkZXI6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlSnNvbihqb2luKGZvbGRlciwgUmVwb1BhdGhzLlBhY2thZ2VKc29uKSwgcGFja2FnZUpzb24pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLG1CQUFtQjtBQUM1QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNB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
@@ -6,7 +6,8 @@
6
6
  *
7
7
  * Every bare specifier in the scanned folders (`dist/lib` and `bin` by default, code and declarations, ESM and
8
8
  * CommonJS) must name a package in `dependencies`, `optionalDependencies` or `peerDependencies`, the package itself,
9
- * or a Node builtin; a declaration file's import may also be served by the package's `@types` one. A package in
9
+ * or a builtin (any `node:` specifier, Node's own, and Electron's `electron` and `original-fs`); a declaration
10
+ * file's import may also be served by the package's `@types` one. A package in
10
11
  * `devDependencies` only is present in the package's own repository and absent from a
11
12
  * consumer's install, so nothing there fails, and the consumer gets `Cannot find module`.
12
13
  */
@@ -51,6 +51,8 @@ import { preProcessFile } from "typescript";
51
51
  import { readPackageJson } from "./npm.mjs";
52
52
  import { RepoPaths } from "./repo-paths.mjs";
53
53
  const DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS = [RepoPaths.DistLib, "bin"];
54
+ const ELECTRON_BUILTIN_PACKAGE_NAMES = /* @__PURE__ */ new Set(["electron", "original-fs"]);
55
+ const NODE_SCHEME = "node:";
54
56
  const DECLARATION_FILE_PATTERN = /\.d\.(?:cts|mts|ts)$/u;
55
57
  const SCANNED_FILE_PATTERN = /\.(?:cjs|cts|js|mjs|mts|ts)$/u;
56
58
  const TYPES_SCOPE = "@types/";
@@ -101,12 +103,13 @@ function getImportSpecifiers(sourceText) {
101
103
  return importedFiles.map((importedFile) => importedFile.fileName);
102
104
  }
103
105
  function getPackageName(specifier) {
104
- if (specifier.startsWith(".") || specifier.startsWith("/") || isBuiltin(specifier)) {
106
+ if (specifier.startsWith(".") || specifier.startsWith("/") || specifier.startsWith(NODE_SCHEME) || isBuiltin(specifier)) {
105
107
  return null;
106
108
  }
107
109
  const segments = specifier.split("/");
108
110
  const segmentCount = specifier.startsWith("@") ? SCOPED_PACKAGE_NAME_SEGMENT_COUNT : 1;
109
- return segments.slice(0, segmentCount).join("/");
111
+ const packageName = segments.slice(0, segmentCount).join("/");
112
+ return ELECTRON_BUILTIN_PACKAGE_NAMES.has(packageName) ? null : packageName;
110
113
  }
111
114
  function getTypesPackageName(packageName) {
112
115
  return TYPES_SCOPE + packageName.replace(/^@/u, "").replace("/", "__");
@@ -115,4 +118,4 @@ export {
115
118
  DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS,
116
119
  validateDependencies
117
120
  };
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZhaWxzIHRoZSBidWlsZCB3aGVuIHRoZSBwdWJsaXNoZWQgb3V0cHV0IGltcG9ydHMgYSBwYWNrYWdlIHRoYXQgYHBhY2thZ2UuanNvbmAgZG9lcyBub3QgaW5zdGFsbCBmb3IgYSBjb25zdW1lci5cbiAqXG4gKiBFdmVyeSBiYXJlIHNwZWNpZmllciBpbiB0aGUgc2Nhbm5lZCBmb2xkZXJzIChgZGlzdC9saWJgIGFuZCBgYmluYCBieSBkZWZhdWx0LCBjb2RlIGFuZCBkZWNsYXJhdGlvbnMsIEVTTSBhbmRcbiAqIENvbW1vbkpTKSBtdXN0IG5hbWUgYSBwYWNrYWdlIGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCwgdGhlIHBhY2thZ2UgaXRzZWxmLFxuICogb3IgYSBOb2RlIGJ1aWx0aW47IGEgZGVjbGFyYXRpb24gZmlsZSdzIGltcG9ydCBtYXkgYWxzbyBiZSBzZXJ2ZWQgYnkgdGhlIHBhY2thZ2UncyBgQHR5cGVzYCBvbmUuIEEgcGFja2FnZSBpblxuICogYGRldkRlcGVuZGVuY2llc2Agb25seSBpcyBwcmVzZW50IGluIHRoZSBwYWNrYWdlJ3Mgb3duIHJlcG9zaXRvcnkgYW5kIGFic2VudCBmcm9tIGFcbiAqIGNvbnN1bWVyJ3MgaW5zdGFsbCwgc28gbm90aGluZyB0aGVyZSBmYWlscywgYW5kIHRoZSBjb25zdW1lciBnZXRzIGBDYW5ub3QgZmluZCBtb2R1bGVgLlxuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgaXNCdWlsdGluIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBwcmVQcm9jZXNzRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuL25wbS50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuXG4vKipcbiAqIFRoZSBmb2xkZXJzIHtAbGluayB2YWxpZGF0ZURlcGVuZGVuY2llc30gc2NhbnMgd2hlbiBub25lIGFyZSBnaXZlbi5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVkFMSURBVEVfREVQRU5ERU5DSUVTX0ZPTERFUlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5EaXN0TGliLCAnYmluJ107XG5cbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTiA9IC9cXC5kXFwuKD86Y3RzfG10c3x0cykkL3U7XG5jb25zdCBTQ0FOTkVEX0ZJTEVfUEFUVEVSTiA9IC9cXC4oPzpjanN8Y3RzfGpzfG1qc3xtdHN8dHMpJC91O1xuY29uc3QgVFlQRVNfU0NPUEUgPSAnQHR5cGVzLyc7XG5jb25zdCBTQ09QRURfUEFDS0FHRV9OQU1FX1NFR01FTlRfQ09VTlQgPSAyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB2YWxpZGF0ZURlcGVuZGVuY2llc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVEZXBlbmRlbmNpZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXJzIHRvIHNjYW4sIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyLiBBIGZvbGRlciB0aGF0IGRvZXMgbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1ZBTElEQVRFX0RFUEVOREVOQ0lFU19GT0xERVJTfVxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVycz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGV2ZXJ5IGJhcmUgaW1wb3J0IGluIHRoZSBwdWJsaXNoZWQgb3V0cHV0IG5hbWVzIGEgcGFja2FnZSBhIGNvbnN1bWVyIGluc3RhbGxzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggZm9sZGVycyBhcmUgc2Nhbm5lZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBpbXBvcnQgaXMgZGVjbGFyZWQuXG4gKiBAdGhyb3dzIElmIGFueSBpbXBvcnQgbmFtZXMgYSBwYWNrYWdlIHRoYXQgaXMgbm90IGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCxcbiAqIHRoZSBwYWNrYWdlIGl0c2VsZiwgb3IgYSBOb2RlIGJ1aWx0aW4uIFRoZSBlcnJvciBsaXN0cyBlYWNoIG9mZmVuZGluZyBmaWxlIGFuZCBzcGVjaWZpZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZURlcGVuZGVuY2llcyhvcHRpb25zOiBWYWxpZGF0ZURlcGVuZGVuY2llc09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocm9vdCk7XG4gIGNvbnN0IGluc3RhbGxlZFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoW1xuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pXG4gIF0pO1xuICBpZiAocGFja2FnZUpzb24ubmFtZSkge1xuICAgIGluc3RhbGxlZFBhY2thZ2VOYW1lcy5hZGQocGFja2FnZUpzb24ubmFtZSk7XG4gIH1cblxuICBjb25zdCB1bmRlY2xhcmVkSW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmb2xkZXIgb2Ygb3B0aW9ucy5mb2xkZXJzID8/IERFRkFVTFRfVkFMSURBVEVfREVQRU5ERU5DSUVTX0ZPTERFUlMpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGF3YWl0IGdldEZpbGVQYXRocyhqb2luKHJvb3QsIGZvbGRlcikpKSB7XG4gICAgICBjb25zdCBpc0RlY2xhcmF0aW9uRmlsZSA9IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTi50ZXN0KGZpbGVQYXRoKTtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIGdldEltcG9ydFNwZWNpZmllcnMoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcik7XG4gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PT0gbnVsbCB8fCBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlY2xhcmF0aW9uRmlsZSAmJiBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKGdldFR5cGVzUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHVuZGVjbGFyZWRJbXBvcnRzLnB1c2goYCR7cmVsYXRpdmUocm9vdCwgZmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpfTogJHtzcGVjaWZpZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHVuZGVjbGFyZWRJbXBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHB1Ymxpc2hlZCBvdXRwdXQgaW1wb3J0cyBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW4gZGVwZW5kZW5jaWVzLCBvcHRpb25hbERlcGVuZGVuY2llcyBvciBwZWVyRGVwZW5kZW5jaWVzOlxcbiR7dW5kZWNsYXJlZEltcG9ydHMuam9pbignXFxuJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgc2Nhbm5lZCBmaWxlcyB1bmRlciBhIGZvbGRlciwgcmVjdXJzaXZlbHkuXG4gKlxuICogQHBhcmFtIGZvbGRlciAtIFRoZSBhYnNvbHV0ZSBmb2xkZXIgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRocyBvZiB0aGUgc2Nhbm5lZCBmaWxlcywgb3Igbm9uZSB3aGVuIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVQYXRocyhmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFleGlzdHNTeW5jKGZvbGRlcikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBTQ0FOTkVEX0ZJTEVfUEFUVEVSTi50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKVxuICAgIC5zb3J0KCk7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIG1vZHVsZSBzcGVjaWZpZXJzIGEgc291cmNlIGZpbGUgaW1wb3J0cywgcmVxdWlyZXMgb3IgcmVmZXJlbmNlcywgaWdub3Jpbmcgc3RyaW5ncyBhbmQgY29tbWVudHMuXG4gKlxuICogQHBhcmFtIHNvdXJjZVRleHQgLSBUaGUgc291cmNlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlIHNwZWNpZmllcnMuXG4gKi9cbmZ1bmN0aW9uIGdldEltcG9ydFNwZWNpZmllcnMoc291cmNlVGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB7IGltcG9ydGVkRmlsZXMgfSA9IHByZVByb2Nlc3NGaWxlKHNvdXJjZVRleHQsIHRydWUsIHRydWUpO1xuICByZXR1cm4gaW1wb3J0ZWRGaWxlcy5tYXAoKGltcG9ydGVkRmlsZSkgPT4gaW1wb3J0ZWRGaWxlLmZpbGVOYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYWNrYWdlIGEgYmFyZSBzcGVjaWZpZXIgbmFtZXMuXG4gKlxuICogQHBhcmFtIHNwZWNpZmllciAtIFRoZSBtb2R1bGUgc3BlY2lmaWVyLlxuICogQHJldHVybnMgVGhlIHBhY2thZ2UgbmFtZSwgb3IgYG51bGxgIGZvciBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggb3IgYSBOb2RlIGJ1aWx0aW4uXG4gKi9cbmZ1bmN0aW9uIGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcjogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLicpIHx8IHNwZWNpZmllci5zdGFydHNXaXRoKCcvJykgfHwgaXNCdWlsdGluKHNwZWNpZmllcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNlZ21lbnRzID0gc3BlY2lmaWVyLnNwbGl0KCcvJyk7XG4gIGNvbnN0IHNlZ21lbnRDb3VudCA9IHNwZWNpZmllci5zdGFydHNXaXRoKCdAJykgPyBTQ09QRURfUEFDS0FHRV9OQU1FX1NFR01FTlRfQ09VTlQgOiAxO1xuICByZXR1cm4gc2VnbWVudHMuc2xpY2UoMCwgc2VnbWVudENvdW50KS5qb2luKCcvJyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgRGVmaW5pdGVseVR5cGVkIHBhY2thZ2UgdGhhdCBkZWNsYXJlcyBhIHBhY2thZ2UncyB0eXBlcywgd2hpY2ggaXMgd2hhdCBhIGRlY2xhcmF0aW9uIGZpbGUncyBpbXBvcnQgb2ZcbiAqIHRoYXQgcGFja2FnZSByZXNvbHZlcyB0byB3aGVuIHRoZSBwYWNrYWdlIHNoaXBzIG5vIHR5cGVzIG9mIGl0cyBvd24gKGBlc3RyZWVgIOKGkiBgQHR5cGVzL2VzdHJlZWAsXG4gKiBgQHNjb3BlL25hbWVgIOKGkiBgQHR5cGVzL3Njb3BlX19uYW1lYCkuXG4gKlxuICogQHBhcmFtIHBhY2thZ2VOYW1lIC0gVGhlIHBhY2thZ2UgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSBgQHR5cGVzYCBwYWNrYWdlIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGdldFR5cGVzUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBUWVBFU19TQ09QRSArIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15AL3UsICcnKS5yZXBsYWNlKCcvJywgJ19fJyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sYUFBYTtBQUNwQixTQUFTLHNCQUFzQjtBQUUvQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLGlCQUFpQjtBQUtuQixNQUFNLHdDQUEyRCxDQUFDLFVBQVUsU0FBUyxLQUFLO0FBRWpHLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sY0FBYztBQUNwQixNQUFNLG9DQUFvQztBQXNCMUMsZUFBc0IscUJBQXFCLFVBQXVDLENBQUMsR0FBa0I7QUFDbkcsUUFBTSxPQUFPLFFBQVEsSUFBSTtBQUN6QixR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
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZhaWxzIHRoZSBidWlsZCB3aGVuIHRoZSBwdWJsaXNoZWQgb3V0cHV0IGltcG9ydHMgYSBwYWNrYWdlIHRoYXQgYHBhY2thZ2UuanNvbmAgZG9lcyBub3QgaW5zdGFsbCBmb3IgYSBjb25zdW1lci5cbiAqXG4gKiBFdmVyeSBiYXJlIHNwZWNpZmllciBpbiB0aGUgc2Nhbm5lZCBmb2xkZXJzIChgZGlzdC9saWJgIGFuZCBgYmluYCBieSBkZWZhdWx0LCBjb2RlIGFuZCBkZWNsYXJhdGlvbnMsIEVTTSBhbmRcbiAqIENvbW1vbkpTKSBtdXN0IG5hbWUgYSBwYWNrYWdlIGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCwgdGhlIHBhY2thZ2UgaXRzZWxmLFxuICogb3IgYSBidWlsdGluIChhbnkgYG5vZGU6YCBzcGVjaWZpZXIsIE5vZGUncyBvd24sIGFuZCBFbGVjdHJvbidzIGBlbGVjdHJvbmAgYW5kIGBvcmlnaW5hbC1mc2ApOyBhIGRlY2xhcmF0aW9uXG4gKiBmaWxlJ3MgaW1wb3J0IG1heSBhbHNvIGJlIHNlcnZlZCBieSB0aGUgcGFja2FnZSdzIGBAdHlwZXNgIG9uZS4gQSBwYWNrYWdlIGluXG4gKiBgZGV2RGVwZW5kZW5jaWVzYCBvbmx5IGlzIHByZXNlbnQgaW4gdGhlIHBhY2thZ2UncyBvd24gcmVwb3NpdG9yeSBhbmQgYWJzZW50IGZyb20gYVxuICogY29uc3VtZXIncyBpbnN0YWxsLCBzbyBub3RoaW5nIHRoZXJlIGZhaWxzLCBhbmQgdGhlIGNvbnN1bWVyIGdldHMgYENhbm5vdCBmaW5kIG1vZHVsZWAuXG4gKi9cblxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBpc0J1aWx0aW4gfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQge1xuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHByZVByb2Nlc3NGaWxlIH0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IFJlcG9QYXRocyB9IGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5cbi8qKlxuICogVGhlIGZvbGRlcnMge0BsaW5rIHZhbGlkYXRlRGVwZW5kZW5jaWVzfSBzY2FucyB3aGVuIG5vbmUgYXJlIGdpdmVuLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9WQUxJREFURV9ERVBFTkRFTkNJRVNfRk9MREVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbUmVwb1BhdGhzLkRpc3RMaWIsICdiaW4nXTtcblxuLyoqXG4gKiBUaGUgbW9kdWxlcyBFbGVjdHJvbiBwcm92aWRlcyB0byBpdHMgb3duIHByb2Nlc3Nlcywgd2hpY2ggbm8gcGFja2FnZSBpbnN0YWxsczogTm9kZSdzIGBpc0J1aWx0aW5gIGRvZXMgbm90IGtub3cgdGhlbS5cbiAqIGBlbGVjdHJvbmAgYWxzbyBjb3ZlcnMgaXRzIGBlbGVjdHJvbi9tYWluYCwgYGVsZWN0cm9uL3JlbmRlcmVyYCBhbmQgYGVsZWN0cm9uL2NvbW1vbmAgc3VicGF0aHMuXG4gKi9cbmNvbnN0IEVMRUNUUk9OX0JVSUxUSU5fUEFDS0FHRV9OQU1FUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoWydlbGVjdHJvbicsICdvcmlnaW5hbC1mcyddKTtcbmNvbnN0IE5PREVfU0NIRU1FID0gJ25vZGU6JztcbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTiA9IC9cXC5kXFwuKD86Y3RzfG10c3x0cykkL3U7XG5jb25zdCBTQ0FOTkVEX0ZJTEVfUEFUVEVSTiA9IC9cXC4oPzpjanN8Y3RzfGpzfG1qc3xtdHN8dHMpJC91O1xuY29uc3QgVFlQRVNfU0NPUEUgPSAnQHR5cGVzLyc7XG5jb25zdCBTQ09QRURfUEFDS0FHRV9OQU1FX1NFR01FTlRfQ09VTlQgPSAyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB2YWxpZGF0ZURlcGVuZGVuY2llc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVEZXBlbmRlbmNpZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXJzIHRvIHNjYW4sIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyLiBBIGZvbGRlciB0aGF0IGRvZXMgbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1ZBTElEQVRFX0RFUEVOREVOQ0lFU19GT0xERVJTfVxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVycz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGV2ZXJ5IGJhcmUgaW1wb3J0IGluIHRoZSBwdWJsaXNoZWQgb3V0cHV0IG5hbWVzIGEgcGFja2FnZSBhIGNvbnN1bWVyIGluc3RhbGxzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggZm9sZGVycyBhcmUgc2Nhbm5lZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBpbXBvcnQgaXMgZGVjbGFyZWQuXG4gKiBAdGhyb3dzIElmIGFueSBpbXBvcnQgbmFtZXMgYSBwYWNrYWdlIHRoYXQgaXMgbm90IGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCxcbiAqIHRoZSBwYWNrYWdlIGl0c2VsZiwgb3IgYSBOb2RlIGJ1aWx0aW4uIFRoZSBlcnJvciBsaXN0cyBlYWNoIG9mZmVuZGluZyBmaWxlIGFuZCBzcGVjaWZpZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZURlcGVuZGVuY2llcyhvcHRpb25zOiBWYWxpZGF0ZURlcGVuZGVuY2llc09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocm9vdCk7XG4gIGNvbnN0IGluc3RhbGxlZFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoW1xuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pXG4gIF0pO1xuICBpZiAocGFja2FnZUpzb24ubmFtZSkge1xuICAgIGluc3RhbGxlZFBhY2thZ2VOYW1lcy5hZGQocGFja2FnZUpzb24ubmFtZSk7XG4gIH1cblxuICBjb25zdCB1bmRlY2xhcmVkSW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmb2xkZXIgb2Ygb3B0aW9ucy5mb2xkZXJzID8/IERFRkFVTFRfVkFMSURBVEVfREVQRU5ERU5DSUVTX0ZPTERFUlMpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGF3YWl0IGdldEZpbGVQYXRocyhqb2luKHJvb3QsIGZvbGRlcikpKSB7XG4gICAgICBjb25zdCBpc0RlY2xhcmF0aW9uRmlsZSA9IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTi50ZXN0KGZpbGVQYXRoKTtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIGdldEltcG9ydFNwZWNpZmllcnMoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcik7XG4gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PT0gbnVsbCB8fCBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlY2xhcmF0aW9uRmlsZSAmJiBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKGdldFR5cGVzUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHVuZGVjbGFyZWRJbXBvcnRzLnB1c2goYCR7cmVsYXRpdmUocm9vdCwgZmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpfTogJHtzcGVjaWZpZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHVuZGVjbGFyZWRJbXBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHB1Ymxpc2hlZCBvdXRwdXQgaW1wb3J0cyBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW4gZGVwZW5kZW5jaWVzLCBvcHRpb25hbERlcGVuZGVuY2llcyBvciBwZWVyRGVwZW5kZW5jaWVzOlxcbiR7dW5kZWNsYXJlZEltcG9ydHMuam9pbignXFxuJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgc2Nhbm5lZCBmaWxlcyB1bmRlciBhIGZvbGRlciwgcmVjdXJzaXZlbHkuXG4gKlxuICogQHBhcmFtIGZvbGRlciAtIFRoZSBhYnNvbHV0ZSBmb2xkZXIgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRocyBvZiB0aGUgc2Nhbm5lZCBmaWxlcywgb3Igbm9uZSB3aGVuIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVQYXRocyhmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFleGlzdHNTeW5jKGZvbGRlcikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBTQ0FOTkVEX0ZJTEVfUEFUVEVSTi50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKVxuICAgIC5zb3J0KCk7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIG1vZHVsZSBzcGVjaWZpZXJzIGEgc291cmNlIGZpbGUgaW1wb3J0cywgcmVxdWlyZXMgb3IgcmVmZXJlbmNlcywgaWdub3Jpbmcgc3RyaW5ncyBhbmQgY29tbWVudHMuXG4gKlxuICogQHBhcmFtIHNvdXJjZVRleHQgLSBUaGUgc291cmNlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlIHNwZWNpZmllcnMuXG4gKi9cbmZ1bmN0aW9uIGdldEltcG9ydFNwZWNpZmllcnMoc291cmNlVGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB7IGltcG9ydGVkRmlsZXMgfSA9IHByZVByb2Nlc3NGaWxlKHNvdXJjZVRleHQsIHRydWUsIHRydWUpO1xuICByZXR1cm4gaW1wb3J0ZWRGaWxlcy5tYXAoKGltcG9ydGVkRmlsZSkgPT4gaW1wb3J0ZWRGaWxlLmZpbGVOYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYWNrYWdlIGEgYmFyZSBzcGVjaWZpZXIgbmFtZXMuXG4gKlxuICogQHBhcmFtIHNwZWNpZmllciAtIFRoZSBtb2R1bGUgc3BlY2lmaWVyLlxuICogQHJldHVybnMgVGhlIHBhY2thZ2UgbmFtZSwgb3IgYG51bGxgIGZvciBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgsIGEgYnVpbHRpbiBvZiBOb2RlIG9yIEVsZWN0cm9uLCBvciBhbnlcbiAqIGBub2RlOmAtc2NoZW1lIHNwZWNpZmllcjogbm8gcGFja2FnZSBuYW1lIGNhbiBzdGFydCB3aXRoIGBub2RlOmAsIGFuZCBFbGVjdHJvbidzIGBub2RlOm9yaWdpbmFsLWZzYCBpcyBvbmUgTm9kZSdzIG93blxuICogbGlzdCBsYWNrcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgaWYgKFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCcuJykgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aChOT0RFX1NDSEVNRSkgfHwgaXNCdWlsdGluKHNwZWNpZmllcilcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzZWdtZW50cyA9IHNwZWNpZmllci5zcGxpdCgnLycpO1xuICBjb25zdCBzZWdtZW50Q291bnQgPSBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnQCcpID8gU0NPUEVEX1BBQ0tBR0VfTkFNRV9TRUdNRU5UX0NPVU5UIDogMTtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBzZWdtZW50cy5zbGljZSgwLCBzZWdtZW50Q291bnQpLmpvaW4oJy8nKTtcbiAgcmV0dXJuIEVMRUNUUk9OX0JVSUxUSU5fUEFDS0FHRV9OQU1FUy5oYXMocGFja2FnZU5hbWUpID8gbnVsbCA6IHBhY2thZ2VOYW1lO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIERlZmluaXRlbHlUeXBlZCBwYWNrYWdlIHRoYXQgZGVjbGFyZXMgYSBwYWNrYWdlJ3MgdHlwZXMsIHdoaWNoIGlzIHdoYXQgYSBkZWNsYXJhdGlvbiBmaWxlJ3MgaW1wb3J0IG9mXG4gKiB0aGF0IHBhY2thZ2UgcmVzb2x2ZXMgdG8gd2hlbiB0aGUgcGFja2FnZSBzaGlwcyBubyB0eXBlcyBvZiBpdHMgb3duIChgZXN0cmVlYCDihpIgYEB0eXBlcy9lc3RyZWVgLFxuICogYEBzY29wZS9uYW1lYCDihpIgYEB0eXBlcy9zY29wZV9fbmFtZWApLlxuICpcbiAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBwYWNrYWdlIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgYEB0eXBlc2AgcGFja2FnZSBuYW1lLlxuICovXG5mdW5jdGlvbiBnZXRUeXBlc1BhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gVFlQRVNfU0NPUEUgKyBwYWNrYWdlTmFtZS5yZXBsYWNlKC9eQC91LCAnJykucmVwbGFjZSgnLycsICdfXycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWFBLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxPQUFPLGFBQWE7QUFDcEIsU0FBUyxzQkFBc0I7QUFFL0IsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQkFBaUI7QUFLbkIsTUFBTSx3Q0FBMkQsQ0FBQyxVQUFVLFNBQVMsS0FBSztBQU1qRyxNQUFNLGlDQUFzRCxvQkFBSSxJQUFJLENBQUMsWUFBWSxhQUFhLENBQUM7QUFDL0YsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sY0FBYztBQUNwQixNQUFNLG9DQUFvQztBQXNCMUMsZUFBc0IscUJBQXFCLFVBQXVDLENBQUMsR0FBa0I7QUFDbkcsUUFBTSxPQUFPLFFBQVEsSUFBSTtBQUN6QixRQUFNLGNBQWMsTUFBTSxnQkFBZ0IsSUFBSTtBQUM5QyxRQUFNLHdCQUF3QixvQkFBSSxJQUFJO0FBQUEsSUFDcEMsR0FBRyxPQUFPLEtBQUssWUFBWSxnQkFBZ0IsQ0FB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/typescript-dev-toolkit",
3
- "version": "3.4.0",
3
+ "version": "3.6.0",
4
4
  "description": "Generic TypeScript project tooling: build, lint, format, spellcheck, test, gate and release scripts.",
5
5
  "keywords": [
6
6
  "typescript",