@mnaoumov/typescript-dev-toolkit 3.8.0 → 3.10.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.
@@ -511,9 +511,19 @@ function sidebarTreeToEntries(node, label) {
511
511
  return { collapsed: true, items, label };
512
512
  }
513
513
  function getApiIndexIntro(namespaces) {
514
- const { packageName } = getApiDocSettings();
514
+ const { apiIndexIntro, importStatement, packageName, publicApiEntry } = getApiDocSettings();
515
+ if (apiIndexIntro !== void 0) {
516
+ return apiIndexIntro;
517
+ }
518
+ const intro = `The complete API reference for \`${packageName}\`, generated from its TSDoc. `;
519
+ if (importStatement !== void 0) {
520
+ return `${intro}The modules below group the exports by source module; each export's page shows the statement it is imported with.`;
521
+ }
522
+ if (publicApiEntry !== void 0) {
523
+ return `${intro}Every export is imported from the package root, \`${packageName}\`; the modules below group them by source module.`;
524
+ }
515
525
  const [exampleNamespace = "module"] = namespaces;
516
- return `The complete API reference for \`${packageName}\`, generated from its TSDoc. Each module below maps to an import subpath (e.g. the \`${exampleNamespace}\` module is \`${packageName}/${exampleNamespace}\`).`;
526
+ return `${intro}Each module below maps to an import subpath (e.g. the \`${exampleNamespace}\` module is \`${packageName}/${exampleNamespace}\`).`;
517
527
  }
