obsidian-dev-utils 72.0.0 → 74.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/dev/main.js +107 -74
  3. package/dist/lib/cjs/library.cjs +1 -1
  4. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +3 -7
  5. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +1 -3
  6. package/dist/lib/cjs/obsidian/command-handlers/command-handler.cjs +15 -4
  7. package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +9 -3
  8. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +3 -8
  9. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +1 -3
  10. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +162 -0
  11. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.d.cts +45 -0
  12. package/dist/lib/cjs/obsidian/components/index.cjs +4 -4
  13. package/dist/lib/cjs/obsidian/components/index.d.cts +1 -1
  14. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +50 -7
  15. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +26 -3
  16. package/dist/lib/cjs/obsidian/i18n/i18n.cjs +2 -7
  17. package/dist/lib/cjs/obsidian/i18n/i18n.d.cts +4 -0
  18. package/dist/lib/cjs/obsidian/link.cjs +9 -16
  19. package/dist/lib/cjs/obsidian/link.d.cts +20 -16
  20. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +15 -20
  21. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +10 -14
  22. package/dist/lib/esm/library.mjs +1 -1
  23. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +1 -3
  24. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +3 -7
  25. package/dist/lib/esm/obsidian/command-handlers/command-handler.d.mts +9 -3
  26. package/dist/lib/esm/obsidian/command-handlers/command-handler.mjs +16 -5
  27. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +1 -3
  28. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +3 -8
  29. package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.d.mts +45 -0
  30. package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.mjs +54 -0
  31. package/dist/lib/esm/obsidian/components/index.d.mts +1 -1
  32. package/dist/lib/esm/obsidian/components/index.mjs +3 -3
  33. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +26 -3
  34. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +50 -7
  35. package/dist/lib/esm/obsidian/i18n/i18n.d.mts +4 -0
  36. package/dist/lib/esm/obsidian/i18n/i18n.mjs +2 -7
  37. package/dist/lib/esm/obsidian/link.d.mts +20 -16
  38. package/dist/lib/esm/obsidian/link.mjs +8 -15
  39. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +10 -14
  40. package/dist/lib/esm/obsidian/plugin/plugin.mjs +15 -20
  41. package/obsidian/Components/generate-markdown-link-default-params-component/package.json +6 -0
  42. package/package.json +1 -1
  43. package/dist/lib/cjs/obsidian/components/i18n-component.cjs +0 -156
  44. package/dist/lib/cjs/obsidian/components/i18n-component.d.cts +0 -24
  45. package/dist/lib/esm/obsidian/components/i18n-component.d.mts +0 -24
  46. package/dist/lib/esm/obsidian/components/i18n-component.mjs +0 -48
  47. package/obsidian/Components/i18n-component/package.json +0 -6