518
528
  function getComponentImports(componentNames) {
519
529
  return componentNames.map((componentName) => `import ${componentName} from "${API_COMPONENTS_IMPORT_PREFIX}/${componentName}.astro";`);
@@ -549,4 +559,4 @@ export {
549
559
  renderVariablePage,
550
560
  sidebarTreeToEntries
551
561
  };
552
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVNZHhQcm9zZSxcbiAgZXNjYXBlWWFtbCxcbiAgZ2V0RGlzcGxheU5hbWUsXG4gIGdldEltcG9ydFN0YXRlbWVudCxcbiAgZ2V0TmFtZXNwYWNlRGlyZWN0b3J5LFxuICBtZW1iZXJSb3V0ZVNlZ21lbnQsXG4gIG1lbWJlclNsdWcsXG4gIG92ZXJsb2FkUm91dGVTZWdtZW50LFxuICBvdmVybG9hZFNsdWcsXG4gIHN0cmlwTWFya2Rvd24sXG4gIHRydW5jYXRlU2lnbmF0dXJlXG59IGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmltcG9ydCB7IEFQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVggfSBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuXG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogQXBwZW5kIGJhY2tsaW5rcyB0byBvdmVydmlldyBwYWdlcyBhbmQgd3JpdGUgYWxsIGZpbGVzLiBLZXllZCBieSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGVuZEJhY2tsaW5rc0FuZFdyaXRlKFxuICBwYWdlQ29udGVudHM6IE1hcDxzdHJpbmcsIFBhZ2VDb250ZW50PixcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQocGFnZUNvbnRlbnRzLCBhbGxUeXBlcyk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB7IGNvbnRlbnQsIGZpbGVQYXRoIH1dIG9mIHBhZ2VDb250ZW50cykge1xuICAgIGNvbnN0IHR5cGVCYWNrbGlua3MgPSBiYWNrbGlua3MuZ2V0KGtleSkgPz8gW107XG4gICAgY29uc3QgbGluZXMgPSBbY29udGVudF07XG4gICAgaWYgKHR5cGVCYWNrbGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydGVkQmFja2xpbmtzID0gWy4uLnR5cGVCYWNrbGlua3NdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICBsaW5lcy5wdXNoKCcnLCAnLS0tJywgJycsICcqKkxpbmtzIHRvIHRoaXMgcGFnZToqKicsICcnKTtcbiAgICAgIGZvciAoY29uc3QgYmxLZXkgb2Ygc29ydGVkQmFja2xpbmtzKSB7XG4gICAgICAgIGNvbnN0IGJsSW5mbyA9IGVuc3VyZU5vbk51bGxhYmxlKGFsbFR5cGVzLmdldChibEtleSkpO1xuICAgICAgICBjb25zdCBibE5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGJsSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFske2JsSW5mby5uYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtibE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudChibEluZm8ubmFtZXNwYWNlLCBibEluZm8ubmFtZSl9LylgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBiYWNrbGlua3MgYnkgc2Nhbm5pbmcgZ2VuZXJhdGVkIHBhZ2UgY29udGVudCBmb3IgaW50ZXJuYWwgQVBJIGxpbmtzLiBLZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250ZW50cyAtIEV2ZXJ5IG92ZXJ2aWV3IHBhZ2UncyBjb250ZW50IGFuZCBwYXRoLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBFYWNoIHJlZmVyZW5jZWQgdHlwZSdzIHF1YWxpZmllZCBpZCBtYXBwZWQgdG8gdGhlIGlkcyBvZiB0aGUgcGFnZXMgbGlua2luZyB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICBjb25zdCBiYWNrbGlua3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIC8vIEVtaXR0ZWQgVVJMcyBsb3dlcmNhc2UgdGhlIHR5cGUgc2VnbWVudCAoc2VlIHRvUm91dGVTZWdtZW50KSwgc28gbWFwIGVhY2ggbG93ZXJjYXNlZCByb3V0ZVxuICAvLyBpZGVudGl0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBxdWFsaWZpZWQgdHlwZSBrZXkuXG4gIGNvbnN0IHJvdXRlS2V5VG9UeXBlS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbdHlwZUtleSwgaW5mb10gb2YgYWxsVHlwZXMpIHtcbiAgICByb3V0ZUtleVRvVHlwZUtleS5zZXQoYCR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0jJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9YCwgdHlwZUtleSk7XG4gIH1cbiAgY29uc3QgZXNjYXBlZEJhc2UgPSBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbiAgY29uc3QgbGlua1BhdHRlcm4gPSBuZXcgUmVnRXhwKGAke2VzY2FwZWRCYXNlfS9hcGkvKD88cGF0aD4oPzpbYS16QS1aMC05X0AtXSsvKSspYCwgJ2cnKTtcbiAgZm9yIChjb25zdCBbc291cmNlS2V5LCB7IGNvbnRlbnQgfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBjb250ZW50Lm1hdGNoQWxsKGxpbmtQYXR0ZXJuKSkge1xuICAgICAgLy8gVGhlIHBhdHRlcm4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlZ21lbnQuXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdwYXRoJykuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGVuc3VyZU5vbk51bGxhYmxlKHNlZ21lbnRzLmF0KC0xKSk7XG4gICAgICBjb25zdCBuYW1lc3BhY2UgPSBzZWdtZW50cy5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgY29uc3Qgcm91dGVLZXkgPSBgJHtuYW1lc3BhY2V9IyR7dHlwZU5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc29sdmVkS2V5ID0gcm91dGVLZXlUb1R5cGVLZXkuZ2V0KHJvdXRlS2V5KTtcbiAgICAgIGlmIChyZXNvbHZlZEtleSAhPT0gdW5kZWZpbmVkICYmIHJlc29sdmVkS2V5ICE9PSBzb3VyY2VLZXkpIHtcbiAgICAgICAgcmVmZXJlbmNlZC5hZGQocmVzb2x2ZWRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWQpIHtcbiAgICAgIGlmICghYmFja2xpbmtzLmhhcyhyZWZlcmVuY2UpKSB7XG4gICAgICAgIGJhY2tsaW5rcy5zZXQocmVmZXJlbmNlLCBbXSk7XG4gICAgICB9XG4gICAgICBiYWNrbGlua3MuZ2V0KHJlZmVyZW5jZSk/LnB1c2goc291cmNlS2V5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbmFtZXNwYWNlIHRyZWUgdGhlIHNpZGViYXIgaXMgZ2VuZXJhdGVkIGZyb20uXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEByZXR1cm5zIFRoZSByb290IG9mIHRoZSB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaWRlYmFyVHJlZSh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogU2lkZWJhclRyZWVOb2RlIHtcbiAgY29uc3Qgcm9vdDogU2lkZWJhclRyZWVOb2RlID0geyBjaGlsZHJlbjogbmV3IE1hcCgpLCB0eXBlczogW10gfTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGNvbnN0IHBhcnRzID0gaW5mby5uYW1lc3BhY2Uuc3BsaXQoJy8nKTtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkcmVuLmdldChwYXJ0KTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgY2hpbGQgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICAgICAgICBub2RlLmNoaWxkcmVuLnNldChwYXJ0LCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuICAgIG5vZGUudHlwZXMucHVzaChpbmZvKTtcbiAgfVxuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqXG4gKiBUaGUgcmF3IGNvZGUgc2lnbmF0dXJlIHNob3duIG9uIGEgdHlwZS1vdmVydmlldyBwYWdlJ3MgT0cgY2FyZCwgZm9yIHRoZSBraW5kcyB0aGF0IHJlbmRlciBhIHNpbmdsZVxuICogc2lnbmF0dXJlIGxpbmUgKGZ1bmN0aW9uIC8gdHlwZSBhbGlhcyAvIHZhcmlhYmxlKS4gQ2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgZW51bXMgcmVuZGVyIG1lbWJlclxuICogdGFibGVzIGluc3RlYWQsIHNvIHRoZXkgZ2V0IG5vIHNpZ25hdHVyZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUsIG9yIGB1bmRlZmluZWRgIGZvciBhIGtpbmQgdGhhdCByZW5kZXJzIG1lbWJlciB0YWJsZXMgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgICByZXR1cm4gJGZ1bmN0aW9uID8gYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7aW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJ31gO1xuICB9XG4gIHJldHVybiBpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScgPyBgJHtpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0J30gJHtuYW1lfTogJHtpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bid9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgb25lIHBhZ2UgcGVyIG93biBwcm9wZXJ0eSBhbmQgcGVyIG93biBtZXRob2Qgb3ZlcmxvYWQga2V5IG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNZW1iZXJQYWdlcyhuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVEaXJlY3RvcnkgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZURpcmVjdG9yeSA9IHRvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IGNvbXBvbmVudEltcG9ydHMgPSBnZXRDb21wb25lbnRJbXBvcnRzKFsnTWVtYmVyRGV0YWlsJ10pO1xuXG4gIC8vIFByb3BlcnR5IHBhZ2VzIChza2lwIGluaGVyaXRlZCDigJQgdGhleSBsaXZlIG9uIHRoZSBwYXJlbnQgdHlwZSlcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcy5maWx0ZXIoKHApID0+ICFwLmluaGVyaXRlZEZyb20pO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7bWVtYmVyU2x1Zyhwcm9wZXJ0eS5uYW1lKX0ubWR4YCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHByb3BlcnR5VGl0bGUgPSBgJHtuYW1lfS4ke3Byb3BlcnR5Lm5hbWV9YDtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogcHJvcGVydHkuZGVzY3JpcHRpb24sXG4gICAgICBzaWRlYmFyTGFiZWw6IHByb3BlcnR5VGl0bGUsXG4gICAgICBzaWduYXR1cmU6IGAke3Byb3BlcnR5LnNpZ25hdHVyZX06ICR7cHJvcGVydHkudHlwZX1gLFxuICAgICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCxcbiAgICAgIHRpdGxlOiBwcm9wZXJ0eVRpdGxlXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7cHJvcGVydHkubmFtZX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gcHJvcGVydHkuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgICBjb25zdCB0eXBlQXR0cmlidXRlID0gYCB0eXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9XCJgO1xuICAgIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gcHJvcGVydHkucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gICAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShwcm9wZXJ0eS5zaW5jZSl9XCJgIDogJyc7XG4gICAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eS5leGFtcGxlcyl9fWAgOiAnJztcblxuICAgIGxpbmVzLnB1c2goYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0ke3R5cGVBdHRyaWJ1dGV9JHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBNZXRob2QgcGFnZXMg4oCUIGVhY2ggb3ZlcmxvYWQga2V5IGdldHMgaXRzIG93biBwYWdlIChza2lwIGluaGVyaXRlZClcbiAgY29uc3QgbWV0aG9kcyA9IGluZm8ubWV0aG9kcy5maWx0ZXIoKG0pID0+ICFtLmluaGVyaXRlZEZyb20pO1xuICBjb25zdCBvdmVybG9hZEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBNZW1iZXJJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBrZXkgPSBtZXRob2Qub3ZlcmxvYWRLZXk7XG4gICAgaWYgKCFvdmVybG9hZEdyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgb3ZlcmxvYWRHcm91cHMuc2V0KGtleSwgW10pO1xuICAgIH1cbiAgICBvdmVybG9hZEdyb3Vwcy5nZXQoa2V5KT8ucHVzaChtZXRob2QpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbb3ZlcmxvYWRLZXksIG92ZXJsb2Fkc10gb2Ygb3ZlcmxvYWRHcm91cHMpIHtcbiAgICBjb25zdCBmaWxlU2x1ZyA9IG92ZXJsb2FkU2x1ZyhvdmVybG9hZEtleSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVEaXJlY3RvcnksIGAke2ZpbGVTbHVnfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fSBtZXRob2RgO1xuICAgIC8vIEEgZ3JvdXAgaXMgY3JlYXRlZCBieSBpdHMgZmlyc3Qgb3ZlcmxvYWQuXG4gICAgY29uc3QgZmlyc3RPdmVybG9hZCA9IGVuc3VyZU5vbk51bGxhYmxlKG92ZXJsb2Fkc1swXSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogZmlyc3RPdmVybG9hZC5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogYCR7bmFtZX0uJHtvdmVybG9hZEtleX1gLFxuICAgICAgc2lnbmF0dXJlOiBgJHtmaXJzdE92ZXJsb2FkLnNpZ25hdHVyZX06ICR7Zmlyc3RPdmVybG9hZC5yZXR1cm5UeXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gLFxuICAgICAgdGl0bGU6IGRpc3BsYXlOYW1lXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7b3ZlcmxvYWRLZXl9YCxcbiAgICAgICcnXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWQgb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lcywgb3ZlcmxvYWQsIG5hbWUsIGluZm8ubmFtZXNwYWNlLCBhbGxUeXBlcyk7XG4gICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJywgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGVhY2ggbW9kdWxlJ3MgaW5kZXggcGFnZSBhbmQgdGhlIHJvb3QgQVBJIGluZGV4LlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbW9kdWxlT3ZlcnZpZXdzIC0gRWFjaCBuYW1lc3BhY2UncyBgQGZpbGVgIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOYW1lc3BhY2VJbmRleFBhZ2VzKFxuICB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBtb2R1bGVPdmVydmlld3M6IE1hcDxzdHJpbmcsIHN0cmluZz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcDxzdHJpbmcsIFR5cGVJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGluZm8ubmFtZXNwYWNlKSkge1xuICAgICAgbmFtZXNwYWNlcy5zZXQoaW5mby5uYW1lc3BhY2UsIFtdKTtcbiAgICB9XG4gICAgbmFtZXNwYWNlcy5nZXQoaW5mby5uYW1lc3BhY2UpPy5wdXNoKGluZm8pO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBuc1R5cGVzXSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCAnaW5kZXgubWR4Jyk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIC8vIFRoZSBtb2R1bGUncyBgQGZpbGVgIHRleHQgZG91YmxlcyBhcyBpdHMgZGVzY3JpcHRpb24uXG4gICAgLy8gV2l0aG91dCBpdCB0aGUgbW9kdWxlIGNhcmQgd2FzIHRpdGxlLW9ubHkgd2hpbGUgZXZlcnkgbWVtYmVyIGNhcmQgdW5kZXIgaXQgY2FycmllZCBvbmUuXG4gICAgY29uc3Qgb3ZlcnZpZXcgPSBtb2R1bGVPdmVydmlld3MuZ2V0KG5hbWVzcGFjZSk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgICAgZGVzY3JpcHRpb246IG92ZXJ2aWV3LFxuICAgICAgc2lkZWJhckxhYmVsOiBuYW1lc3BhY2UsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9YCxcbiAgICAgIHRpdGxlOiBuYW1lc3BhY2VcbiAgICB9KTtcblxuICAgIC8vIE1vZHVsZSBAZmlsZSBvdmVydmlldyB0ZXh0XG4gICAgaWYgKG92ZXJ2aWV3KSB7XG4gICAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKG92ZXJ2aWV3LCBhbGxUeXBlcywgbmFtZXNwYWNlKSwgJycpO1xuICAgIH1cblxuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnQ2xhc3NlcycsICdDbGFzcycsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdjbGFzcycpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0ludGVyZmFjZXMnLCAnSW50ZXJmYWNlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2ludGVyZmFjZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0Z1bmN0aW9ucycsICdGdW5jdGlvbicsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdmdW5jdGlvbicpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1R5cGVzJywgJ1R5cGUnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAndHlwZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0VudW1zJywgJ0VudW0nLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnZW51bScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1ZhcmlhYmxlcycsICdWYXJpYWJsZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd2YXJpYWJsZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gUm9vdCBBUEkgaW5kZXggcGFnZSBsaXN0aW5nIGV2ZXJ5IG1vZHVsZS5cbiAgY29uc3Qgc29ydGVkTmFtZXNwYWNlcyA9IFsuLi5uYW1lc3BhY2VzLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgY29uc3QgYXBpSW5kZXhJbnRybyA9IGdldEFwaUluZGV4SW50cm8oc29ydGVkTmFtZXNwYWNlcyk7XG4gIGNvbnN0IHJvb3RMaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGFwaUluZGV4SW50cm8sXG4gICAgc2lkZWJhckxhYmVsOiAnT3ZlcnZpZXcnLFxuICAgIHNsdWc6ICdhcGknLFxuICAgIHRpdGxlOiAnQVBJIHJlZmVyZW5jZSdcbiAgfSk7XG4gIHJvb3RMaW5lcy5wdXNoKGFwaUluZGV4SW50cm8sICcnLCAnIyMgTW9kdWxlcycsICcnKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2Ygc29ydGVkTmFtZXNwYWNlcykge1xuICAgIHJvb3RMaW5lcy5wdXNoKGAtIFske25hbWVzcGFjZX1dKCR7Z2V0QXBpRG9jU2V0dGluZ3MoKS5iYXNlUGF0aH0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZSl9LylgKTtcbiAgfVxuICByb290TGluZXMucHVzaCgnJyk7XG4gIGNvbnN0IHJvb3RGaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHJvb3RGaWxlUGF0aCk7XG4gIGF3YWl0IHdyaXRlRmlsZShyb290RmlsZVBhdGgsIHJvb3RMaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHJldHVybnMgVGhlIHBhZ2UncyBjb250ZW50LCBiZWZvcmUgYmFja2xpbmtzLCBhbmQgdGhlIHBhdGggaXQgaXMgd3JpdHRlbiB0by5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3ZlcnZpZXdQYWdlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPFBhZ2VDb250ZW50PiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVTbHVnID0gdG9UeXBlRmlsZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCB0eXBlUm91dGVTbHVnID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVTbHVnLCAnaW5kZXgubWR4Jyk7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgLy8gRnJvbnRtYXR0ZXJcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShuYW1lLCBpbmZvKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgIGRlc2NyaXB0aW9uOiBpbmZvLmRlc2NyaXB0aW9uLFxuICAgIHNpZGViYXJMYWJlbDogZGlzcGxheU5hbWUsXG4gICAgc2lnbmF0dXJlOiBjb21wdXRlT3ZlcnZpZXdTaWduYXR1cmUobmFtZSwgaW5mbyksXG4gICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZVNsdWd9YCxcbiAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgfSk7XG5cbiAgLy8gQ29tcG9uZW50IGltcG9ydHMg4oCUIGNvbXB1dGUgcmVsYXRpdmUgcGF0aCBmcm9tIGdlbmVyYXRlZCBwYWdlIHRvIGNvbXBvbmVudHNcbiAgbGluZXMucHVzaCguLi5nZXRDb21wb25lbnRJbXBvcnRzKFsnQ29uc3RydWN0b3JCbG9jaycsICdJbXBvcnRTdGF0ZW1lbnQnLCAnTWV0aG9kVGFibGUnLCAnUHJvcGVydHlUYWJsZScsICdUeXBlU2lnbmF0dXJlJ10pLCAnJyk7XG5cbiAgLy8gRGVzY3JpcHRpb25cbiAgaWYgKGluZm8uZGVzY3JpcHRpb24pIHtcbiAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKGluZm8uZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIFJlbWFya3NcbiAgaWYgKGluZm8ucmVtYXJrcykge1xuICAgIGNvbnN0IHJlbWFya3NCbG9jayA9IHJlbmRlck1keFByb3NlKGluZm8ucmVtYXJrcywgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKHJlbWFya3NCbG9jay5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiAobGluZS5sZW5ndGggPiAwID8gYD4gJHtsaW5lfWAgOiAnPicpKS5qb2luKCdcXG4nKSwgJycpO1xuICB9XG5cbiAgLy8gSW1wb3J0IHN0YXRlbWVudFxuICBjb25zdCBpbXBvcnRTdGF0ZW1lbnQgPSBnZXRJbXBvcnRTdGF0ZW1lbnQoaW5mbyk7XG4gIGlmIChpbXBvcnRTdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpbmVzLnB1c2goYDxJbXBvcnRTdGF0ZW1lbnQgdGV4dD1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGltcG9ydFN0YXRlbWVudCl9XCIgLz5gLCAnJyk7XG4gIH1cblxuICAvLyBFeGFtcGxlc1xuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgaW5mby5leGFtcGxlcykge1xuICAgIGxpbmVzLnB1c2goJyoqRXhhbXBsZToqKicsICcnLCByZW5kZXJFeGFtcGxlTWR4KGV4YW1wbGUsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9ucyByZW5kZXIgbGlrZSBtZXRob2QgZGV0YWlsIHBhZ2VzIOKAlCBzaWduYXR1cmUsIHBhcmFtcywgcmV0dXJuc1xuICBpZiAoaW5mby5raW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVuZGVyRnVuY3Rpb25QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBWYXJpYWJsZXMgcmVuZGVyIHdpdGggZGVjbGFyYXRpb24ga2V5d29yZCBhbmQgdHlwZVxuICBpZiAoaW5mby5raW5kID09PSAndmFyaWFibGUnKSB7XG4gICAgcmVuZGVyVmFyaWFibGVQYWdlKGxpbmVzLCBuYW1lLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBFbnVtcyByZW5kZXIgdGhlaXIgbWVtYmVycyBsaXN0XG4gIGlmIChpbmZvLmtpbmQgPT09ICdlbnVtJykge1xuICAgIHJlbmRlckVudW1QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBUeXBlIGFsaWFzZXMgcmVuZGVyIHRoZWlyIHJpZ2h0LWhhbmQtc2lkZSBzaWduYXR1cmVcbiAgaWYgKGluZm8ua2luZCA9PT0gJ3R5cGUnKSB7XG4gICAgcmVuZGVyVHlwZUFsaWFzUGFnZShsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gQ2xhc3NlcyAvIGludGVyZmFjZXM6IHNpZ25hdHVyZSArIGV4dGVuZHMvaW1wbGVtZW50cyArIGNvbnN0cnVjdG9yICsgbWVtYmVyIHRhYmxlc1xuICBjb25zdCB0eXBlUGFyYW1zQXR0cmlidXRlID0gaW5mby50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwID8gYCB0eXBlUGFyYW1zPXske0pTT04uc3RyaW5naWZ5KGluZm8udHlwZVBhcmFtZXRlcnMpfX1gIDogJyc7XG4gIGNvbnN0IGV4dGVuZHNBdHRyaWJ1dGUgPSBpbmZvLmJhc2VUeXBlcy5sZW5ndGggPiAwID8gYCBleHRlbmRzPXske0pTT04uc3RyaW5naWZ5KGluZm8uYmFzZVR5cGVzKX19YCA6ICcnO1xuICBjb25zdCBpbXBsZW1lbnRzQXR0cmlidXRlID0gaW5mby5pbXBsZW1lbnRzVHlwZXMubGVuZ3RoID4gMCA/IGAgaW1wbGVtZW50cz17JHtKU09OLnN0cmluZ2lmeShpbmZvLmltcGxlbWVudHNUeXBlcyl9fWAgOiAnJztcbiAgbGluZXMucHVzaChgPFR5cGVTaWduYXR1cmUga2luZD1cIiR7aW5mby5raW5kfVwiIG5hbWU9XCIke25hbWV9XCIke3R5cGVQYXJhbXNBdHRyaWJ1dGV9JHtleHRlbmRzQXR0cmlidXRlfSR7aW1wbGVtZW50c0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgaWYgKGluZm8uYmFzZVR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uYmFzZVR5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqRXh0ZW5kczoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgaWYgKGluZm8uaW1wbGVtZW50c1R5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uaW1wbGVtZW50c1R5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqSW1wbGVtZW50czoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXMsIG5hbWUsIGluZm8sIGFsbFR5cGVzKTtcbiAgcmVuZGVyUHJvcGVydHlUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICByZW5kZXJNZXRob2RUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuXG4gIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgU3RhcmxpZ2h0IHNpZGViYXIgb2YgdGhlIEFQSSByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2lkZWJhckpzb24odHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gYnVpbGRTaWRlYmFyVHJlZSh0eXBlcyk7XG5cbiAgY29uc3QgZ3JvdXBzOiBTaWRlYmFyRW50cnlbXSA9IFtdO1xuICBjb25zdCB0b3BMZXZlbHMgPSBbLi4ucm9vdC5jaGlsZHJlbl0uc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGZvciAoY29uc3QgW3RvcExldmVsLCBjaGlsZF0gb2YgdG9wTGV2ZWxzKSB7XG4gICAgZ3JvdXBzLnB1c2goc2lkZWJhclRyZWVUb0VudHJpZXMoY2hpbGQsIHRvcExldmVsKSk7XG4gIH1cblxuICBjb25zdCB3cmFwcGVkU2lkZWJhcjogU2lkZWJhckVudHJ5W10gPSBbe1xuICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgaXRlbXM6IGdyb3VwcyxcbiAgICBsYWJlbDogJ0FQSSByZWZlcmVuY2UnXG4gIH1dO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShnZXRBcGlEb2NTZXR0aW5ncygpLnNpZGViYXJGaWxlLCBKU09OLnN0cmluZ2lmeSh3cmFwcGVkU2lkZWJhciwgbnVsbCwgSlNPTl9JTkRFTlQpLCAndXRmLTgnKTtcbiAgY29uc29sZS53YXJuKGBHZW5lcmF0ZWQgc2lkZWJhciB3aXRoICR7U3RyaW5nKGdyb3Vwcy5sZW5ndGgpfSB0b3AtbGV2ZWwgbW9kdWxlIGdyb3Vwc2ApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBjbGFzcydzIGNvbnN0cnVjdG9yIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGNvbnN0cnVjdG9yID0gaW5mby5jb25zdHJ1Y3RvckluZm87XG4gIGlmICghY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY3RvclNpZyA9IGBuZXcgJHtuYW1lfSR7Y29uc3RydWN0b3Iuc2lnbmF0dXJlfWA7XG4gIGNvbnN0IGN0b3JEZXNjID0gY29uc3RydWN0b3IuZGVzY3JpcHRpb25cbiAgICA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MoY29uc3RydWN0b3IuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICA6ICcnO1xuICBsaW5lcy5wdXNoKGA8Q29uc3RydWN0b3JCbG9jayBzaWduYXR1cmU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShjdG9yU2lnKX1cIiR7Y3RvckRlc2N9IC8+YCwgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYW4gZW51bSdzIG1lbWJlcnMuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRW51bVBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwiZW51bVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiAvPmAsICcnKTtcblxuICBpZiAoaW5mby5lbnVtTWVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5lcy5wdXNoKCcqKk1lbWJlcnM6KionLCAnJywgJ3wgTWVtYmVyIHwgVmFsdWUgfCBEZXNjcmlwdGlvbiB8JywgJ3wgOi0tIHwgOi0tIHwgOi0tIHwnKTtcbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgaW5mby5lbnVtTWVtYmVycykge1xuICAgIGNvbnN0IHZhbHVlID0gbWVtYmVyLnZhbHVlID8gYFxcYCR7ZXNjYXBlTWFya2Rvd24obWVtYmVyLnZhbHVlKX1cXGBgIDogJyc7XG4gICAgbGluZXMucHVzaChgfCBcXGAke21lbWJlci5uYW1lfVxcYCB8ICR7dmFsdWV9IHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MobWVtYmVyLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKX0gfGApO1xuICB9XG4gIGxpbmVzLnB1c2goJycpO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgU3RhcmxpZ2h0IGZyb250bWF0dGVyIGJsb2NrICh0aHJvdWdoIHRoZSBjbG9zaW5nIGAtLS1gIGFuZCBpdHMgYmxhbmsgbGluZSkgc2hhcmVkIGJ5IGV2ZXJ5XG4gKiBnZW5lcmF0ZWQgcGFnZSBraW5kOiBtb2R1bGUgaW5kZXgsIHR5cGUgb3ZlcnZpZXcsIHByb3BlcnR5LCBhbmQgbWV0aG9kLlxuICpcbiAqIEV2ZXJ5IHBhZ2Uga2luZCBnb2VzIHRocm91Z2ggaGVyZSBzbyBubyBmaWVsZCBjYW4gYmUgZW1pdHRlZCBvbiBzb21lIGtpbmRzIGFuZCBzaWxlbnRseSBkcm9wcGVkIG9uXG4gKiBvdGhlcnMuIGBkZXNjcmlwdGlvbmAgaW4gcGFydGljdWxhciBpcyBub3QganVzdCBTRU8gbWV0YWRhdGEg4oCUIGl0IGlzIHRoZSBsaW5lIHRoZSBPRyBjYXJkIHJlbmRlcnMgdW5kZXJcbiAqIHRoZSB0aXRsZSwgc28gYSBwYWdlIGtpbmQgdGhhdCBza2lwcGVkIGl0IHByb2R1Y2VkIGEgdGl0bGUtb25seSBjYXJkIG5leHQgdG8gZnVsbHkgcG9wdWxhdGVkIG9uZXMuXG4gKlxuICogQHBhcmFtIGZyb250TWF0dGVyIC0gVGhlIHBhZ2UncyBmcm9udG1hdHRlciBmaWVsZHMuXG4gKiBAcmV0dXJucyBUaGUgZnJvbnRtYXR0ZXIgbGluZXMsIHRocm91Z2ggdGhlIGNsb3NpbmcgYC0tLWAgYW5kIGl0cyBibGFuayBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRnJvbnRNYXR0ZXIoZnJvbnRNYXR0ZXI6IFBhZ2VGcm9udE1hdHRlcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAnLS0tJyxcbiAgICBgdGl0bGU6IFwiJHtlc2NhcGVZYW1sKGZyb250TWF0dGVyLnRpdGxlKX1cImAsXG4gICAgYHNsdWc6IFwiJHtmcm9udE1hdHRlci5zbHVnfVwiYCxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuZGVzY3JpcHRpb24gPyBbYGRlc2NyaXB0aW9uOiBcIiR7ZXNjYXBlWWFtbChzdHJpcE1hcmtkb3duKGZyb250TWF0dGVyLmRlc2NyaXB0aW9uKSl9XCJgXSA6IFtdKSxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuc2lnbmF0dXJlID8gW2BzaWduYXR1cmU6IFwiJHtlc2NhcGVZYW1sKHRydW5jYXRlU2lnbmF0dXJlKGZyb250TWF0dGVyLnNpZ25hdHVyZSkpfVwiYF0gOiBbXSksXG4gICAgJ2VkaXRVcmw6IGZhbHNlJyxcbiAgICAnc2lkZWJhcjonLFxuICAgIGAgIGxhYmVsOiBcIiR7ZXNjYXBlWWFtbChmcm9udE1hdHRlci5zaWRlYmFyTGFiZWwpfVwiYCxcbiAgICAnLS0tJyxcbiAgICAnJ1xuICBdO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBmdW5jdGlvbidzIHNpZ25hdHVyZSwgcGFyYW1ldGVycywgcmV0dXJuIHZhbHVlIGFuZCBleGFtcGxlcy5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJGdW5jdGlvblBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCAkZnVuY3Rpb24gPSBpbmZvLm1ldGhvZHNbMF07XG4gIGlmICghJGZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGluZXMucHVzaCgnKipTaWduYXR1cmU6KionLCAnJywgJ2BgYHRzJywgYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCwgJ2BgYCcsICcnKTtcblxuICBpZiAoJGZ1bmN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGxpbmVzLnB1c2goJyoqUGFyYW1ldGVyczoqKicsICcnLCAnfCBQYXJhbWV0ZXIgfCBUeXBlIHwgRGVzY3JpcHRpb24gfCcsICd8IDotLSB8IDotLSB8IDotLSB8Jyk7XG4gICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgJGZ1bmN0aW9uLnBhcmFtZXRlcnMpIHtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGB8IFxcYCR7cGFyYW1ldGVyLm5hbWV9XFxgIHwgJHtlc2NhcGVNYXJrZG93bihlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocGFyYW1ldGVyLnR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKHBhcmFtZXRlci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9IHxgXG4gICAgICApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgfVxuXG4gIGNvbnN0IHJldHVybkRlc2MgPSAkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24gPyBgIOKAlCAke2VzY2FwZU1keFByb3NlKHJlc29sdmVMaW5rcygkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfWAgOiAnJztcbiAgbGluZXMucHVzaChgKipSZXR1cm5zOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcygkZnVuY3Rpb24ucmV0dXJuVHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9JHtyZXR1cm5EZXNjfWAsICcnKTtcblxuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgJGZ1bmN0aW9uLmV4YW1wbGVzKSB7XG4gICAgbGluZXMucHVzaCgnKipFeGFtcGxlOioqJywgJycsIHJlbmRlckV4YW1wbGVNZHgoZXhhbXBsZSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBvbmUgbWV0aG9kIG92ZXJsb2FkLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBvdmVybG9hZCAtIFRoZSBvdmVybG9hZC5cbiAqIEBwYXJhbSB0eXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZE92ZXJsb2FkTWR4KGxpbmVzOiBzdHJpbmdbXSwgb3ZlcmxvYWQ6IE1lbWJlckluZm8sIHR5cGVOYW1lOiBzdHJpbmcsIG5hbWVzcGFjZTogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHNpZyA9IGAke292ZXJsb2FkLnNpZ25hdHVyZX06ICR7b3ZlcmxvYWQucmV0dXJuVHlwZX1gO1xuICBjb25zdCBzdGF0aWNBdHRyaWJ1dGUgPSBvdmVybG9hZC5pc1N0YXRpYyA/ICcgaXNTdGF0aWM9e3RydWV9JyA6ICcnO1xuICBjb25zdCBkZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQuZGVzY3JpcHRpb24gPyBgIGRlc2NyaXB0aW9uPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gb3ZlcmxvYWQucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5yZW1hcmtzLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCBzaW5jZUF0dHJpYnV0ZSA9IG92ZXJsb2FkLnNpbmNlID8gYCBzaW5jZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG92ZXJsb2FkLnNpbmNlKX1cImAgOiAnJztcbiAgY29uc3QgcmV0dXJuVHlwZUF0dHJpYnV0ZSA9IGAgcmV0dXJuVHlwZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3Mob3ZlcmxvYWQucmV0dXJuVHlwZSwgYWxsVHlwZXMsIHR5cGVOYW1lLCBuYW1lc3BhY2UpKSl9XCJgO1xuICBjb25zdCByZXR1cm5EZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb25cbiAgICA/IGAgcmV0dXJuRGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgXG4gICAgOiAnJztcbiAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBvdmVybG9hZC5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShvdmVybG9hZC5leGFtcGxlcyl9fWAgOiAnJztcblxuICBjb25zdCBwYXJhbXMgPSBvdmVybG9hZC5wYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHtcbiAgICBkZXNjcmlwdGlvbjogbWFya2Rvd25Ub0h0bWwocC5kZXNjcmlwdGlvbiB8fCAocC5uYW1lLmVuZHNXaXRoKCc/JykgPyAnKihPcHRpb25hbCkqJyA6ICcnKSksXG4gICAgbmFtZTogcC5uYW1lLFxuICAgIHR5cGU6IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocC50eXBlLCBhbGxUeXBlcywgdHlwZU5hbWUsIG5hbWVzcGFjZSkpXG4gIH0pKTtcbiAgY29uc3QgcGFyYW1zQXR0cmlidXRlID0gcGFyYW1zLmxlbmd0aCA+IDAgPyBgIHBhcmFtZXRlcnM9eyR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX19YCA6ICcnO1xuXG4gIGxpbmVzLnB1c2goXG4gICAgYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0gc2lnbmF0dXJlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUoc2lnKX1cIiR7ZGVzY0F0dHJpYnV0ZX0ke3JlbWFya3NBdHRyaWJ1dGV9JHtzaW5jZUF0dHJpYnV0ZX0ke3JldHVyblR5cGVBdHRyaWJ1dGV9JHtyZXR1cm5EZXNjQXR0cmlidXRlfSR7cGFyYW1zQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlJ3MgbWV0aG9kIHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZFRhYmxlTWR4KGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgbWV0aG9kcyA9IFsuLi5pbmZvLm1ldGhvZHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5pc1N0YXRpYyAhPT0gYi5pc1N0YXRpYykge1xuICAgICAgcmV0dXJuIGEuaXNTdGF0aWMgPyAxIDogLTE7XG4gICAgfVxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICB9KTtcbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxpbmVzLnB1c2goJzxNZXRob2RUYWJsZSByb3dzPXtbJyk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG1ldGhvZC5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpO1xuICAgIGNvbnN0IHN0YXRpY1ByZWZpeCA9IG1ldGhvZC5pc1N0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuICAgIGNvbnN0IHNob3J0UGFyYW1zID0gbWV0aG9kLnBhcmFtZXRlcnMubWFwKChwLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwICYmIEVWRU5UX01FVEhPRFMuaGFzKG1ldGhvZC5uYW1lKSAmJiAocC50eXBlLnN0YXJ0c1dpdGgoJ1wiJykgfHwgcC50eXBlLnN0YXJ0c1dpdGgoJ1xcJycpKSA/IHAudHlwZS5yZXBsYWNlQWxsKCdcIicsICdcXCcnKSA6IHAubmFtZTtcbiAgICB9KS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHNob3J0U2lnID0gYCR7c3RhdGljUHJlZml4fSR7bWV0aG9kLm5hbWV9KCR7c2hvcnRQYXJhbXN9KWA7XG4gICAgY29uc3Qgc2lnID0gZXNjYXBlSnNTdHJpbmcoc2hvcnRTaWcpO1xuICAgIGNvbnN0IHNsdWcgPSBvdmVybG9hZFJvdXRlU2VnbWVudChtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKG1ldGhvZC5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGNvbnN0IGluaGVyaXRlZEF0dHJpYnV0ZSA9IG1ldGhvZC5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgICAgOiAnJztcbiAgICBjb25zdCBocmVmID0gbWVtYmVySHJlZihzbHVnLCBtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBzaWduYXR1cmU6IFwiJHtzaWd9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgcmV0dXJuczogXCIke2VzY2FwZUpzU3RyaW5nKHJldHVyblR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSdzIHByb3BlcnR5IHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByb3BlcnR5VGFibGVNZHgobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gaW5mby5wcm9wZXJ0aWVzO1xuICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGluZXMucHVzaCgnPFByb3BlcnR5VGFibGUgcm93cz17WycpO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKHByb3BlcnR5LmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSk7XG4gICAgY29uc3QgdHlwZSA9IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocHJvcGVydHkudHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBjb25zdCBpbmhlcml0ZWRBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhyZWYgPSBtZW1iZXJIcmVmKG1lbWJlclJvdXRlU2VnbWVudChwcm9wZXJ0eS5uYW1lKSwgcHJvcGVydHkuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBuYW1lOiBcIiR7ZXNjYXBlSnNTdHJpbmcocHJvcGVydHkubmFtZSl9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgdHlwZTogXCIke2VzY2FwZUpzU3RyaW5nKHR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSBhbGlhcydzIHNpZ25hdHVyZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUeXBlQWxpYXNQYWdlKGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgdHlwZVBhcmFtc0F0dHJpYnV0ZSA9IGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IGAgdHlwZVBhcmFtcz17JHtKU09OLnN0cmluZ2lmeShpbmZvLnR5cGVQYXJhbWV0ZXJzKX19YCA6ICcnO1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwidHlwZVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiR7dHlwZVBhcmFtc0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgY29uc3QgcmhzID0gaW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJztcbiAgbGluZXMucHVzaChcbiAgICAnKipTaWduYXR1cmU6KionLFxuICAgICcnLFxuICAgICdgYGB0cycsXG4gICAgYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7cmhzfWAsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgYCoqVHlwZToqKiAke2VzY2FwZU1keEJyYWNlcyhlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocmhzLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX1gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHZhcmlhYmxlJ3MgZGVjbGFyYXRpb24gYW5kIHR5cGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJWYXJpYWJsZVBhZ2UobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGtleXdvcmQgPSBpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0JztcbiAgY29uc3QgdmFyaWFibGVUeXBlID0gaW5mby52YXJpYWJsZVR5cGUgPz8gJ3Vua25vd24nO1xuICBsaW5lcy5wdXNoKFxuICAgICcqKlNpZ25hdHVyZToqKicsXG4gICAgJycsXG4gICAgJ2BgYHRzJyxcbiAgICBgJHtrZXl3b3JkfSAke25hbWV9OiAke3ZhcmlhYmxlVHlwZX1gLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgIGAqKlR5cGU6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKHZhcmlhYmxlVHlwZSwgYWxsVHlwZXMsIG5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfWAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5hbWVzcGFjZSB0cmVlIG5vZGUgaW50byBhIHNpZGViYXIgZ3JvdXAuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZS5cbiAqIEBwYXJhbSBsYWJlbCAtIFRoZSBncm91cCdzIGxhYmVsLlxuICogQHJldHVybnMgVGhlIHNpZGViYXIgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWRlYmFyVHJlZVRvRW50cmllcyhub2RlOiBTaWRlYmFyVHJlZU5vZGUsIGxhYmVsOiBzdHJpbmcpOiBTaWRlYmFyRW50cnkge1xuICBjb25zdCBpdGVtczogKFNpZGViYXJFbnRyeSB8IFNpZGViYXJMaW5rKVtdID0gW107XG5cbiAgLy8gQ2hpbGQgZGlyZWN0b3J5IGdyb3VwcyBmaXJzdCAoYmVmb3JlIHRoaXMgbW9kdWxlJ3Mgb3duIHBhZ2VzKVxuICBjb25zdCBzb3J0ZWRDaGlsZHJlbiA9IFsuLi5ub2RlLmNoaWxkcmVuXS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgZm9yIChjb25zdCBbY2hpbGROYW1lLCBjaGlsZF0gb2Ygc29ydGVkQ2hpbGRyZW4pIHtcbiAgICBpdGVtcy5wdXNoKHNpZGViYXJUcmVlVG9FbnRyaWVzKGNoaWxkLCBjaGlsZE5hbWUpKTtcbiAgfVxuXG4gIC8vIFRoaXMgbW9kdWxlJ3Mgb3duIG92ZXJ2aWV3IHBhZ2UgKyB0eXBlL2Z1bmN0aW9uIHBhZ2VzIChpbmRpdmlkdWFsIG1lbWJlcnMgYXJlIG5vdCBsaXN0ZWQpLlxuICAvLyBTaWRlYmFyIGBsaW5rYCBmaWVsZHMgbXVzdCBOT1QgZW1iZWQgQkFTRV9QQVRIOiBTdGFybGlnaHQgcHJlcGVuZHMgdGhlIGNvbmZpZyBgYmFzZWAgdG8gZXZlcnlcbiAgLy8gc2lkZWJhciBsaW5rIGl0c2VsZiwgc28gaW5jbHVkaW5nIGl0IGhlcmUgd291bGQgZG91YmxlIHRoZSBiYXNlIChlLmcuIGAvYmFzZS9iYXNlL2FwaS8uLi5gIOKGkiA0MDQpLlxuICAvLyBUaGlzIGRpZmZlcnMgZnJvbSBpbi1jb250ZW50IGxpbmtzLCB3aGljaCBhcmUgcmF3IGFuY2hvcnMgdGhhdCBTdGFybGlnaHQgZG9lcyBub3QgYmFzZS1wcmVwZW5kLlxuICBpZiAobm9kZS50eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUudHlwZXNbMF0pO1xuICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ092ZXJ2aWV3JywgbGluazogYC9hcGkvJHtuYW1lc3BhY2V9L2AgfSk7XG4gICAgY29uc3Qgc29ydGVkVHlwZXMgPSBbLi4ubm9kZS50eXBlc10uc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gICAgZm9yIChjb25zdCB0IG9mIHNvcnRlZFR5cGVzKSB7XG4gICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6IHQubmFtZSwgbGluazogYC9hcGkvJHt0Lm5hbWVzcGFjZX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQodC5uYW1lc3BhY2UsIHQubmFtZSl9L2AgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY29sbGFwc2VkOiB0cnVlLCBpdGVtcywgbGFiZWwgfTtcbn1cblxuLy8gU2VydmVzIGJvdGggYXMgdGhlIHJvb3QgQVBJIHBhZ2UncyBwcm9zZSBhbmQgKHN0cmlwcGVkKSBhcyBpdHMgYGRlc2NyaXB0aW9uYCBmcm9udG1hdHRlci5cbi8vIFNoYXJpbmcgb25lIGZ1bmN0aW9uIGtlZXBzIHRoZSBwYWdlIGFuZCBpdHMgT0cgY2FyZCBmcm9tIGRyaWZ0aW5nIGFwYXJ0LlxuZnVuY3Rpb24gZ2V0QXBpSW5kZXhJbnRybyhuYW1lc3BhY2VzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgcGFja2FnZU5hbWUgfSA9IGdldEFwaURvY1NldHRpbmdzKCk7XG4gIGNvbnN0IFtleGFtcGxlTmFtZXNwYWNlID0gJ21vZHVsZSddID0gbmFtZXNwYWNlcztcbiAgcmV0dXJuIGBUaGUgY29tcGxldGUgQVBJIHJlZmVyZW5jZSBmb3IgXFxgJHtwYWNrYWdlTmFtZX1cXGAsIGdlbmVyYXRlZCBmcm9tIGl0cyBUU0RvYy4gYFxuICAgICsgYEVhY2ggbW9kdWxlIGJlbG93IG1hcHMgdG8gYW4gaW1wb3J0IHN1YnBhdGggKGUuZy4gdGhlIFxcYCR7ZXhhbXBsZU5hbWVzcGFjZX1cXGAgbW9kdWxlIGlzIFxcYCR7cGFja2FnZU5hbWV9LyR7ZXhhbXBsZU5hbWVzcGFjZX1cXGApLmA7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudEltcG9ydHMoY29tcG9uZW50TmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29tcG9uZW50TmFtZXMubWFwKChjb21wb25lbnROYW1lKSA9PiBgaW1wb3J0ICR7Y29tcG9uZW50TmFtZX0gZnJvbSBcIiR7QVBJX0NPTVBPTkVOVFNfSU1QT1JUX1BSRUZJWH0vJHtjb21wb25lbnROYW1lfS5hc3Ryb1wiO2ApO1xufVxuXG5mdW5jdGlvbiByZW5kZXJOYW1lc3BhY2VUYWJsZShcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBoZWFkaW5nOiBzdHJpbmcsXG4gIGNvbHVtbkxhYmVsOiBzdHJpbmcsXG4gIGVudHJpZXM6IFR5cGVJbmZvW10sXG4gIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sXG4gIG5hbWVzcGFjZTogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5lbnRyaWVzXS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgbGluZXMucHVzaChgIyMgJHtoZWFkaW5nfWAsICcnLCBgfCAke2NvbHVtbkxhYmVsfSB8IERlc2NyaXB0aW9uIHxgLCAnfCA6LS0gfCA6LS0gfCcpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvcnRlZCkge1xuICAgIGxpbmVzLnB1c2goYHwgWyR7ZW50cnkubmFtZX1dKC4vJHt0b1R5cGVSb3V0ZVNlZ21lbnQoZW50cnkubmFtZXNwYWNlLCBlbnRyeS5uYW1lKX0vKSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKGVudHJ5LmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSl9IHxgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCcnKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQSxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLFlBQVk7QUFZckIsU0FBUyxxQkFBcUI7QUFDOUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FB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
562
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVNZHhQcm9zZSxcbiAgZXNjYXBlWWFtbCxcbiAgZ2V0RGlzcGxheU5hbWUsXG4gIGdldEltcG9ydFN0YXRlbWVudCxcbiAgZ2V0TmFtZXNwYWNlRGlyZWN0b3J5LFxuICBtZW1iZXJSb3V0ZVNlZ21lbnQsXG4gIG1lbWJlclNsdWcsXG4gIG92ZXJsb2FkUm91dGVTZWdtZW50LFxuICBvdmVybG9hZFNsdWcsXG4gIHN0cmlwTWFya2Rvd24sXG4gIHRydW5jYXRlU2lnbmF0dXJlXG59IGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmltcG9ydCB7IEFQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVggfSBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuXG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogQXBwZW5kIGJhY2tsaW5rcyB0byBvdmVydmlldyBwYWdlcyBhbmQgd3JpdGUgYWxsIGZpbGVzLiBLZXllZCBieSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGVuZEJhY2tsaW5rc0FuZFdyaXRlKFxuICBwYWdlQ29udGVudHM6IE1hcDxzdHJpbmcsIFBhZ2VDb250ZW50PixcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQocGFnZUNvbnRlbnRzLCBhbGxUeXBlcyk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB7IGNvbnRlbnQsIGZpbGVQYXRoIH1dIG9mIHBhZ2VDb250ZW50cykge1xuICAgIGNvbnN0IHR5cGVCYWNrbGlua3MgPSBiYWNrbGlua3MuZ2V0KGtleSkgPz8gW107XG4gICAgY29uc3QgbGluZXMgPSBbY29udGVudF07XG4gICAgaWYgKHR5cGVCYWNrbGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydGVkQmFja2xpbmtzID0gWy4uLnR5cGVCYWNrbGlua3NdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICBsaW5lcy5wdXNoKCcnLCAnLS0tJywgJycsICcqKkxpbmtzIHRvIHRoaXMgcGFnZToqKicsICcnKTtcbiAgICAgIGZvciAoY29uc3QgYmxLZXkgb2Ygc29ydGVkQmFja2xpbmtzKSB7XG4gICAgICAgIGNvbnN0IGJsSW5mbyA9IGVuc3VyZU5vbk51bGxhYmxlKGFsbFR5cGVzLmdldChibEtleSkpO1xuICAgICAgICBjb25zdCBibE5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGJsSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFske2JsSW5mby5uYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtibE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudChibEluZm8ubmFtZXNwYWNlLCBibEluZm8ubmFtZSl9LylgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBiYWNrbGlua3MgYnkgc2Nhbm5pbmcgZ2VuZXJhdGVkIHBhZ2UgY29udGVudCBmb3IgaW50ZXJuYWwgQVBJIGxpbmtzLiBLZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250ZW50cyAtIEV2ZXJ5IG92ZXJ2aWV3IHBhZ2UncyBjb250ZW50IGFuZCBwYXRoLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBFYWNoIHJlZmVyZW5jZWQgdHlwZSdzIHF1YWxpZmllZCBpZCBtYXBwZWQgdG8gdGhlIGlkcyBvZiB0aGUgcGFnZXMgbGlua2luZyB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICBjb25zdCBiYWNrbGlua3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIC8vIEVtaXR0ZWQgVVJMcyBsb3dlcmNhc2UgdGhlIHR5cGUgc2VnbWVudCAoc2VlIHRvUm91dGVTZWdtZW50KSwgc28gbWFwIGVhY2ggbG93ZXJjYXNlZCByb3V0ZVxuICAvLyBpZGVudGl0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBxdWFsaWZpZWQgdHlwZSBrZXkuXG4gIGNvbnN0IHJvdXRlS2V5VG9UeXBlS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbdHlwZUtleSwgaW5mb10gb2YgYWxsVHlwZXMpIHtcbiAgICByb3V0ZUtleVRvVHlwZUtleS5zZXQoYCR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0jJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9YCwgdHlwZUtleSk7XG4gIH1cbiAgY29uc3QgZXNjYXBlZEJhc2UgPSBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbiAgY29uc3QgbGlua1BhdHRlcm4gPSBuZXcgUmVnRXhwKGAke2VzY2FwZWRCYXNlfS9hcGkvKD88cGF0aD4oPzpbYS16QS1aMC05X0AtXSsvKSspYCwgJ2cnKTtcbiAgZm9yIChjb25zdCBbc291cmNlS2V5LCB7IGNvbnRlbnQgfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBjb250ZW50Lm1hdGNoQWxsKGxpbmtQYXR0ZXJuKSkge1xuICAgICAgLy8gVGhlIHBhdHRlcm4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlZ21lbnQuXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdwYXRoJykuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGVuc3VyZU5vbk51bGxhYmxlKHNlZ21lbnRzLmF0KC0xKSk7XG4gICAgICBjb25zdCBuYW1lc3BhY2UgPSBzZWdtZW50cy5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgY29uc3Qgcm91dGVLZXkgPSBgJHtuYW1lc3BhY2V9IyR7dHlwZU5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc29sdmVkS2V5ID0gcm91dGVLZXlUb1R5cGVLZXkuZ2V0KHJvdXRlS2V5KTtcbiAgICAgIGlmIChyZXNvbHZlZEtleSAhPT0gdW5kZWZpbmVkICYmIHJlc29sdmVkS2V5ICE9PSBzb3VyY2VLZXkpIHtcbiAgICAgICAgcmVmZXJlbmNlZC5hZGQocmVzb2x2ZWRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWQpIHtcbiAgICAgIGlmICghYmFja2xpbmtzLmhhcyhyZWZlcmVuY2UpKSB7XG4gICAgICAgIGJhY2tsaW5rcy5zZXQocmVmZXJlbmNlLCBbXSk7XG4gICAgICB9XG4gICAgICBiYWNrbGlua3MuZ2V0KHJlZmVyZW5jZSk/LnB1c2goc291cmNlS2V5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbmFtZXNwYWNlIHRyZWUgdGhlIHNpZGViYXIgaXMgZ2VuZXJhdGVkIGZyb20uXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEByZXR1cm5zIFRoZSByb290IG9mIHRoZSB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaWRlYmFyVHJlZSh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogU2lkZWJhclRyZWVOb2RlIHtcbiAgY29uc3Qgcm9vdDogU2lkZWJhclRyZWVOb2RlID0geyBjaGlsZHJlbjogbmV3IE1hcCgpLCB0eXBlczogW10gfTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGNvbnN0IHBhcnRzID0gaW5mby5uYW1lc3BhY2Uuc3BsaXQoJy8nKTtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkcmVuLmdldChwYXJ0KTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgY2hpbGQgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICAgICAgICBub2RlLmNoaWxkcmVuLnNldChwYXJ0LCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuICAgIG5vZGUudHlwZXMucHVzaChpbmZvKTtcbiAgfVxuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqXG4gKiBUaGUgcmF3IGNvZGUgc2lnbmF0dXJlIHNob3duIG9uIGEgdHlwZS1vdmVydmlldyBwYWdlJ3MgT0cgY2FyZCwgZm9yIHRoZSBraW5kcyB0aGF0IHJlbmRlciBhIHNpbmdsZVxuICogc2lnbmF0dXJlIGxpbmUgKGZ1bmN0aW9uIC8gdHlwZSBhbGlhcyAvIHZhcmlhYmxlKS4gQ2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgZW51bXMgcmVuZGVyIG1lbWJlclxuICogdGFibGVzIGluc3RlYWQsIHNvIHRoZXkgZ2V0IG5vIHNpZ25hdHVyZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUsIG9yIGB1bmRlZmluZWRgIGZvciBhIGtpbmQgdGhhdCByZW5kZXJzIG1lbWJlciB0YWJsZXMgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgICByZXR1cm4gJGZ1bmN0aW9uID8gYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7aW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJ31gO1xuICB9XG4gIHJldHVybiBpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScgPyBgJHtpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0J30gJHtuYW1lfTogJHtpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bid9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgb25lIHBhZ2UgcGVyIG93biBwcm9wZXJ0eSBhbmQgcGVyIG93biBtZXRob2Qgb3ZlcmxvYWQga2V5IG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNZW1iZXJQYWdlcyhuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVEaXJlY3RvcnkgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZURpcmVjdG9yeSA9IHRvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IGNvbXBvbmVudEltcG9ydHMgPSBnZXRDb21wb25lbnRJbXBvcnRzKFsnTWVtYmVyRGV0YWlsJ10pO1xuXG4gIC8vIFByb3BlcnR5IHBhZ2VzIChza2lwIGluaGVyaXRlZCDigJQgdGhleSBsaXZlIG9uIHRoZSBwYXJlbnQgdHlwZSlcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcy5maWx0ZXIoKHApID0+ICFwLmluaGVyaXRlZEZyb20pO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7bWVtYmVyU2x1Zyhwcm9wZXJ0eS5uYW1lKX0ubWR4YCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHByb3BlcnR5VGl0bGUgPSBgJHtuYW1lfS4ke3Byb3BlcnR5Lm5hbWV9YDtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogcHJvcGVydHkuZGVzY3JpcHRpb24sXG4gICAgICBzaWRlYmFyTGFiZWw6IHByb3BlcnR5VGl0bGUsXG4gICAgICBzaWduYXR1cmU6IGAke3Byb3BlcnR5LnNpZ25hdHVyZX06ICR7cHJvcGVydHkudHlwZX1gLFxuICAgICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCxcbiAgICAgIHRpdGxlOiBwcm9wZXJ0eVRpdGxlXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7cHJvcGVydHkubmFtZX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gcHJvcGVydHkuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgICBjb25zdCB0eXBlQXR0cmlidXRlID0gYCB0eXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9XCJgO1xuICAgIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gcHJvcGVydHkucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gICAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShwcm9wZXJ0eS5zaW5jZSl9XCJgIDogJyc7XG4gICAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eS5leGFtcGxlcyl9fWAgOiAnJztcblxuICAgIGxpbmVzLnB1c2goYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0ke3R5cGVBdHRyaWJ1dGV9JHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBNZXRob2QgcGFnZXMg4oCUIGVhY2ggb3ZlcmxvYWQga2V5IGdldHMgaXRzIG93biBwYWdlIChza2lwIGluaGVyaXRlZClcbiAgY29uc3QgbWV0aG9kcyA9IGluZm8ubWV0aG9kcy5maWx0ZXIoKG0pID0+ICFtLmluaGVyaXRlZEZyb20pO1xuICBjb25zdCBvdmVybG9hZEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBNZW1iZXJJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBrZXkgPSBtZXRob2Qub3ZlcmxvYWRLZXk7XG4gICAgaWYgKCFvdmVybG9hZEdyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgb3ZlcmxvYWRHcm91cHMuc2V0KGtleSwgW10pO1xuICAgIH1cbiAgICBvdmVybG9hZEdyb3Vwcy5nZXQoa2V5KT8ucHVzaChtZXRob2QpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbb3ZlcmxvYWRLZXksIG92ZXJsb2Fkc10gb2Ygb3ZlcmxvYWRHcm91cHMpIHtcbiAgICBjb25zdCBmaWxlU2x1ZyA9IG92ZXJsb2FkU2x1ZyhvdmVybG9hZEtleSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVEaXJlY3RvcnksIGAke2ZpbGVTbHVnfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fSBtZXRob2RgO1xuICAgIC8vIEEgZ3JvdXAgaXMgY3JlYXRlZCBieSBpdHMgZmlyc3Qgb3ZlcmxvYWQuXG4gICAgY29uc3QgZmlyc3RPdmVybG9hZCA9IGVuc3VyZU5vbk51bGxhYmxlKG92ZXJsb2Fkc1swXSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogZmlyc3RPdmVybG9hZC5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogYCR7bmFtZX0uJHtvdmVybG9hZEtleX1gLFxuICAgICAgc2lnbmF0dXJlOiBgJHtmaXJzdE92ZXJsb2FkLnNpZ25hdHVyZX06ICR7Zmlyc3RPdmVybG9hZC5yZXR1cm5UeXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gLFxuICAgICAgdGl0bGU6IGRpc3BsYXlOYW1lXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7b3ZlcmxvYWRLZXl9YCxcbiAgICAgICcnXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWQgb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lcywgb3ZlcmxvYWQsIG5hbWUsIGluZm8ubmFtZXNwYWNlLCBhbGxUeXBlcyk7XG4gICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJywgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGVhY2ggbW9kdWxlJ3MgaW5kZXggcGFnZSBhbmQgdGhlIHJvb3QgQVBJIGluZGV4LlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbW9kdWxlT3ZlcnZpZXdzIC0gRWFjaCBuYW1lc3BhY2UncyBgQGZpbGVgIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOYW1lc3BhY2VJbmRleFBhZ2VzKFxuICB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBtb2R1bGVPdmVydmlld3M6IE1hcDxzdHJpbmcsIHN0cmluZz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcDxzdHJpbmcsIFR5cGVJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGluZm8ubmFtZXNwYWNlKSkge1xuICAgICAgbmFtZXNwYWNlcy5zZXQoaW5mby5uYW1lc3BhY2UsIFtdKTtcbiAgICB9XG4gICAgbmFtZXNwYWNlcy5nZXQoaW5mby5uYW1lc3BhY2UpPy5wdXNoKGluZm8pO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBuc1R5cGVzXSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCAnaW5kZXgubWR4Jyk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIC8vIFRoZSBtb2R1bGUncyBgQGZpbGVgIHRleHQgZG91YmxlcyBhcyBpdHMgZGVzY3JpcHRpb24uXG4gICAgLy8gV2l0aG91dCBpdCB0aGUgbW9kdWxlIGNhcmQgd2FzIHRpdGxlLW9ubHkgd2hpbGUgZXZlcnkgbWVtYmVyIGNhcmQgdW5kZXIgaXQgY2FycmllZCBvbmUuXG4gICAgY29uc3Qgb3ZlcnZpZXcgPSBtb2R1bGVPdmVydmlld3MuZ2V0KG5hbWVzcGFjZSk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgICAgZGVzY3JpcHRpb246IG92ZXJ2aWV3LFxuICAgICAgc2lkZWJhckxhYmVsOiBuYW1lc3BhY2UsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9YCxcbiAgICAgIHRpdGxlOiBuYW1lc3BhY2VcbiAgICB9KTtcblxuICAgIC8vIE1vZHVsZSBAZmlsZSBvdmVydmlldyB0ZXh0XG4gICAgaWYgKG92ZXJ2aWV3KSB7XG4gICAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKG92ZXJ2aWV3LCBhbGxUeXBlcywgbmFtZXNwYWNlKSwgJycpO1xuICAgIH1cblxuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnQ2xhc3NlcycsICdDbGFzcycsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdjbGFzcycpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0ludGVyZmFjZXMnLCAnSW50ZXJmYWNlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2ludGVyZmFjZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0Z1bmN0aW9ucycsICdGdW5jdGlvbicsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdmdW5jdGlvbicpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1R5cGVzJywgJ1R5cGUnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAndHlwZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0VudW1zJywgJ0VudW0nLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnZW51bScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1ZhcmlhYmxlcycsICdWYXJpYWJsZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd2YXJpYWJsZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gUm9vdCBBUEkgaW5kZXggcGFnZSBsaXN0aW5nIGV2ZXJ5IG1vZHVsZS5cbiAgY29uc3Qgc29ydGVkTmFtZXNwYWNlcyA9IFsuLi5uYW1lc3BhY2VzLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgY29uc3QgYXBpSW5kZXhJbnRybyA9IGdldEFwaUluZGV4SW50cm8oc29ydGVkTmFtZXNwYWNlcyk7XG4gIGNvbnN0IHJvb3RMaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGFwaUluZGV4SW50cm8sXG4gICAgc2lkZWJhckxhYmVsOiAnT3ZlcnZpZXcnLFxuICAgIHNsdWc6ICdhcGknLFxuICAgIHRpdGxlOiAnQVBJIHJlZmVyZW5jZSdcbiAgfSk7XG4gIHJvb3RMaW5lcy5wdXNoKGFwaUluZGV4SW50cm8sICcnLCAnIyMgTW9kdWxlcycsICcnKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2Ygc29ydGVkTmFtZXNwYWNlcykge1xuICAgIHJvb3RMaW5lcy5wdXNoKGAtIFske25hbWVzcGFjZX1dKCR7Z2V0QXBpRG9jU2V0dGluZ3MoKS5iYXNlUGF0aH0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZSl9LylgKTtcbiAgfVxuICByb290TGluZXMucHVzaCgnJyk7XG4gIGNvbnN0IHJvb3RGaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHJvb3RGaWxlUGF0aCk7XG4gIGF3YWl0IHdyaXRlRmlsZShyb290RmlsZVBhdGgsIHJvb3RMaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHJldHVybnMgVGhlIHBhZ2UncyBjb250ZW50LCBiZWZvcmUgYmFja2xpbmtzLCBhbmQgdGhlIHBhdGggaXQgaXMgd3JpdHRlbiB0by5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3ZlcnZpZXdQYWdlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPFBhZ2VDb250ZW50PiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVTbHVnID0gdG9UeXBlRmlsZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCB0eXBlUm91dGVTbHVnID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVTbHVnLCAnaW5kZXgubWR4Jyk7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgLy8gRnJvbnRtYXR0ZXJcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShuYW1lLCBpbmZvKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgIGRlc2NyaXB0aW9uOiBpbmZvLmRlc2NyaXB0aW9uLFxuICAgIHNpZGViYXJMYWJlbDogZGlzcGxheU5hbWUsXG4gICAgc2lnbmF0dXJlOiBjb21wdXRlT3ZlcnZpZXdTaWduYXR1cmUobmFtZSwgaW5mbyksXG4gICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZVNsdWd9YCxcbiAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgfSk7XG5cbiAgLy8gQ29tcG9uZW50IGltcG9ydHMg4oCUIGNvbXB1dGUgcmVsYXRpdmUgcGF0aCBmcm9tIGdlbmVyYXRlZCBwYWdlIHRvIGNvbXBvbmVudHNcbiAgbGluZXMucHVzaCguLi5nZXRDb21wb25lbnRJbXBvcnRzKFsnQ29uc3RydWN0b3JCbG9jaycsICdJbXBvcnRTdGF0ZW1lbnQnLCAnTWV0aG9kVGFibGUnLCAnUHJvcGVydHlUYWJsZScsICdUeXBlU2lnbmF0dXJlJ10pLCAnJyk7XG5cbiAgLy8gRGVzY3JpcHRpb25cbiAgaWYgKGluZm8uZGVzY3JpcHRpb24pIHtcbiAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKGluZm8uZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIFJlbWFya3NcbiAgaWYgKGluZm8ucmVtYXJrcykge1xuICAgIGNvbnN0IHJlbWFya3NCbG9jayA9IHJlbmRlck1keFByb3NlKGluZm8ucmVtYXJrcywgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKHJlbWFya3NCbG9jay5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiAobGluZS5sZW5ndGggPiAwID8gYD4gJHtsaW5lfWAgOiAnPicpKS5qb2luKCdcXG4nKSwgJycpO1xuICB9XG5cbiAgLy8gSW1wb3J0IHN0YXRlbWVudFxuICBjb25zdCBpbXBvcnRTdGF0ZW1lbnQgPSBnZXRJbXBvcnRTdGF0ZW1lbnQoaW5mbyk7XG4gIGlmIChpbXBvcnRTdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpbmVzLnB1c2goYDxJbXBvcnRTdGF0ZW1lbnQgdGV4dD1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGltcG9ydFN0YXRlbWVudCl9XCIgLz5gLCAnJyk7XG4gIH1cblxuICAvLyBFeGFtcGxlc1xuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgaW5mby5leGFtcGxlcykge1xuICAgIGxpbmVzLnB1c2goJyoqRXhhbXBsZToqKicsICcnLCByZW5kZXJFeGFtcGxlTWR4KGV4YW1wbGUsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9ucyByZW5kZXIgbGlrZSBtZXRob2QgZGV0YWlsIHBhZ2VzIOKAlCBzaWduYXR1cmUsIHBhcmFtcywgcmV0dXJuc1xuICBpZiAoaW5mby5raW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVuZGVyRnVuY3Rpb25QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBWYXJpYWJsZXMgcmVuZGVyIHdpdGggZGVjbGFyYXRpb24ga2V5d29yZCBhbmQgdHlwZVxuICBpZiAoaW5mby5raW5kID09PSAndmFyaWFibGUnKSB7XG4gICAgcmVuZGVyVmFyaWFibGVQYWdlKGxpbmVzLCBuYW1lLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBFbnVtcyByZW5kZXIgdGhlaXIgbWVtYmVycyBsaXN0XG4gIGlmIChpbmZvLmtpbmQgPT09ICdlbnVtJykge1xuICAgIHJlbmRlckVudW1QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBUeXBlIGFsaWFzZXMgcmVuZGVyIHRoZWlyIHJpZ2h0LWhhbmQtc2lkZSBzaWduYXR1cmVcbiAgaWYgKGluZm8ua2luZCA9PT0gJ3R5cGUnKSB7XG4gICAgcmVuZGVyVHlwZUFsaWFzUGFnZShsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gQ2xhc3NlcyAvIGludGVyZmFjZXM6IHNpZ25hdHVyZSArIGV4dGVuZHMvaW1wbGVtZW50cyArIGNvbnN0cnVjdG9yICsgbWVtYmVyIHRhYmxlc1xuICBjb25zdCB0eXBlUGFyYW1zQXR0cmlidXRlID0gaW5mby50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwID8gYCB0eXBlUGFyYW1zPXske0pTT04uc3RyaW5naWZ5KGluZm8udHlwZVBhcmFtZXRlcnMpfX1gIDogJyc7XG4gIGNvbnN0IGV4dGVuZHNBdHRyaWJ1dGUgPSBpbmZvLmJhc2VUeXBlcy5sZW5ndGggPiAwID8gYCBleHRlbmRzPXske0pTT04uc3RyaW5naWZ5KGluZm8uYmFzZVR5cGVzKX19YCA6ICcnO1xuICBjb25zdCBpbXBsZW1lbnRzQXR0cmlidXRlID0gaW5mby5pbXBsZW1lbnRzVHlwZXMubGVuZ3RoID4gMCA/IGAgaW1wbGVtZW50cz17JHtKU09OLnN0cmluZ2lmeShpbmZvLmltcGxlbWVudHNUeXBlcyl9fWAgOiAnJztcbiAgbGluZXMucHVzaChgPFR5cGVTaWduYXR1cmUga2luZD1cIiR7aW5mby5raW5kfVwiIG5hbWU9XCIke25hbWV9XCIke3R5cGVQYXJhbXNBdHRyaWJ1dGV9JHtleHRlbmRzQXR0cmlidXRlfSR7aW1wbGVtZW50c0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgaWYgKGluZm8uYmFzZVR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uYmFzZVR5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqRXh0ZW5kczoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgaWYgKGluZm8uaW1wbGVtZW50c1R5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uaW1wbGVtZW50c1R5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqSW1wbGVtZW50czoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXMsIG5hbWUsIGluZm8sIGFsbFR5cGVzKTtcbiAgcmVuZGVyUHJvcGVydHlUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICByZW5kZXJNZXRob2RUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuXG4gIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgU3RhcmxpZ2h0IHNpZGViYXIgb2YgdGhlIEFQSSByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2lkZWJhckpzb24odHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gYnVpbGRTaWRlYmFyVHJlZSh0eXBlcyk7XG5cbiAgY29uc3QgZ3JvdXBzOiBTaWRlYmFyRW50cnlbXSA9IFtdO1xuICBjb25zdCB0b3BMZXZlbHMgPSBbLi4ucm9vdC5jaGlsZHJlbl0uc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGZvciAoY29uc3QgW3RvcExldmVsLCBjaGlsZF0gb2YgdG9wTGV2ZWxzKSB7XG4gICAgZ3JvdXBzLnB1c2goc2lkZWJhclRyZWVUb0VudHJpZXMoY2hpbGQsIHRvcExldmVsKSk7XG4gIH1cblxuICBjb25zdCB3cmFwcGVkU2lkZWJhcjogU2lkZWJhckVudHJ5W10gPSBbe1xuICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgaXRlbXM6IGdyb3VwcyxcbiAgICBsYWJlbDogJ0FQSSByZWZlcmVuY2UnXG4gIH1dO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShnZXRBcGlEb2NTZXR0aW5ncygpLnNpZGViYXJGaWxlLCBKU09OLnN0cmluZ2lmeSh3cmFwcGVkU2lkZWJhciwgbnVsbCwgSlNPTl9JTkRFTlQpLCAndXRmLTgnKTtcbiAgY29uc29sZS53YXJuKGBHZW5lcmF0ZWQgc2lkZWJhciB3aXRoICR7U3RyaW5nKGdyb3Vwcy5sZW5ndGgpfSB0b3AtbGV2ZWwgbW9kdWxlIGdyb3Vwc2ApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBjbGFzcydzIGNvbnN0cnVjdG9yIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGNvbnN0cnVjdG9yID0gaW5mby5jb25zdHJ1Y3RvckluZm87XG4gIGlmICghY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY3RvclNpZyA9IGBuZXcgJHtuYW1lfSR7Y29uc3RydWN0b3Iuc2lnbmF0dXJlfWA7XG4gIGNvbnN0IGN0b3JEZXNjID0gY29uc3RydWN0b3IuZGVzY3JpcHRpb25cbiAgICA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MoY29uc3RydWN0b3IuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICA6ICcnO1xuICBsaW5lcy5wdXNoKGA8Q29uc3RydWN0b3JCbG9jayBzaWduYXR1cmU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShjdG9yU2lnKX1cIiR7Y3RvckRlc2N9IC8+YCwgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYW4gZW51bSdzIG1lbWJlcnMuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRW51bVBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwiZW51bVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiAvPmAsICcnKTtcblxuICBpZiAoaW5mby5lbnVtTWVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5lcy5wdXNoKCcqKk1lbWJlcnM6KionLCAnJywgJ3wgTWVtYmVyIHwgVmFsdWUgfCBEZXNjcmlwdGlvbiB8JywgJ3wgOi0tIHwgOi0tIHwgOi0tIHwnKTtcbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgaW5mby5lbnVtTWVtYmVycykge1xuICAgIGNvbnN0IHZhbHVlID0gbWVtYmVyLnZhbHVlID8gYFxcYCR7ZXNjYXBlTWFya2Rvd24obWVtYmVyLnZhbHVlKX1cXGBgIDogJyc7XG4gICAgbGluZXMucHVzaChgfCBcXGAke21lbWJlci5uYW1lfVxcYCB8ICR7dmFsdWV9IHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MobWVtYmVyLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKX0gfGApO1xuICB9XG4gIGxpbmVzLnB1c2goJycpO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgU3RhcmxpZ2h0IGZyb250bWF0dGVyIGJsb2NrICh0aHJvdWdoIHRoZSBjbG9zaW5nIGAtLS1gIGFuZCBpdHMgYmxhbmsgbGluZSkgc2hhcmVkIGJ5IGV2ZXJ5XG4gKiBnZW5lcmF0ZWQgcGFnZSBraW5kOiBtb2R1bGUgaW5kZXgsIHR5cGUgb3ZlcnZpZXcsIHByb3BlcnR5LCBhbmQgbWV0aG9kLlxuICpcbiAqIEV2ZXJ5IHBhZ2Uga2luZCBnb2VzIHRocm91Z2ggaGVyZSBzbyBubyBmaWVsZCBjYW4gYmUgZW1pdHRlZCBvbiBzb21lIGtpbmRzIGFuZCBzaWxlbnRseSBkcm9wcGVkIG9uXG4gKiBvdGhlcnMuIGBkZXNjcmlwdGlvbmAgaW4gcGFydGljdWxhciBpcyBub3QganVzdCBTRU8gbWV0YWRhdGEg4oCUIGl0IGlzIHRoZSBsaW5lIHRoZSBPRyBjYXJkIHJlbmRlcnMgdW5kZXJcbiAqIHRoZSB0aXRsZSwgc28gYSBwYWdlIGtpbmQgdGhhdCBza2lwcGVkIGl0IHByb2R1Y2VkIGEgdGl0bGUtb25seSBjYXJkIG5leHQgdG8gZnVsbHkgcG9wdWxhdGVkIG9uZXMuXG4gKlxuICogQHBhcmFtIGZyb250TWF0dGVyIC0gVGhlIHBhZ2UncyBmcm9udG1hdHRlciBmaWVsZHMuXG4gKiBAcmV0dXJucyBUaGUgZnJvbnRtYXR0ZXIgbGluZXMsIHRocm91Z2ggdGhlIGNsb3NpbmcgYC0tLWAgYW5kIGl0cyBibGFuayBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRnJvbnRNYXR0ZXIoZnJvbnRNYXR0ZXI6IFBhZ2VGcm9udE1hdHRlcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAnLS0tJyxcbiAgICBgdGl0bGU6IFwiJHtlc2NhcGVZYW1sKGZyb250TWF0dGVyLnRpdGxlKX1cImAsXG4gICAgYHNsdWc6IFwiJHtmcm9udE1hdHRlci5zbHVnfVwiYCxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuZGVzY3JpcHRpb24gPyBbYGRlc2NyaXB0aW9uOiBcIiR7ZXNjYXBlWWFtbChzdHJpcE1hcmtkb3duKGZyb250TWF0dGVyLmRlc2NyaXB0aW9uKSl9XCJgXSA6IFtdKSxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuc2lnbmF0dXJlID8gW2BzaWduYXR1cmU6IFwiJHtlc2NhcGVZYW1sKHRydW5jYXRlU2lnbmF0dXJlKGZyb250TWF0dGVyLnNpZ25hdHVyZSkpfVwiYF0gOiBbXSksXG4gICAgJ2VkaXRVcmw6IGZhbHNlJyxcbiAgICAnc2lkZWJhcjonLFxuICAgIGAgIGxhYmVsOiBcIiR7ZXNjYXBlWWFtbChmcm9udE1hdHRlci5zaWRlYmFyTGFiZWwpfVwiYCxcbiAgICAnLS0tJyxcbiAgICAnJ1xuICBdO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBmdW5jdGlvbidzIHNpZ25hdHVyZSwgcGFyYW1ldGVycywgcmV0dXJuIHZhbHVlIGFuZCBleGFtcGxlcy5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJGdW5jdGlvblBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCAkZnVuY3Rpb24gPSBpbmZvLm1ldGhvZHNbMF07XG4gIGlmICghJGZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGluZXMucHVzaCgnKipTaWduYXR1cmU6KionLCAnJywgJ2BgYHRzJywgYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCwgJ2BgYCcsICcnKTtcblxuICBpZiAoJGZ1bmN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGxpbmVzLnB1c2goJyoqUGFyYW1ldGVyczoqKicsICcnLCAnfCBQYXJhbWV0ZXIgfCBUeXBlIHwgRGVzY3JpcHRpb24gfCcsICd8IDotLSB8IDotLSB8IDotLSB8Jyk7XG4gICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgJGZ1bmN0aW9uLnBhcmFtZXRlcnMpIHtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGB8IFxcYCR7cGFyYW1ldGVyLm5hbWV9XFxgIHwgJHtlc2NhcGVNYXJrZG93bihlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocGFyYW1ldGVyLnR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKHBhcmFtZXRlci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9IHxgXG4gICAgICApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgfVxuXG4gIGNvbnN0IHJldHVybkRlc2MgPSAkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24gPyBgIOKAlCAke2VzY2FwZU1keFByb3NlKHJlc29sdmVMaW5rcygkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfWAgOiAnJztcbiAgbGluZXMucHVzaChgKipSZXR1cm5zOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcygkZnVuY3Rpb24ucmV0dXJuVHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9JHtyZXR1cm5EZXNjfWAsICcnKTtcblxuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgJGZ1bmN0aW9uLmV4YW1wbGVzKSB7XG4gICAgbGluZXMucHVzaCgnKipFeGFtcGxlOioqJywgJycsIHJlbmRlckV4YW1wbGVNZHgoZXhhbXBsZSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBvbmUgbWV0aG9kIG92ZXJsb2FkLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBvdmVybG9hZCAtIFRoZSBvdmVybG9hZC5cbiAqIEBwYXJhbSB0eXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZE92ZXJsb2FkTWR4KGxpbmVzOiBzdHJpbmdbXSwgb3ZlcmxvYWQ6IE1lbWJlckluZm8sIHR5cGVOYW1lOiBzdHJpbmcsIG5hbWVzcGFjZTogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHNpZyA9IGAke292ZXJsb2FkLnNpZ25hdHVyZX06ICR7b3ZlcmxvYWQucmV0dXJuVHlwZX1gO1xuICBjb25zdCBzdGF0aWNBdHRyaWJ1dGUgPSBvdmVybG9hZC5pc1N0YXRpYyA/ICcgaXNTdGF0aWM9e3RydWV9JyA6ICcnO1xuICBjb25zdCBkZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQuZGVzY3JpcHRpb24gPyBgIGRlc2NyaXB0aW9uPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gb3ZlcmxvYWQucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5yZW1hcmtzLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCBzaW5jZUF0dHJpYnV0ZSA9IG92ZXJsb2FkLnNpbmNlID8gYCBzaW5jZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG92ZXJsb2FkLnNpbmNlKX1cImAgOiAnJztcbiAgY29uc3QgcmV0dXJuVHlwZUF0dHJpYnV0ZSA9IGAgcmV0dXJuVHlwZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3Mob3ZlcmxvYWQucmV0dXJuVHlwZSwgYWxsVHlwZXMsIHR5cGVOYW1lLCBuYW1lc3BhY2UpKSl9XCJgO1xuICBjb25zdCByZXR1cm5EZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb25cbiAgICA/IGAgcmV0dXJuRGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgXG4gICAgOiAnJztcbiAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBvdmVybG9hZC5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShvdmVybG9hZC5leGFtcGxlcyl9fWAgOiAnJztcblxuICBjb25zdCBwYXJhbXMgPSBvdmVybG9hZC5wYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHtcbiAgICBkZXNjcmlwdGlvbjogbWFya2Rvd25Ub0h0bWwocC5kZXNjcmlwdGlvbiB8fCAocC5uYW1lLmVuZHNXaXRoKCc/JykgPyAnKihPcHRpb25hbCkqJyA6ICcnKSksXG4gICAgbmFtZTogcC5uYW1lLFxuICAgIHR5cGU6IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocC50eXBlLCBhbGxUeXBlcywgdHlwZU5hbWUsIG5hbWVzcGFjZSkpXG4gIH0pKTtcbiAgY29uc3QgcGFyYW1zQXR0cmlidXRlID0gcGFyYW1zLmxlbmd0aCA+IDAgPyBgIHBhcmFtZXRlcnM9eyR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX19YCA6ICcnO1xuXG4gIGxpbmVzLnB1c2goXG4gICAgYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0gc2lnbmF0dXJlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUoc2lnKX1cIiR7ZGVzY0F0dHJpYnV0ZX0ke3JlbWFya3NBdHRyaWJ1dGV9JHtzaW5jZUF0dHJpYnV0ZX0ke3JldHVyblR5cGVBdHRyaWJ1dGV9JHtyZXR1cm5EZXNjQXR0cmlidXRlfSR7cGFyYW1zQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlJ3MgbWV0aG9kIHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZFRhYmxlTWR4KGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgbWV0aG9kcyA9IFsuLi5pbmZvLm1ldGhvZHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5pc1N0YXRpYyAhPT0gYi5pc1N0YXRpYykge1xuICAgICAgcmV0dXJuIGEuaXNTdGF0aWMgPyAxIDogLTE7XG4gICAgfVxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICB9KTtcbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxpbmVzLnB1c2goJzxNZXRob2RUYWJsZSByb3dzPXtbJyk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG1ldGhvZC5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpO1xuICAgIGNvbnN0IHN0YXRpY1ByZWZpeCA9IG1ldGhvZC5pc1N0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuICAgIGNvbnN0IHNob3J0UGFyYW1zID0gbWV0aG9kLnBhcmFtZXRlcnMubWFwKChwLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwICYmIEVWRU5UX01FVEhPRFMuaGFzKG1ldGhvZC5uYW1lKSAmJiAocC50eXBlLnN0YXJ0c1dpdGgoJ1wiJykgfHwgcC50eXBlLnN0YXJ0c1dpdGgoJ1xcJycpKSA/IHAudHlwZS5yZXBsYWNlQWxsKCdcIicsICdcXCcnKSA6IHAubmFtZTtcbiAgICB9KS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHNob3J0U2lnID0gYCR7c3RhdGljUHJlZml4fSR7bWV0aG9kLm5hbWV9KCR7c2hvcnRQYXJhbXN9KWA7XG4gICAgY29uc3Qgc2lnID0gZXNjYXBlSnNTdHJpbmcoc2hvcnRTaWcpO1xuICAgIGNvbnN0IHNsdWcgPSBvdmVybG9hZFJvdXRlU2VnbWVudChtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKG1ldGhvZC5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGNvbnN0IGluaGVyaXRlZEF0dHJpYnV0ZSA9IG1ldGhvZC5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgICAgOiAnJztcbiAgICBjb25zdCBocmVmID0gbWVtYmVySHJlZihzbHVnLCBtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBzaWduYXR1cmU6IFwiJHtzaWd9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgcmV0dXJuczogXCIke2VzY2FwZUpzU3RyaW5nKHJldHVyblR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSdzIHByb3BlcnR5IHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByb3BlcnR5VGFibGVNZHgobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gaW5mby5wcm9wZXJ0aWVzO1xuICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGluZXMucHVzaCgnPFByb3BlcnR5VGFibGUgcm93cz17WycpO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKHByb3BlcnR5LmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSk7XG4gICAgY29uc3QgdHlwZSA9IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocHJvcGVydHkudHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBjb25zdCBpbmhlcml0ZWRBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhyZWYgPSBtZW1iZXJIcmVmKG1lbWJlclJvdXRlU2VnbWVudChwcm9wZXJ0eS5uYW1lKSwgcHJvcGVydHkuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBuYW1lOiBcIiR7ZXNjYXBlSnNTdHJpbmcocHJvcGVydHkubmFtZSl9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgdHlwZTogXCIke2VzY2FwZUpzU3RyaW5nKHR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSBhbGlhcydzIHNpZ25hdHVyZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUeXBlQWxpYXNQYWdlKGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgdHlwZVBhcmFtc0F0dHJpYnV0ZSA9IGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IGAgdHlwZVBhcmFtcz17JHtKU09OLnN0cmluZ2lmeShpbmZvLnR5cGVQYXJhbWV0ZXJzKX19YCA6ICcnO1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwidHlwZVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiR7dHlwZVBhcmFtc0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgY29uc3QgcmhzID0gaW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJztcbiAgbGluZXMucHVzaChcbiAgICAnKipTaWduYXR1cmU6KionLFxuICAgICcnLFxuICAgICdgYGB0cycsXG4gICAgYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7cmhzfWAsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgYCoqVHlwZToqKiAke2VzY2FwZU1keEJyYWNlcyhlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocmhzLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX1gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHZhcmlhYmxlJ3MgZGVjbGFyYXRpb24gYW5kIHR5cGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJWYXJpYWJsZVBhZ2UobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGtleXdvcmQgPSBpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0JztcbiAgY29uc3QgdmFyaWFibGVUeXBlID0gaW5mby52YXJpYWJsZVR5cGUgPz8gJ3Vua25vd24nO1xuICBsaW5lcy5wdXNoKFxuICAgICcqKlNpZ25hdHVyZToqKicsXG4gICAgJycsXG4gICAgJ2BgYHRzJyxcbiAgICBgJHtrZXl3b3JkfSAke25hbWV9OiAke3ZhcmlhYmxlVHlwZX1gLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgIGAqKlR5cGU6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKHZhcmlhYmxlVHlwZSwgYWxsVHlwZXMsIG5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfWAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5hbWVzcGFjZSB0cmVlIG5vZGUgaW50byBhIHNpZGViYXIgZ3JvdXAuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZS5cbiAqIEBwYXJhbSBsYWJlbCAtIFRoZSBncm91cCdzIGxhYmVsLlxuICogQHJldHVybnMgVGhlIHNpZGViYXIgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWRlYmFyVHJlZVRvRW50cmllcyhub2RlOiBTaWRlYmFyVHJlZU5vZGUsIGxhYmVsOiBzdHJpbmcpOiBTaWRlYmFyRW50cnkge1xuICBjb25zdCBpdGVtczogKFNpZGViYXJFbnRyeSB8IFNpZGViYXJMaW5rKVtdID0gW107XG5cbiAgLy8gQ2hpbGQgZGlyZWN0b3J5IGdyb3VwcyBmaXJzdCAoYmVmb3JlIHRoaXMgbW9kdWxlJ3Mgb3duIHBhZ2VzKVxuICBjb25zdCBzb3J0ZWRDaGlsZHJlbiA9IFsuLi5ub2RlLmNoaWxkcmVuXS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgZm9yIChjb25zdCBbY2hpbGROYW1lLCBjaGlsZF0gb2Ygc29ydGVkQ2hpbGRyZW4pIHtcbiAgICBpdGVtcy5wdXNoKHNpZGViYXJUcmVlVG9FbnRyaWVzKGNoaWxkLCBjaGlsZE5hbWUpKTtcbiAgfVxuXG4gIC8vIFRoaXMgbW9kdWxlJ3Mgb3duIG92ZXJ2aWV3IHBhZ2UgKyB0eXBlL2Z1bmN0aW9uIHBhZ2VzIChpbmRpdmlkdWFsIG1lbWJlcnMgYXJlIG5vdCBsaXN0ZWQpLlxuICAvLyBTaWRlYmFyIGBsaW5rYCBmaWVsZHMgbXVzdCBOT1QgZW1iZWQgQkFTRV9QQVRIOiBTdGFybGlnaHQgcHJlcGVuZHMgdGhlIGNvbmZpZyBgYmFzZWAgdG8gZXZlcnlcbiAgLy8gc2lkZWJhciBsaW5rIGl0c2VsZiwgc28gaW5jbHVkaW5nIGl0IGhlcmUgd291bGQgZG91YmxlIHRoZSBiYXNlIChlLmcuIGAvYmFzZS9iYXNlL2FwaS8uLi5gIOKGkiA0MDQpLlxuICAvLyBUaGlzIGRpZmZlcnMgZnJvbSBpbi1jb250ZW50IGxpbmtzLCB3aGljaCBhcmUgcmF3IGFuY2hvcnMgdGhhdCBTdGFybGlnaHQgZG9lcyBub3QgYmFzZS1wcmVwZW5kLlxuICBpZiAobm9kZS50eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUudHlwZXNbMF0pO1xuICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ092ZXJ2aWV3JywgbGluazogYC9hcGkvJHtuYW1lc3BhY2V9L2AgfSk7XG4gICAgY29uc3Qgc29ydGVkVHlwZXMgPSBbLi4ubm9kZS50eXBlc10uc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gICAgZm9yIChjb25zdCB0IG9mIHNvcnRlZFR5cGVzKSB7XG4gICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6IHQubmFtZSwgbGluazogYC9hcGkvJHt0Lm5hbWVzcGFjZX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQodC5uYW1lc3BhY2UsIHQubmFtZSl9L2AgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY29sbGFwc2VkOiB0cnVlLCBpdGVtcywgbGFiZWwgfTtcbn1cblxuLy8gU2VydmVzIGJvdGggYXMgdGhlIHJvb3QgQVBJIHBhZ2UncyBwcm9zZSBhbmQgKHN0cmlwcGVkKSBhcyBpdHMgYGRlc2NyaXB0aW9uYCBmcm9udG1hdHRlci5cbi8vIFNoYXJpbmcgb25lIGZ1bmN0aW9uIGtlZXBzIHRoZSBwYWdlIGFuZCBpdHMgT0cgY2FyZCBmcm9tIGRyaWZ0aW5nIGFwYXJ0LlxuLy8gQW4gYGltcG9ydFN0YXRlbWVudGAgaG9vaywgbm90IHRoZSBtb2R1bGUgcGF0aCBvciB0aGUgYmFycmVsLCBkZWNpZGVzIHdoZXJlIGFuIGV4cG9ydCBpcyBpbXBvcnRlZCBmcm9tLCBzbyB0aGVcbi8vIGdlbmVyYXRlZCBwcm9zZSBjbGFpbXMgbmVpdGhlciB1bmRlciBvbmUuXG5mdW5jdGlvbiBnZXRBcGlJbmRleEludHJvKG5hbWVzcGFjZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcGlJbmRleEludHJvLCBpbXBvcnRTdGF0ZW1lbnQsIHBhY2thZ2VOYW1lLCBwdWJsaWNBcGlFbnRyeSB9ID0gZ2V0QXBpRG9jU2V0dGluZ3MoKTtcbiAgaWYgKGFwaUluZGV4SW50cm8gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBhcGlJbmRleEludHJvO1xuICB9XG4gIGNvbnN0IGludHJvID0gYFRoZSBjb21wbGV0ZSBBUEkgcmVmZXJlbmNlIGZvciBcXGAke3BhY2thZ2VOYW1lfVxcYCwgZ2VuZXJhdGVkIGZyb20gaXRzIFRTRG9jLiBgO1xuICBpZiAoaW1wb3J0U3RhdGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYCR7aW50cm99VGhlIG1vZHVsZXMgYmVsb3cgZ3JvdXAgdGhlIGV4cG9ydHMgYnkgc291cmNlIG1vZHVsZTsgZWFjaCBleHBvcnQncyBwYWdlIHNob3dzIHRoZSBzdGF0ZW1lbnQgaXQgaXMgaW1wb3J0ZWQgd2l0aC5gO1xuICB9XG4gIGlmIChwdWJsaWNBcGlFbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGAke2ludHJvfUV2ZXJ5IGV4cG9ydCBpcyBpbXBvcnRlZCBmcm9tIHRoZSBwYWNrYWdlIHJvb3QsIFxcYCR7cGFja2FnZU5hbWV9XFxgOyB0aGUgbW9kdWxlcyBiZWxvdyBncm91cCB0aGVtIGJ5IHNvdXJjZSBtb2R1bGUuYDtcbiAgfVxuICBjb25zdCBbZXhhbXBsZU5hbWVzcGFjZSA9ICdtb2R1bGUnXSA9IG5hbWVzcGFjZXM7XG4gIHJldHVybiBgJHtpbnRyb31FYWNoIG1vZHVsZSBiZWxvdyBtYXBzIHRvIGFuIGltcG9ydCBzdWJwYXRoIChlLmcuIHRoZSBcXGAke2V4YW1wbGVOYW1lc3BhY2V9XFxgIG1vZHVsZSBpcyBcXGAke3BhY2thZ2VOYW1lfS8ke2V4YW1wbGVOYW1lc3BhY2V9XFxgKS5gO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRJbXBvcnRzKGNvbXBvbmVudE5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbXBvbmVudE5hbWVzLm1hcCgoY29tcG9uZW50TmFtZSkgPT4gYGltcG9ydCAke2NvbXBvbmVudE5hbWV9IGZyb20gXCIke0FQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVh9LyR7Y29tcG9uZW50TmFtZX0uYXN0cm9cIjtgKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTmFtZXNwYWNlVGFibGUoXG4gIGxpbmVzOiBzdHJpbmdbXSxcbiAgaGVhZGluZzogc3RyaW5nLFxuICBjb2x1bW5MYWJlbDogc3RyaW5nLFxuICBlbnRyaWVzOiBUeXBlSW5mb1tdLFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBuYW1lc3BhY2U6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzb3J0ZWQgPSBbLi4uZW50cmllc10uc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIGxpbmVzLnB1c2goYCMjICR7aGVhZGluZ31gLCAnJywgYHwgJHtjb2x1bW5MYWJlbH0gfCBEZXNjcmlwdGlvbiB8YCwgJ3wgOi0tIHwgOi0tIHwnKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBzb3J0ZWQpIHtcbiAgICBsaW5lcy5wdXNoKGB8IFske2VudHJ5Lm5hbWV9XSguLyR7dG9UeXBlUm91dGVTZWdtZW50KGVudHJ5Lm5hbWVzcGFjZSwgZW50cnkubmFtZSl9LykgfCAke2VzY2FwZU1hcmtkb3duKHJlc29sdmVMaW5rcyhlbnRyeS5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIG5hbWVzcGFjZSkpfSB8YCk7XG4gIH1cbiAgbGluZXMucHVzaCgnJyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT0EsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxZQUFZO0FBWXJCLFNBQVMscUJBQXFCO0FBQzlCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0NBQW9DO0FBRTdDLE1BQU0sY0FBYztBQVFwQixlQUFzQix3QkFDcEIsY0FDQSxVQUNlO0FBQ2YsUUFBTSxZQUFZLDBCQUEwQixjQUFjLFFBQVE7QUFFbEUsYUFBVyxDQUFDLEtBQUssRUFBRSxTQUFTLFNBQVMsQ0FBQyxLQUFLLGNBQWM7QUFD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
@@ -9,6 +9,11 @@
9
9
  * The settings the API documentation generator reads while it renders pages and links.
10
10
  */
11
11
  export interface ApiDocSettings {
12
+ /**
13
+ * The root API page's intro, as Markdown, in place of the generated one; stripped of its Markdown, it is also the
14
+ * page's `description`. For a package whose arrangement the generated intro cannot explain.
15
+ */
16
+ readonly apiIndexIntro?: string | undefined;
12
17
  /**
13
18
  * The site's base path, with a leading slash and no trailing one, e.g. `/typescript-lib`. Every in-content link
14
19
  * the generator emits starts with it.
@@ -57,6 +62,13 @@ export interface ApiDocSettings {
57
62
  * declaration resolves into one of these packages links to its page on that site.
58
63
  */
59
64
  readonly packageSites: ReadonlyMap<string, string>;
65
+ /**
66
+ * The absolute path of the package's one public entry point, for a package that publishes its API from a barrel
67
+ * rather than one import subpath per module. Set, the reference documents only the exports that barrel re-exports,
68
+ * found by following its `export ... from` statements rather than by walking the source folder, and every import
69
+ * statement imports from the package root. A namespace still groups the reference by source module.
70
+ */
71
+ readonly publicApiEntry?: string | undefined;
60
72
  /**
61
73
  * The JSON file the generated Starlight sidebar is written to.
62
74
  */
@@ -19,4 +19,4 @@ export {
19
19
  configureApiDocs,
20
20
  getApiDocSettings
21
21
  };
22
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9hcGktZG9jLXNldHRpbmdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBlci1zaXRlIHNldHRpbmdzIG9mIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3I6IHdoZXJlIGl0IHdyaXRlcywgd2hpY2ggcGFja2FnZSBpdCBkb2N1bWVudHMsIHRoZSBiYXNlXG4gKiBwYXRoIGl0cyBsaW5rcyBjYXJyeSwgYW5kIHRoZSBleHRlcm5hbCBsaW5rcyBhIHNpdGUgYWRkcyB0byB0aGUgZ2VuZXJpYyBvbmVzLlxuICovXG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgcmVhZHMgd2hpbGUgaXQgcmVuZGVycyBwYWdlcyBhbmQgbGlua3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRG9jU2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIHNpdGUncyBiYXNlIHBhdGgsIHdpdGggYSBsZWFkaW5nIHNsYXNoIGFuZCBubyB0cmFpbGluZyBvbmUsIGUuZy4gYC90eXBlc2NyaXB0LWxpYmAuIEV2ZXJ5IGluLWNvbnRlbnQgbGlua1xuICAgKiB0aGUgZ2VuZXJhdG9yIGVtaXRzIHN0YXJ0cyB3aXRoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogRm9sZGVyIG5hbWVzIHdob3NlIHN1YnRyZWUgaXMgbm90IGRvY3VtZW50ZWQsIGluIGFkZGl0aW9uIHRvIGBAdHlwZXNgLCBgc3R5bGVzYCBhbmQgYHRlc3QtaGVscGVyc2AuIEFwcGxpZXNcbiAgICogdG8gdGhpcyBzaXRlJ3Mgc291cmNlIHdhbGsgb25seTogYSBsaW5rIGludG8gYW5vdGhlciBwYWNrYWdlJ3Mgc2l0ZSBhc3N1bWVzIHRoYXQgc2l0ZSdzIGdlbmVyYXRvciBza2lwcGVkIHRoZVxuICAgKiBkZWZhdWx0IGZvbGRlcnMgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZERpcmVjdG9yaWVzPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFR5cGUgbmFtZXMgbWFwcGVkIHRvIHRoZSBVUkwgdGhlaXIgcmVmZXJlbmNlcyBsaW5rIHRvLCBmb3IgdHlwZXMgbmVpdGhlciB0aGlzIHBhY2thZ2Ugbm9yIGEge0BsaW5rIHBhY2thZ2VTaXRlc31cbiAgICogcGFja2FnZSBkZWNsYXJlcywgZS5nLiBhbiBlY29zeXN0ZW0ncyBvd24gQVBJIHJlZmVyZW5jZS4gQ29uc3VsdGVkIGJlZm9yZSB0aGUgZ2VuZXJpYyBUeXBlU2NyaXB0LCBKYXZhU2NyaXB0IGFuZFxuICAgKiBXZWIgQVBJIGxpbmtzLCBzbyBhbiBlbnRyeSBoZXJlIHdpbnMgb3ZlciB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxUeXBlTGlua3M6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogTmFtZXMgdGhhdCBhcmUgbmV2ZXIgbGlua2VkIGFzIHR5cGVzLCBpbiBhZGRpdGlvbiB0byB0aGUgYnVpbHQtaW4gZ2VuZXJpYyBwYXJhbWV0ZXIgbmFtZXMgYW5kIGV2ZXJ5IHR5cGVcbiAgICogcGFyYW1ldGVyIGEgZG9jdW1lbnRlZCB0eXBlIGRlY2xhcmVzOiB0eXBlIHBhcmFtZXRlcnMgdGhlIHNjYW4gZG9lcyBub3QgZmluZC5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyaWNUeXBlUGFyYW1ldGVycz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgZWFjaCBleHBvcnQncyBpbXBvcnQgc3RhdGVtZW50LCBmb3IgYSBwYWNrYWdlIHdob3NlIGV4cG9ydHMgYXJlIG5vdCBpbXBvcnRlZCBmcm9tXG4gICAqIGA8cGFja2FnZU5hbWU+LzxuYW1lc3BhY2U+YCwgZS5nLiBvbmUgcHVibGlzaGluZyBiYXJyZWwgZW50cnkgcG9pbnRzLiBSZXR1cm5pbmcgYHVuZGVmaW5lZGAgc2hvd3Mgbm8gc3RhdGVtZW50LlxuICAgKiBVbnNldCwgZXZlcnkgc3RhdGVtZW50IGlzIHRoZSB7QGxpbmsgSW1wb3J0U3RhdGVtZW50Q29udGV4dC5kZWZhdWx0SW1wb3J0U3RhdGVtZW50fS5cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydFN0YXRlbWVudD86IEltcG9ydFN0YXRlbWVudFByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNhc2UtcHJlc2VydmVkIHJvdXRlIHNlZ21lbnQgb2YgYSBtZW1iZXIncyBwYWdlLCBvdmVycmlkaW5nIHRoZSBnZW5lcmF0b3IncyBzbHVnIHdoZXJlIGl0IHJldHVybnMgYVxuICAgKiBzdHJpbmcuIFRoZSBmaWxlIGlzIHdyaXR0ZW4gdW5kZXIgdGhlIHNlZ21lbnQgbG93ZXJjYXNlZC4gVGhlIGdlbmVyYXRvcidzIG93biBzbHVnIGFscmVhZHkga2VlcHMgYSBuYW1lJ3NcbiAgICogdHJhaWxpbmcgdW5kZXJzY29yZXMsIHNvIGBjcmVhdGVfX2AgYW5kIGBjcmVhdGVgIG5ldmVyIHNoYXJlIGEgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlclJvdXRlU2VnbWVudD86IE1lbWJlclJvdXRlU2VnbWVudFByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHRoZSBnZW5lcmF0ZWQgQVBJIHBhZ2VzIGFyZSB3cml0dGVuIHRvLCBub3JtYWxseSBgPGRvY3M+L3NyYy9jb250ZW50L2RvY3MvYXBpYC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dERpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jdW1lbnRlZCBwYWNrYWdlJ3MgbmFtZSwgZS5nLiBgQG1uYW91bW92L3R5cGVzY3JpcHQtbGliYC4gSW1wb3J0IHN0YXRlbWVudHMgYXJlIGJ1aWx0IGZyb20gaXQsIHVubGVzc1xuICAgKiB7QGxpbmsgaW1wb3J0U3RhdGVtZW50fSBidWlsZHMgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZXMgbWFwcGVkIHRvIHRoZSByb290IFVSTCBvZiB0aGVpciBkb2N1bWVudGF0aW9uIHNpdGUsIHdpdGggYSB0cmFpbGluZyBzbGFzaC4gQSB0eXBlIHdob3NlXG4gICAqIGRlY2xhcmF0aW9uIHJlc29sdmVzIGludG8gb25lIG9mIHRoZXNlIHBhY2thZ2VzIGxpbmtzIHRvIGl0cyBwYWdlIG9uIHRoYXQgc2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VTaXRlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgSlNPTiBmaWxlIHRoZSBnZW5lcmF0ZWQgU3RhcmxpZ2h0IHNpZGViYXIgaXMgd3JpdHRlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IHNpZGViYXJGaWxlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgQXBpRG9jU2V0dGluZ3MuaW1wb3J0U3RhdGVtZW50fSBpcyB0b2xkIGFib3V0IHRoZSBleHBvcnQgd2hvc2UgaW1wb3J0IHN0YXRlbWVudCBpdCBidWlsZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0U3RhdGVtZW50Q29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgc3RhdGVtZW50IHRoZSBnZW5lcmF0b3Igd3JpdGVzIHdoZW4gbm8gaG9vayBpcyBzZXQsIGUuZy5cbiAgICogYGltcG9ydCB0eXBlIHsgQWxwaGEgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYWxwaGEnO2AuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0SW1wb3J0U3RhdGVtZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGV4cG9ydCBpcyBhIHR5cGUgb25seSAoYW4gaW50ZXJmYWNlLCBhIHR5cGUgYWxpYXMgb3IgYW4gZW51bSksIGltcG9ydGVkIHdpdGggYGltcG9ydCB0eXBlYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzVHlwZU9ubHk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBleHBvcnQncyBraW5kLCBlLmcuIGBjbGFzc2AsIGBmdW5jdGlvbmAsIGBpbnRlcmZhY2VgLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwb3J0J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGV4cG9ydCdzIG5hbWVzcGFjZTogaXRzIHNvdXJjZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZm9sZGVyLCB3aXRob3V0IGl0cyBleHRlbnNpb24uXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGltcG9ydCBzdGF0ZW1lbnQgb2YgYSBkb2N1bWVudGVkIGV4cG9ydC5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBleHBvcnQuXG4gKiBAcmV0dXJucyBUaGUgc3RhdGVtZW50LCBvciBgdW5kZWZpbmVkYCB0byBzaG93IG5vbmUuXG4gKi9cbmV4cG9ydCB0eXBlIEltcG9ydFN0YXRlbWVudFByb3ZpZGVyID0gKGNvbnRleHQ6IEltcG9ydFN0YXRlbWVudENvbnRleHQpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNhc2UtcHJlc2VydmVkIHJvdXRlIHNlZ21lbnQgb2YgYSBtZW1iZXIncyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gQSBwcm9wZXJ0eSdzIG5hbWUsIG9yIGEgbWV0aG9kJ3Mgb3ZlcmxvYWQga2V5OiBpdHMgbmFtZSwgb3IgYG9uKCdjaGFuZ2VkJylgIGZvciBhbiBldmVudCBtZXRob2RcbiAqIGtleWVkIGJ5IGl0cyBmaXJzdCBhcmd1bWVudC5cbiAqIEByZXR1cm5zIFRoZSBzZWdtZW50LCBvciBgdW5kZWZpbmVkYCBmb3IgdGhlIGdlbmVyYXRvcidzIG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgTWVtYmVyUm91dGVTZWdtZW50UHJvdmlkZXIgPSAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmludGVyZmFjZSBNb2R1bGVTdGF0ZSB7XG4gIHNldHRpbmdzOiBBcGlEb2NTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgbW9kdWxlU3RhdGU6IE1vZHVsZVN0YXRlID0ge1xuICBzZXR0aW5nczogdW5kZWZpbmVkXG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHNldHRpbmdzIGV2ZXJ5IGxhdGVyIHBhZ2UgYW5kIGxpbmsgcmVhZHMuXG4gKlxuICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlQXBpRG9jcyhzZXR0aW5nczogQXBpRG9jU2V0dGluZ3MpOiB2b2lkIHtcbiAgbW9kdWxlU3RhdGUuc2V0dGluZ3MgPSBzZXR0aW5ncztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzZXR0aW5ncyBzZXQgYnkge0BsaW5rIGNvbmZpZ3VyZUFwaURvY3N9LlxuICpcbiAqIEByZXR1cm5zIFRoZSBzZXR0aW5ncy5cbiAqIEB0aHJvd3MgSWYge0BsaW5rIGNvbmZpZ3VyZUFwaURvY3N9IGhhcyBub3QgYmVlbiBjYWxsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcGlEb2NTZXR0aW5ncygpOiBBcGlEb2NTZXR0aW5ncyB7XG4gIGlmIChtb2R1bGVTdGF0ZS5zZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQVBJIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yIGlzIG5vdCBjb25maWd1cmVkOiBjYWxsIGNvbmZpZ3VyZUFwaURvY3MoKSBmaXJzdC4nKTtcbiAgfVxuXG4gIHJldHVybiBtb2R1bGVTdGF0ZS5zZXR0aW5ncztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBOEhBLE1BQU0sY0FBMkI7QUFBQSxFQUMvQixVQUFVO0FBQ1o7QUFPTyxTQUFTLGlCQUFpQixVQUFnQztBQUMvRCxjQUFZLFdBQVc7QUFDekI7QUFRTyxTQUFTLG9CQUFvQztBQUNsRCxNQUFJLFlBQVksYUFBYSxRQUFXO0FBQ3RDLFVBQU0sSUFBSSxNQUFNLG1GQUFtRjtBQUFBLEVBQ3JHO0FBRUEsU0FBTyxZQUFZO0FBQ3JCOyIsCiAgIm5hbWVzIjogW10KfQo=
22
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9hcGktZG9jLXNldHRpbmdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBlci1zaXRlIHNldHRpbmdzIG9mIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3I6IHdoZXJlIGl0IHdyaXRlcywgd2hpY2ggcGFja2FnZSBpdCBkb2N1bWVudHMsIHRoZSBiYXNlXG4gKiBwYXRoIGl0cyBsaW5rcyBjYXJyeSwgYW5kIHRoZSBleHRlcm5hbCBsaW5rcyBhIHNpdGUgYWRkcyB0byB0aGUgZ2VuZXJpYyBvbmVzLlxuICovXG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgcmVhZHMgd2hpbGUgaXQgcmVuZGVycyBwYWdlcyBhbmQgbGlua3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRG9jU2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIHJvb3QgQVBJIHBhZ2UncyBpbnRybywgYXMgTWFya2Rvd24sIGluIHBsYWNlIG9mIHRoZSBnZW5lcmF0ZWQgb25lOyBzdHJpcHBlZCBvZiBpdHMgTWFya2Rvd24sIGl0IGlzIGFsc28gdGhlXG4gICAqIHBhZ2UncyBgZGVzY3JpcHRpb25gLiBGb3IgYSBwYWNrYWdlIHdob3NlIGFycmFuZ2VtZW50IHRoZSBnZW5lcmF0ZWQgaW50cm8gY2Fubm90IGV4cGxhaW4uXG4gICAqL1xuICByZWFkb25seSBhcGlJbmRleEludHJvPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l0ZSdzIGJhc2UgcGF0aCwgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYW5kIG5vIHRyYWlsaW5nIG9uZSwgZS5nLiBgL3R5cGVzY3JpcHQtbGliYC4gRXZlcnkgaW4tY29udGVudCBsaW5rXG4gICAqIHRoZSBnZW5lcmF0b3IgZW1pdHMgc3RhcnRzIHdpdGggaXQuXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb2xkZXIgbmFtZXMgd2hvc2Ugc3VidHJlZSBpcyBub3QgZG9jdW1lbnRlZCwgaW4gYWRkaXRpb24gdG8gYEB0eXBlc2AsIGBzdHlsZXNgIGFuZCBgdGVzdC1oZWxwZXJzYC4gQXBwbGllc1xuICAgKiB0byB0aGlzIHNpdGUncyBzb3VyY2Ugd2FsayBvbmx5OiBhIGxpbmsgaW50byBhbm90aGVyIHBhY2thZ2UncyBzaXRlIGFzc3VtZXMgdGhhdCBzaXRlJ3MgZ2VuZXJhdG9yIHNraXBwZWQgdGhlXG4gICAqIGRlZmF1bHQgZm9sZGVycyBhbG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkRGlyZWN0b3JpZXM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVHlwZSBuYW1lcyBtYXBwZWQgdG8gdGhlIFVSTCB0aGVpciByZWZlcmVuY2VzIGxpbmsgdG8sIGZvciB0eXBlcyBuZWl0aGVyIHRoaXMgcGFja2FnZSBub3IgYSB7QGxpbmsgcGFja2FnZVNpdGVzfVxuICAgKiBwYWNrYWdlIGRlY2xhcmVzLCBlLmcuIGFuIGVjb3N5c3RlbSdzIG93biBBUEkgcmVmZXJlbmNlLiBDb25zdWx0ZWQgYmVmb3JlIHRoZSBnZW5lcmljIFR5cGVTY3JpcHQsIEphdmFTY3JpcHQgYW5kXG4gICAqIFdlYiBBUEkgbGlua3MsIHNvIGFuIGVudHJ5IGhlcmUgd2lucyBvdmVyIHRoZW0uXG4gICAqL1xuICByZWFkb25seSBleHRlcm5hbFR5cGVMaW5rczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGF0IGFyZSBuZXZlciBsaW5rZWQgYXMgdHlwZXMsIGluIGFkZGl0aW9uIHRvIHRoZSBidWlsdC1pbiBnZW5lcmljIHBhcmFtZXRlciBuYW1lcyBhbmQgZXZlcnkgdHlwZVxuICAgKiBwYXJhbWV0ZXIgYSBkb2N1bWVudGVkIHR5cGUgZGVjbGFyZXM6IHR5cGUgcGFyYW1ldGVycyB0aGUgc2NhbiBkb2VzIG5vdCBmaW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2VuZXJpY1R5cGVQYXJhbWV0ZXJzPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBlYWNoIGV4cG9ydCdzIGltcG9ydCBzdGF0ZW1lbnQsIGZvciBhIHBhY2thZ2Ugd2hvc2UgZXhwb3J0cyBhcmUgbm90IGltcG9ydGVkIGZyb21cbiAgICogYDxwYWNrYWdlTmFtZT4vPG5hbWVzcGFjZT5gLCBlLmcuIG9uZSBwdWJsaXNoaW5nIGJhcnJlbCBlbnRyeSBwb2ludHMuIFJldHVybmluZyBgdW5kZWZpbmVkYCBzaG93cyBubyBzdGF0ZW1lbnQuXG4gICAqIFVuc2V0LCBldmVyeSBzdGF0ZW1lbnQgaXMgdGhlIHtAbGluayBJbXBvcnRTdGF0ZW1lbnRDb250ZXh0LmRlZmF1bHRJbXBvcnRTdGF0ZW1lbnR9LlxuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0U3RhdGVtZW50PzogSW1wb3J0U3RhdGVtZW50UHJvdmlkZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgY2FzZS1wcmVzZXJ2ZWQgcm91dGUgc2VnbWVudCBvZiBhIG1lbWJlcidzIHBhZ2UsIG92ZXJyaWRpbmcgdGhlIGdlbmVyYXRvcidzIHNsdWcgd2hlcmUgaXQgcmV0dXJucyBhXG4gICAqIHN0cmluZy4gVGhlIGZpbGUgaXMgd3JpdHRlbiB1bmRlciB0aGUgc2VnbWVudCBsb3dlcmNhc2VkLiBUaGUgZ2VuZXJhdG9yJ3Mgb3duIHNsdWcgYWxyZWFkeSBrZWVwcyBhIG5hbWUnc1xuICAgKiB0cmFpbGluZyB1bmRlcnNjb3Jlcywgc28gYGNyZWF0ZV9fYCBhbmQgYGNyZWF0ZWAgbmV2ZXIgc2hhcmUgYSBwYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtYmVyUm91dGVTZWdtZW50PzogTWVtYmVyUm91dGVTZWdtZW50UHJvdmlkZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgdGhlIGdlbmVyYXRlZCBBUEkgcGFnZXMgYXJlIHdyaXR0ZW4gdG8sIG5vcm1hbGx5IGA8ZG9jcz4vc3JjL2NvbnRlbnQvZG9jcy9hcGlgLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0RGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2N1bWVudGVkIHBhY2thZ2UncyBuYW1lLCBlLmcuIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgLiBJbXBvcnQgc3RhdGVtZW50cyBhcmUgYnVpbHQgZnJvbSBpdCwgdW5sZXNzXG4gICAqIHtAbGluayBpbXBvcnRTdGF0ZW1lbnR9IGJ1aWxkcyB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUGFja2FnZSBuYW1lcyBtYXBwZWQgdG8gdGhlIHJvb3QgVVJMIG9mIHRoZWlyIGRvY3VtZW50YXRpb24gc2l0ZSwgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLiBBIHR5cGUgd2hvc2VcbiAgICogZGVjbGFyYXRpb24gcmVzb2x2ZXMgaW50byBvbmUgb2YgdGhlc2UgcGFja2FnZXMgbGlua3MgdG8gaXRzIHBhZ2Ugb24gdGhhdCBzaXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZVNpdGVzOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwYWNrYWdlJ3Mgb25lIHB1YmxpYyBlbnRyeSBwb2ludCwgZm9yIGEgcGFja2FnZSB0aGF0IHB1Ymxpc2hlcyBpdHMgQVBJIGZyb20gYSBiYXJyZWxcbiAgICogcmF0aGVyIHRoYW4gb25lIGltcG9ydCBzdWJwYXRoIHBlciBtb2R1bGUuIFNldCwgdGhlIHJlZmVyZW5jZSBkb2N1bWVudHMgb25seSB0aGUgZXhwb3J0cyB0aGF0IGJhcnJlbCByZS1leHBvcnRzLFxuICAgKiBmb3VuZCBieSBmb2xsb3dpbmcgaXRzIGBleHBvcnQgLi4uIGZyb21gIHN0YXRlbWVudHMgcmF0aGVyIHRoYW4gYnkgd2Fsa2luZyB0aGUgc291cmNlIGZvbGRlciwgYW5kIGV2ZXJ5IGltcG9ydFxuICAgKiBzdGF0ZW1lbnQgaW1wb3J0cyBmcm9tIHRoZSBwYWNrYWdlIHJvb3QuIEEgbmFtZXNwYWNlIHN0aWxsIGdyb3VwcyB0aGUgcmVmZXJlbmNlIGJ5IHNvdXJjZSBtb2R1bGUuXG4gICAqL1xuICByZWFkb25seSBwdWJsaWNBcGlFbnRyeT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIEpTT04gZmlsZSB0aGUgZ2VuZXJhdGVkIFN0YXJsaWdodCBzaWRlYmFyIGlzIHdyaXR0ZW4gdG8uXG4gICAqL1xuICByZWFkb25seSBzaWRlYmFyRmlsZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQge0BsaW5rIEFwaURvY1NldHRpbmdzLmltcG9ydFN0YXRlbWVudH0gaXMgdG9sZCBhYm91dCB0aGUgZXhwb3J0IHdob3NlIGltcG9ydCBzdGF0ZW1lbnQgaXQgYnVpbGRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFN0YXRlbWVudENvbnRleHQge1xuICAvKipcbiAgICogVGhlIHN0YXRlbWVudCB0aGUgZ2VuZXJhdG9yIHdyaXRlcyB3aGVuIG5vIGhvb2sgaXMgc2V0LCBlLmcuXG4gICAqIGBpbXBvcnQgdHlwZSB7IEFscGhhIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FscGhhJztgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEltcG9ydFN0YXRlbWVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBleHBvcnQgaXMgYSB0eXBlIG9ubHkgKGFuIGludGVyZmFjZSwgYSB0eXBlIGFsaWFzIG9yIGFuIGVudW0pLCBpbXBvcnRlZCB3aXRoIGBpbXBvcnQgdHlwZWAuXG4gICAqL1xuICByZWFkb25seSBpc1R5cGVPbmx5OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwb3J0J3Mga2luZCwgZS5nLiBgY2xhc3NgLCBgZnVuY3Rpb25gLCBgaW50ZXJmYWNlYC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGV4cG9ydCdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleHBvcnQncyBuYW1lc3BhY2U6IGl0cyBzb3VyY2UgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIGZvbGRlciwgd2l0aG91dCBpdHMgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBpbXBvcnQgc3RhdGVtZW50IG9mIGEgZG9jdW1lbnRlZCBleHBvcnQuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgZXhwb3J0LlxuICogQHJldHVybnMgVGhlIHN0YXRlbWVudCwgb3IgYHVuZGVmaW5lZGAgdG8gc2hvdyBub25lLlxuICovXG5leHBvcnQgdHlwZSBJbXBvcnRTdGF0ZW1lbnRQcm92aWRlciA9IChjb250ZXh0OiBJbXBvcnRTdGF0ZW1lbnRDb250ZXh0KSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjYXNlLXByZXNlcnZlZCByb3V0ZSBzZWdtZW50IG9mIGEgbWVtYmVyJ3MgcGFnZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIEEgcHJvcGVydHkncyBuYW1lLCBvciBhIG1ldGhvZCdzIG92ZXJsb2FkIGtleTogaXRzIG5hbWUsIG9yIGBvbignY2hhbmdlZCcpYCBmb3IgYW4gZXZlbnQgbWV0aG9kXG4gKiBrZXllZCBieSBpdHMgZmlyc3QgYXJndW1lbnQuXG4gKiBAcmV0dXJucyBUaGUgc2VnbWVudCwgb3IgYHVuZGVmaW5lZGAgZm9yIHRoZSBnZW5lcmF0b3IncyBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIE1lbWJlclJvdXRlU2VnbWVudFByb3ZpZGVyID0gKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICBzZXR0aW5nczogQXBpRG9jU2V0dGluZ3MgfCB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgc2V0dGluZ3M6IHVuZGVmaW5lZFxufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzZXR0aW5ncyBldmVyeSBsYXRlciBwYWdlIGFuZCBsaW5rIHJlYWRzLlxuICpcbiAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUFwaURvY3Moc2V0dGluZ3M6IEFwaURvY1NldHRpbmdzKTogdm9pZCB7XG4gIG1vZHVsZVN0YXRlLnNldHRpbmdzID0gc2V0dGluZ3M7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2V0dGluZ3Mgc2V0IGJ5IHtAbGluayBjb25maWd1cmVBcGlEb2NzfS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2V0dGluZ3MuXG4gKiBAdGhyb3dzIElmIHtAbGluayBjb25maWd1cmVBcGlEb2NzfSBoYXMgbm90IGJlZW4gY2FsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpRG9jU2V0dGluZ3MoKTogQXBpRG9jU2V0dGluZ3Mge1xuICBpZiAobW9kdWxlU3RhdGUuc2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIEFQSSBkb2N1bWVudGF0aW9uIGdlbmVyYXRvciBpcyBub3QgY29uZmlndXJlZDogY2FsbCBjb25maWd1cmVBcGlEb2NzKCkgZmlyc3QuJyk7XG4gIH1cblxuICByZXR1cm4gbW9kdWxlU3RhdGUuc2V0dGluZ3M7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQTRJQSxNQUFNLGNBQTJCO0FBQUEsRUFDL0IsVUFBVTtBQUNaO0FBT08sU0FBUyxpQkFBaUIsVUFBZ0M7QUFDL0QsY0FBWSxXQUFXO0FBQ3pCO0FBUU8sU0FBUyxvQkFBb0M7QUFDbEQsTUFBSSxZQUFZLGFBQWEsUUFBVztBQUN0QyxVQUFNLElBQUksTUFBTSxtRkFBbUY7QUFBQSxFQUNyRztBQUVBLFNBQU8sWUFBWTtBQUNyQjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -7,6 +7,23 @@
7
7
  */
8
8
  import type { SourceFile } from 'ts-morph';
9
9
  import type { TypeInfo } from './api-doc-types.mjs';
10
+ /**
11
+ * A package's public API barrel, read by {@link readPublicApiBarrel}.
12
+ */
13
+ export interface PublicApiBarrel {
14
+ /**
15
+ * The modules the barrel re-exports from, in barrel order: the entry files of the API reference.
16
+ */
17
+ readonly files: readonly string[];
18
+ /**
19
+ * The qualified ids (`<namespace>#<name>`) of the exports the barrel forwards by name.
20
+ */
21
+ readonly publicKeys: ReadonlySet<string>;
22
+ /**
23
+ * The namespaces of the modules the barrel re-exports whole (`export * from`).
24
+ */
25
+ readonly wholeNamespaces: ReadonlySet<string>;
26
+ }
10
27
  /**
11
28
  * Collect top-level exported functions.
12
29
  *
@@ -59,6 +76,14 @@ export declare function computeNamespace(srcDirectory: string, filePath: string)
59
76
  * @returns The entry files' paths.
60
77
  */
61
78
  export declare function findEntryFiles(directory: string, excludedDirectories?: readonly string[]): string[];
79
+ /**
80
+ * Drops every documented type the public API barrel does not re-export. Run it after `resolveInheritedMembers`, so
81
+ * a public class still inherits the members of an internal base class.
82
+ *
83
+ * @param types - The documented types, keyed by qualified id.
84
+ * @param barrel - The barrel, read by {@link readPublicApiBarrel}.
85
+ */
86
+ export declare function keepPublicApi(types: Map<string, TypeInfo>, barrel: PublicApiBarrel): void;
62
87
  /**
63
88
  * Collects a source file's exported type aliases, enums, interfaces and classes.
64
89
  *
@@ -67,6 +92,19 @@ export declare function findEntryFiles(directory: string, excludedDirectories?:
67
92
  * @param namespace - The type's namespace.
68
93
  */
69
94
  export declare function processSourceFile(src: SourceFile, types: Map<string, TypeInfo>, namespace: string): void;
95
+ /**
96
+ * Reads a package's public API barrel: the modules it re-exports from and the names it forwards.
97
+ *
98
+ * It is parsed on its own rather than through the ts-morph project, because the cache check needs the entry files
99
+ * before that project exists, and a cache hit must not pay for loading it.
100
+ *
101
+ * @param entryFile - The barrel, e.g. `<root>/src/index.ts`.
102
+ * @param sourceDirectory - The folder namespaces are relative to.
103
+ * @returns The barrel.
104
+ * @throws If the barrel re-exports a module that does not exist or belongs to another package, renames an export,
105
+ * or re-exports a module as a namespace: none of these can be documented under the name a consumer imports.
106
+ */
107
+ export declare function readPublicApiBarrel(entryFile: string, sourceDirectory: string): PublicApiBarrel;
70
108
  /**
71
109
  * Register all type parameter names so renderTypeWithLinks won't hyperlink them.
72
110
  * Skip names that are also known types — those should still be linkable. The site's `genericTypeParameters`