@@ -147,9 +147,9 @@ __export(link_exports, {
147
147
  fixFrontmatterMarkdownLinks: () => fixFrontmatterMarkdownLinks,
148
148
  generateMarkdownLink: () => generateMarkdownLink,
149
149
  generateRawMarkdownLink: () => generateRawMarkdownLink,
150
+ getGenerateMarkdownLinkDefaultParamsFns: () => getGenerateMarkdownLinkDefaultParamsFns,
150
151
  parseLink: () => parseLink,
151
152
  parseLinks: () => parseLinks,
152
- registerGenerateMarkdownLinkDefaultOptionsFn: () => registerGenerateMarkdownLinkDefaultOptionsFn,
153
153
  shouldResetAlias: () => shouldResetAlias,
154
154
  splitSubpath: () => splitSubpath,
155
155
  testAngleBrackets: () => testAngleBrackets,
@@ -286,11 +286,11 @@ function fixFrontmatterMarkdownLinks(cache) {
286
286
  }
287
287
  function generateMarkdownLink(params) {
288
288
  const { app } = params;
289
- const DEFAULT_OPTIONS = {
289
+ const DEFAULT_PARAMS = {
290
290
  isEmptyEmbedAliasAllowed: true
291
291
  };
292
- const customDefaultOptions = getGenerateMarkdownLinkDefaultOptionsFns(app).map((defaultOptionsFn) => defaultOptionsFn());
293
- params = Object.assign({}, DEFAULT_OPTIONS, ...customDefaultOptions, params);
292
+ const customDefaultParams = getGenerateMarkdownLinkDefaultParamsFns(app).map((defaultParamsFn) => defaultParamsFn());
293
+ params = Object.assign({}, DEFAULT_PARAMS, ...customDefaultParams, params);
294
294
  const targetFile = (0, import_file_system.getFile)(app, params.targetPathOrFile, params.isNonExistingFileAllowed);
295
295
  return (0, import_metadata_cache.tempRegisterFilesAndRun)(app, [targetFile], () => generateMarkdownLinkImpl(params));
296
296
  }
@@ -307,6 +307,9 @@ function generateRawMarkdownLink(params) {
307
307
  const titlePart = params.title ? ` ${JSON.stringify(params.title)}` : "";
308
308
  return `${embedPrefix}[${escapedAlias}](${url}${titlePart})`;
309
309
  }
310
+ function getGenerateMarkdownLinkDefaultParamsFns(app) {
311
+ return (0, import_app.getObsidianDevUtilsState)(app, "generateMarkdownLinkDefaultParamsFns", []).value;
312
+ }
310
313
  function parseLink(str) {
311
314
  const links = parseLinks(str);
312
315
  return links[0]?.raw === str ? links[0] : null;
@@ -362,13 +365,6 @@ function parseLinks(str) {
362
365
  links.sort((a, b) => a.startOffset - b.startOffset);
363
366
  return links;
364
367
  }
365
- function registerGenerateMarkdownLinkDefaultOptionsFn(plugin, fn) {
366
- const generateMarkdownLinkDefaultOptionsFns = getGenerateMarkdownLinkDefaultOptionsFns(plugin.app);
367
- generateMarkdownLinkDefaultOptionsFns.push(fn);
368
- plugin.register(() => {
369
- generateMarkdownLinkDefaultOptionsFns.remove(fn);
370
- });
371
- }
372
368
  function shouldResetAlias(params) {
373
369
  const {
374
370
  app,
@@ -764,9 +760,6 @@ function getFinalLinkPathStyle(app, linkPathStyle) {
764
760
  (0, import_type_guards.assertNever)(resolvedStyle);
765
761
  }
766
762
  }
767
- function getGenerateMarkdownLinkDefaultOptionsFns(app) {
768
- return (0, import_app.getObsidianDevUtilsState)(app, "generateMarkdownLinkDefaultOptionsFns", []).value;
769
- }
770
763
  function getLinkConfig(params, targetFile) {
771
764
  const { app } = params;
772
765
  return {
@@ -882,9 +875,9 @@ function shouldUseWikilinkStyle(app, originalLink, linkStyle) {
882
875
  fixFrontmatterMarkdownLinks,
883
876
  generateMarkdownLink,
884
877
  generateRawMarkdownLink,
878
+ getGenerateMarkdownLinkDefaultParamsFns,
885
879
  parseLink,
886
880
  parseLinks,
887
- registerGenerateMarkdownLinkDefaultOptionsFn,
888
881
  shouldResetAlias,
889
882
  splitSubpath,
890
883
  testAngleBrackets,
@@ -897,4 +890,4 @@ function shouldUseWikilinkStyle(app, originalLink, linkStyle) {
897
890
  updateLinksInContent,
898
891
  updateLinksInFile
899
892
  });
900
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFBsdWdpbixcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSAndW5pc3QnO1xuXG5pbXBvcnQgeyBJbnRlcm5hbFBsdWdpbk5hbWUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVQYXRoLFxuICBwYXJzZUxpbmt0ZXh0LFxuICByZXF1aXJlQXBpVmVyc2lvblxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyByZW1hcmsgfSBmcm9tICdyZW1hcmsnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgeyB3aWtpTGlua1BsdWdpbiB9IGZyb20gJ3JlbWFyay13aWtpLWxpbmsnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVJldHVybiB9IGZyb20gJy4uL3R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlQ2hhbmdlIH0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc09wdGlvbnMgfSBmcm9tICcuL3ZhdWx0LnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxOZXZlciB9IGZyb20gJy4uL2Fib3J0LWNvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbUVuZFxufSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uL3VybC50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL2FwcC50cyc7XG5pbXBvcnQge1xuICBhcHBseUNvbnRlbnRDaGFuZ2VzLFxuICBhcHBseUZpbGVDaGFuZ2VzLFxuICBpc0NhbnZhc0NoYW5nZSxcbiAgaXNDb250ZW50Q2hhbmdlXG59IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldENhY2hlU2FmZSxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW5cbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQge1xuICBnZXROZXdMaW5rRm9ybWF0LFxuICBzaG91bGRVc2VXaWtpbGlua3Ncbn0gZnJvbSAnLi9vYnNpZGlhbi1zZXR0aW5ncy50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSAnXFxcXHwnO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBsaW5rIHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgd3JpdHRlbiB0byBjYXB0dXJlIGNvbnRyb2wgY2hhcmFjdGVycy5cbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdW5lc2NhcGVkIHBpcGVzLlxuICovXG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICovXG5leHBvcnQgZW51bSBMaW5rUGF0aFN0eWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvZnJvbS90aGUvdmF1bHQvcm9vdC90YXJnZXRdXWBcbiAgICovXG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHBhdGggc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbWy4uLy4uL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc2hvcnRlc3QgcGF0aCB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tzaG9ydGVzdC1wYXRoLXRvLXRhcmdldF1dYFxuICAgKi9cbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShwYXRoL3RvL3RhcmdldC5tZClgXG4gICAqL1xuICBNYXJrZG93biA9ICdNYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFByZXNlcnZlIHRoZSBleGlzdGluZyBsaW5rIHN0eWxlLlxuICAgKi9cbiAgUHJlc2VydmVFeGlzdGluZyA9ICdQcmVzZXJ2ZUV4aXN0aW5nJyxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gd2lraWxpbmsgZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldF1dYFxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldHxhbGlhc11dYFxuICAgKi9cbiAgV2lraWxpbmsgPSAnV2lraWxpbmsnXG59XG5cbmVudW0gRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVOb3RlJyxcbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2FsaWFzfGxpbmtdXWBcbiAgICogQGV4YW1wbGUgYFthbGlhc10obGluay5tZClgXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgZW1iZWRkZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW1t0YXJnZXRdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3RhcmdldF1dYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYCBhbmQge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGlzIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhIHNpbmdsZSBzdWJwYXRoLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gYW5kIHtAbGluayBzb3VyY2VQYXRoT3JGaWxlfSBhcmUgdGhlIHNhbWUgZmlsZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1sjc3VicGF0aF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbc291cmNlI3N1YnBhdGhdXWBcbiAgICovXG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGluZmVyIHRoZSB2YWx1ZXMgb2ZcbiAgICpcbiAgICogLSB7QGxpbmsgaXNFbWJlZH1cbiAgICogLSB7QGxpbmsgbGlua1N0eWxlfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VBbmdsZUJyYWNrZXRzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc31cbiAgICpcbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9Tb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIFNob3VsZCBiZSBlbXB0eSBvciBzdGFydCB3aXRoIGAjYC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLWVtcHR5LXN1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoI25lc3RlZC1zdWJwYXRoXV1gXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZVJhd01hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBhbmdsZSBicmFja2V0cy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXN1bHQgb2YgcGFyc2luZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVzdWx0IHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiBcXCphbGlhc1xcKlxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsgd2l0aCBzcGFjZS5tZD4pIC0+IGxpbmslMjB3aXRoJTIwc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBlbmNvZGVkVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rLm1kPikgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaGFzQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogIVtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFtbYWxpYXNdXSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGZpbGUubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbW2FsaWFzXV0gLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBbYWxpYXNdKGxpbmsubWQpXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCBcInRpdGxlXCIpIC0+IHRpdGxlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIHVuZXNjYXBlZCBhbGlhcyBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtcXCphbGlhc1xcKl0obGluay5tZCkgLT4gKmFsaWFzKlxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHVuZXNjYXBlZEFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmslMjB3aXRoJTIwc3BhY2UubWQpIC0+IGxpbmsgd2l0aCBzcGFjZS5tZFxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgdGFyZ2V0IHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBBIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVGFibGVQb3NpdGlvbiB7XG4gIGVuZDogbnVtYmVyO1xuICBzdGFydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFdpa2lMaW5rTm9kZSBleHRlbmRzIE5vZGUge1xuICBkYXRhOiBXaWtpTGlua05vZGVEYXRhO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlRGF0YSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgYWxpYXM6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnZlcnRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TGluayhwYXJhbXM6IENvbnZlcnRMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShwYXJhbXMuYXBwLCBwYXJhbXMubGluaywgcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBpZiAoIXRhcmdldEZpbGUpIHtcbiAgICByZXR1cm4gcGFyYW1zLmxpbmsub3JpZ2luYWw7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBwYXJhbXMuc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9KSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcHJvY2Vzc09wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciByZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwgcHJvY2Vzc09wdGlvbnMpO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IGVuc3VyZU5vbk51bGxhYmxlKGJhY2tsaW5rcy5nZXQoYmFja2xpbmtOb3RlUGF0aCkpO1xuICAgIGNvbnN0IGxpbmtKc29ucyA9IG5ldyBTZXQ8c3RyaW5nPihjdXJyZW50TGlua3MubWFwKChsaW5rKSA9PiBKU09OLnN0cmluZ2lmeShsaW5rKSkpO1xuICAgIGF3YWl0IGVkaXRMaW5rcyhhcHAsIGJhY2tsaW5rTm90ZVBhdGgsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rSnNvbiA9IEpTT04uc3RyaW5naWZ5KGxpbmspO1xuICAgICAgaWYgKCFsaW5rSnNvbnMuaGFzKGxpbmtKc29uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgIH0sIHByb2Nlc3NPcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKGNvbnRlbnQgIT09IGNhY2hlZENvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhjYWNoZSwgaXNDYW52YXNGaWxlKGFwcCwgcGF0aE9yRmlsZSksIGxpbmtDb252ZXJ0ZXIsIGFib3J0U2lnbmFsKTtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQoXG4gIGFwcDogQXBwLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoYWJvcnRTaWduYWwsIGNvbnRlbnQsICcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGZhbHNlLCBsaW5rQ29udmVydGVyLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3Q29udGVudCwgJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuXG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG4vKipcbiAqIEVuY29kZXMgYSBVUkwuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gZW5jb2RlLlxuICogQHJldHVybnMgVGhlIGVuY29kZWQgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwodXJsLCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAsICh7IHN1YnN0cmluZzogc3BlY2lhbExpbmtTeW1ib2wgfSkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHNwZWNpYWxMaW5rU3ltYm9sKSk7XG59XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBhbGlhcyAtIEFuIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEFuIGVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBlc2NhcGVBbGlhcygnKiphbGlhcyoqJykgLy8gJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUFsaWFzKGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbChhbGlhcywgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsICdcXFxcJCYnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIHNvdXJjZVBhdGhPckZpbGUgLSBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSAtIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKGFwcDogQXBwLCBsaW5rOiBSZWZlcmVuY2UsIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZShhcHAsIGxpbmtQYXRoLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICBpZiAoZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZShhcHAsIGZ1bGxMaW5rUGF0aCwgdHJ1ZSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKGNhY2hlLmZyb250bWF0dGVyLCAnJywgY2FjaGUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgREVGQVVMVF9PUFRJT05TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0T3B0aW9ucyA9IGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbnMoYXBwKS5tYXAoKGRlZmF1bHRPcHRpb25zRm4pID0+IGRlZmF1bHRPcHRpb25zRm4oKSk7XG4gIHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgLi4uY3VzdG9tRGVmYXVsdE9wdGlvbnMsIHBhcmFtcyk7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQpO1xuXG4gIHJldHVybiB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bihhcHAsIFt0YXJnZXRGaWxlXSwgKCkgPT4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtcykpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhdyBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyBhIHJhdyBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgQSByYXcgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBlbWJlZFByZWZpeCA9IHBhcmFtcy5pc0VtYmVkID8gJyEnIDogJyc7XG5cbiAgaWYgKHBhcmFtcy5pc1dpa2lsaW5rKSB7XG4gICAgY29uc3QgYWxpYXNQYXJ0ID0gcGFyYW1zLmFsaWFzID8gYHwke3BhcmFtcy5hbGlhc31gIDogJyc7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtwYXJhbXMudXJsfSR7YWxpYXNQYXJ0fV1dYDtcbiAgfVxuXG4gIGNvbnN0IGFsaWFzID0gcGFyYW1zLmFsaWFzID8/ICcnO1xuICBjb25zdCBzaG91bGRFc2NhcGVBbGlhcyA9IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gc2hvdWxkRXNjYXBlQWxpYXMgPyBlc2NhcGVBbGlhcyhhbGlhcykgOiBhbGlhcztcblxuICBjb25zdCB1cmwgPSBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0c1xuICAgID8gYDwke3BhcmFtcy51cmx9PmBcbiAgICA6IGVuY29kZVVybChwYXJhbXMudXJsKTtcblxuICBjb25zdCB0aXRsZVBhcnQgPSBwYXJhbXMudGl0bGUgPyBgICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zLnRpdGxlKX1gIDogJyc7XG5cbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7dXJsfSR7dGl0bGVQYXJ0fSlgO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGxpbmsgaW50byBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIGxpbmsgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmsoc3RyOiBzdHJpbmcpOiBudWxsIHwgUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgbGlua3MgPSBwYXJzZUxpbmtzKHN0cik7XG4gIHJldHVybiBsaW5rc1swXT8ucmF3ID09PSBzdHIgPyBsaW5rc1swXSA6IG51bGw7XG59XG5cbi8qKlxuICogUGFyc2VzIGFsbCBsaW5rcyBpbiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byBwYXJzZSB0aGUgbGlua3MgaW4uXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5rcyhzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdFtdIHtcbiAgY29uc3QgZW1iZWRTeW1ib2xPZmZzZXRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgY29uc3QgRU1CRURfTElOS19QUkVGSVggPSAnIVsnO1xuICBjb25zdCBOT19FTUJFRF9MSU5LX1BSRUZJWCA9ICdAWyc7XG4gIGNvbnN0IERVTU1ZX0NIQVJBQ1RFUiA9ICdAJztcblxuICBjb25zdCBFTUJFRF9JTlNJREVfTElOS19SRUdfRVhQID0gL1xcWyg/PExpbmtBbGlhcz4hXFxbLio/XFxdXFwoLis/XFwpKVxcXVxcKCg/PExpbms+Lis/KVxcKS9nO1xuICBjb25zdCBub0luc2lkZUVtYmVkc0xpbmtzU3RyID0gcmVwbGFjZUFsbChzdHIsIEVNQkVEX0lOU0lERV9MSU5LX1JFR19FWFAsICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbbGlua0FsaWFzID0gJycsIGxpbmsgPSAnJ10gfSkgPT4ge1xuICAgIGNvbnN0IGR1bW15QWxpYXMgPSBEVU1NWV9DSEFSQUNURVIucmVwZWF0KGxpbmtBbGlhcy5sZW5ndGgpO1xuICAgIHJldHVybiBgWyR7ZHVtbXlBbGlhc31dKCR7bGlua30pYDtcbiAgfSk7XG5cbiAgY29uc3Qgbm9FbWJlZFN0ciA9IHJlcGxhY2VBbGwobm9JbnNpZGVFbWJlZHNMaW5rc1N0ciwgRU1CRURfTElOS19QUkVGSVgsIChhcmdzKSA9PiB7XG4gICAgZW1iZWRTeW1ib2xPZmZzZXRzLmFkZChhcmdzLm9mZnNldCk7XG4gICAgcmV0dXJuIE5PX0VNQkVEX0xJTktfUFJFRklYO1xuICB9KTtcblxuICBjb25zdCBwcm9jZXNzb3IgPSByZW1hcmsoKS51c2UocmVtYXJrUGFyc2UpLnVzZSh3aWtpTGlua1BsdWdpbiwgeyBhbGlhc0RpdmlkZXI6IFdJS0lMSU5LX0RJVklERVIgfSk7XG4gIGNvbnN0IHJvb3QgPSBwcm9jZXNzb3IucGFyc2Uobm9FbWJlZFN0cik7XG5cbiAgY29uc3QgbGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG4gIGNvbnN0IHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcblxuICB2aXNpdChyb290LCAobm9kZTogTm9kZSkgPT4ge1xuICAgIGxldCBsaW5rOiBQYXJzZUxpbmtSZXN1bHQ7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VMaW5rTm9kZShub2RlIGFzIExpbmssIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2lraUxpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VXaWtpbGlua05vZGUobm9kZSBhcyBXaWtpTGlua05vZGUsIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbWJlZFN5bWJvbE9mZnNldHMuaGFzKGxpbmsuc3RhcnRPZmZzZXQgLSAxKSkge1xuICAgICAgbGluayA9IHtcbiAgICAgICAgLi4ubGluayxcbiAgICAgICAgaXNFbWJlZDogdHJ1ZSxcbiAgICAgICAgcmF3OiBgISR7bGluay5yYXd9YCxcbiAgICAgICAgc3RhcnRPZmZzZXQ6IGxpbmsuc3RhcnRPZmZzZXQgLSAxXG4gICAgICB9O1xuICAgIH1cbiAgICBsaW5rcy5wdXNoKGxpbmspO1xuICB9KTtcblxuICBsaW5rcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0T2Zmc2V0IC0gYi5zdGFydE9mZnNldCk7XG5cbiAgbGV0IHRleHRTdGFydE9mZnNldCA9IDA7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgZXh0cmFjdFRleHRMaW5rcyhzdHIsIHRleHRTdGFydE9mZnNldCwgbGluay5zdGFydE9mZnNldCAtIDEsIHRleHRMaW5rcyk7XG4gICAgdGV4dFN0YXJ0T2Zmc2V0ID0gbGluay5lbmRPZmZzZXQgKyAxO1xuICB9XG5cbiAgZXh0cmFjdFRleHRMaW5rcyhzdHIsIHRleHRTdGFydE9mZnNldCwgc3RyLmxlbmd0aCAtIDEsIHRleHRMaW5rcyk7XG5cbiAgbGlua3MucHVzaCguLi50ZXh0TGlua3MpO1xuICBsaW5rcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0T2Zmc2V0IC0gYi5zdGFydE9mZnNldCk7XG5cbiAgcmV0dXJuIGxpbmtzO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBkZWZhdWx0IG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZGVmYXVsdCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zRm4ocGx1Z2luOiBQbHVnaW4sIGZuOiAoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPik6IHZvaWQge1xuICBjb25zdCBnZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zRm5zID0gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc0ZucyhwbHVnaW4uYXBwKTtcbiAgZ2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc0Zucy5wdXNoKGZuKTtcbiAgcGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICBnZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zRm5zLnJlbW92ZShmbik7XG4gIH0pO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUmVzZXRBbGlhcyhwYXJhbXM6IFNob3VsZFJlc2V0QWxpYXNQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBpc1dpa2lsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKGlzV2lraWxpbmsgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFkaXNwbGF5VGV4dCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCB0YXJnZXRQYXRoT3JGaWxlLCB0cnVlKTtcbiAgY29uc3QgbmV3U291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBuZXdTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG5ld1NvdXJjZVBhdGgpO1xuICBjb25zdCBvbGRTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG9sZFNvdXJjZVBhdGgpO1xuICBjb25zdCBhbGlhc2VzVG9SZXNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcGF0aE9yRmlsZSBvZiBbdGFyZ2V0RmlsZS5wYXRoLCBvbGRUYXJnZXRQYXRoXSkge1xuICAgIGlmICghcGF0aE9yRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocGF0aCk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGJhc2VuYW1lKHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUobmV3U291cmNlRm9sZGVyLCBwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG9sZFNvdXJjZUZvbGRlciwgcGF0aCkpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIFtvbGRTb3VyY2VQYXRoLCBuZXdTb3VyY2VQYXRoXSkge1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChhcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dCh0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBmYWxzZSkpO1xuICB9XG5cbiAgY29uc3QgY2xlYW5EaXNwbGF5VGV4dCA9IHJlcGxhY2VBbGwobm9ybWFsaXplUGF0aChlbnN1cmVOb25OdWxsYWJsZShkaXNwbGF5VGV4dC5zcGxpdCgnID4gJylbMF0pKSwgL15cXC5cXC8vZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihmb2xkZXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZShsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW3RpdGxlXSg8bGluaz4pYCwgYCFbdGl0bGVdKDxsaW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RFbWJlZChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TGVhZGluZ0RvdChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLi8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy9saW5rXV1gLCBgW3RpdGxlXSgvbGluaylgLCBgW3RpdGxlXSg8L2xpbms+KWAsXG4gKiBgIVtbL2xpbmtdXWAsIGAhW3RpdGxlXSgvbGluaylgLCBgIVt0aXRsZV0oPC9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RMZWFkaW5nU2xhc2gobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RXaWtpbGluayhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFVuZXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBlc2NhcGVkQWxpYXMgLSBBbiBlc2NhcGVkIGFsaWFzLlxuICogQHJldHVybnMgQW4gdW5lc2NhcGVkIGFsaWFzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdW5lc2NhcGVBbGlhcygnXFxcXCpcXFxcKmFsaWFzXFxcXCpcXFxcKicpIC8vICcqKmFsaWFzKionXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuZXNjYXBlQWxpYXMoZXNjYXBlZEFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbChcbiAgICBlc2NhcGVkQWxpYXMsXG4gICAgLyg/PEJhY2tzbGFzaGVzPlxcXFwrKSg/PFNwZWNpYWxDaGFyYWN0ZXI+WyFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXFxcXF1eX2B7fH1+XSkvZyxcbiAgICAoeyBjYXB0dXJlZEdyb3VwQXJnczogW2JhY2tzbGFzaGVzID0gJycsIHNwZWNpYWxDaGFyID0gJyddIH0pID0+IHtcbiAgICAgIGNvbnN0IEVTQ0FQRURfQkFDS1NMQVNIX0xFTkdUSCA9IDI7XG4gICAgICBjb25zdCBiYWNrc2xhc2hDb3VudCA9IGJhY2tzbGFzaGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGtlZXBDb3VudCA9IE1hdGguZmxvb3IoYmFja3NsYXNoQ291bnQgLyBFU0NBUEVEX0JBQ0tTTEFTSF9MRU5HVEgpO1xuICAgICAgcmV0dXJuICdcXFxcJy5yZXBlYXQoa2VlcENvdW50KSArIHNwZWNpYWxDaGFyO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIHVwZGF0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmsocGFyYW1zOiBVcGRhdGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSA9IHBhcmFtcztcbiAgaWYgKCFuZXdUYXJnZXRQYXRoT3JGaWxlKSB7XG4gICAgcmV0dXJuIGxpbmsub3JpZ2luYWw7XG4gIH1cbiAgY29uc3QgbmV3VGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBuZXdUYXJnZXRQYXRoT3JGaWxlLCB0cnVlKTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRUYXJnZXRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFRhcmdldFBhdGhPckZpbGUgPz8gbmV3VGFyZ2V0UGF0aE9yRmlsZSk7XG4gIGNvbnN0IGlzV2lraWxpbmsgPSBzaG91bGRVc2VXaWtpbGlua1N0eWxlKGFwcCwgbGluay5vcmlnaW5hbCwgbGlua1N0eWxlKTtcblxuICBjb25zdCB7IHN1YnBhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuICBsZXQgc2hvdWxkS2VlcEFsaWFzID0gIXNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM7XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIENhbnZhcyBmaWxlIG5vZGUgcmVmZXJlbmNlIGJyYW5jaCBpcyBoYXJkIHRvIHJlcHJvZHVjZSBpbiB1bml0IHRlc3RzLiAqL1xuICAgIGlmIChpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgICByZXR1cm4gbmV3VGFyZ2V0RmlsZS5wYXRoICsgc3VicGF0aDtcbiAgICB9XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rLm9yaWdpbmFsKTtcbiAgbGV0IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzV2lraWxpbmsgJiYgcGFyc2VMaW5rUmVzdWx0Py5hbGlhcykge1xuICAgIGFsaWFzID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIHNob3VsZEtlZXBBbGlhcyA9IHRydWU7XG4gIH1cblxuICBhbGlhcyA/Pz0gc2hvdWxkUmVzZXRBbGlhcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkUmVzZXRBbGlhc1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgICBpc1dpa2lsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRUYXJnZXRQYXRoLFxuICAgICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICAgIH0pKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzO1xuXG4gIGlmICghc2hvdWxkS2VlcEFsaWFzKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsaWFzIG1hdGNoaW5nIGJyYW5jaGVzIGFyZSBoYXJkIHRvIHJlcHJvZHVjZSBpbiB1bml0IHRlc3RzLiAqL1xuICAgIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCwgZXh0bmFtZShvbGRUYXJnZXRQYXRoKSkpIHtcbiAgICAgIGFsaWFzID0gbmV3VGFyZ2V0RmlsZS5iYXNlbmFtZTtcbiAgICB9IGVsc2UgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLm5hbWU7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cblxuICBjb25zdCBuZXdMaW5rID0gZ2VuZXJhdGVNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgYWxpYXMsXG4gICAgYXBwLFxuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IG9sZFNvdXJjZVBhdGggPT09IG9sZFRhcmdldFBhdGggJiYgISFwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzLFxuICAgIGxpbmtTdHlsZSxcbiAgICBvcmlnaW5hbExpbms6IGxpbmsub3JpZ2luYWwsXG4gICAgc291cmNlUGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgfSkpO1xuICByZXR1cm4gbmV3TGluaztcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB3aXRoIHVwZGF0ZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUxpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuXG4gIHJldHVybiBhd2FpdCBlZGl0TGlua3NJbkNvbnRlbnQoYXBwLCBjb250ZW50LCAobGluaykgPT4ge1xuICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gdGVzdEVtYmVkKGxpbmsub3JpZ2luYWwpO1xuICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rLFxuICAgICAgbGlua1N0eWxlLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgfSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkZpbGUocGFyYW1zOiBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiAhYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGVkaXRMaW5rcyhhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUsIChsaW5rKSA9PiB7XG4gICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmssXG4gICAgICBsaW5rU3R5bGUsXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICB9KSk7XG4gIH0sIHBhcmFtcyk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVVybFNhZmVseSh1cmw6IHN0cmluZywgaXNFeHRlcm5hbDogYm9vbGVhbiwgaGFzQW5nbGVCcmFja2V0czogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc0V4dGVybmFsIHx8IGhhc0FuZ2xlQnJhY2tldHMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGRlY29kZSBVUkwgJHt1cmx9YCwgZXJyb3IpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFsaWFzKHN0cjogc3RyaW5nLCBhbGlhc1N0YXJ0T2Zmc2V0OiBudW1iZXIsIGFsaWFzRW5kT2Zmc2V0OiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gYWxpYXNTdGFydE9mZnNldCA8IGFsaWFzRW5kT2Zmc2V0XG4gICAgPyBzdHIuc2xpY2UoYWxpYXNTdGFydE9mZnNldCwgYWxpYXNFbmRPZmZzZXQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUZXh0TGlua3Moc3RyOiBzdHJpbmcsIHN0YXJ0T2Zmc2V0OiBudW1iZXIsIGVuZE9mZnNldDogbnVtYmVyLCB0ZXh0TGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdKTogdm9pZCB7XG4gIGlmIChzdGFydE9mZnNldCA+IGVuZE9mZnNldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRleHRQYXJ0ID0gc3RyLnNsaWNlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgKyAxKTtcbiAgcmVwbGFjZUFsbCh0ZXh0UGFydCwgLyg/PFVybD5cXFMrKS9nLCAoeyBjYXB0dXJlZEdyb3VwQXJnczogW3VybCA9ICcnXSwgb2Zmc2V0IH0pID0+IHtcbiAgICBpZiAoIWlzVXJsKHVybCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0ZXh0TGlua3MucHVzaCh7XG4gICAgICBlbmNvZGVkVXJsOiBlbmNvZGVVcmwodXJsKSxcbiAgICAgIGVuZE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQgKyB1cmwubGVuZ3RoLFxuICAgICAgaGFzQW5nbGVCcmFja2V0czogZmFsc2UsXG4gICAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICAgIGlzRXh0ZXJuYWw6IHRydWUsXG4gICAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICAgIHJhdzogdXJsLFxuICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0T2Zmc2V0ICsgb2Zmc2V0LFxuICAgICAgdXJsXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKHZhbHVlOiB1bmtub3duLCBrZXk6IHN0cmluZywgY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKHZhbHVlKTtcbiAgICBpZiAoIXBhcnNlTGlua1Jlc3VsdCB8fCBwYXJzZUxpbmtSZXN1bHQuaXNXaWtpbGluayB8fCBwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNhY2hlLmZyb250bWF0dGVyTGlua3MgPz89IFtdO1xuICAgIGxldCBsaW5rID0gY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcy5maW5kKChmcm9udG1hdHRlckxpbmspID0+IGZyb250bWF0dGVyTGluay5rZXkgPT09IGtleSk7XG5cbiAgICBpZiAoIWxpbmspIHtcbiAgICAgIGxpbmsgPSB7XG4gICAgICAgIGtleSxcbiAgICAgICAgbGluazogJycsXG4gICAgICAgIG9yaWdpbmFsOiAnJ1xuICAgICAgfTtcbiAgICAgIGNhY2hlLmZyb250bWF0dGVyTGlua3MucHVzaChsaW5rKTtcbiAgICB9XG5cbiAgICBsaW5rLmxpbmsgPSBwYXJzZUxpbmtSZXN1bHQudXJsO1xuICAgIGxpbmsub3JpZ2luYWwgPSB2YWx1ZTtcbiAgICBpZiAocGFyc2VMaW5rUmVzdWx0LmFsaWFzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxpbmsuZGlzcGxheVRleHQgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBoYXNGcm9udG1hdHRlckxpbmtzID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBbY2hpbGRLZXksIGNoaWxkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIEdlbmVyaWNPYmplY3QpKSB7XG4gICAgY29uc3QgaGFzQ2hpbGRGcm9udG1hdHRlckxpbmtzID0gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbChjaGlsZFZhbHVlLCBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCBjYWNoZSk7XG4gICAgaGFzRnJvbnRtYXR0ZXJMaW5rcyB8fD0gaGFzQ2hpbGRGcm9udG1hdHRlckxpbmtzO1xuICB9XG5cbiAgcmV0dXJuIGhhc0Zyb250bWF0dGVyTGlua3M7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTGlua1RleHQoYXBwOiBBcHAsIHRhcmdldEZpbGU6IFRGaWxlLCBzb3VyY2VQYXRoOiBzdHJpbmcsIHN1YnBhdGg6IHN0cmluZywgY29uZmlnOiBMaW5rQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKHNvdXJjZVBhdGggPT09ICcvJykge1xuICAgIHNvdXJjZVBhdGggPSAnJztcbiAgfVxuXG4gIGxldCBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRGaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aCAmJiBjb25maWcuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCkge1xuICAgIGxpbmtUZXh0ID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBicmFuY2hlcyBjb3ZlcmVkIGJ1dCB2OCByZXBvcnRzIHN3aXRjaCBhcyBwYXJ0aWFsLiAqL1xuICAgIHN3aXRjaCAoY29uZmlnLmxpbmtQYXRoU3R5bGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICAgIGxpbmtUZXh0ID0gcmVsYXRpdmUoZGlybmFtZShzb3VyY2VQYXRoKSwgdGFyZ2V0RmlsZS5wYXRoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgbGlua1RleHQgPSBgLi8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6IHtcbiAgICAgICAgY29uc3Qgc2hvcnRlc3ROYW1lID0gaXNNYXJrZG93bkZpbGUoYXBwLCB0YXJnZXRGaWxlKSA/IHRhcmdldEZpbGUuYmFzZW5hbWUgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRGaWxlcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldExpbmtwYXRoRGVzdChzaG9ydGVzdE5hbWUsIHNvdXJjZVBhdGgpO1xuICAgICAgICBsaW5rVGV4dCA9IG1hdGNoZWRGaWxlcy5sZW5ndGggPT09IDEgJiYgbWF0Y2hlZEZpbGVzWzBdID09PSB0YXJnZXRGaWxlID8gdGFyZ2V0RmlsZS5uYW1lIDogdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgdmFsaWQgRmluYWxMaW5rUGF0aFN0eWxlIHZhbHVlcyBhcmUgaGFuZGxlZCBhYm92ZS4gKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFzc2VydE5ldmVyKGNvbmZpZy5saW5rUGF0aFN0eWxlKTtcbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICB9XG4gIH1cblxuICBsaW5rVGV4dCA9IGNvbmZpZy5pc1dpa2lsaW5rID8gdHJpbUVuZChsaW5rVGV4dCwgYC4ke01BUktET1dOX0ZJTEVfRVhURU5TSU9OfWApIDogbGlua1RleHQ7XG4gIGxpbmtUZXh0ICs9IHN1YnBhdGg7XG5cbiAgcmV0dXJuIGxpbmtUZXh0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQpO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5zb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgc3VicGF0aCA9IHBhcmFtcy5zdWJwYXRoID8/ICcnO1xuXG4gIGNvbnN0IGxpbmtDb25maWcgPSBnZXRMaW5rQ29uZmlnKHBhcmFtcywgdGFyZ2V0RmlsZSk7XG4gIGNvbnN0IGxpbmtUZXh0ID0gZ2VuZXJhdGVMaW5rVGV4dChhcHAsIHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIHN1YnBhdGgsIGxpbmtDb25maWcpO1xuXG4gIHJldHVybiBsaW5rQ29uZmlnLmlzV2lraWxpbmtcbiAgICA/IGdlbmVyYXRlV2lraUxpbmsobGlua1RleHQsIHBhcmFtcy5hbGlhcywgbGlua0NvbmZpZy5pc0VtYmVkKVxuICAgIDogZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayhsaW5rVGV4dCwgdGFyZ2V0RmlsZSwgcGFyYW1zLCBsaW5rQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayhsaW5rVGV4dDogc3RyaW5nLCB0YXJnZXRGaWxlOiBURmlsZSwgcGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcywgY29uZmlnOiBMaW5rQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcblxuICBsZXQgYWxpYXMgPSBwYXJhbXMuYWxpYXMgPz8gJyc7XG4gIGxldCBzaG91bGRFc2NhcGVBbGlhcyA9IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgaWYgKCFhbGlhcyAmJiAoaXNNYXJrZG93bkZpbGUoYXBwLCB0YXJnZXRGaWxlKSB8fCAhcGFyYW1zLmlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCkpIHtcbiAgICBhbGlhcyA9ICFwYXJhbXMuc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMgfHwgaXNNYXJrZG93bkZpbGUoYXBwLCB0YXJnZXRGaWxlKVxuICAgICAgPyB0YXJnZXRGaWxlLmJhc2VuYW1lXG4gICAgICA6IHRhcmdldEZpbGUubmFtZTtcbiAgICBzaG91bGRFc2NhcGVBbGlhcyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQ6IGNvbmZpZy5pc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGNvbmZpZy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsobGlua1RleHQ6IHN0cmluZywgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZCwgaXNFbWJlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChhbGlhcz8udG9Mb3dlckNhc2UoKSA9PT0gbGlua1RleHQudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgICBpc0VtYmVkLFxuICAgICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICAgIHVybDogYWxpYXNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVDaGFuZ2VzKFxuICBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsLFxuICBpc0NhbnZhc0ZpbGVDYWNoZTogYm9vbGVhbixcbiAgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsXG4pOiBQcm9taXNlPEZpbGVDaGFuZ2VbXT4ge1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdID0gKGNhY2hlLnNlY3Rpb25zID8/IFtdKS5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24udHlwZSA9PT0gJ3RhYmxlJykubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgIGVuZDogc2VjdGlvbi5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgIHN0YXJ0OiBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldFxuICB9KSk7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGdldEFsbExpbmtzKGNhY2hlKSkge1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGxpbmtDb252ZXJ0ZXIobGluaywgYWJvcnRTaWduYWwpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUNoYW5nZSA9IHJlZmVyZW5jZVRvRmlsZUNoYW5nZShsaW5rLCBuZXdDb250ZW50KTtcblxuICAgIGlmIChpc0NhbnZhc0ZpbGVDYWNoZSkge1xuICAgICAgaWYgKGlzQ2FudmFzQ2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vuc3VwcG9ydGVkIGZpbGUgY2hhbmdlJywgZmlsZUNoYW5nZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zKSkge1xuICAgICAgICBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQgPSBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQucmVwbGFjZUFsbChVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAsIEVTQ0FQRURfV0lLSUxJTktfRElWSURFUik7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbmZ1bmN0aW9uIGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHA6IEFwcCwgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGUpOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1BhdGhTdHlsZSA/PyBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0O1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcCk7XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKHJlc29sdmVkU3R5bGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNGbnMoYXBwOiBBcHApOiAoKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4pW10ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPCgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXT4oYXBwLCAnZ2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc0ZucycsIFtdKS52YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0TGlua0NvbmZpZyhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zLCB0YXJnZXRGaWxlOiBURmlsZSk6IExpbmtDb25maWcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSByZXF1aXJlQXBpVmVyc2lvbiBmYWxsYmFjayBpcyBvbmx5IHJlYWNoZWQgaW4gb2xkZXIgT2JzaWRpYW4gdmVyc2lvbnMuICovXG4gICAgaXNFbWJlZDogcGFyYW1zLmlzRW1iZWQgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0RW1iZWQocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpXG4gICAgICA/PyAoIXJlcXVpcmVBcGlWZXJzaW9uKCcxLjEwLjAnKSAmJiAhaXNNYXJrZG93bkZpbGUoYXBwLCB0YXJnZXRGaWxlKSksXG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBwYXJhbXMuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCA/PyB0cnVlLFxuICAgIGlzV2lraWxpbms6IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUoYXBwLCBwYXJhbXMub3JpZ2luYWxMaW5rLCBwYXJhbXMubGlua1N0eWxlKSxcbiAgICBsaW5rUGF0aFN0eWxlOiBnZXRGaW5hbExpbmtQYXRoU3R5bGUoYXBwLCBwYXJhbXMubGlua1BhdGhTdHlsZSksXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0QW5nbGVCcmFja2V0cyhwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0TGVhZGluZ0RvdChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdExlYWRpbmdTbGFzaChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3TGluayhub2RlOiBOb2RlLCBzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBvcyA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUucG9zaXRpb24pO1xuICByZXR1cm4gc3RyLnNsaWNlKHBvcy5zdGFydC5vZmZzZXQsIHBvcy5lbmQub2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gaGFzQW5nbGVCcmFja2V0c0luTGluayhyYXc6IHN0cmluZywgcmF3VXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgT1BFTl9BTkdMRV9CUkFDS0VUID0gJzwnO1xuICByZXR1cm4gcmF3LnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKSB8fCByYXdVcmwuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpbmtOb2RlKG5vZGU6IExpbmssIHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgTElOS19BTElBU19TVUZGSVggPSAnXSgnO1xuICBjb25zdCBMSU5LX1NVRkZJWCA9ICcpJztcbiAgY29uc3QgcmF3ID0gZ2V0UmF3TGluayhub2RlLCBzdHIpO1xuICBjb25zdCBhbGlhc05vZGVTdGFydE9mZnNldCA9IG5vZGUuY2hpbGRyZW5bMF0/LnBvc2l0aW9uPy5zdGFydC5vZmZzZXQgPz8gMTtcbiAgY29uc3QgYWxpYXNOb2RlRW5kT2Zmc2V0ID0gbm9kZS5jaGlsZHJlbi5hdCgtMSk/LnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDE7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIGNvbnN0IG5vZGVFbmRPZmZzZXQgPSBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5lbmQub2Zmc2V0KTtcbiAgY29uc3Qgbm9kZVN0YXJ0T2Zmc2V0ID0gZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uc3RhcnQub2Zmc2V0KTtcbiAgY29uc3QgcmF3VXJsID0gc3RyLnNsaWNlKGFsaWFzTm9kZUVuZE9mZnNldCArIExJTktfQUxJQVNfU1VGRklYLmxlbmd0aCwgbm9kZUVuZE9mZnNldCAtIExJTktfU1VGRklYLmxlbmd0aCk7XG4gIGNvbnN0IGhhc0FuZ2xlQnJhY2tldHMgPSBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rKHJhdywgcmF3VXJsKTtcbiAgY29uc3QgaXNFeHRlcm5hbCA9IGlzVXJsKG5vZGUudXJsKTtcbiAgY29uc3QgdXJsID0gZGVjb2RlVXJsU2FmZWx5KG5vZGUudXJsLCBpc0V4dGVybmFsLCBoYXNBbmdsZUJyYWNrZXRzKTtcbiAgY29uc3QgYWxpYXMgPSBleHRyYWN0QWxpYXMoc3RyLCBhbGlhc05vZGVTdGFydE9mZnNldCwgYWxpYXNOb2RlRW5kT2Zmc2V0KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQYXJzZUxpbmtSZXN1bHQ+KHtcbiAgICBhbGlhcyxcbiAgICBlbmNvZGVkVXJsOiBpc0V4dGVybmFsID8gZW5jb2RlVXJsKHVybCkgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBub2RlRW5kT2Zmc2V0LFxuICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICByYXcsXG4gICAgc3RhcnRPZmZzZXQ6IG5vZGVTdGFydE9mZnNldCxcbiAgICB0aXRsZTogbm9kZS50aXRsZSA/PyB1bmRlZmluZWQsXG4gICAgdW5lc2NhcGVkQWxpYXM6IGFsaWFzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB1bmVzY2FwZUFsaWFzKGFsaWFzKSxcbiAgICB1cmxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2lraWxpbmtOb2RlKG5vZGU6IFdpa2lMaW5rTm9kZSwgc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBwb3NpdGlvbiA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUucG9zaXRpb24pO1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzOiBzdHIuaW5jbHVkZXMoV0lLSUxJTktfRElWSURFUikgPyBub2RlLmRhdGEuYWxpYXMgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5lbmQub2Zmc2V0KSxcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsOiBmYWxzZSxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIHJhdzogZ2V0UmF3TGluayhub2RlLCBzdHIpLFxuICAgIHN0YXJ0T2Zmc2V0OiBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5zdGFydC5vZmZzZXQpLFxuICAgIHVybDogbm9kZS52YWx1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcDogQXBwKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgbmV3TGlua0Zvcm1hdCA9IGdldE5ld0xpbmtGb3JtYXQoYXBwKTtcbiAgc3dpdGNoIChuZXdMaW5rRm9ybWF0KSB7XG4gICAgY2FzZSAnYWJzb2x1dGUnOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIGNhc2UgJ3JlbGF0aXZlJzpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U7XG4gICAgY2FzZSAnc2hvcnRlc3QnOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKG5ld0xpbmtGb3JtYXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEVzY2FwZVdpa2lsaW5rRGl2aWRlcihmaWxlQ2hhbmdlOiBGaWxlQ2hhbmdlLCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdKTogYm9vbGVhbiB7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBnZXRGaWxlQ2hhbmdlcyBvbmx5IGNhbGxzIHRoaXMgZm9yIG5vbi1jYW52YXMgZmlsZXMgd2hpY2ggYWx3YXlzIGhhdmUgY29udGVudCBjaGFuZ2VzLiAqL1xuICBpZiAoIWlzQ29udGVudENoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGlmICghVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLnRlc3QoZmlsZUNoYW5nZS5uZXdDb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZVBvc2l0aW9ucy5zb21lKCh0YWJsZVBvc2l0aW9uKSA9PiB0YWJsZVBvc2l0aW9uLnN0YXJ0IDw9IGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAmJiBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0IDw9IHRhYmxlUG9zaXRpb24uZW5kKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShhcHA6IEFwcCwgb3JpZ2luYWxMaW5rPzogc3RyaW5nLCBsaW5rU3R5bGU/OiBMaW5rU3R5bGUpOiBib29sZWFuIHtcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtTdHlsZSA/PyBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZztcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rU3R5bGUuTWFya2Rvd246XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBMaW5rU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6XG4gICAgICByZXR1cm4gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCk7XG4gICAgY2FzZSBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZzpcbiAgICAgIHJldHVybiBvcmlnaW5hbExpbmsgPT09IHVuZGVmaW5lZCA/IHNob3VsZFVzZVdpa2lsaW5rcyhhcHApIDogdGVzdFdpa2lsaW5rKG9yaWdpbmFsTGluayk7XG4gICAgY2FzZSBMaW5rU3R5bGUuV2lraWxpbms6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRT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
893
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gJ3VuaXN0JztcblxuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dCxcbiAgcmVxdWlyZUFwaVZlcnNpb25cbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgcmVtYXJrIH0gZnJvbSAncmVtYXJrJztcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tICdyZW1hcmstcGFyc2UnO1xuaW1wb3J0IHsgd2lraUxpbmtQbHVnaW4gfSBmcm9tICdyZW1hcmstd2lraS1saW5rJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemUsXG4gIHJlcGxhY2VBbGwsXG4gIHRyaW1FbmRcbn0gZnJvbSAnLi4vc3RyaW5nLnRzJztcbmltcG9ydCB7XG4gIGFzc2VydE5ldmVyLFxuICBhc3NlcnROb25OdWxsYWJsZSxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICcuLi91cmwudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi9hcHAudHMnO1xuaW1wb3J0IHtcbiAgYXBwbHlDb250ZW50Q2hhbmdlcyxcbiAgYXBwbHlGaWxlQ2hhbmdlcyxcbiAgaXNDYW52YXNDaGFuZ2UsXG4gIGlzQ29udGVudENoYW5nZVxufSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNNYXJrZG93bkZpbGUsXG4gIE1BUktET1dOX0ZJTEVfRVhURU5TSU9OXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIHBhcnNlTWV0YWRhdGEsXG4gIHRlbXBSZWdpc3RlckZpbGVzQW5kUnVuXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSxcbiAgcmVmZXJlbmNlVG9GaWxlQ2hhbmdlXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcblxuY29uc3QgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSID0gJ1xcXFx8JztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbGluayBzeW1ib2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBUaGUgcmVndWxhciBleHByZXNzaW9uIGlzIHdyaXR0ZW4gdG8gY2FwdHVyZSBjb250cm9sIGNoYXJhY3RlcnMuXG5jb25zdCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAgPSAvW1xcXFxcXHgwMFxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGIF0vZztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbWFya2Rvd24gbGluayBzeW1ib2xzLlxuICovXG5jb25zdCBTUEVDSUFMX01BUktET1dOX0xJTktfU1lNQk9MU19SRUdFWCA9IC9bXFxcXFtcXF08Pl8qfj1gJF0vZztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHVuZXNjYXBlZCBwaXBlcy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/PCFcXFxcKVxcfC9nO1xuXG5jb25zdCBXSUtJTElOS19ESVZJREVSID0gJ3wnO1xuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1BhdGhTdHlsZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIHZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL2Zyb20vdGhlL3ZhdWx0L3Jvb3QvdGFyZ2V0XV1gXG4gICAqL1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBwYXRoIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1suLi8uLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHNob3J0ZXN0IHBhdGggd2hlbiBwb3NzaWJsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbc2hvcnRlc3QtcGF0aC10by10YXJnZXRdXWBcbiAgICovXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1N0eWxlIHtcbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFthbGlhc10ocGF0aC90by90YXJnZXQubWQpYFxuICAgKi9cbiAgTWFya2Rvd24gPSAnTWFya2Rvd24nLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBQcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgbGluayBzdHlsZS5cbiAgICovXG4gIFByZXNlcnZlRXhpc3RpbmcgPSAnUHJlc2VydmVFeGlzdGluZycsXG5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIHdpa2lsaW5rIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXRdXWBcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXR8YWxpYXNdXWBcbiAgICovXG4gIFdpa2lsaW5rID0gJ1dpa2lsaW5rJ1xufVxuXG5lbnVtIEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlTm90ZScsXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbYWxpYXN8bGlua11dYFxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShsaW5rLm1kKWBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbW3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbdGFyZ2V0XV1gLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgIGFuZCB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqL1xuICByZWFkb25seSBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgc2luZ2xlIHN1YnBhdGguIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBhbmQge0BsaW5rIHNvdXJjZVBhdGhPckZpbGV9IGFyZSB0aGUgc2FtZSBmaWxlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWyNzdWJwYXRoXV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tzb3VyY2Ujc3VicGF0aF1dYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZlxuICAgKlxuICAgKiAtIHtAbGluayBpc0VtYmVkfVxuICAgKiAtIHtAbGluayBsaW5rU3R5bGV9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUFuZ2xlQnJhY2tldHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzfVxuICAgKlxuICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1NvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogU2hvdWxkIGJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggYCNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtZW1wdHktc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGgjbmVzdGVkLXN1YnBhdGhdXWBcbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLiBEZWZhdWx0cyB0byBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhbiBlbWJlZCBsaW5rLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNXaWtpbGlua30gaXMgYGZhbHNlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYW5nbGUgYnJhY2tldHMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNXaWtpbGlua30gaXMgYGZhbHNlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcmVzdWx0IG9mIHBhcnNpbmcgYSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtcXCphbGlhc1xcKl0obGluay5tZCkgLT4gXFwqYWxpYXNcXCpcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZW5jb2RlZCBVUkwgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rIHdpdGggc3BhY2UubWQ+KSAtPiBsaW5rJTIwd2l0aCUyMHNwYWNlLm1kXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgZW5jb2RlZFVybD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZW5kIG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgb3JpZ2luYWwgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGVuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaGFzIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXSg8bGluay5tZD4pIC0+IHRydWVcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGhhc0FuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqICFbW2FsaWFzXV0gLT4gdHJ1ZVxuICAgKiBbW2FsaWFzXV0gLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgZXh0ZXJuYWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGh0dHBzOi8vZXhhbXBsZS5jb20pIC0+IHRydWVcbiAgICogW2FsaWFzXShmaWxlLm1kKSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzRXh0ZXJuYWw6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1thbGlhc11dIC0+IHRydWVcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgcmF3IGxpbmsgdGV4dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gW2FsaWFzXShsaW5rLm1kKVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHJhdzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgb3JpZ2luYWwgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmsubWQgXCJ0aXRsZVwiKSAtPiB0aXRsZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiB1bmVzY2FwZWQgYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbXFwqYWxpYXNcXCpdKGxpbmsubWQpIC0+ICphbGlhcypcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB1bmVzY2FwZWRBbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rJTIwd2l0aCUyMHNwYWNlLm1kKSAtPiBsaW5rIHdpdGggc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgdGFyZ2V0IHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBBIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdUYXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5GaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMaW5rQ29uZmlnIHtcbiAgcmVhZG9ubHkgaXNFbWJlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZTogRmluYWxMaW5rUGF0aFN0eWxlO1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFRhYmxlUG9zaXRpb24ge1xuICBlbmQ6IG51bWJlcjtcbiAgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFdpa2lMaW5rTm9kZSBleHRlbmRzIE5vZGUge1xuICBkYXRhOiBXaWtpTGlua05vZGVEYXRhO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlRGF0YSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgYWxpYXM6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxpbmsgdG8gYSBuZXcgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnZlcnRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TGluayhwYXJhbXM6IENvbnZlcnRMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShwYXJhbXMuYXBwLCBwYXJhbXMubGluaywgcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBpZiAoIXRhcmdldEZpbGUpIHtcbiAgICByZXR1cm4gcGFyYW1zLmxpbmsub3JpZ2luYWw7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBwYXJhbXMuc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9KSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGJhY2tsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcHJvY2Vzc09wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciByZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwgcHJvY2Vzc09wdGlvbnMpO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IGVuc3VyZU5vbk51bGxhYmxlKGJhY2tsaW5rcy5nZXQoYmFja2xpbmtOb3RlUGF0aCkpO1xuICAgIGNvbnN0IGxpbmtKc29ucyA9IG5ldyBTZXQ8c3RyaW5nPihjdXJyZW50TGlua3MubWFwKChsaW5rKSA9PiBKU09OLnN0cmluZ2lmeShsaW5rKSkpO1xuICAgIGF3YWl0IGVkaXRMaW5rcyhhcHAsIGJhY2tsaW5rTm90ZVBhdGgsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rSnNvbiA9IEpTT04uc3RyaW5naWZ5KGxpbmspO1xuICAgICAgaWYgKCFsaW5rSnNvbnMuaGFzKGxpbmtKc29uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgIH0sIHByb2Nlc3NPcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKGNvbnRlbnQgIT09IGNhY2hlZENvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhjYWNoZSwgaXNDYW52YXNGaWxlKGFwcCwgcGF0aE9yRmlsZSksIGxpbmtDb252ZXJ0ZXIsIGFib3J0U2lnbmFsKTtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQoXG4gIGFwcDogQXBwLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoYWJvcnRTaWduYWwsIGNvbnRlbnQsICcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGZhbHNlLCBsaW5rQ29udmVydGVyLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3Q29udGVudCwgJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuXG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG4vKipcbiAqIEVuY29kZXMgYSBVUkwuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gZW5jb2RlLlxuICogQHJldHVybnMgVGhlIGVuY29kZWQgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwodXJsLCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAsICh7IHN1YnN0cmluZzogc3BlY2lhbExpbmtTeW1ib2wgfSkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHNwZWNpYWxMaW5rU3ltYm9sKSk7XG59XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBhbGlhcyAtIEFuIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEFuIGVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBlc2NhcGVBbGlhcygnKiphbGlhcyoqJykgLy8gJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUFsaWFzKGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbChhbGlhcywgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsICdcXFxcJCYnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIHNvdXJjZVBhdGhPckZpbGUgLSBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSAtIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKGFwcDogQXBwLCBsaW5rOiBSZWZlcmVuY2UsIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZShhcHAsIGxpbmtQYXRoLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICBpZiAoZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZShhcHAsIGZ1bGxMaW5rUGF0aCwgdHJ1ZSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKGNhY2hlLmZyb250bWF0dGVyLCAnJywgY2FjaGUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgREVGQVVMVF9QQVJBTVM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+ID0ge1xuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZDogdHJ1ZVxuICB9O1xuXG4gIGNvbnN0IGN1c3RvbURlZmF1bHRQYXJhbXMgPSBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMoYXBwKS5tYXAoKGRlZmF1bHRQYXJhbXNGbikgPT4gZGVmYXVsdFBhcmFtc0ZuKCkpO1xuICBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1BBUkFNUywgLi4uY3VzdG9tRGVmYXVsdFBhcmFtcywgcGFyYW1zKTtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCk7XG5cbiAgcmV0dXJuIHRlbXBSZWdpc3RlckZpbGVzQW5kUnVuKGFwcCwgW3RhcmdldEZpbGVdLCAoKSA9PiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zKSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmF3IG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgYSByYXcgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgZW1iZWRQcmVmaXggPSBwYXJhbXMuaXNFbWJlZCA/ICchJyA6ICcnO1xuXG4gIGlmIChwYXJhbXMuaXNXaWtpbGluaykge1xuICAgIGNvbnN0IGFsaWFzUGFydCA9IHBhcmFtcy5hbGlhcyA/IGB8JHtwYXJhbXMuYWxpYXN9YCA6ICcnO1xuICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7cGFyYW1zLnVybH0ke2FsaWFzUGFydH1dXWA7XG4gIH1cblxuICBjb25zdCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgY29uc3Qgc2hvdWxkRXNjYXBlQWxpYXMgPSBwYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGNvbnN0IGVzY2FwZWRBbGlhcyA9IHNob3VsZEVzY2FwZUFsaWFzID8gZXNjYXBlQWxpYXMoYWxpYXMpIDogYWxpYXM7XG5cbiAgY29uc3QgdXJsID0gcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHNcbiAgICA/IGA8JHtwYXJhbXMudXJsfT5gXG4gICAgOiBlbmNvZGVVcmwocGFyYW1zLnVybCk7XG5cbiAgY29uc3QgdGl0bGVQYXJ0ID0gcGFyYW1zLnRpdGxlID8gYCAke0pTT04uc3RyaW5naWZ5KHBhcmFtcy50aXRsZSl9YCA6ICcnO1xuXG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bJHtlc2NhcGVkQWxpYXN9XSgke3VybH0ke3RpdGxlUGFydH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaGFyZWQsIG11dGFibGUgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBwcm92aWRlIGRlZmF1bHQgcGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICpcbiAqIEVhY2ggZnVuY3Rpb24gaXMgaW52b2tlZCBvbiBldmVyeSB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9IGNhbGwgYW5kIGl0cyByZXN1bHQgaXMgbWVyZ2VkIGludG8gdGhlIHBhcmFtcyAobGF0ZXJcbiAqIHJlZ2lzdHJhdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIGJ1aWx0LWluIGRlZmF1bHRzLCBidXQgbmV2ZXIgb3ZlciBleHBsaWNpdGx5IHBhc3NlZCBwYXJhbXMpLiBSZWdpc3RlciBlbnRyaWVzXG4gKiBieSBhZGRpbmcgYSBgR2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zQ29tcG9uZW50YCB0byBhIGNvbXBvbmVudCB0cmVlIHJhdGhlciB0aGFuIG11dGF0aW5nIHRoaXMgbGlzdCBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZSB3aG9zZSBzaGFyZWQgc3RhdGUgaG9sZHMgdGhlIGxpc3QuXG4gKiBAcmV0dXJucyBUaGUgbXV0YWJsZSBsaXN0IG9mIGRlZmF1bHQtcGFyYW1zIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucyhhcHA6IEFwcCk6ICgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXSB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8KCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdPihhcHAsICdnZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMnLCBbXSkudmFsdWU7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgbGluayBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgbGluayB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGluayhzdHI6IHN0cmluZyk6IG51bGwgfCBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBsaW5rcyA9IHBhcnNlTGlua3Moc3RyKTtcbiAgcmV0dXJuIGxpbmtzWzBdPy5yYXcgPT09IHN0ciA/IGxpbmtzWzBdIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYWxsIGxpbmtzIGluIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmtzKHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0W10ge1xuICBjb25zdCBlbWJlZFN5bWJvbE9mZnNldHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdCBFTUJFRF9MSU5LX1BSRUZJWCA9ICchWyc7XG4gIGNvbnN0IE5PX0VNQkVEX0xJTktfUFJFRklYID0gJ0BbJztcbiAgY29uc3QgRFVNTVlfQ0hBUkFDVEVSID0gJ0AnO1xuXG4gIGNvbnN0IEVNQkVEX0lOU0lERV9MSU5LX1JFR19FWFAgPSAvXFxbKD88TGlua0FsaWFzPiFcXFsuKj9cXF1cXCguKz9cXCkpXFxdXFwoKD88TGluaz4uKz8pXFwpL2c7XG4gIGNvbnN0IG5vSW5zaWRlRW1iZWRzTGlua3NTdHIgPSByZXBsYWNlQWxsKHN0ciwgRU1CRURfSU5TSURFX0xJTktfUkVHX0VYUCwgKHsgY2FwdHVyZWRHcm91cEFyZ3M6IFtsaW5rQWxpYXMgPSAnJywgbGluayA9ICcnXSB9KSA9PiB7XG4gICAgY29uc3QgZHVtbXlBbGlhcyA9IERVTU1ZX0NIQVJBQ1RFUi5yZXBlYXQobGlua0FsaWFzLmxlbmd0aCk7XG4gICAgcmV0dXJuIGBbJHtkdW1teUFsaWFzfV0oJHtsaW5rfSlgO1xuICB9KTtcblxuICBjb25zdCBub0VtYmVkU3RyID0gcmVwbGFjZUFsbChub0luc2lkZUVtYmVkc0xpbmtzU3RyLCBFTUJFRF9MSU5LX1BSRUZJWCwgKGFyZ3MpID0+IHtcbiAgICBlbWJlZFN5bWJvbE9mZnNldHMuYWRkKGFyZ3Mub2Zmc2V0KTtcbiAgICByZXR1cm4gTk9fRU1CRURfTElOS19QUkVGSVg7XG4gIH0pO1xuXG4gIGNvbnN0IHByb2Nlc3NvciA9IHJlbWFyaygpLnVzZShyZW1hcmtQYXJzZSkudXNlKHdpa2lMaW5rUGx1Z2luLCB7IGFsaWFzRGl2aWRlcjogV0lLSUxJTktfRElWSURFUiB9KTtcbiAgY29uc3Qgcm9vdCA9IHByb2Nlc3Nvci5wYXJzZShub0VtYmVkU3RyKTtcblxuICBjb25zdCBsaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcbiAgY29uc3QgdGV4dExpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSA9IFtdO1xuXG4gIHZpc2l0KHJvb3QsIChub2RlOiBOb2RlKSA9PiB7XG4gICAgbGV0IGxpbms6IFBhcnNlTGlua1Jlc3VsdDtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnbGluayc6XG4gICAgICAgIGxpbmsgPSBwYXJzZUxpbmtOb2RlKG5vZGUgYXMgTGluaywgc3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3aWtpTGluayc6XG4gICAgICAgIGxpbmsgPSBwYXJzZVdpa2lsaW5rTm9kZShub2RlIGFzIFdpa2lMaW5rTm9kZSwgc3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGVtYmVkU3ltYm9sT2Zmc2V0cy5oYXMobGluay5zdGFydE9mZnNldCAtIDEpKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICAuLi5saW5rLFxuICAgICAgICBpc0VtYmVkOiB0cnVlLFxuICAgICAgICByYXc6IGAhJHtsaW5rLnJhd31gLFxuICAgICAgICBzdGFydE9mZnNldDogbGluay5zdGFydE9mZnNldCAtIDFcbiAgICAgIH07XG4gICAgfVxuICAgIGxpbmtzLnB1c2gobGluayk7XG4gIH0pO1xuXG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICBsZXQgdGV4dFN0YXJ0T2Zmc2V0ID0gMDtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICBleHRyYWN0VGV4dExpbmtzKHN0ciwgdGV4dFN0YXJ0T2Zmc2V0LCBsaW5rLnN0YXJ0T2Zmc2V0IC0gMSwgdGV4dExpbmtzKTtcbiAgICB0ZXh0U3RhcnRPZmZzZXQgPSBsaW5rLmVuZE9mZnNldCArIDE7XG4gIH1cblxuICBleHRyYWN0VGV4dExpbmtzKHN0ciwgdGV4dFN0YXJ0T2Zmc2V0LCBzdHIubGVuZ3RoIC0gMSwgdGV4dExpbmtzKTtcblxuICBsaW5rcy5wdXNoKC4uLnRleHRMaW5rcyk7XG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXNldEFsaWFzKHBhcmFtczogU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGRpc3BsYXlUZXh0LFxuICAgIGlzV2lraWxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRpc3BsYXlUZXh0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIHRhcmdldFBhdGhPckZpbGUsIHRydWUpO1xuICBjb25zdCBuZXdTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5ld1NvdXJjZUZvbGRlciA9IGRpcm5hbWUobmV3U291cmNlUGF0aCk7XG4gIGNvbnN0IG9sZFNvdXJjZUZvbGRlciA9IGRpcm5hbWUob2xkU291cmNlUGF0aCk7XG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFt0YXJnZXRGaWxlLnBhdGgsIG9sZFRhcmdldFBhdGhdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChwYXRoKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYmFzZW5hbWUocGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShuZXdTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUob2xkU291cmNlRm9sZGVyLCBwYXRoKSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgW29sZFNvdXJjZVBhdGgsIG5ld1NvdXJjZVBhdGhdKSB7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIGZhbHNlKSk7XG4gIH1cblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gcmVwbGFjZUFsbChub3JtYWxpemVQYXRoKGVuc3VyZU5vbk51bGxhYmxlKGRpc3BsYXlUZXh0LnNwbGl0KCcgPiAnKVswXSkpLCAvXlxcLlxcLy9nLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGZvbGRlciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gc3BsaXQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdWJwYXRoKGxpbms6IHN0cmluZyk6IFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTGlua3RleHQobm9ybWFsaXplKGxpbmspKTtcbiAgcmV0dXJuIHtcbiAgICBsaW5rUGF0aDogcGFyc2VkLnBhdGgsXG4gICAgc3VicGF0aDogcGFyc2VkLnN1YnBhdGhcbiAgfTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbdGl0bGVdKDxsaW5rPilgLCBgIVt0aXRsZV0oPGxpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEFuZ2xlQnJhY2tldHMobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaGFzQW5nbGVCcmFja2V0cyA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhbiBlbWJlZCBsaW5rOlxuICogYCFbW2xpbmtdXWAsIGAhW3RpdGxlXShsaW5rKWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEVtYmVkKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzRW1iZWQgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBkb3QsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbLi9saW5rXV1gLCBgW3RpdGxlXSguL2xpbmspYCwgYFt0aXRsZV0oPC4vbGluaz4pYCxcbiAqIGAhW1suL2xpbmtdXWAsIGAhW3RpdGxlXSguL2xpbmspYCwgYCFbdGl0bGVdKDwuL2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBkb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RMZWFkaW5nRG90KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcuLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2gsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbL2xpbmtdXWAsIGBbdGl0bGVdKC9saW5rKWAsIGBbdGl0bGVdKDwvbGluaz4pYCxcbiAqIGAhW1svbGlua11dYCwgYCFbdGl0bGVdKC9saW5rKWAsIGAhW3RpdGxlXSg8L2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdExlYWRpbmdTbGFzaChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGEgd2lraWxpbmssIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbbGlua11dYCwgYCFbW2xpbmtdXWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYSB3aWtpbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdFdpa2lsaW5rKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzV2lraWxpbmsgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVW5lc2NhcGVzIHRoZSBhbGlhcyBvZiBhIG1hcmtkb3duIGxpbmsuXG4gKlxuICogQHBhcmFtIGVzY2FwZWRBbGlhcyAtIEFuIGVzY2FwZWQgYWxpYXMuXG4gKiBAcmV0dXJucyBBbiB1bmVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB1bmVzY2FwZUFsaWFzKCdcXFxcKlxcXFwqYWxpYXNcXFxcKlxcXFwqJykgLy8gJyoqYWxpYXMqKidcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5lc2NhcGVBbGlhcyhlc2NhcGVkQWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKFxuICAgIGVzY2FwZWRBbGlhcyxcbiAgICAvKD88QmFja3NsYXNoZXM+XFxcXCspKD88U3BlY2lhbENoYXJhY3Rlcj5bIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXV5fYHt8fX5dKS9nLFxuICAgICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbYmFja3NsYXNoZXMgPSAnJywgc3BlY2lhbENoYXIgPSAnJ10gfSkgPT4ge1xuICAgICAgY29uc3QgRVNDQVBFRF9CQUNLU0xBU0hfTEVOR1RIID0gMjtcbiAgICAgIGNvbnN0IGJhY2tzbGFzaENvdW50ID0gYmFja3NsYXNoZXMubGVuZ3RoO1xuICAgICAgY29uc3Qga2VlcENvdW50ID0gTWF0aC5mbG9vcihiYWNrc2xhc2hDb3VudCAvIEVTQ0FQRURfQkFDS1NMQVNIX0xFTkdUSCk7XG4gICAgICByZXR1cm4gJ1xcXFwnLnJlcGVhdChrZWVwQ291bnQpICsgc3BlY2lhbENoYXI7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGluayhwYXJhbXM6IFVwZGF0ZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuICBpZiAoIW5ld1RhcmdldFBhdGhPckZpbGUpIHtcbiAgICByZXR1cm4gbGluay5vcmlnaW5hbDtcbiAgfVxuICBjb25zdCBuZXdUYXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIG5ld1RhcmdldFBhdGhPckZpbGUsIHRydWUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFRhcmdldFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkVGFyZ2V0UGF0aE9yRmlsZSA/PyBuZXdUYXJnZXRQYXRoT3JGaWxlKTtcbiAgY29uc3QgaXNXaWtpbGluayA9IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUoYXBwLCBsaW5rLm9yaWdpbmFsLCBsaW5rU3R5bGUpO1xuXG4gIGNvbnN0IHsgc3VicGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGxldCBzaG91bGRLZWVwQWxpYXMgPSAhc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcztcblxuICBpZiAoaXNDYW52YXNGaWxlKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSkpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UobGluaykpIHtcbiAgICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgc2hvdWxkS2VlcEFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIGFsaWFzID8/PSBzaG91bGRSZXNldEFsaWFzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRSZXNldEFsaWFzUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBkaXNwbGF5VGV4dDogbGluay5kaXNwbGF5VGV4dCxcbiAgICAgIGlzV2lraWxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGgsXG4gICAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gICAgfSkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHBhcnNlTGlua1Jlc3VsdD8uYWxpYXM7XG5cbiAgaWYgKCFzaG91bGRLZWVwQWxpYXMpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxpYXMgbWF0Y2hpbmcgYnJhbmNoZXMgYXJlIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHtcbiAgICBhbGlhcyxcbiAgICBhcHAsXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogb2xkU291cmNlUGF0aCA9PT0gb2xkVGFyZ2V0UGF0aCAmJiAhIXBhcnNlTGlua1Jlc3VsdD8uYWxpYXMsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbCxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICB9KSk7XG4gIHJldHVybiBuZXdMaW5rO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggdXBkYXRlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5Db250ZW50KHBhcmFtczogVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGF3YWl0IGVkaXRMaW5rc0luQ29udGVudChhcHAsIGNvbnRlbnQsIChsaW5rKSA9PiB7XG4gICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmssXG4gICAgICBsaW5rU3R5bGUsXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgYXJlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpICYmICFhcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZWRpdExpbmtzKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSwgKGxpbmspID0+IHtcbiAgICBjb25zdCBpc0VtYmVkTGluayA9IHRlc3RFbWJlZChsaW5rLm9yaWdpbmFsKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgbGluayxcbiAgICAgIGxpbmtTdHlsZSxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICAgIH0pKTtcbiAgfSwgcGFyYW1zKTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlVXJsU2FmZWx5KHVybDogc3RyaW5nLCBpc0V4dGVybmFsOiBib29sZWFuLCBoYXNBbmdsZUJyYWNrZXRzOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzRXh0ZXJuYWwgfHwgaGFzQW5nbGVCcmFja2V0cykge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIFVSTCAke3VybH1gLCBlcnJvcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0QWxpYXMoc3RyOiBzdHJpbmcsIGFsaWFzU3RhcnRPZmZzZXQ6IG51bWJlciwgYWxpYXNFbmRPZmZzZXQ6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhbGlhc1N0YXJ0T2Zmc2V0IDwgYWxpYXNFbmRPZmZzZXRcbiAgICA/IHN0ci5zbGljZShhbGlhc1N0YXJ0T2Zmc2V0LCBhbGlhc0VuZE9mZnNldClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRleHRMaW5rcyhzdHI6IHN0cmluZywgc3RhcnRPZmZzZXQ6IG51bWJlciwgZW5kT2Zmc2V0OiBudW1iZXIsIHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W10pOiB2b2lkIHtcbiAgaWYgKHN0YXJ0T2Zmc2V0ID4gZW5kT2Zmc2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdGV4dFBhcnQgPSBzdHIuc2xpY2Uoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCArIDEpO1xuICByZXBsYWNlQWxsKHRleHRQYXJ0LCAvKD88VXJsPlxcUyspL2csICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbdXJsID0gJyddLCBvZmZzZXQgfSkgPT4ge1xuICAgIGlmICghaXNVcmwodXJsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRMaW5rcy5wdXNoKHtcbiAgICAgIGVuY29kZWRVcmw6IGVuY29kZVVybCh1cmwpLFxuICAgICAgZW5kT2Zmc2V0OiBzdGFydE9mZnNldCArIG9mZnNldCArIHVybC5sZW5ndGgsXG4gICAgICBoYXNBbmdsZUJyYWNrZXRzOiBmYWxzZSxcbiAgICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgICAgcmF3OiB1cmwsXG4gICAgICBzdGFydE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQsXG4gICAgICB1cmxcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwodmFsdWU6IHVua25vd24sIGtleTogc3RyaW5nLCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsodmFsdWUpO1xuICAgIGlmICghcGFyc2VMaW5rUmVzdWx0IHx8IHBhcnNlTGlua1Jlc3VsdC5pc1dpa2lsaW5rIHx8IHBhcnNlTGlua1Jlc3VsdC5pc0V4dGVybmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/Pz0gW107XG4gICAgbGV0IGxpbmsgPSBjYWNoZS5mcm9udG1hdHRlckxpbmtzLmZpbmQoKGZyb250bWF0dGVyTGluaykgPT4gZnJvbnRtYXR0ZXJMaW5rLmtleSA9PT0ga2V5KTtcblxuICAgIGlmICghbGluaykge1xuICAgICAgbGluayA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICBsaW5rOiAnJyxcbiAgICAgICAgb3JpZ2luYWw6ICcnXG4gICAgICB9O1xuICAgICAgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcy5wdXNoKGxpbmspO1xuICAgIH1cblxuICAgIGxpbmsubGluayA9IHBhcnNlTGlua1Jlc3VsdC51cmw7XG4gICAgbGluay5vcmlnaW5hbCA9IHZhbHVlO1xuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQuYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGluay5kaXNwbGF5VGV4dCA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0Zyb250bWF0dGVyTGlua3MgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IFtjaGlsZEtleSwgY2hpbGRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgR2VuZXJpY09iamVjdCkpIHtcbiAgICBjb25zdCBoYXNDaGlsZEZyb250bWF0dGVyTGlua3MgPSBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKGNoaWxkVmFsdWUsIGtleSA/IGAke2tleX0uJHtjaGlsZEtleX1gIDogY2hpbGRLZXksIGNhY2hlKTtcbiAgICBoYXNGcm9udG1hdHRlckxpbmtzIHx8PSBoYXNDaGlsZEZyb250bWF0dGVyTGlua3M7XG4gIH1cblxuICByZXR1cm4gaGFzRnJvbnRtYXR0ZXJMaW5rcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChhcHA6IEFwcCwgdGFyZ2V0RmlsZTogVEZpbGUsIHNvdXJjZVBhdGg6IHN0cmluZywgc3VicGF0aDogc3RyaW5nLCBjb25maWc6IExpbmtDb25maWcpOiBzdHJpbmcge1xuICBpZiAoc291cmNlUGF0aCA9PT0gJy8nKSB7XG4gICAgc291cmNlUGF0aCA9ICcnO1xuICB9XG5cbiAgbGV0IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgaWYgKHRhcmdldEZpbGUucGF0aCA9PT0gc291cmNlUGF0aCAmJiBzdWJwYXRoICYmIGNvbmZpZy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkKSB7XG4gICAgbGlua1RleHQgPSAnJztcbiAgfSBlbHNlIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gICAgc3dpdGNoIChjb25maWcubGlua1BhdGhTdHlsZSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ6XG4gICAgICAgIGxpbmtUZXh0ID0gdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTpcbiAgICAgICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCB0YXJnZXRGaWxlLnBhdGgpO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgICBjb25zdCBzaG9ydGVzdE5hbWUgPSBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpID8gdGFyZ2V0RmlsZS5iYXNlbmFtZSA6IHRhcmdldEZpbGUubmFtZTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEZpbGVzID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0TGlua3BhdGhEZXN0KHNob3J0ZXN0TmFtZSwgc291cmNlUGF0aCk7XG4gICAgICAgIGxpbmtUZXh0ID0gbWF0Y2hlZEZpbGVzLmxlbmd0aCA9PT0gMSAmJiBtYXRjaGVkRmlsZXNbMF0gPT09IHRhcmdldEZpbGUgPyB0YXJnZXRGaWxlLm5hbWUgOiB0YXJnZXRGaWxlLnBhdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCB2YWxpZCBGaW5hbExpbmtQYXRoU3R5bGUgdmFsdWVzIGFyZSBoYW5kbGVkIGFib3ZlLiAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXIoY29uZmlnLmxpbmtQYXRoU3R5bGUpO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxuXG4gIGxpbmtUZXh0ID0gY29uZmlnLmlzV2lraWxpbmsgPyB0cmltRW5kKGxpbmtUZXh0LCBgLiR7TUFSS0RPV05fRklMRV9FWFRFTlNJT059YCkgOiBsaW5rVGV4dDtcbiAgbGlua1RleHQgKz0gc3VicGF0aDtcblxuICByZXR1cm4gbGlua1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzdWJwYXRoID0gcGFyYW1zLnN1YnBhdGggPz8gJyc7XG5cbiAgY29uc3QgbGlua0NvbmZpZyA9IGdldExpbmtDb25maWcocGFyYW1zLCB0YXJnZXRGaWxlKTtcbiAgY29uc3QgbGlua1RleHQgPSBnZW5lcmF0ZUxpbmtUZXh0KGFwcCwgdGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgc3VicGF0aCwgbGlua0NvbmZpZyk7XG5cbiAgcmV0dXJuIGxpbmtDb25maWcuaXNXaWtpbGlua1xuICAgID8gZ2VuZXJhdGVXaWtpTGluayhsaW5rVGV4dCwgcGFyYW1zLmFsaWFzLCBsaW5rQ29uZmlnLmlzRW1iZWQpXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0LCB0YXJnZXRGaWxlLCBwYXJhbXMsIGxpbmtDb25maWcpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0OiBzdHJpbmcsIHRhcmdldEZpbGU6IFRGaWxlLCBwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zLCBjb25maWc6IExpbmtDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGxldCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgbGV0IHNob3VsZEVzY2FwZUFsaWFzID0gcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBpZiAoIWFsaWFzICYmIChpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpIHx8ICFwYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkKSkge1xuICAgIGFsaWFzID0gIXBhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgIHNob3VsZEVzY2FwZUFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZDogY29uZmlnLmlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogY29uZmlnLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXaWtpTGluayhsaW5rVGV4dDogc3RyaW5nLCBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkLCBpc0VtYmVkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGFsaWFzPy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICAgIGlzRW1iZWQsXG4gICAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgICAgdXJsOiBhbGlhc1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBhbGlhcyxcbiAgICBpc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZUNoYW5nZXMoXG4gIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwsXG4gIGlzQ2FudmFzRmlsZUNhY2hlOiBib29sZWFuLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8RmlsZUNoYW5nZVtdPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXSA9IFtdO1xuXG4gIGNvbnN0IHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10gPSAoY2FjaGUuc2VjdGlvbnMgPz8gW10pLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi50eXBlID09PSAndGFibGUnKS5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgZW5kOiBzZWN0aW9uLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgc3RhcnQ6IHNlY3Rpb24ucG9zaXRpb24uc3RhcnQub2Zmc2V0XG4gIH0pKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0QWxsTGlua3MoY2FjaGUpKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2hhbmdlID0gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKGxpbmssIG5ld0NvbnRlbnQpO1xuXG4gICAgaWYgKGlzQ2FudmFzRmlsZUNhY2hlKSB7XG4gICAgICBpZiAoaXNDYW52YXNDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSBjaGFuZ2UnLCBmaWxlQ2hhbmdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcDogQXBwLCBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZSk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rUGF0aFN0eWxlID8/IExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGlua0NvbmZpZyhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zLCB0YXJnZXRGaWxlOiBURmlsZSk6IExpbmtDb25maWcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSByZXF1aXJlQXBpVmVyc2lvbiBmYWxsYmFjayBpcyBvbmx5IHJlYWNoZWQgaW4gb2xkZXIgT2JzaWRpYW4gdmVyc2lvbnMuICovXG4gICAgaXNFbWJlZDogcGFyYW1zLmlzRW1iZWQgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0RW1iZWQocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpXG4gICAgICA/PyAoIXJlcXVpcmVBcGlWZXJzaW9uKCcxLjEwLjAnKSAmJiAhaXNNYXJrZG93bkZpbGUoYXBwLCB0YXJnZXRGaWxlKSksXG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBwYXJhbXMuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCA/PyB0cnVlLFxuICAgIGlzV2lraWxpbms6IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUoYXBwLCBwYXJhbXMub3JpZ2luYWxMaW5rLCBwYXJhbXMubGlua1N0eWxlKSxcbiAgICBsaW5rUGF0aFN0eWxlOiBnZXRGaW5hbExpbmtQYXRoU3R5bGUoYXBwLCBwYXJhbXMubGlua1BhdGhTdHlsZSksXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0QW5nbGVCcmFja2V0cyhwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0TGVhZGluZ0RvdChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdExlYWRpbmdTbGFzaChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3TGluayhub2RlOiBOb2RlLCBzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBvcyA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUucG9zaXRpb24pO1xuICByZXR1cm4gc3RyLnNsaWNlKHBvcy5zdGFydC5vZmZzZXQsIHBvcy5lbmQub2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gaGFzQW5nbGVCcmFja2V0c0luTGluayhyYXc6IHN0cmluZywgcmF3VXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgT1BFTl9BTkdMRV9CUkFDS0VUID0gJzwnO1xuICByZXR1cm4gcmF3LnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKSB8fCByYXdVcmwuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpbmtOb2RlKG5vZGU6IExpbmssIHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgTElOS19BTElBU19TVUZGSVggPSAnXSgnO1xuICBjb25zdCBMSU5LX1NVRkZJWCA9ICcpJztcbiAgY29uc3QgcmF3ID0gZ2V0UmF3TGluayhub2RlLCBzdHIpO1xuICBjb25zdCBhbGlhc05vZGVTdGFydE9mZnNldCA9IG5vZGUuY2hpbGRyZW5bMF0/LnBvc2l0aW9uPy5zdGFydC5vZmZzZXQgPz8gMTtcbiAgY29uc3QgYWxpYXNOb2RlRW5kT2Zmc2V0ID0gbm9kZS5jaGlsZHJlbi5hdCgtMSk/LnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDE7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIGNvbnN0IG5vZGVFbmRPZmZzZXQgPSBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5lbmQub2Zmc2V0KTtcbiAgY29uc3Qgbm9kZVN0YXJ0T2Zmc2V0ID0gZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uc3RhcnQub2Zmc2V0KTtcbiAgY29uc3QgcmF3VXJsID0gc3RyLnNsaWNlKGFsaWFzTm9kZUVuZE9mZnNldCArIExJTktfQUxJQVNfU1VGRklYLmxlbmd0aCwgbm9kZUVuZE9mZnNldCAtIExJTktfU1VGRklYLmxlbmd0aCk7XG4gIGNvbnN0IGhhc0FuZ2xlQnJhY2tldHMgPSBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rKHJhdywgcmF3VXJsKTtcbiAgY29uc3QgaXNFeHRlcm5hbCA9IGlzVXJsKG5vZGUudXJsKTtcbiAgY29uc3QgdXJsID0gZGVjb2RlVXJsU2FmZWx5KG5vZGUudXJsLCBpc0V4dGVybmFsLCBoYXNBbmdsZUJyYWNrZXRzKTtcbiAgY29uc3QgYWxpYXMgPSBleHRyYWN0QWxpYXMoc3RyLCBhbGlhc05vZGVTdGFydE9mZnNldCwgYWxpYXNOb2RlRW5kT2Zmc2V0KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQYXJzZUxpbmtSZXN1bHQ+KHtcbiAgICBhbGlhcyxcbiAgICBlbmNvZGVkVXJsOiBpc0V4dGVybmFsID8gZW5jb2RlVXJsKHVybCkgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBub2RlRW5kT2Zmc2V0LFxuICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICByYXcsXG4gICAgc3RhcnRPZmZzZXQ6IG5vZGVTdGFydE9mZnNldCxcbiAgICB0aXRsZTogbm9kZS50aXRsZSA/PyB1bmRlZmluZWQsXG4gICAgdW5lc2NhcGVkQWxpYXM6IGFsaWFzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB1bmVzY2FwZUFsaWFzKGFsaWFzKSxcbiAgICB1cmxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2lraWxpbmtOb2RlKG5vZGU6IFdpa2lMaW5rTm9kZSwgc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBwb3NpdGlvbiA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUucG9zaXRpb24pO1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzOiBzdHIuaW5jbHVkZXMoV0lLSUxJTktfRElWSURFUikgPyBub2RlLmRhdGEuYWxpYXMgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5lbmQub2Zmc2V0KSxcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsOiBmYWxzZSxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIHJhdzogZ2V0UmF3TGluayhub2RlLCBzdHIpLFxuICAgIHN0YXJ0T2Zmc2V0OiBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5zdGFydC5vZmZzZXQpLFxuICAgIHVybDogbm9kZS52YWx1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcDogQXBwKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgbmV3TGlua0Zvcm1hdCA9IGdldE5ld0xpbmtGb3JtYXQoYXBwKTtcbiAgc3dpdGNoIChuZXdMaW5rRm9ybWF0KSB7XG4gICAgY2FzZSAnYWJzb2x1dGUnOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIGNhc2UgJ3JlbGF0aXZlJzpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U7XG4gICAgY2FzZSAnc2hvcnRlc3QnOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKG5ld0xpbmtGb3JtYXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEVzY2FwZVdpa2lsaW5rRGl2aWRlcihmaWxlQ2hhbmdlOiBGaWxlQ2hhbmdlLCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdKTogYm9vbGVhbiB7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBnZXRGaWxlQ2hhbmdlcyBvbmx5IGNhbGxzIHRoaXMgZm9yIG5vbi1jYW52YXMgZmlsZXMgd2hpY2ggYWx3YXlzIGhhdmUgY29udGVudCBjaGFuZ2VzLiAqL1xuICBpZiAoIWlzQ29udGVudENoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGlmICghVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLnRlc3QoZmlsZUNoYW5nZS5uZXdDb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZVBvc2l0aW9ucy5zb21lKCh0YWJsZVBvc2l0aW9uKSA9PiB0YWJsZVBvc2l0aW9uLnN0YXJ0IDw9IGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAmJiBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0IDw9IHRhYmxlUG9zaXRpb24uZW5kKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShhcHA6IEFwcCwgb3JpZ2luYWxMaW5rPzogc3RyaW5nLCBsaW5rU3R5bGU/OiBMaW5rU3R5bGUpOiBib29sZWFuIHtcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtTdHlsZSA/PyBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZztcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rU3R5bGUuTWFya2Rvd246XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBMaW5rU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6XG4gICAgICByZXR1cm4gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCk7XG4gICAgY2FzZSBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZzpcbiAgICAgIHJldHVybiBvcmlnaW5hbExpbmsgPT09IHVuZGVmaW5lZCA/IHNob3VsZFVzZVdpa2lsaW5rcyhhcHApIDogdGVzdFdpa2lsaW5rKG9yaWdpbmFsTGluayk7XG4gICAgY2FzZSBMaW5rU3R5bGUuV2lraWxpbms6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAg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QUs7QUFDSCxhQUFPO0FBQUEsSUFDVCxLQUFLO0FBQ0gsYUFBTztBQUFBLElBQ1Q7QUFDRSwwQ0FBWSxhQUFhO0FBQUEsRUFDN0I7QUFDRjtBQUVBLFNBQVMsNEJBQTRCLFlBQXdCLGdCQUEwQztBQUVyRyxNQUFJLEtBQUMsb0NBQWdCLFVBQVUsR0FBRztBQUNoQyxXQUFPO0FBQUEsRUFDVDtBQUdBLE1BQUksQ0FBQyxrQ0FBa0MsS0FBSyxXQUFXLFVBQVUsR0FBRztBQUNsRSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sZUFBZSxLQUFLLENBQUMsa0JBQWtCLGNBQWMsU0FBUyxXQUFXLFVBQVUsU0FBUyxNQUFNLFVBQVUsV0FBVyxVQUFVLFNBQVMsSUFBSSxVQUFVLGNBQWMsR0FBRztBQUNsTDtBQUVBLFNBQVMsdUJBQXVCLEtBQVUsY0FBdUIsV0FBZ0M7QUFDL0YsUUFBTSxnQkFBZ0IsYUFBYTtBQUNuQyxVQUFRLGVBQWU7QUFBQSxJQUNyQixLQUFLO0FBQ0gsYUFBTztBQUFBLElBQ1QsS0FBSztBQUNILGlCQUFPLDZDQUFtQixHQUFHO0FBQUEsSUFDL0IsS0FBSztBQUNILGFBQU8saUJBQWlCLGFBQVksNkNBQW1CLEdBQUcsSUFBSSxhQUFhLFlBQVk7QUFBQSxJQUN6RixLQUFLO0FBQ0gsYUFBTztBQUFBLElBQ1Q7QUFDRSwwQ0FBWSxhQUFhO0FBQUEsRUFDN0I7QUFDRjsiLAogICJuYW1lcyI6IFsiTGlua1BhdGhTdHlsZSIsICJMaW5rU3R5bGUiLCAicmVtYXJrUGFyc2UiXQp9Cg==
@@ -5,7 +5,7 @@
5
5
  * This module provides utilities for handling and updating links within Obsidian vaults. It includes
6
6
  * functions to split paths, update links in files, and generate markdown links with various options.
7
7
  */
8
- import type { App, CachedMetadata, Plugin, Reference, TFile } from 'obsidian';
8
+ import type { App, CachedMetadata, Reference, TFile } from 'obsidian';
9
9
  import type { Promisable } from 'type-fest';
10
10
  import type { MaybeReturn } from '../type.cjs';
11
11
  import type { PathOrFile } from './file-system.cjs';
@@ -64,7 +64,7 @@ export declare enum LinkStyle {
64
64
  Wikilink = "Wikilink"
65
65
  }
66
66
  /**
67
- * Options for {@link convertLink}.
67
+ * Params for {@link convertLink}.
68
68
  */
69
69
  export interface ConvertLinkParams {
70
70
  /**
@@ -93,7 +93,7 @@ export interface ConvertLinkParams {
93
93
  readonly shouldUpdateFileNameAlias?: boolean;
94
94
  }
95
95
  /**
96
- * Options for {@link generateMarkdownLink}.
96
+ * Params for {@link generateMarkdownLink}.
97
97
  */
98
98
  export interface GenerateMarkdownLinkParams {
99
99
  /**
@@ -233,7 +233,7 @@ export interface GenerateMarkdownLinkParams {
233
233
  readonly targetPathOrFile: PathOrFile;
234
234
  }
235
235
  /**
236
- * Options for {@link generateRawMarkdownLink}.
236
+ * Params for {@link generateRawMarkdownLink}.
237
237
  */
238
238
  export interface GenerateRawMarkdownLinkParams {
239
239
  /**
@@ -373,7 +373,7 @@ export interface ParseLinkResult {
373
373
  readonly url: string;
374
374
  }
375
375
  /**
376
- * Options for {@link shouldResetAlias}.
376
+ * Params for {@link shouldResetAlias}.
377
377
  */
378
378
  export interface ShouldResetAliasParams {
379
379
  /**
@@ -419,7 +419,7 @@ export interface SplitSubpathResult {
419
419
  readonly subpath: string;
420
420
  }
421
421
  /**
422
- * Options for {@link updateLink}.
422
+ * Params for {@link updateLink}.
423
423
  */
424
424
  export interface UpdateLinkParams {
425
425
  /**
@@ -456,7 +456,7 @@ export interface UpdateLinkParams {
456
456
  readonly shouldUpdateFileNameAlias?: boolean;
457
457
  }
458
458
  /**
459
- * Options for {@link updateLinksInFile}.
459
+ * Params for {@link updateLinksInFile}.
460
460
  */
461
461
  export interface UpdateLinksInFileParams extends ProcessOptions {
462
462
  /**
@@ -485,7 +485,7 @@ export interface UpdateLinksInFileParams extends ProcessOptions {
485
485
  readonly shouldUpdateFileNameAlias?: boolean;
486
486
  }
487
487
  /**
488
- * Options for {@link updateLinksInContent}.
488
+ * Params for {@link updateLinksInContent}.
489
489
  */
490
490
  interface UpdateLinksInContentParams {
491
491
  /**
@@ -598,12 +598,23 @@ export declare function fixFrontmatterMarkdownLinks(cache: CachedMetadata): bool
598
598
  */
599
599
  export declare function generateMarkdownLink(params: GenerateMarkdownLinkParams): string;
600
600
  /**
601
- * Generates a raw markdown link based on the provided options.
601
+ * Generates a raw markdown link based on the provided params.
602
602
  *
603
603
  * @param params - The parameters for generating a raw markdown link.
604
604
  * @returns A raw markdown link.
605
605
  */
606
606
  export declare function generateRawMarkdownLink(params: GenerateRawMarkdownLinkParams): string;
607
+ /**
608
+ * Returns the shared, mutable list of functions that provide default params for {@link generateMarkdownLink}.
609
+ *
610
+ * Each function is invoked on every {@link generateMarkdownLink} call and its result is merged into the params (later
611
+ * registrations take precedence over the built-in defaults, but never over explicitly passed params). Register entries
612
+ * by adding a `GenerateMarkdownLinkDefaultParamsComponent` to a component tree rather than mutating this list directly.
613
+ *
614
+ * @param app - The Obsidian app instance whose shared state holds the list.
615
+ * @returns The mutable list of default-params functions.
616
+ */
617
+ export declare function getGenerateMarkdownLinkDefaultParamsFns(app: App): (() => Partial<GenerateMarkdownLinkParams>)[];
607
618
  /**
608
619
  * Parses a link into its components.
609
620
  *
@@ -618,13 +629,6 @@ export declare function parseLink(str: string): null | ParseLinkResult;
618
629
  * @returns The parsed links.
619
630
  */
620
631
  export declare function parseLinks(str: string): ParseLinkResult[];
621
- /**
622
- * Registers a function that returns default options for generating a markdown link.
623
- *
624
- * @param plugin - The plugin instance.
625
- * @param fn - The function that returns the default options.
626
- */
627
- export declare function registerGenerateMarkdownLinkDefaultOptionsFn(plugin: Plugin, fn: () => Partial<GenerateMarkdownLinkParams>): void;
628
632
  /**
629
633
  * Determines if the alias of a link should be reset.
630
634
  *