@mnaoumov/obsidian-lib 10.4.1 → 10.5.1

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 (118) hide show
  1. package/README.md +6 -0
  2. package/codemirror/incremental-parse-state-field/package.json +6 -0
  3. package/codemirror/markdown-editor-views/package.json +6 -0
  4. package/codemirror/range-set/package.json +6 -0
  5. package/command-handlers/open-bug-report-command-handler/package.json +6 -0
  6. package/components/embeddable-markdown-editor-component/package.json +6 -0
  7. package/components/reconfigurable-editor-extension-component/package.json +6 -0
  8. package/dist/lib/cjs/__merged.cjs +54 -1
  9. package/dist/lib/cjs/__merged.d.cts +14 -3
  10. package/dist/lib/cjs/attachment-path.cjs +3 -2
  11. package/dist/lib/cjs/backlink-index.cjs +44 -8
  12. package/dist/lib/cjs/backlink-index.d.cts +23 -0
  13. package/dist/lib/cjs/bug-report.cjs +241 -0
  14. package/dist/lib/cjs/bug-report.d.cts +161 -0
  15. package/dist/lib/cjs/bulk-operation-progress.cjs +16 -1
  16. package/dist/lib/cjs/bulk-operation-progress.d.cts +22 -0
  17. package/dist/lib/cjs/case-insensitive-file-index.cjs +9 -1
  18. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +162 -0
  19. package/dist/lib/cjs/codemirror/incremental-parse-state-field.d.cts +37 -0
  20. package/dist/lib/cjs/codemirror/index.cjs +10 -1
  21. package/dist/lib/cjs/codemirror/index.d.cts +3 -0
  22. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +142 -0
  23. package/dist/lib/cjs/codemirror/markdown-editor-views.d.cts +34 -0
  24. package/dist/lib/cjs/codemirror/range-set.cjs +106 -0
  25. package/dist/lib/cjs/codemirror/range-set.d.cts +35 -0
  26. package/dist/lib/cjs/command-handlers/index.cjs +4 -1
  27. package/dist/lib/cjs/command-handlers/index.d.cts +1 -0
  28. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +139 -0
  29. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +53 -0
  30. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +6 -3
  31. package/dist/lib/cjs/community-plugins.cjs +19 -2
  32. package/dist/lib/cjs/community-plugins.d.cts +14 -0
  33. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +5 -2
  34. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +374 -0
  35. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +221 -0
  36. package/dist/lib/cjs/components/index.cjs +7 -1
  37. package/dist/lib/cjs/components/index.d.cts +2 -0
  38. package/dist/lib/cjs/components/plugin-gate-component.cjs +6 -3
  39. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +200 -0
  40. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.d.cts +96 -0
  41. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +105 -2
  42. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +38 -13
  43. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +21 -1
  44. package/dist/lib/cjs/desktop-operating-system.cjs +101 -0
  45. package/dist/lib/cjs/desktop-operating-system.d.cts +15 -0
  46. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  47. package/dist/lib/cjs/i18n/locales/en.cjs +2 -1
  48. package/dist/lib/cjs/i18n/locales/en.d.cts +1 -0
  49. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +1 -0
  50. package/dist/lib/cjs/index.cjs +16 -1
  51. package/dist/lib/cjs/index.d.cts +5 -0
  52. package/dist/lib/cjs/menu.cjs +118 -0
  53. package/dist/lib/cjs/menu.d.cts +65 -0
  54. package/dist/lib/cjs/mobile-app-info.cjs +167 -0
  55. package/dist/lib/cjs/mobile-app-info.d.cts +32 -0
  56. package/dist/lib/cjs/modals/modal.cjs +8 -5
  57. package/dist/lib/cjs/modals/modal.d.cts +4 -0
  58. package/dist/lib/cjs/obsidian-settings.cjs +2 -2
  59. package/dist/lib/cjs/plugin/plugin.cjs +5 -2
  60. package/dist/lib/cjs/plugin/plugin.d.cts +2 -0
  61. package/dist/lib/cjs/settings-modal.cjs +103 -0
  62. package/dist/lib/cjs/settings-modal.d.cts +33 -0
  63. package/dist/lib/esm/__merged.d.mts +14 -3
  64. package/dist/lib/esm/__merged.mjs +50 -2
  65. package/dist/lib/esm/attachment-path.mjs +3 -2
  66. package/dist/lib/esm/backlink-index.d.mts +23 -0
  67. package/dist/lib/esm/backlink-index.mjs +42 -7
  68. package/dist/lib/esm/bug-report.d.mts +161 -0
  69. package/dist/lib/esm/bug-report.mjs +141 -0
  70. package/dist/lib/esm/bulk-operation-progress.d.mts +22 -0
  71. package/dist/lib/esm/bulk-operation-progress.mjs +14 -1
  72. package/dist/lib/esm/case-insensitive-file-index.mjs +9 -1
  73. package/dist/lib/esm/codemirror/incremental-parse-state-field.d.mts +37 -0
  74. package/dist/lib/esm/codemirror/incremental-parse-state-field.mjs +74 -0
  75. package/dist/lib/esm/codemirror/index.d.mts +3 -0
  76. package/dist/lib/esm/codemirror/index.mjs +7 -1
  77. package/dist/lib/esm/codemirror/markdown-editor-views.d.mts +34 -0
  78. package/dist/lib/esm/codemirror/markdown-editor-views.mjs +53 -0
  79. package/dist/lib/esm/codemirror/range-set.d.mts +35 -0
  80. package/dist/lib/esm/codemirror/range-set.mjs +18 -0
  81. package/dist/lib/esm/command-handlers/index.d.mts +1 -0
  82. package/dist/lib/esm/command-handlers/index.mjs +3 -1
  83. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +53 -0
  84. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +51 -0
  85. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +6 -3
  86. package/dist/lib/esm/community-plugins.d.mts +14 -0
  87. package/dist/lib/esm/community-plugins.mjs +18 -2
  88. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +5 -2
  89. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +221 -0
  90. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +293 -0
  91. package/dist/lib/esm/components/index.d.mts +2 -0
  92. package/dist/lib/esm/components/index.mjs +5 -1
  93. package/dist/lib/esm/components/plugin-gate-component.mjs +6 -3
  94. package/dist/lib/esm/components/reconfigurable-editor-extension-component.d.mts +96 -0
  95. package/dist/lib/esm/components/reconfigurable-editor-extension-component.mjs +112 -0
  96. package/dist/lib/esm/components/rename-delete-handler-component.mjs +105 -2
  97. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +21 -1
  98. package/dist/lib/esm/desktop-bulk-operation-git.mjs +38 -13
  99. package/dist/lib/esm/desktop-operating-system.d.mts +15 -0
  100. package/dist/lib/esm/desktop-operating-system.mjs +16 -0
  101. package/dist/lib/esm/generated-during-build.mjs +1 -1
  102. package/dist/lib/esm/i18n/locales/en.d.mts +1 -0
  103. package/dist/lib/esm/i18n/locales/en.mjs +2 -1
  104. package/dist/lib/esm/i18n/locales/translations-map.d.mts +1 -0
  105. package/dist/lib/esm/index.d.mts +5 -0
  106. package/dist/lib/esm/index.mjs +11 -1
  107. package/dist/lib/esm/menu.d.mts +65 -0
  108. package/dist/lib/esm/menu.mjs +30 -0
  109. package/dist/lib/esm/mobile-app-info.d.mts +32 -0
  110. package/dist/lib/esm/mobile-app-info.mjs +84 -0
  111. package/dist/lib/esm/modals/modal.d.mts +4 -0
  112. package/dist/lib/esm/modals/modal.mjs +8 -5
  113. package/dist/lib/esm/obsidian-settings.mjs +6 -3
  114. package/dist/lib/esm/plugin/plugin.d.mts +2 -0
  115. package/dist/lib/esm/plugin/plugin.mjs +5 -2
  116. package/dist/lib/esm/settings-modal.d.mts +33 -0
  117. package/dist/lib/esm/settings-modal.mjs +15 -0
  118. package/package.json +9 -8
@@ -0,0 +1,139 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function patchObsidianRequire() {
6
+ const originalRequire = require;
7
+ if (!originalRequire || originalRequire.__isPatched) {
8
+ return;
9
+ }
10
+ require = Object.assign(
11
+ (id) => requirePatched(id),
12
+ originalRequire,
13
+ {
14
+ __isPatched: true
15
+ }
16
+ );
17
+ function extractDefault($module) {
18
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
19
+ }
20
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
21
+ "@codemirror/autocomplete",
22
+ "@codemirror/collab",
23
+ "@codemirror/commands",
24
+ "@codemirror/language",
25
+ "@codemirror/lint",
26
+ "@codemirror/search",
27
+ "@codemirror/state",
28
+ "@codemirror/text",
29
+ "@codemirror/view",
30
+ "@lezer/common",
31
+ "@lezer/highlight",
32
+ "@lezer/lr",
33
+ "obsidian"
34
+ ]);
35
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
36
+ "@codemirror/closebrackets",
37
+ "@codemirror/comment",
38
+ "@codemirror/fold",
39
+ "@codemirror/gutter",
40
+ "@codemirror/highlight",
41
+ "@codemirror/history",
42
+ "@codemirror/matchbrackets",
43
+ "@codemirror/panel",
44
+ "@codemirror/rangeset",
45
+ "@codemirror/rectangular-selection",
46
+ "@codemirror/stream-parser",
47
+ "@codemirror/tooltip"
48
+ ]);
49
+ function requirePatched(id) {
50
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
51
+ return originalRequire?.(id);
52
+ }
53
+ const app = globalThis.app;
54
+ if (app?.isMobile) {
55
+ if (id === "process" || id === "node:process") {
56
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
57
+ return process;
58
+ }
59
+ } else {
60
+ const $module = originalRequire?.(id);
61
+ if ($module) {
62
+ return extractDefault($module);
63
+ }
64
+ }
65
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
66
+ return {};
67
+ }
68
+ })();
69
+
70
+ "use strict";
71
+ var __defProp = Object.defineProperty;
72
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
73
+ var __getOwnPropNames = Object.getOwnPropertyNames;
74
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
75
+ var __export = (target, all) => {
76
+ for (var name in all)
77
+ __defProp(target, name, { get: all[name], enumerable: true });
78
+ };
79
+ var __copyProps = (to, from, except, desc) => {
80
+ if (from && typeof from === "object" || typeof from === "function") {
81
+ for (let key of __getOwnPropNames(from))
82
+ if (!__hasOwnProp.call(to, key) && key !== except)
83
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
84
+ }
85
+ return to;
86
+ };
87
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
88
+ var open_bug_report_command_handler_exports = {};
89
+ __export(open_bug_report_command_handler_exports, {
90
+ OpenBugReportCommandHandler: () => OpenBugReportCommandHandler
91
+ });
92
+ module.exports = __toCommonJS(open_bug_report_command_handler_exports);
93
+ var import_bug_report = require('../bug-report.cjs');
94
+ var import_global_command_handler = require('./global-command-handler.cjs');
95
+ class OpenBugReportCommandHandler extends import_global_command_handler.GlobalCommandHandler {
96
+ /**
97
+ * The Obsidian app instance.
98
+ */
99
+ app;
100
+ /**
101
+ * The plugin's GitHub repository, as `owner/name`.
102
+ */
103
+ gitHubRepo;
104
+ /**
105
+ * The id of the reporting plugin.
106
+ */
107
+ pluginId;
108
+ /**
109
+ * Constructs a new instance.
110
+ *
111
+ * @param params - Constructor parameters.
112
+ */
113
+ constructor(params) {
114
+ super({
115
+ icon: "bug",
116
+ id: "report-bug",
117
+ name: "Report a bug"
118
+ });
119
+ this.app = params.app;
120
+ this.pluginId = params.pluginId;
121
+ this.gitHubRepo = params.gitHubRepo;
122
+ }
123
+ /**
124
+ * Executes the command, opening the prefilled issue form in the browser.
125
+ */
126
+ async execute() {
127
+ const url = await (0, import_bug_report.getBugReportIssueFormUrl)({
128
+ app: this.app,
129
+ gitHubRepo: this.gitHubRepo,
130
+ pluginId: this.pluginId
131
+ });
132
+ window.open(url, "_blank");
133
+ }
134
+ }
135
+ // Annotate the CommonJS export names for ESM import in node:
136
+ 0 && (module.exports = {
137
+ OpenBugReportCommandHandler
138
+ });
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tYW5kLWhhbmRsZXJzL29wZW4tYnVnLXJlcG9ydC1jb21tYW5kLWhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEhhbmRsZXMgdGhlIFwiUmVwb3J0IGEgYnVnXCIgY29tbWFuZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsIH0gZnJvbSAnLi4vYnVnLXJlcG9ydC50cyc7XG5pbXBvcnQgeyBHbG9iYWxDb21tYW5kSGFuZGxlciB9IGZyb20gJy4vZ2xvYmFsLWNvbW1hbmQtaGFuZGxlci50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIE9wZW5CdWdSZXBvcnRDb21tYW5kSGFuZGxlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkJ1Z1JlcG9ydENvbW1hbmRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgR2l0SHViIHJlcG9zaXRvcnksIGFzIGBvd25lci9uYW1lYC5cbiAgICovXG4gIHJlYWRvbmx5IGdpdEh1YlJlcG86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSByZXBvcnRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbW1hbmQgaGFuZGxlciB0aGF0IG9wZW5zIHRoZSBwbHVnaW4ncyBidWctcmVwb3J0IGlzc3VlIGZvcm0gb24gR2l0SHViLCBwcmVmaWxsZWQgd2l0aCB0aGVcbiAqIGVudmlyb25tZW50LiBTZWUge0BsaW5rIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybH0gZm9yIHRoZSBmaWVsZCBpZHMgdGhlIGZvcm0gbXVzdCB1c2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuQnVnUmVwb3J0Q29tbWFuZEhhbmRsZXIgZXh0ZW5kcyBHbG9iYWxDb21tYW5kSGFuZGxlciB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgR2l0SHViIHJlcG9zaXRvcnksIGFzIGBvd25lci9uYW1lYC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBnaXRIdWJSZXBvOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcmVwb3J0aW5nIHBsdWdpbi5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQ29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE9wZW5CdWdSZXBvcnRDb21tYW5kSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgaWNvbjogJ2J1ZycsXG4gICAgICBpZDogJ3JlcG9ydC1idWcnLFxuICAgICAgbmFtZTogJ1JlcG9ydCBhIGJ1ZydcbiAgICB9KTtcblxuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbklkID0gcGFyYW1zLnBsdWdpbklkO1xuICAgIHRoaXMuZ2l0SHViUmVwbyA9IHBhcmFtcy5naXRIdWJSZXBvO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kLCBvcGVuaW5nIHRoZSBwcmVmaWxsZWQgaXNzdWUgZm9ybSBpbiB0aGUgYnJvd3Nlci5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGF3YWl0IGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZ2l0SHViUmVwbzogdGhpcy5naXRIdWJSZXBvLFxuICAgICAgcGx1Z2luSWQ6IHRoaXMucGx1Z2luSWRcbiAgICB9KTtcbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEsd0JBQXlDO0FBQ3pDLG9DQUFxQztBQTBCOUIsTUFBTSxvQ0FBb0MsbURBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9aLFlBQVksUUFBc0Q7QUFDdkUsVUFBTTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLElBQ1IsQ0FBQztBQUVELFNBQUssTUFBTSxPQUFPO0FBQ2xCLFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUssYUFBYSxPQUFPO0FBQUEsRUFDM0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQXNCLFVBQXlCO0FBQzdDLFVBQU0sTUFBTSxVQUFNLDRDQUF5QjtBQUFBLE1BQ3pDLEtBQUssS0FBSztBQUFBLE1BQ1YsWUFBWSxLQUFLO0FBQUEsTUFDakIsVUFBVSxLQUFLO0FBQUEsSUFDakIsQ0FBQztBQUNELFdBQU8sS0FBSyxLQUFLLFFBQVE7QUFBQSxFQUMzQjtBQUNGOyIsIm5hbWVzIjpbXX0=
@@ -0,0 +1,53 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Handles the "Report a bug" command.
6
+ */
7
+ import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
8
+ import { GlobalCommandHandler } from './global-command-handler.cjs';
9
+ /**
10
+ * Constructor parameters for {@link OpenBugReportCommandHandler}.
11
+ */
12
+ export interface OpenBugReportCommandHandlerConstructorParams {
13
+ /**
14
+ * The Obsidian app instance.
15
+ */
16
+ readonly app: App;
17
+ /**
18
+ * The plugin's GitHub repository, as `owner/name`.
19
+ */
20
+ readonly gitHubRepo: string;
21
+ /**
22
+ * The id of the reporting plugin.
23
+ */
24
+ readonly pluginId: string;
25
+ }
26
+ /**
27
+ * A command handler that opens the plugin's bug-report issue form on GitHub, prefilled with the
28
+ * environment. See {@link getBugReportIssueFormUrl} for the field ids the form must use.
29
+ */
30
+ export declare class OpenBugReportCommandHandler extends GlobalCommandHandler {
31
+ /**
32
+ * The Obsidian app instance.
33
+ */
34
+ protected readonly app: App;
35
+ /**
36
+ * The plugin's GitHub repository, as `owner/name`.
37
+ */
38
+ protected readonly gitHubRepo: string;
39
+ /**
40
+ * The id of the reporting plugin.
41
+ */
42
+ protected readonly pluginId: string;
43
+ /**
44
+ * Constructs a new instance.
45
+ *
46
+ * @param params - Constructor parameters.
47
+ */
48
+ constructor(params: OpenBugReportCommandHandlerConstructorParams);
49
+ /**
50
+ * Executes the command, opening the prefilled issue form in the browser.
51
+ */
52
+ execute(): Promise<void>;
53
+ }
@@ -90,6 +90,7 @@ __export(open_settings_command_handler_exports, {
90
90
  OpenSettingsCommandHandler: () => OpenSettingsCommandHandler
91
91
  });
92
92
  module.exports = __toCommonJS(open_settings_command_handler_exports);
93
+ var import_settings_modal = require('../settings-modal.cjs');
93
94
  var import_global_command_handler = require('./global-command-handler.cjs');
94
95
  class OpenSettingsCommandHandler extends import_global_command_handler.GlobalCommandHandler {
95
96
  /**
@@ -118,12 +119,14 @@ class OpenSettingsCommandHandler extends import_global_command_handler.GlobalCom
118
119
  * Executes the command.
119
120
  */
120
121
  execute() {
121
- this.app.setting.open();
122
- this.app.setting.openTab(this.settingTab);
122
+ (0, import_settings_modal.openSettingTab)({
123
+ app: this.app,
124
+ tabId: this.settingTab.id
125
+ });
123
126
  }
124
127
  }
125
128
  // Annotate the CommonJS export names for ESM import in node:
126
129
  0 && (module.exports = {
127
130
  OpenSettingsCommandHandler
128
131
  });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tYW5kLWhhbmRsZXJzL29wZW4tc2V0dGluZ3MtY29tbWFuZC1oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIYW5kbGVzIHRoZSBcIk9wZW4gc2V0dGluZ3NcIiBjb21tYW5kLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBTZXR0aW5nVGFiXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgR2xvYmFsQ29tbWFuZEhhbmRsZXIgfSBmcm9tICcuL2dsb2JhbC1jb21tYW5kLWhhbmRsZXIudHMnO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZm9yIHtAbGluayBPcGVuU2V0dGluZ3NDb21tYW5kSGFuZGxlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlblNldHRpbmdzQ29tbWFuZEhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5nIHRhYiB0byBvcGVuLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZ1RhYjogU2V0dGluZ1RhYjtcbn1cblxuLyoqXG4gKiBBIGNvbW1hbmQgaGFuZGxlciB0aGF0IG9wZW5zIHRoZSBzZXR0aW5ncyB0YWIgZm9yIGEgcGx1Z2luLlxuICovXG5leHBvcnQgY2xhc3MgT3BlblNldHRpbmdzQ29tbWFuZEhhbmRsZXIgZXh0ZW5kcyBHbG9iYWxDb21tYW5kSGFuZGxlciB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZyB0YWIgdG8gb3Blbi5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nVGFiOiBTZXR0aW5nVGFiO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQ29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE9wZW5TZXR0aW5nc0NvbW1hbmRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICBpY29uOiAnc2V0dGluZ3MnLFxuICAgICAgaWQ6ICdvcGVuLXNldHRpbmdzJyxcbiAgICAgIG5hbWU6ICdPcGVuIHNldHRpbmdzJ1xuICAgIH0pO1xuXG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuc2V0dGluZ1RhYiA9IHBhcmFtcy5zZXR0aW5nVGFiO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGV4ZWN1dGUoKTogdm9pZCB7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuKCk7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuVGFiKHRoaXMuc2V0dGluZ1RhYik7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVdBLG9DQUFxQztBQW9COUIsTUFBTSxtQ0FBbUMsbURBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1osWUFBWSxRQUFxRDtBQUN0RSxVQUFNO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsSUFDUixDQUFDO0FBRUQsU0FBSyxNQUFNLE9BQU87QUFDbEIsU0FBSyxhQUFhLE9BQU87QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLFVBQWdCO0FBQzlCLFNBQUssSUFBSSxRQUFRLEtBQUs7QUFDdEIsU0FBSyxJQUFJLFFBQVEsUUFBUSxLQUFLLFVBQVU7QUFBQSxFQUMxQztBQUNGOyIsIm5hbWVzIjpbXX0=
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tYW5kLWhhbmRsZXJzL29wZW4tc2V0dGluZ3MtY29tbWFuZC1oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIYW5kbGVzIHRoZSBcIk9wZW4gc2V0dGluZ3NcIiBjb21tYW5kLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBTZXR0aW5nVGFiXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgb3BlblNldHRpbmdUYWIgfSBmcm9tICcuLi9zZXR0aW5ncy1tb2RhbC50cyc7XG5pbXBvcnQgeyBHbG9iYWxDb21tYW5kSGFuZGxlciB9IGZyb20gJy4vZ2xvYmFsLWNvbW1hbmQtaGFuZGxlci50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIE9wZW5TZXR0aW5nc0NvbW1hbmRIYW5kbGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuU2V0dGluZ3NDb21tYW5kSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHNldHRpbmcgdGFiIHRvIG9wZW4uXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5nVGFiOiBTZXR0aW5nVGFiO1xufVxuXG4vKipcbiAqIEEgY29tbWFuZCBoYW5kbGVyIHRoYXQgb3BlbnMgdGhlIHNldHRpbmdzIHRhYiBmb3IgYSBwbHVnaW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuU2V0dGluZ3NDb21tYW5kSGFuZGxlciBleHRlbmRzIEdsb2JhbENvbW1hbmRIYW5kbGVyIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5nIHRhYiB0byBvcGVuLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdUYWI6IFNldHRpbmdUYWI7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogT3BlblNldHRpbmdzQ29tbWFuZEhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIGljb246ICdzZXR0aW5ncycsXG4gICAgICBpZDogJ29wZW4tc2V0dGluZ3MnLFxuICAgICAgbmFtZTogJ09wZW4gc2V0dGluZ3MnXG4gICAgfSk7XG5cbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5zZXR0aW5nVGFiID0gcGFyYW1zLnNldHRpbmdUYWI7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZXhlY3V0ZSgpOiB2b2lkIHtcbiAgICBvcGVuU2V0dGluZ1RhYih7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgdGFiSWQ6IHRoaXMuc2V0dGluZ1RhYi5pZFxuICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSw0QkFBK0I7QUFDL0Isb0NBQXFDO0FBb0I5QixNQUFNLG1DQUFtQyxtREFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUloRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPWixZQUFZLFFBQXFEO0FBQ3RFLFVBQU07QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxJQUNSLENBQUM7QUFFRCxTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLGFBQWEsT0FBTztBQUFBLEVBQzNCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZ0IsVUFBZ0I7QUFDOUIsOENBQWU7QUFBQSxNQUNiLEtBQUssS0FBSztBQUFBLE1BQ1YsT0FBTyxLQUFLLFdBQVc7QUFBQSxJQUN6QixDQUFDO0FBQUEsRUFDSDtBQUNGOyIsIm5hbWVzIjpbXX0=
@@ -115,6 +115,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
115
115
  var community_plugins_exports = {};
116
116
  __export(community_plugins_exports, {
117
117
  ConfigureCommunityPluginResult: () => ConfigureCommunityPluginResult,
118
+ PluginEnableRefusedError: () => PluginEnableRefusedError,
118
119
  UpdateCommunityPluginResult: () => UpdateCommunityPluginResult,
119
120
  configureCommunityPlugin: () => configureCommunityPlugin,
120
121
  disableCommunityPlugin: () => disableCommunityPlugin,
@@ -147,6 +148,19 @@ var UpdateCommunityPluginResult = /* @__PURE__ */ ((UpdateCommunityPluginResult2
147
148
  UpdateCommunityPluginResult2["Updated"] = "updated";
148
149
  return UpdateCommunityPluginResult2;
149
150
  })(UpdateCommunityPluginResult || {});
151
+ class PluginEnableRefusedError extends Error {
152
+ /**
153
+ * Creates a {@link PluginEnableRefusedError}.
154
+ *
155
+ * @param pluginId - The id of the plugin Obsidian refused to enable.
156
+ */
157
+ constructor(pluginId) {
158
+ super(`Obsidian refused to enable the plugin "${pluginId}".`);
159
+ this.pluginId = pluginId;
160
+ this.name = "PluginEnableRefusedError";
161
+ }
162
+ pluginId;
163
+ }
150
164
  async function configureCommunityPlugin(params) {
151
165
  const { app, settings } = params;
152
166
  const pluginId = await resolveCommunityPluginId(params);
@@ -189,7 +203,9 @@ async function enableCommunityPlugin(params) {
189
203
  if (app.plugins.enabledPlugins.has(pluginId)) {
190
204
  return;
191
205
  }
192
- await app.plugins.enablePluginAndSave(pluginId);
206
+ if (!await app.plugins.enablePluginAndSave(pluginId)) {
207
+ throw new PluginEnableRefusedError(pluginId);
208
+ }
193
209
  }
194
210
  async function getCommunityPluginRepo(pluginId) {
195
211
  const entries = await getCommunityPluginEntries();
@@ -329,6 +345,7 @@ async function resolveCommunityPluginId(reference) {
329
345
  // Annotate the CommonJS export names for ESM import in node:
330
346
  0 && (module.exports = {
331
347
  ConfigureCommunityPluginResult,
348
+ PluginEnableRefusedError,
332
349
  UpdateCommunityPluginResult,
333
350
  configureCommunityPlugin,
334
351
  disableCommunityPlugin,
@@ -343,4 +360,4 @@ async function resolveCommunityPluginId(reference) {
343
360
  uninstallCommunityPlugin,
344
361
  updateCommunityPlugin
345
362
  });
346
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tdW5pdHktcGx1Z2lucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogUmVzb2x2ZXMsIHNlYXJjaGVzIGFuZCBtYW5hZ2VzIGNvbW11bml0eSBwbHVnaW5zIHRocm91Z2ggT2JzaWRpYW4ncyBwdWJsaWMgcGx1Z2luIHJlZ2lzdHJ5IGFuZFxuICogc3RvcmUtaW5zdGFsbCBwYXRoLlxuICpcbiAqIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSB0aGF0IG1hcHMgYSBwbHVnaW4gYGlkYCB0byBpdHNcbiAqIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeSDigJQgdGhlIHBsdWdpbiBtYW5pZmVzdCBpdHNlbGYgY2FycmllcyBubyByZXBvc2l0b3J5LiBUaGlzIG1vZHVsZSB1c2VzXG4gKiBpdCB0byBzZWFyY2ggdGhlIHJlZ2lzdHJ5LCB0byBsb2NhdGUgYSBwbHVnaW4ncyBHaXRIdWIgcmVsZWFzZXMgKGUuZy4gdG8gZG93bmxvYWQgaXRzIHNoaXBwZWRcbiAqIGRlbW8tdmF1bHQgYXJjaGl2ZSksIGFuZCB0byBpbnN0YWxsL3VwZGF0ZS91bmluc3RhbGwvZW5hYmxlL2Rpc2FibGUgYW4gYXJiaXRyYXJ5IGNvbW11bml0eSBwbHVnaW4g4oCUIHNlbGVjdGVkXG4gKiBieSBlaXRoZXIgaXRzIGBpZGAgb3IgaXRzIGRpc3BsYXkgYG5hbWVgIOKAlCB2aWEgT2JzaWRpYW4ncyBvd24gc3RvcmUgcGF0aCAoYGFwcC5wbHVnaW5zLmluc3RhbGxQbHVnaW5gXG4gKiArIGBlbmFibGVQbHVnaW5BbmRTYXZlYCksIHNvIGFueSBkZXYvZGVwbG95IG9yIHRvb2xpbmcgZmxvdyBjYW4gcmV1c2UgaXQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFBsdWdpbk1hbmlmZXN0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29tcGFyZSBhcyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7IHJlcXVlc3RVcmwgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogU2VsZWN0cyBhIGNvbW11bml0eSBwbHVnaW4gZWl0aGVyIGJ5IGl0cyBpZCAoe0BsaW5rIENvbW11bml0eVBsdWdpbkJ5SWRSZWZ9KSBvciBieSBpdHMgZGlzcGxheSBuYW1lXG4gKiAoe0BsaW5rIENvbW11bml0eVBsdWdpbkJ5TmFtZVJlZn0pLlxuICovXG5leHBvcnQgdHlwZSBDb21tdW5pdHlQbHVnaW5SZWYgPSBDb21tdW5pdHlQbHVnaW5CeUlkUmVmIHwgQ29tbXVuaXR5UGx1Z2luQnlOYW1lUmVmO1xuXG4vKipcbiAqIEEgc2luZ2xlIHJlc3VsdCBvZiB7QGxpbmsgc2VhcmNoQ29tbXVuaXR5UGx1Z2luc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luU2VhcmNoUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBDb21tdW5pdHlQbHVnaW5TZXR0aW5ncztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGlzYWJsZUNvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvclxuICogYHBsdWdpbk5hbWVgLlxuICovXG5leHBvcnQgdHlwZSBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zID0gQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCAmIENvbW11bml0eVBsdWdpblJlZjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIEVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluc3RhbGxDb21tdW5pdHlQbHVnaW59LiBTZWxlY3RzIHRoZSBwbHVnaW4gYnkgZWl0aGVyIGBwbHVnaW5JZGAgb3JcbiAqIGBwbHVnaW5OYW1lYC5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluc3RhbGxDb25maWd1cmVFbmFibGVDb21tdW5pdHlQbHVnaW59LiBTZWxlY3RzIHRoZSBwbHVnaW4gYnkgZWl0aGVyIGBwbHVnaW5JZGBcbiAqIG9yIGBwbHVnaW5OYW1lYDsgYHNldHRpbmdzYCBpcyBvcHRpb25hbCAob21pdCBmb3IgYSBwbHVnaW4gdGhhdCBuZWVkcyBubyBjb25maWd1cmF0aW9uKS5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBQYXJ0aWFsPENvbW11bml0eVBsdWdpblNldHRpbmdzPjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9nZ2xlRW5hYmxlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFRvZ2dsZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBDb21tdW5pdHlQbHVnaW5Ub2dnbGVFbmFibGVTdGF0ZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9nZ2xlSW5zdGFsbENvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvclxuICogYHBsdWdpbk5hbWVgLlxuICovXG5leHBvcnQgdHlwZSBUb2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zID0gQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCAmIENvbW11bml0eVBsdWdpblJlZiAmIENvbW11bml0eVBsdWdpblRvZ2dsZUluc3RhbGxTdGF0ZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHVwZGF0ZUNvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvciBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogU2VsZWN0cyBhIGNvbW11bml0eSBwbHVnaW4gYnkgaXRzIGlkLlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luQnlJZFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZWxlY3RzIGEgY29tbXVuaXR5IHBsdWdpbiBieSBpdHMgZGlzcGxheSBuYW1lIChhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcmVnaXN0cnkpLlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luQnlOYW1lUmVmIHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gZGlzcGxheSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudHJ5IGluIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHJlZ2lzdHJ5LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luRW50cnkge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBhdXRob3IuXG4gICAqL1xuICByZWFkb25seSBhdXRob3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlIGEgY29tbXVuaXR5LXBsdWdpbiBvcGVyYXRpb24gcnVucyBhZ2FpbnN0LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRvIG1lcmdlIGludG8gYSBjb21tdW5pdHkgcGx1Z2luJ3MgYGRhdGEuanNvbmAuXG4gKi9cbmludGVyZmFjZSBDb21tdW5pdHlQbHVnaW5TZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3Mgb2JqZWN0IHNoYWxsb3ctbWVyZ2VkIG92ZXIgdGhlIHBsdWdpbidzIGV4aXN0aW5nIGBkYXRhLmpzb25gICh0aGUgZmlsZSBpcyBjcmVhdGVkIGlmXG4gICAqIGFic2VudCkuXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5nczogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSBkZXNpcmVkIGVuYWJsZWQgc3RhdGUgZm9yIHtAbGluayB0b2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW59LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luVG9nZ2xlRW5hYmxlU3RhdGUge1xuICAvKipcbiAgICogVGhlIGRlc2lyZWQgZW5hYmxlZCBzdGF0ZTogYHRydWVgIGVuYWJsZXMgdGhlIHBsdWdpbiwgYGZhbHNlYCBkaXNhYmxlcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGUgZm9yIHtAbGluayB0b2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2lufS5cbiAqL1xuaW50ZXJmYWNlIENvbW11bml0eVBsdWdpblRvZ2dsZUluc3RhbGxTdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGU6IGB0cnVlYCBpbnN0YWxscyB0aGUgcGx1Z2luLCBgZmFsc2VgIHVuaW5zdGFsbHMgaXQuXG4gICAqL1xuICByZWFkb25seSBpc0luc3RhbGxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgb25lIG1ldGhvZCB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufSBuZWVkcyBmcm9tIGEgcGx1Z2luJ3Mgc2V0dGluZ3MgY29tcG9uZW50IHRvIGNvbmZpZ3VyZVxuICogaXQgbGl2ZS4gRGVjbGFyZWQgc3RydWN0dXJhbGx5IHJhdGhlciB0aGFuIGltcG9ydGluZyBgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRgLCBzbyBhIHBsdWdpbiBidWlsdCBvblxuICogYW55IHZlcnNpb24gb2YgaXQgLS0gb3Igb24gaXRzIG93biBlcXVpdmFsZW50IC0tIGlzIGNvbmZpZ3VyYWJsZSB3aXRob3V0IGEgc2hhcmVkIG5vbWluYWwgdHlwZS5cbiAqL1xuaW50ZXJmYWNlIEVkaXRhYmxlU2V0dGluZ3NDb21wb25lbnQge1xuICByZWFkb25seSBlZGl0QW5kU2F2ZTogKHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IG9iamVjdCkgPT4gdm9pZCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgR2l0SHViIHJlbGVhc2Ugd2UgcmVhZC5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2Uge1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgdGFnLCBhIGJhcmUgdmVyc2lvbiBzdWNoIGFzIGAxLjIuM2AuXG4gICAqL1xuICByZWFkb25seSB0YWdfbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19TVEFURV9LRVkgPSAnY29tbXVuaXR5UGx1Z2luRW50cmllc1Byb21pc2UnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfVVJMID0gJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL0hFQUQvY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayBjb25maWd1cmVDb21tdW5pdHlQbHVnaW59LlxuICovXG5leHBvcnQgZW51bSBDb25maWd1cmVDb21tdW5pdHlQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHdlcmUgYXBwbGllZCB0aHJvdWdoIHRoZSBydW5uaW5nIHBsdWdpbidzIG93biBzZXR0aW5ncyBjb21wb25lbnQsIHdoaWNoIGJvdGggdXBkYXRlZFxuICAgKiB0aGVtIGluIG1lbW9yeSBhbmQgcGVyc2lzdGVkIHRoZW0uIFRoZSBwbHVnaW4gaXMgYWxyZWFkeSB1c2luZyB0aGVtLCBzbyBpdCBtdXN0IE5PVCBiZSByZWxvYWRlZC5cbiAgICovXG4gIEFwcGxpZWRMaXZlID0gJ2FwcGxpZWRMaXZlJyxcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHdlcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgc28gbm90aGluZyB3YXMgd3JpdHRlbi5cbiAgICovXG4gIFNraXBwZWQgPSAnc2tpcHBlZCcsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyB3ZXJlIG1lcmdlZCBpbnRvIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgd2hpY2ggd2FzIHdyaXR0ZW4uXG4gICAqL1xuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgdXBkYXRlQ29tbXVuaXR5UGx1Z2lufS5cbiAqL1xuZXhwb3J0IGVudW0gVXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YWxsZWQgY29weSBpcyBhbHJlYWR5IGF0IChvciBwYXN0KSB0aGUgbGF0ZXN0IHJlbGVhc2UsIHNvIG5vdGhpbmcgd2FzIGRvd25sb2FkZWQuXG4gICAqL1xuICBBbHJlYWR5VXBUb0RhdGUgPSAnYWxyZWFkeVVwVG9EYXRlJyxcblxuICAvKipcbiAgICogVGhlIGxhdGVzdCByZWxlYXNlIHdhcyBpbnN0YWxsZWQgb3ZlciB0aGUgb2xkIGNvcHksIHdoaWNoIE9ic2lkaWFuIHJlbG9hZGVkIGlmIGl0IHdhcyBydW5uaW5nLlxuICAgKi9cbiAgVXBkYXRlZCA9ICd1cGRhdGVkJ1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb21tdW5pdHkgcGx1Z2luLCBwcmVmZXJyaW5nIHRoZSBydW5uaW5nIHBsdWdpbidzIG93biBzZXR0aW5ncyBjb21wb25lbnQgb3ZlciBpdHNcbiAqIGBkYXRhLmpzb25gLlxuICpcbiAqIFdoZW4gdGhlIHBsdWdpbiBpcyBsb2FkZWQgQU5EIGV4cG9zZXMgYSBgcGx1Z2luU2V0dGluZ3NDb21wb25lbnRgIHdpdGggYW4gYGVkaXRBbmRTYXZlYCBtZXRob2QsIHRoZVxuICogc2V0dGluZ3MgYXJlIHNoYWxsb3ctbWVyZ2VkIHRocm91Z2ggaXQ6IHRoZXkgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkgYW5kIGFyZSBwZXJzaXN0ZWQsIHNvIHRoZSBwbHVnaW5cbiAqIG5lZWRzIG5vIHJlbG9hZCBhbmQge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5BcHBsaWVkTGl2ZX0gaXMgcmV0dXJuZWQuIFRoaXMgaXMgd2hhdCBsZXRzIGFcbiAqIHBsdWdpbidzIG93biBzY3JpcHQgcmVjb25maWd1cmUgaXQgd2l0aG91dCB0aGUgZGlzYWJsZS9lbmFibGUgY3ljbGUgdGhhdCB3b3VsZCB0ZWFyIGRvd24gdGhlIHZlcnkgY29kZVxuICogZG9pbmcgdGhlIHJlY29uZmlndXJpbmcuIE5vdGUgdGhhdCB0aGlzIHBhdGggcnVucyB0aGUgcGx1Z2luJ3Mgc2V0dGluZyB2YWxpZGF0b3JzLCBzbyBhbiBpbnZhbGlkIHZhbHVlXG4gKiBpcyByZXBsYWNlZCBieSBpdHMgZGVmYXVsdCByYXRoZXIgdGhhbiB3cml0dGVuIHRocm91Z2ggdmVyYmF0aW0uXG4gKlxuICogT3RoZXJ3aXNlIHRoZSBzZXR0aW5ncyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgc2hhbGxvdy1tZXJnZWQgb3ZlciBhbnkgZXhpc3RpbmdcbiAqIHNldHRpbmdzIChjcmVhdGluZyB0aGUgZmlsZSBpZiBhYnNlbnQpLiBXcml0aW5nIHNldHRpbmdzIEJFRk9SRSB0aGUgcGx1Z2luIGlzIGVuYWJsZWQgbWFrZXMgaXQgbG9hZFxuICogYWxyZWFkeSBjb25maWd1cmVkLCB3aXRoIG5vIHJlbG9hZC4gQSBuby1vcCB3cml0ZSBpcyBza2lwcGVkOiB3aGVuIHRoZSBtZXJnZSBjaGFuZ2VzIG5vdGhpbmcsIHRoZSBmaWxlXG4gKiBpcyBsZWZ0IHVudG91Y2hlZCBhbmQge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkfSBpcyByZXR1cm5lZCwgc28gYSBjYWxsZXIgY2FuIGF2b2lkXG4gKiByZWxvYWRpbmcgYW4gYWxyZWFkeS1jb3JyZWN0bHktY29uZmlndXJlZCBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8ge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5BcHBsaWVkTGl2ZX0gaWYgdGhlXG4gKiBydW5uaW5nIHBsdWdpbiBhcHBsaWVkIHRoZW0gaXRzZWxmIChubyByZWxvYWQgbmVlZGVkKSwge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5TdWNjZXNzfSBpZlxuICogdGhlIGBkYXRhLmpzb25gIGNvbnRlbnQgY2hhbmdlZCAoYW5kIHdhcyB3cml0dGVuKSwgb3Ige0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkfSBpZlxuICogdGhlIHNldHRpbmdzIHdlcmUgYWxyZWFkeSBwcmVzZW50IChub3RoaW5nIHdyaXR0ZW4pLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8Q29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0PiB7XG4gIGNvbnN0IHsgYXBwLCBzZXR0aW5ncyB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuXG4gIGNvbnN0IHNldHRpbmdzQ29tcG9uZW50ID0gZ2V0U2V0dGluZ3NDb21wb25lbnQoYXBwLnBsdWdpbnMucGx1Z2luc1twbHVnaW5JZF0pO1xuICBpZiAoY2hlY2tIYXNFZGl0QW5kU2F2ZShzZXR0aW5nc0NvbXBvbmVudCkpIHtcbiAgICBhd2FpdCBzZXR0aW5nc0NvbXBvbmVudC5lZGl0QW5kU2F2ZSgocGx1Z2luU2V0dGluZ3MpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICB9KTtcbiAgICByZXR1cm4gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LkFwcGxpZWRMaXZlO1xuICB9XG5cbiAgY29uc3QgZGF0YVBhdGggPSBgJHthcHAudmF1bHQuY29uZmlnRGlyfS9wbHVnaW5zLyR7cGx1Z2luSWR9L2RhdGEuanNvbmA7XG5cbiAgbGV0IGRhdGE6IG9iamVjdCA9IHt9O1xuICBpZiAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGRhdGFQYXRoKSkge1xuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChkYXRhUGF0aCkpO1xuICAgIGlmIChwYXJzZWQgIT09IG51bGwgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBwYXJzZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZEJlZm9yZSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICBPYmplY3QuYXNzaWduKGRhdGEsIHNldHRpbmdzKTtcbiAgaWYgKEpTT04uc3RyaW5naWZ5KGRhdGEpID09PSBzZXJpYWxpemVkQmVmb3JlKSB7XG4gICAgcmV0dXJuIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZCA9IFN0cmluZyhKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gIGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGRhdGFQYXRoLCBgJHtzZXJpYWxpemVkfVxcbmApO1xuICByZXR1cm4gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LlN1Y2Nlc3M7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgYSBjb21tdW5pdHkgcGx1Z2luIChwZXJzaXN0aW5nIHRoZSBjaGFuZ2UpIGlmIGl0IGlzIGN1cnJlbnRseSBlbmFibGVkLiBJZGVtcG90ZW50IOKAlCBhIG5vLW9wXG4gKiB3aGVuIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBkaXNhYmxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGRpc2FibGVkLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2FibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmICghYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBhcHAucGx1Z2lucy5kaXNhYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5JZCk7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIGNvbW11bml0eSBwbHVnaW4gKHBlcnNpc3RpbmcgdGhlIGNoYW5nZSkgaWYgaXQgaXMgbm90IGFscmVhZHkgZW5hYmxlZC4gSWRlbXBvdGVudCDigJQgYSBuby1vcFxuICogd2hlbiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgZW5hYmxlZC5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmFibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgcGx1Z2luSWQgPSBhd2FpdCByZXNvbHZlQ29tbXVuaXR5UGx1Z2luSWQocGFyYW1zKTtcbiAgaWYgKGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwbHVnaW5JZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5JZCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeSBvZiBhIGNvbW11bml0eSBwbHVnaW4gZnJvbSBPYnNpZGlhbidzIHB1YmxpY1xuICogYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHJlZ2lzdHJ5LlxuICpcbiAqIFRoZSByZWdpc3RyeSBpcyBmZXRjaGVkIG9uY2UgYW5kIGNhY2hlZCBvbiB0aGUgc2hhcmVkIHBsdWdpbiBzdGF0ZSBmb3Igc3Vic2VxdWVudCBjYWxsczsgYSBmYWlsZWRcbiAqIGZldGNoIGlzIG5vdCBjYWNoZWQsIHNvIGEgbGF0ZXIgY2FsbCByZXRyaWVzLlxuICpcbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBwbHVnaW4gaWQgdG8gbG9vayB1cC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgcGx1Z2luJ3MgYG93bmVyL25hbWVgIHJlcG9zaXRvcnksIG9yIGBudWxsYCBpZiB0aGVcbiAqIHBsdWdpbiBpcyBub3QgbGlzdGVkIGluIHRoZSByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbW11bml0eVBsdWdpblJlcG8ocGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luRW50cmllcygpO1xuICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHBsdWdpbklkKTtcbiAgcmV0dXJuIGVudHJ5Py5yZXBvID8/IG51bGw7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGxhdGVzdCByZWxlYXNlIHZlcnNpb24gKHRoZSByZWxlYXNlIGB0YWdfbmFtZWAsIGEgYmFyZSB2ZXJzaW9uIHN1Y2ggYXMgYDEuMi4zYCkgb2YgYVxuICogR2l0SHViIHJlcG9zaXRvcnkuXG4gKlxuICogQHBhcmFtIHJlcG8gLSBUaGUgYG93bmVyL25hbWVgIEdpdEh1YiByZXBvc2l0b3J5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBsYXRlc3QgcmVsZWFzZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0UmVsZWFzZVZlcnNpb24ocmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cmVwb30vcmVsZWFzZXMvbGF0ZXN0YCk7XG4gIGNvbnN0IHJlbGVhc2UgPSByZXNwb25zZS5qc29uIGFzIEdpdEh1YlJlbGVhc2U7XG4gIHJldHVybiByZWxlYXNlLnRhZ19uYW1lO1xufVxuXG4vKipcbiAqIEluc3RhbGxzIGEgY29tbXVuaXR5IHBsdWdpbiBmcm9tIHRoZSBvZmZpY2lhbCBzdG9yZSBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQuIElkZW1wb3RlbnQg4oCUIGFcbiAqIG5vLW9wIHdoZW4gdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGluc3RhbGxlZC4gUmVzb2x2ZXMgdGhlIHBsdWdpbidzIHJlcG9zaXRvcnkgZnJvbSBPYnNpZGlhbidzXG4gKiBjb21tdW5pdHkgcmVnaXN0cnksIHJlYWRzIHRoZSBsYXRlc3QgcmVsZWFzZSB2ZXJzaW9uIGFuZCBpdHMgbWFuaWZlc3QsIGFuZCBpbnN0YWxscyBpdCB0aHJvdWdoXG4gKiBPYnNpZGlhbidzIG93biBgaW5zdGFsbFBsdWdpbmAgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZC5cbiAqIEB0aHJvd3MgSWYgdGhlIHBsdWdpbiBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQ29tbXVuaXR5UGx1Z2luKHBhcmFtczogSW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuICBpZiAoT2JqZWN0Lmhhc093bihhcHAucGx1Z2lucy5tYW5pZmVzdHMsIHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlcG8gPSBhd2FpdCBnZXRDb21tdW5pdHlQbHVnaW5SZXBvKHBsdWdpbklkKTtcbiAgaWYgKCFyZXBvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJyR7cGx1Z2luSWR9JyB3YXMgbm90IGZvdW5kIGluIHRoZSBPYnNpZGlhbiBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgfVxuXG4gIGNvbnN0IHZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RSZWxlYXNlVmVyc2lvbihyZXBvKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBnZXRQbHVnaW5NYW5pZmVzdChyZXBvLCB2ZXJzaW9uKTtcbiAgYXdhaXQgYXBwLnBsdWdpbnMuaW5zdGFsbFBsdWdpbihyZXBvLCB2ZXJzaW9uLCBtYW5pZmVzdCk7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgYSBjb21tdW5pdHkgcGx1Z2luLCB3cml0ZXMgaXRzIHNldHRpbmdzLCBUSEVOIGVuYWJsZXMgaXQg4oCUIGluIHRoYXQgb3JkZXIg4oCUIHNvIHRoZSBwbHVnaW5cbiAqIGxvYWRzIGFscmVhZHkgY29uZmlndXJlZCAoYSBwbHVnaW4gZW5hYmxlZCBiZWZvcmUgaXQgaXMgY29uZmlndXJlZCBydW5zIGl0cyBgb25sb2FkYCB3aXRoIGRlZmF1bHRcbiAqIHNldHRpbmdzIGFuZCBkb2VzIG5vdGhpbmcgdXNlZnVsKS4gSWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGVuYWJsZWQgYW5kIHRoZSBzZXR0aW5ncyBjaGFuZ2VkLCBpdCBpc1xuICogZGlzYWJsZWQgYW5kIHJlLWVuYWJsZWQgc28gdGhlIG5ldyBzZXR0aW5ncyB0YWtlIGVmZmVjdC4gYHNldHRpbmdzYCBpcyBvcHRpb25hbDogb21pdCBpdCBmb3IgYSBwbHVnaW5cbiAqIHRoYXQgbmVlZHMgbm8gY29uZmlndXJhdGlvbi4gQ29tcG9zZXMge0BsaW5rIGluc3RhbGxDb21tdW5pdHlQbHVnaW59LCB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufSxcbiAqIHtAbGluayBlbmFibGVDb21tdW5pdHlQbHVnaW59IGFuZCB7QGxpbmsgZGlzYWJsZUNvbW11bml0eVBsdWdpbn0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgSW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQsIGNvbmZpZ3VyZWQgYW5kIGVuYWJsZWQuXG4gKiBAdGhyb3dzIElmIHNlbGVjdGVkIGJ5IGBwbHVnaW5OYW1lYCBhbmQgdGhlIG5hbWUgaXMgbm90IGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IEluc3RhbGxDb25maWd1cmVFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIHNldHRpbmdzIH0gPSBwYXJhbXM7XG4gIGF3YWl0IGluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgY29uc3QgZGlkU2V0dGluZ3NDaGFuZ2UgPSBzZXR0aW5ncyA/IGF3YWl0IGNvbmZpZ3VyZUNvbW11bml0eVBsdWdpbih7IC4uLnBhcmFtcywgc2V0dGluZ3MgfSkgPT09IENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5TdWNjZXNzIDogZmFsc2U7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmICghYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIGF3YWl0IGVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICB9IGVsc2UgaWYgKGRpZFNldHRpbmdzQ2hhbmdlKSB7XG4gICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICAgIGF3YWl0IGVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICB9XG59XG5cbi8qKlxuICogU2VhcmNoZXMgT2JzaWRpYW4ncyBwdWJsaWMgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnksIHJldHVybmluZyB0aGUgaWQgYW5kIGRpc3BsYXkgbmFtZSBvZiBldmVyeVxuICogcGx1Z2luIHdob3NlIGlkLCBuYW1lLCBhdXRob3Igb3IgZGVzY3JpcHRpb24gY29udGFpbnMgdGhlIHF1ZXJ5IChjYXNlLWluc2Vuc2l0aXZlKS4gQW4gZW1wdHkgcXVlcnlcbiAqIG1hdGNoZXMgZXZlcnkgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBxdWVyeSAtIFRoZSBzZWFyY2ggcXVlcnkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIG1hdGNoaW5nIHBsdWdpbnMnIHtAbGluayBDb21tdW5pdHlQbHVnaW5TZWFyY2hSZXN1bHR9cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaENvbW11bml0eVBsdWdpbnMocXVlcnk6IHN0cmluZyk6IFByb21pc2U8Q29tbXVuaXR5UGx1Z2luU2VhcmNoUmVzdWx0W10+IHtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpbkVudHJpZXMoKTtcbiAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKChlbnRyeSkgPT5cbiAgICAgIGVudHJ5LmlkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgICAgfHwgZW50cnkubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgIHx8IGVudHJ5LmF1dGhvci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgIHx8IGVudHJ5LmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgIClcbiAgICAubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGlkOiBlbnRyeS5pZCxcbiAgICAgIG5hbWU6IGVudHJ5Lm5hbWVcbiAgICB9KSk7XG59XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlcyBhIGNvbW11bml0eSBwbHVnaW4gdG8gbWF0Y2ggdGhlIGRlc2lyZWQgc3RhdGUuIERlbGVnYXRlcyB0b1xuICoge0BsaW5rIGVuYWJsZUNvbW11bml0eVBsdWdpbn0gLyB7QGxpbmsgZGlzYWJsZUNvbW11bml0eVBsdWdpbn0sIHNvIGl0IGlzIGlkZW1wb3RlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgVG9nZ2xlRW5hYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIG1hdGNoZXMgdGhlIGRlc2lyZWQgZW5hYmxlZCBzdGF0ZS5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBUb2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBhcmFtcy5pc0VuYWJsZWQpIHtcbiAgICBhd2FpdCBlbmFibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnN0YWxscyBvciB1bmluc3RhbGxzIGEgY29tbXVuaXR5IHBsdWdpbiB0byBtYXRjaCB0aGUgZGVzaXJlZCBzdGF0ZS4gRGVsZWdhdGVzIHRvXG4gKiB7QGxpbmsgaW5zdGFsbENvbW11bml0eVBsdWdpbn0gLyB7QGxpbmsgdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2lufSwgc28gaXQgaXMgaWRlbXBvdGVudC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBUb2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIG1hdGNoZXMgdGhlIGRlc2lyZWQgaW5zdGFsbGVkIHN0YXRlLlxuICogQHRocm93cyBJZiBpbnN0YWxsaW5nIGFuZCB0aGUgcGx1Z2luIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBUb2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwYXJhbXMuaXNJbnN0YWxsZWQpIHtcbiAgICBhd2FpdCBpbnN0YWxsQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVbmluc3RhbGxzIGEgY29tbXVuaXR5IHBsdWdpbiBpZiBpdCBpcyBjdXJyZW50bHkgaW5zdGFsbGVkLiBJZGVtcG90ZW50IOKAlCBhIG5vLW9wIHdoZW4gdGhlIHBsdWdpbiBpc1xuICogbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBVbmluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgdW5pbnN0YWxsZWQuXG4gKiBAdGhyb3dzIElmIHNlbGVjdGVkIGJ5IGBwbHVnaW5OYW1lYCBhbmQgdGhlIG5hbWUgaXMgbm90IGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2luKHBhcmFtczogVW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmICghT2JqZWN0Lmhhc093bihhcHAucGx1Z2lucy5tYW5pZmVzdHMsIHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBhcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4ocGx1Z2luSWQpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYW4gaW5zdGFsbGVkIGNvbW11bml0eSBwbHVnaW4gdG8gaXRzIGxhdGVzdCByZWxlYXNlLCB0aGUgd2F5IHRoZSBjb21tdW5pdHkgcGx1Z2luIGJyb3dzZXIncyBvd25cbiAqIGBVcGRhdGVgIGJ1dHRvbiBkb2VzLlxuICpcbiAqIE9ic2lkaWFuJ3MgYGluc3RhbGxQbHVnaW5gIHdyaXRlcyB0aGUgcmVsZWFzZSdzIGZpbGVzIG92ZXIgdGhlIGluc3RhbGxlZCBjb3B5IGFuZCwgd2hlbiB0aGUgcGx1Z2luIGlzXG4gKiBydW5uaW5nLCBkaXNhYmxlcyBhbmQgcmUtZW5hYmxlcyBpdCBzbyB0aGUgbmV3IGNvZGUgbG9hZHMg4oCUIHJlYWQgZnJvbSB0aGUgc2hpcHBlZCBidW5kbGUgKGAxLjE0LjRgKSwgbm90XG4gKiBhc3N1bWVkLiBJdCByZXBvcnRzIGl0cyBvd24gZmFpbHVyZXMgKGEgZmFpbGVkIGRvd25sb2FkLCBhIG1hbmlmZXN0IHdob3NlIGlkIGRvZXMgbm90IG1hdGNoKSBhcyBhIG5vdGljZVxuICogYW5kIFJFVFVSTlMgcmF0aGVyIHRoYW4gdGhyb3dpbmcsIHNvIHRoZSBpbnN0YWxsZWQgbWFuaWZlc3QgaXMgcmUtcmVhZCBhZnRlcndhcmRzIGFuZCBhIHZlcnNpb24gdGhhdCBkaWRcbiAqIG5vdCBtb3ZlIHRvIHRoZSByZWxlYXNlIGlzIHRocm93biBhcyBhIGZhaWx1cmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgVXBkYXRlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB7QGxpbmsgVXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LlVwZGF0ZWR9IG9uY2UgdGhlIGxhdGVzdCByZWxlYXNlXG4gKiBpcyBpbnN0YWxsZWQsIG9yIHtAbGluayBVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQuQWxyZWFkeVVwVG9EYXRlfSB3aGVuIHRoZSBpbnN0YWxsZWQgY29weSBpcyBub3Qgb2xkZXJcbiAqIHRoYW4gaXQuXG4gKiBAdGhyb3dzIElmIHRoZSBwbHVnaW4gaXMgbm90IGluc3RhbGxlZCwgaXMgbm90IGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LCBvciB0aGVcbiAqIGluc3RhbGwgZGlkIG5vdCBsZWF2ZSB0aGUgbGF0ZXN0IHJlbGVhc2UgaW4gcGxhY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBVcGRhdGVDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPFVwZGF0ZUNvbW11bml0eVBsdWdpblJlc3VsdD4ge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuICBjb25zdCBpbnN0YWxsZWRNYW5pZmVzdCA9IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF07XG4gIGlmICghaW5zdGFsbGVkTWFuaWZlc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAnJHtwbHVnaW5JZH0nIGlzIG5vdCBpbnN0YWxsZWQsIHNvIGl0IGNhbm5vdCBiZSB1cGRhdGVkLmApO1xuICB9XG5cbiAgY29uc3QgcmVwbyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpblJlcG8ocGx1Z2luSWQpO1xuICBpZiAoIXJlcG8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAnJHtwbHVnaW5JZH0nIHdhcyBub3QgZm91bmQgaW4gdGhlIE9ic2lkaWFuIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LmApO1xuICB9XG5cbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFJlbGVhc2VWZXJzaW9uKHJlcG8pO1xuICBpZiAoaXNBdExlYXN0VmVyc2lvbihpbnN0YWxsZWRNYW5pZmVzdC52ZXJzaW9uLCB2ZXJzaW9uKSkge1xuICAgIHJldHVybiBVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQuQWxyZWFkeVVwVG9EYXRlO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBnZXRQbHVnaW5NYW5pZmVzdChyZXBvLCB2ZXJzaW9uKTtcbiAgYXdhaXQgYXBwLnBsdWdpbnMuaW5zdGFsbFBsdWdpbihyZXBvLCB2ZXJzaW9uLCBtYW5pZmVzdCk7XG5cbiAgY29uc3QgdXBkYXRlZFZlcnNpb24gPSBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy52ZXJzaW9uO1xuICBpZiAodXBkYXRlZFZlcnNpb24gIT09IG1hbmlmZXN0LnZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVXBkYXRpbmcgcGx1Z2luICcke3BsdWdpbklkfScgdG8gJHttYW5pZmVzdC52ZXJzaW9ufSBsZWZ0IHZlcnNpb24gJHt1cGRhdGVkVmVyc2lvbiA/PyAnKG5vbmUpJ30gaW5zdGFsbGVkLiBPYnNpZGlhbiByZXBvcnRzIHRoZSBjYXVzZSBhcyBhIG5vdGljZS5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQuVXBkYXRlZDtcbn1cblxuLy8gV2hldGhlciBhIHBsdWdpbidzIGBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudGAgY2FuIGNvbmZpZ3VyZSBpdHNlbGYgaW4gcGxhY2UuIFN0cnVjdHVyYWwgcmF0aGVyIHRoYW4gYW5cbi8vIGBpbnN0YW5jZW9mYDogdGhlIHBsdWdpbiB3YXMgbG9hZGVkIGZyb20gaXRzIG93biBidW5kbGUsIHNvIGV2ZW4gYSBwbHVnaW4gYnVpbHQgb24gdGhpcyB2ZXJ5IGxpYnJhcnlcbi8vIGNhcnJpZXMgaXRzIG93biBjb3B5IG9mIHRoZSBjbGFzcyBhbmQgd291bGQgZmFpbCBhbiBpZGVudGl0eSBjaGVjay5cbmZ1bmN0aW9uIGNoZWNrSGFzRWRpdEFuZFNhdmUoc2V0dGluZ3NDb21wb25lbnQ6IHVua25vd24pOiBzZXR0aW5nc0NvbXBvbmVudCBpcyBFZGl0YWJsZVNldHRpbmdzQ29tcG9uZW50IHtcbiAgcmV0dXJuIHR5cGVvZiBzZXR0aW5nc0NvbXBvbmVudCA9PT0gJ29iamVjdCdcbiAgICAmJiBzZXR0aW5nc0NvbXBvbmVudCAhPT0gbnVsbFxuICAgICYmICdlZGl0QW5kU2F2ZScgaW4gc2V0dGluZ3NDb21wb25lbnRcbiAgICAmJiB0eXBlb2Ygc2V0dGluZ3NDb21wb25lbnQuZWRpdEFuZFNhdmUgPT09ICdmdW5jdGlvbic7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQ29tbXVuaXR5UGx1Z2luRW50cmllcygpOiBQcm9taXNlPENvbW11bml0eVBsdWdpbkVudHJ5W10+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKENPTU1VTklUWV9QTFVHSU5TX1VSTCk7XG4gIHJldHVybiByZXNwb25zZS5qc29uIGFzIENvbW11bml0eVBsdWdpbkVudHJ5W107XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENvbW11bml0eVBsdWdpbkVudHJpZXMoKTogUHJvbWlzZTxDb21tdW5pdHlQbHVnaW5FbnRyeVtdPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0T2JzaWRpYW5MaWJTdGF0ZTxudWxsIHwgUHJvbWlzZTxDb21tdW5pdHlQbHVnaW5FbnRyeVtdPj4oQ09NTVVOSVRZX1BMVUdJTlNfU1RBVEVfS0VZLCBudWxsKTtcbiAgY2FjaGUudmFsdWUgPz89IGZldGNoQ29tbXVuaXR5UGx1Z2luRW50cmllcygpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNhY2hlLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhY2hlLnZhbHVlID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQbHVnaW5NYW5pZmVzdChyZXBvOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8UGx1Z2luTWFuaWZlc3Q+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259L21hbmlmZXN0Lmpzb25gKTtcbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24gYXMgUGx1Z2luTWFuaWZlc3Q7XG59XG5cbi8vIFJlYWRzIGEgbG9hZGVkIHBsdWdpbidzIGBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudGAsIG9yIGBudWxsYCB3aGVuIGl0IGhhcyBub25lLiBUYWtlcyBgdW5rbm93bmAgYmVjYXVzZVxuLy8gQSBwbHVnaW4gaXMgdW5kZXIgbm8gb2JsaWdhdGlvbiB0byBleHBvc2Ugb25lLCBzbyB0aGVyZSBpcyBubyB0eXBlIHRvIG5hcnJvdyBmcm9tLlxuZnVuY3Rpb24gZ2V0U2V0dGluZ3NDb21wb25lbnQocGx1Z2luOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldHVybiB0eXBlb2YgcGx1Z2luICE9PSAnb2JqZWN0JyB8fCBwbHVnaW4gPT09IG51bGwgfHwgISgncGx1Z2luU2V0dGluZ3NDb21wb25lbnQnIGluIHBsdWdpbikgPyBudWxsIDogcGx1Z2luLnBsdWdpblNldHRpbmdzQ29tcG9uZW50O1xufVxuXG4vLyBBIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIHJlYWRzIGFzIG9sZGVyLCBzbyBhbiB1cGRhdGUgaXMgYXR0ZW1wdGVkIHJhdGhlciB0aGFuIHNraXBwZWQ6IHRoZSBpbnN0YWxsJ3Ncbi8vIG93biB2ZXJzaW9uIGNoZWNrIGFmdGVyd2FyZHMgc3RpbGwgY2F0Y2hlcyBhIHJlbGVhc2UgdGhhdCBkb2VzIG5vdCBtb3ZlIGl0LlxuZnVuY3Rpb24gaXNBdExlYXN0VmVyc2lvbihpbnN0YWxsZWRWZXJzaW9uOiBzdHJpbmcsIGxhdGVzdFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkVmVyc2lvbiwgbGF0ZXN0VmVyc2lvbiwgJz49Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ29tbXVuaXR5UGx1Z2luSWQocmVmZXJlbmNlOiBDb21tdW5pdHlQbHVnaW5SZWYpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoJ3BsdWdpbklkJyBpbiByZWZlcmVuY2UpIHtcbiAgICByZXR1cm4gcmVmZXJlbmNlLnBsdWdpbklkO1xuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpbkVudHJpZXMoKTtcbiAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IHJlZmVyZW5jZS5wbHVnaW5OYW1lKTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIG5hbWVkICcke3JlZmVyZW5jZS5wbHVnaW5OYW1lfScgd2FzIG5vdCBmb3VuZCBpbiB0aGUgT2JzaWRpYW4gY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuYCk7XG4gIH1cbiAgcmV0dXJuIGVudHJ5LmlkO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7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QUNUO0FBRUEsUUFBTSxXQUFXLE1BQU0sa0JBQWtCLE1BQU0sT0FBTztBQUN0RCxRQUFNLElBQUksUUFBUSxjQUFjLE1BQU0sU0FBUyxRQUFRO0FBRXZELFFBQU0saUJBQWlCLElBQUksUUFBUSxVQUFVLFFBQVEsR0FBRztBQUN4RCxNQUFJLG1CQUFtQixTQUFTLFNBQVM7QUFDdkMsVUFBTSxJQUFJO0FBQUEsTUFDUixvQkFBb0IsUUFBUSxRQUFRLFNBQVMsT0FBTyxpQkFBaUIsa0JBQWtCLFFBQVE7QUFBQSxJQUNqRztBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFLQSxTQUFTLG9CQUFvQixtQkFBNEU7QUFDdkcsU0FBTyxPQUFPLHNCQUFzQixZQUMvQixzQkFBc0IsUUFDdEIsaUJBQWlCLHFCQUNqQixPQUFPLGtCQUFrQixnQkFBZ0I7QUFDaEQ7QUFFQSxlQUFlLDhCQUErRDtBQUM1RSxRQUFNLFdBQVcsVUFBTSw0QkFBVyxxQkFBcUI7QUFDdkQsU0FBTyxTQUFTO0FBQ2xCO0FBRUEsZUFBZSw0QkFBNkQ7QUFDMUUsUUFBTSxZQUFRLCtDQUE0RCw2QkFBNkIsSUFBSTtBQUMzRyxRQUFNLFVBQVUsNEJBQTRCO0FBRTVDLE1BQUk7QUFDRixXQUFPLE1BQU0sTUFBTTtBQUFBLEVBQ3JCLFNBQVMsT0FBTztBQUNkLFVBQU0sUUFBUTtBQUNkLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFFQSxlQUFlLGtCQUFrQixNQUFjLFNBQTBDO0FBQ3ZGLFFBQU0sV0FBVyxVQUFNLDRCQUFXLHNCQUFzQixJQUFJLHNCQUFzQixPQUFPLGdCQUFnQjtBQUN6RyxTQUFPLFNBQVM7QUFDbEI7QUFJQSxTQUFTLHFCQUFxQixRQUEwQjtBQUN0RCxTQUFPLE9BQU8sV0FBVyxZQUFZLFdBQVcsUUFBUSxFQUFFLDZCQUE2QixVQUFVLE9BQU8sT0FBTztBQUNqSDtBQUlBLFNBQVMsaUJBQWlCLGtCQUEwQixlQUFnQztBQUNsRixNQUFJO0FBQ0YsZUFBTyx3QkFBQUMsU0FBZ0Isa0JBQWtCLGVBQWUsSUFBSTtBQUFBLEVBQzlELFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsZUFBZSx5QkFBeUIsV0FBZ0Q7QUFDdEYsTUFBSSxjQUFjLFdBQVc7QUFDM0IsV0FBTyxVQUFVO0FBQUEsRUFDbkI7QUFFQSxRQUFNLFVBQVUsTUFBTSwwQkFBMEI7QUFDaEQsUUFBTSxRQUFRLFFBQVEsS0FBSyxDQUFDLGNBQWMsVUFBVSxTQUFTLFVBQVUsVUFBVTtBQUNqRixNQUFJLENBQUMsT0FBTztBQUNWLFVBQU0sSUFBSSxNQUFNLGlCQUFpQixVQUFVLFVBQVUsNkRBQTZEO0FBQUEsRUFDcEg7QUFDQSxTQUFPLE1BQU07QUFDZjsiLCJuYW1lcyI6WyJDb25maWd1cmVDb21tdW5pdHlQbHVnaW5SZXN1bHQiLCJVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQiLCJjb21wYXJlVmVyc2lvbnMiXX0=
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tdW5pdHktcGx1Z2lucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogUmVzb2x2ZXMsIHNlYXJjaGVzIGFuZCBtYW5hZ2VzIGNvbW11bml0eSBwbHVnaW5zIHRocm91Z2ggT2JzaWRpYW4ncyBwdWJsaWMgcGx1Z2luIHJlZ2lzdHJ5IGFuZFxuICogc3RvcmUtaW5zdGFsbCBwYXRoLlxuICpcbiAqIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSB0aGF0IG1hcHMgYSBwbHVnaW4gYGlkYCB0byBpdHNcbiAqIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeSDigJQgdGhlIHBsdWdpbiBtYW5pZmVzdCBpdHNlbGYgY2FycmllcyBubyByZXBvc2l0b3J5LiBUaGlzIG1vZHVsZSB1c2VzXG4gKiBpdCB0byBzZWFyY2ggdGhlIHJlZ2lzdHJ5LCB0byBsb2NhdGUgYSBwbHVnaW4ncyBHaXRIdWIgcmVsZWFzZXMgKGUuZy4gdG8gZG93bmxvYWQgaXRzIHNoaXBwZWRcbiAqIGRlbW8tdmF1bHQgYXJjaGl2ZSksIGFuZCB0byBpbnN0YWxsL3VwZGF0ZS91bmluc3RhbGwvZW5hYmxlL2Rpc2FibGUgYW4gYXJiaXRyYXJ5IGNvbW11bml0eSBwbHVnaW4g4oCUIHNlbGVjdGVkXG4gKiBieSBlaXRoZXIgaXRzIGBpZGAgb3IgaXRzIGRpc3BsYXkgYG5hbWVgIOKAlCB2aWEgT2JzaWRpYW4ncyBvd24gc3RvcmUgcGF0aCAoYGFwcC5wbHVnaW5zLmluc3RhbGxQbHVnaW5gXG4gKiArIGBlbmFibGVQbHVnaW5BbmRTYXZlYCksIHNvIGFueSBkZXYvZGVwbG95IG9yIHRvb2xpbmcgZmxvdyBjYW4gcmV1c2UgaXQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFBsdWdpbk1hbmlmZXN0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29tcGFyZSBhcyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7IHJlcXVlc3RVcmwgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogU2VsZWN0cyBhIGNvbW11bml0eSBwbHVnaW4gZWl0aGVyIGJ5IGl0cyBpZCAoe0BsaW5rIENvbW11bml0eVBsdWdpbkJ5SWRSZWZ9KSBvciBieSBpdHMgZGlzcGxheSBuYW1lXG4gKiAoe0BsaW5rIENvbW11bml0eVBsdWdpbkJ5TmFtZVJlZn0pLlxuICovXG5leHBvcnQgdHlwZSBDb21tdW5pdHlQbHVnaW5SZWYgPSBDb21tdW5pdHlQbHVnaW5CeUlkUmVmIHwgQ29tbXVuaXR5UGx1Z2luQnlOYW1lUmVmO1xuXG4vKipcbiAqIEEgc2luZ2xlIHJlc3VsdCBvZiB7QGxpbmsgc2VhcmNoQ29tbXVuaXR5UGx1Z2luc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luU2VhcmNoUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBDb21tdW5pdHlQbHVnaW5TZXR0aW5ncztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGlzYWJsZUNvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvclxuICogYHBsdWdpbk5hbWVgLlxuICovXG5leHBvcnQgdHlwZSBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zID0gQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCAmIENvbW11bml0eVBsdWdpblJlZjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIEVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluc3RhbGxDb21tdW5pdHlQbHVnaW59LiBTZWxlY3RzIHRoZSBwbHVnaW4gYnkgZWl0aGVyIGBwbHVnaW5JZGAgb3JcbiAqIGBwbHVnaW5OYW1lYC5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluc3RhbGxDb25maWd1cmVFbmFibGVDb21tdW5pdHlQbHVnaW59LiBTZWxlY3RzIHRoZSBwbHVnaW4gYnkgZWl0aGVyIGBwbHVnaW5JZGBcbiAqIG9yIGBwbHVnaW5OYW1lYDsgYHNldHRpbmdzYCBpcyBvcHRpb25hbCAob21pdCBmb3IgYSBwbHVnaW4gdGhhdCBuZWVkcyBubyBjb25maWd1cmF0aW9uKS5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBQYXJ0aWFsPENvbW11bml0eVBsdWdpblNldHRpbmdzPjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9nZ2xlRW5hYmxlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFRvZ2dsZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBDb21tdW5pdHlQbHVnaW5Ub2dnbGVFbmFibGVTdGF0ZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9nZ2xlSW5zdGFsbENvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvclxuICogYHBsdWdpbk5hbWVgLlxuICovXG5leHBvcnQgdHlwZSBUb2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zID0gQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCAmIENvbW11bml0eVBsdWdpblJlZiAmIENvbW11bml0eVBsdWdpblRvZ2dsZUluc3RhbGxTdGF0ZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHVwZGF0ZUNvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvciBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogU2VsZWN0cyBhIGNvbW11bml0eSBwbHVnaW4gYnkgaXRzIGlkLlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luQnlJZFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZWxlY3RzIGEgY29tbXVuaXR5IHBsdWdpbiBieSBpdHMgZGlzcGxheSBuYW1lIChhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcmVnaXN0cnkpLlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luQnlOYW1lUmVmIHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gZGlzcGxheSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudHJ5IGluIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHJlZ2lzdHJ5LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luRW50cnkge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBhdXRob3IuXG4gICAqL1xuICByZWFkb25seSBhdXRob3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlIGEgY29tbXVuaXR5LXBsdWdpbiBvcGVyYXRpb24gcnVucyBhZ2FpbnN0LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRvIG1lcmdlIGludG8gYSBjb21tdW5pdHkgcGx1Z2luJ3MgYGRhdGEuanNvbmAuXG4gKi9cbmludGVyZmFjZSBDb21tdW5pdHlQbHVnaW5TZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3Mgb2JqZWN0IHNoYWxsb3ctbWVyZ2VkIG92ZXIgdGhlIHBsdWdpbidzIGV4aXN0aW5nIGBkYXRhLmpzb25gICh0aGUgZmlsZSBpcyBjcmVhdGVkIGlmXG4gICAqIGFic2VudCkuXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5nczogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSBkZXNpcmVkIGVuYWJsZWQgc3RhdGUgZm9yIHtAbGluayB0b2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW59LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luVG9nZ2xlRW5hYmxlU3RhdGUge1xuICAvKipcbiAgICogVGhlIGRlc2lyZWQgZW5hYmxlZCBzdGF0ZTogYHRydWVgIGVuYWJsZXMgdGhlIHBsdWdpbiwgYGZhbHNlYCBkaXNhYmxlcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGUgZm9yIHtAbGluayB0b2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2lufS5cbiAqL1xuaW50ZXJmYWNlIENvbW11bml0eVBsdWdpblRvZ2dsZUluc3RhbGxTdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGU6IGB0cnVlYCBpbnN0YWxscyB0aGUgcGx1Z2luLCBgZmFsc2VgIHVuaW5zdGFsbHMgaXQuXG4gICAqL1xuICByZWFkb25seSBpc0luc3RhbGxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgb25lIG1ldGhvZCB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufSBuZWVkcyBmcm9tIGEgcGx1Z2luJ3Mgc2V0dGluZ3MgY29tcG9uZW50IHRvIGNvbmZpZ3VyZVxuICogaXQgbGl2ZS4gRGVjbGFyZWQgc3RydWN0dXJhbGx5IHJhdGhlciB0aGFuIGltcG9ydGluZyBgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRgLCBzbyBhIHBsdWdpbiBidWlsdCBvblxuICogYW55IHZlcnNpb24gb2YgaXQgLS0gb3Igb24gaXRzIG93biBlcXVpdmFsZW50IC0tIGlzIGNvbmZpZ3VyYWJsZSB3aXRob3V0IGEgc2hhcmVkIG5vbWluYWwgdHlwZS5cbiAqL1xuaW50ZXJmYWNlIEVkaXRhYmxlU2V0dGluZ3NDb21wb25lbnQge1xuICByZWFkb25seSBlZGl0QW5kU2F2ZTogKHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IG9iamVjdCkgPT4gdm9pZCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgR2l0SHViIHJlbGVhc2Ugd2UgcmVhZC5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2Uge1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgdGFnLCBhIGJhcmUgdmVyc2lvbiBzdWNoIGFzIGAxLjIuM2AuXG4gICAqL1xuICByZWFkb25seSB0YWdfbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19TVEFURV9LRVkgPSAnY29tbXVuaXR5UGx1Z2luRW50cmllc1Byb21pc2UnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfVVJMID0gJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL0hFQUQvY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayBjb25maWd1cmVDb21tdW5pdHlQbHVnaW59LlxuICovXG5leHBvcnQgZW51bSBDb25maWd1cmVDb21tdW5pdHlQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHdlcmUgYXBwbGllZCB0aHJvdWdoIHRoZSBydW5uaW5nIHBsdWdpbidzIG93biBzZXR0aW5ncyBjb21wb25lbnQsIHdoaWNoIGJvdGggdXBkYXRlZFxuICAgKiB0aGVtIGluIG1lbW9yeSBhbmQgcGVyc2lzdGVkIHRoZW0uIFRoZSBwbHVnaW4gaXMgYWxyZWFkeSB1c2luZyB0aGVtLCBzbyBpdCBtdXN0IE5PVCBiZSByZWxvYWRlZC5cbiAgICovXG4gIEFwcGxpZWRMaXZlID0gJ2FwcGxpZWRMaXZlJyxcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHdlcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgc28gbm90aGluZyB3YXMgd3JpdHRlbi5cbiAgICovXG4gIFNraXBwZWQgPSAnc2tpcHBlZCcsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyB3ZXJlIG1lcmdlZCBpbnRvIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgd2hpY2ggd2FzIHdyaXR0ZW4uXG4gICAqL1xuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgdXBkYXRlQ29tbXVuaXR5UGx1Z2lufS5cbiAqL1xuZXhwb3J0IGVudW0gVXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YWxsZWQgY29weSBpcyBhbHJlYWR5IGF0IChvciBwYXN0KSB0aGUgbGF0ZXN0IHJlbGVhc2UsIHNvIG5vdGhpbmcgd2FzIGRvd25sb2FkZWQuXG4gICAqL1xuICBBbHJlYWR5VXBUb0RhdGUgPSAnYWxyZWFkeVVwVG9EYXRlJyxcblxuICAvKipcbiAgICogVGhlIGxhdGVzdCByZWxlYXNlIHdhcyBpbnN0YWxsZWQgb3ZlciB0aGUgb2xkIGNvcHksIHdoaWNoIE9ic2lkaWFuIHJlbG9hZGVkIGlmIGl0IHdhcyBydW5uaW5nLlxuICAgKi9cbiAgVXBkYXRlZCA9ICd1cGRhdGVkJ1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIE9ic2lkaWFuIHJlZnVzZXMgdG8gZW5hYmxlIGEgcGx1Z2luOiBpdHMgYGVuYWJsZVBsdWdpbmAgLyBgZW5hYmxlUGx1Z2luQW5kU2F2ZWAgcmVzb2x2ZWRcbiAqIGBmYWxzZWAsIGJlY2F1c2UgdGhlIHBsdWdpbiBpcyB1bmtub3duLCBkZXByZWNhdGVkLCBkZXNrdG9wLW9ubHkgb24gbW9iaWxlLCBvciB0aHJldyB3aGlsZSBsb2FkaW5nLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRW5hYmxlUmVmdXNlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5FbmFibGVSZWZ1c2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiBPYnNpZGlhbiByZWZ1c2VkIHRvIGVuYWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBPYnNpZGlhbiByZWZ1c2VkIHRvIGVuYWJsZSB0aGUgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luRW5hYmxlUmVmdXNlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb21tdW5pdHkgcGx1Z2luLCBwcmVmZXJyaW5nIHRoZSBydW5uaW5nIHBsdWdpbidzIG93biBzZXR0aW5ncyBjb21wb25lbnQgb3ZlciBpdHNcbiAqIGBkYXRhLmpzb25gLlxuICpcbiAqIFdoZW4gdGhlIHBsdWdpbiBpcyBsb2FkZWQgQU5EIGV4cG9zZXMgYSBgcGx1Z2luU2V0dGluZ3NDb21wb25lbnRgIHdpdGggYW4gYGVkaXRBbmRTYXZlYCBtZXRob2QsIHRoZVxuICogc2V0dGluZ3MgYXJlIHNoYWxsb3ctbWVyZ2VkIHRocm91Z2ggaXQ6IHRoZXkgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkgYW5kIGFyZSBwZXJzaXN0ZWQsIHNvIHRoZSBwbHVnaW5cbiAqIG5lZWRzIG5vIHJlbG9hZCBhbmQge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5BcHBsaWVkTGl2ZX0gaXMgcmV0dXJuZWQuIFRoaXMgaXMgd2hhdCBsZXRzIGFcbiAqIHBsdWdpbidzIG93biBzY3JpcHQgcmVjb25maWd1cmUgaXQgd2l0aG91dCB0aGUgZGlzYWJsZS9lbmFibGUgY3ljbGUgdGhhdCB3b3VsZCB0ZWFyIGRvd24gdGhlIHZlcnkgY29kZVxuICogZG9pbmcgdGhlIHJlY29uZmlndXJpbmcuIE5vdGUgdGhhdCB0aGlzIHBhdGggcnVucyB0aGUgcGx1Z2luJ3Mgc2V0dGluZyB2YWxpZGF0b3JzLCBzbyBhbiBpbnZhbGlkIHZhbHVlXG4gKiBpcyByZXBsYWNlZCBieSBpdHMgZGVmYXVsdCByYXRoZXIgdGhhbiB3cml0dGVuIHRocm91Z2ggdmVyYmF0aW0uXG4gKlxuICogT3RoZXJ3aXNlIHRoZSBzZXR0aW5ncyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgc2hhbGxvdy1tZXJnZWQgb3ZlciBhbnkgZXhpc3RpbmdcbiAqIHNldHRpbmdzIChjcmVhdGluZyB0aGUgZmlsZSBpZiBhYnNlbnQpLiBXcml0aW5nIHNldHRpbmdzIEJFRk9SRSB0aGUgcGx1Z2luIGlzIGVuYWJsZWQgbWFrZXMgaXQgbG9hZFxuICogYWxyZWFkeSBjb25maWd1cmVkLCB3aXRoIG5vIHJlbG9hZC4gQSBuby1vcCB3cml0ZSBpcyBza2lwcGVkOiB3aGVuIHRoZSBtZXJnZSBjaGFuZ2VzIG5vdGhpbmcsIHRoZSBmaWxlXG4gKiBpcyBsZWZ0IHVudG91Y2hlZCBhbmQge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkfSBpcyByZXR1cm5lZCwgc28gYSBjYWxsZXIgY2FuIGF2b2lkXG4gKiByZWxvYWRpbmcgYW4gYWxyZWFkeS1jb3JyZWN0bHktY29uZmlndXJlZCBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8ge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5BcHBsaWVkTGl2ZX0gaWYgdGhlXG4gKiBydW5uaW5nIHBsdWdpbiBhcHBsaWVkIHRoZW0gaXRzZWxmIChubyByZWxvYWQgbmVlZGVkKSwge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5TdWNjZXNzfSBpZlxuICogdGhlIGBkYXRhLmpzb25gIGNvbnRlbnQgY2hhbmdlZCAoYW5kIHdhcyB3cml0dGVuKSwgb3Ige0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkfSBpZlxuICogdGhlIHNldHRpbmdzIHdlcmUgYWxyZWFkeSBwcmVzZW50IChub3RoaW5nIHdyaXR0ZW4pLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8Q29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0PiB7XG4gIGNvbnN0IHsgYXBwLCBzZXR0aW5ncyB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuXG4gIGNvbnN0IHNldHRpbmdzQ29tcG9uZW50ID0gZ2V0U2V0dGluZ3NDb21wb25lbnQoYXBwLnBsdWdpbnMucGx1Z2luc1twbHVnaW5JZF0pO1xuICBpZiAoY2hlY2tIYXNFZGl0QW5kU2F2ZShzZXR0aW5nc0NvbXBvbmVudCkpIHtcbiAgICBhd2FpdCBzZXR0aW5nc0NvbXBvbmVudC5lZGl0QW5kU2F2ZSgocGx1Z2luU2V0dGluZ3MpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICB9KTtcbiAgICByZXR1cm4gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LkFwcGxpZWRMaXZlO1xuICB9XG5cbiAgY29uc3QgZGF0YVBhdGggPSBgJHthcHAudmF1bHQuY29uZmlnRGlyfS9wbHVnaW5zLyR7cGx1Z2luSWR9L2RhdGEuanNvbmA7XG5cbiAgbGV0IGRhdGE6IG9iamVjdCA9IHt9O1xuICBpZiAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGRhdGFQYXRoKSkge1xuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChkYXRhUGF0aCkpO1xuICAgIGlmIChwYXJzZWQgIT09IG51bGwgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBwYXJzZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZEJlZm9yZSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICBPYmplY3QuYXNzaWduKGRhdGEsIHNldHRpbmdzKTtcbiAgaWYgKEpTT04uc3RyaW5naWZ5KGRhdGEpID09PSBzZXJpYWxpemVkQmVmb3JlKSB7XG4gICAgcmV0dXJuIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZCA9IFN0cmluZyhKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gIGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGRhdGFQYXRoLCBgJHtzZXJpYWxpemVkfVxcbmApO1xuICByZXR1cm4gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LlN1Y2Nlc3M7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgYSBjb21tdW5pdHkgcGx1Z2luIChwZXJzaXN0aW5nIHRoZSBjaGFuZ2UpIGlmIGl0IGlzIGN1cnJlbnRseSBlbmFibGVkLiBJZGVtcG90ZW50IOKAlCBhIG5vLW9wXG4gKiB3aGVuIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBkaXNhYmxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGRpc2FibGVkLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2FibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmICghYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBhcHAucGx1Z2lucy5kaXNhYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5JZCk7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIGNvbW11bml0eSBwbHVnaW4gKHBlcnNpc3RpbmcgdGhlIGNoYW5nZSkgaWYgaXQgaXMgbm90IGFscmVhZHkgZW5hYmxlZC4gSWRlbXBvdGVudCDigJQgYSBuby1vcFxuICogd2hlbiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgZW5hYmxlZC5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKiBAdGhyb3dzIHtAbGluayBQbHVnaW5FbmFibGVSZWZ1c2VkRXJyb3J9IElmIE9ic2lkaWFuIHJlZnVzZWQgdG8gZW5hYmxlIHRoZSBwbHVnaW47IG5vdGhpbmcgaXMgc2F2ZWQgdGhlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IEVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWF3YWl0IGFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbkFuZFNhdmUocGx1Z2luSWQpKSB7XG4gICAgdGhyb3cgbmV3IFBsdWdpbkVuYWJsZVJlZnVzZWRFcnJvcihwbHVnaW5JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYG93bmVyL25hbWVgIEdpdEh1YiByZXBvc2l0b3J5IG9mIGEgY29tbXVuaXR5IHBsdWdpbiBmcm9tIE9ic2lkaWFuJ3MgcHVibGljXG4gKiBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgcmVnaXN0cnkuXG4gKlxuICogVGhlIHJlZ2lzdHJ5IGlzIGZldGNoZWQgb25jZSBhbmQgY2FjaGVkIG9uIHRoZSBzaGFyZWQgcGx1Z2luIHN0YXRlIGZvciBzdWJzZXF1ZW50IGNhbGxzOyBhIGZhaWxlZFxuICogZmV0Y2ggaXMgbm90IGNhY2hlZCwgc28gYSBsYXRlciBjYWxsIHJldHJpZXMuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBpZCB0byBsb29rIHVwLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBwbHVnaW4ncyBgb3duZXIvbmFtZWAgcmVwb3NpdG9yeSwgb3IgYG51bGxgIGlmIHRoZVxuICogcGx1Z2luIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29tbXVuaXR5UGx1Z2luUmVwbyhwbHVnaW5JZDogc3RyaW5nKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBnZXRDb21tdW5pdHlQbHVnaW5FbnRyaWVzKCk7XG4gIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gcGx1Z2luSWQpO1xuICByZXR1cm4gZW50cnk/LnJlcG8gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbGF0ZXN0IHJlbGVhc2UgdmVyc2lvbiAodGhlIHJlbGVhc2UgYHRhZ19uYW1lYCwgYSBiYXJlIHZlcnNpb24gc3VjaCBhcyBgMS4yLjNgKSBvZiBhXG4gKiBHaXRIdWIgcmVwb3NpdG9yeS5cbiAqXG4gKiBAcGFyYW0gcmVwbyAtIFRoZSBgb3duZXIvbmFtZWAgR2l0SHViIHJlcG9zaXRvcnkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGxhdGVzdCByZWxlYXNlIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RSZWxlYXNlVmVyc2lvbihyZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvfS9yZWxlYXNlcy9sYXRlc3RgKTtcbiAgY29uc3QgcmVsZWFzZSA9IHJlc3BvbnNlLmpzb24gYXMgR2l0SHViUmVsZWFzZTtcbiAgcmV0dXJuIHJlbGVhc2UudGFnX25hbWU7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgYSBjb21tdW5pdHkgcGx1Z2luIGZyb20gdGhlIG9mZmljaWFsIHN0b3JlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGluc3RhbGxlZC4gSWRlbXBvdGVudCDigJQgYVxuICogbm8tb3Agd2hlbiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBSZXNvbHZlcyB0aGUgcGx1Z2luJ3MgcmVwb3NpdG9yeSBmcm9tIE9ic2lkaWFuJ3NcbiAqIGNvbW11bml0eSByZWdpc3RyeSwgcmVhZHMgdGhlIGxhdGVzdCByZWxlYXNlIHZlcnNpb24gYW5kIGl0cyBtYW5pZmVzdCwgYW5kIGluc3RhbGxzIGl0IHRocm91Z2hcbiAqIE9ic2lkaWFuJ3Mgb3duIGBpbnN0YWxsUGx1Z2luYCBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgaW5zdGFsbGVkLlxuICogQHRocm93cyBJZiB0aGUgcGx1Z2luIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmIChPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLm1hbmlmZXN0cywgcGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVwbyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpblJlcG8ocGx1Z2luSWQpO1xuICBpZiAoIXJlcG8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAnJHtwbHVnaW5JZH0nIHdhcyBub3QgZm91bmQgaW4gdGhlIE9ic2lkaWFuIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LmApO1xuICB9XG5cbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFJlbGVhc2VWZXJzaW9uKHJlcG8pO1xuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGdldFBsdWdpbk1hbmlmZXN0KHJlcG8sIHZlcnNpb24pO1xuICBhd2FpdCBhcHAucGx1Z2lucy5pbnN0YWxsUGx1Z2luKHJlcG8sIHZlcnNpb24sIG1hbmlmZXN0KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxscyBhIGNvbW11bml0eSBwbHVnaW4sIHdyaXRlcyBpdHMgc2V0dGluZ3MsIFRIRU4gZW5hYmxlcyBpdCDigJQgaW4gdGhhdCBvcmRlciDigJQgc28gdGhlIHBsdWdpblxuICogbG9hZHMgYWxyZWFkeSBjb25maWd1cmVkIChhIHBsdWdpbiBlbmFibGVkIGJlZm9yZSBpdCBpcyBjb25maWd1cmVkIHJ1bnMgaXRzIGBvbmxvYWRgIHdpdGggZGVmYXVsdFxuICogc2V0dGluZ3MgYW5kIGRvZXMgbm90aGluZyB1c2VmdWwpLiBJZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgZW5hYmxlZCBhbmQgdGhlIHNldHRpbmdzIGNoYW5nZWQsIGl0IGlzXG4gKiBkaXNhYmxlZCBhbmQgcmUtZW5hYmxlZCBzbyB0aGUgbmV3IHNldHRpbmdzIHRha2UgZWZmZWN0LiBgc2V0dGluZ3NgIGlzIG9wdGlvbmFsOiBvbWl0IGl0IGZvciBhIHBsdWdpblxuICogdGhhdCBuZWVkcyBubyBjb25maWd1cmF0aW9uLiBDb21wb3NlcyB7QGxpbmsgaW5zdGFsbENvbW11bml0eVBsdWdpbn0sIHtAbGluayBjb25maWd1cmVDb21tdW5pdHlQbHVnaW59LFxuICoge0BsaW5rIGVuYWJsZUNvbW11bml0eVBsdWdpbn0gYW5kIHtAbGluayBkaXNhYmxlQ29tbXVuaXR5UGx1Z2lufS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBJbnN0YWxsQ29uZmlndXJlRW5hYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZCwgY29uZmlndXJlZCBhbmQgZW5hYmxlZC5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQ29uZmlndXJlRW5hYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtczogSW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgc2V0dGluZ3MgfSA9IHBhcmFtcztcbiAgYXdhaXQgaW5zdGFsbENvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICBjb25zdCBkaWRTZXR0aW5nc0NoYW5nZSA9IHNldHRpbmdzID8gYXdhaXQgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2luKHsgLi4ucGFyYW1zLCBzZXR0aW5ncyB9KSA9PT0gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LlN1Y2Nlc3MgOiBmYWxzZTtcbiAgY29uc3QgcGx1Z2luSWQgPSBhd2FpdCByZXNvbHZlQ29tbXVuaXR5UGx1Z2luSWQocGFyYW1zKTtcbiAgaWYgKCFhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMocGx1Z2luSWQpKSB7XG4gICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAoZGlkU2V0dGluZ3NDaGFuZ2UpIHtcbiAgICBhd2FpdCBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWFyY2hlcyBPYnNpZGlhbidzIHB1YmxpYyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeSwgcmV0dXJuaW5nIHRoZSBpZCBhbmQgZGlzcGxheSBuYW1lIG9mIGV2ZXJ5XG4gKiBwbHVnaW4gd2hvc2UgaWQsIG5hbWUsIGF1dGhvciBvciBkZXNjcmlwdGlvbiBjb250YWlucyB0aGUgcXVlcnkgKGNhc2UtaW5zZW5zaXRpdmUpLiBBbiBlbXB0eSBxdWVyeVxuICogbWF0Y2hlcyBldmVyeSBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHNlYXJjaCBxdWVyeS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgbWF0Y2hpbmcgcGx1Z2lucycge0BsaW5rIENvbW11bml0eVBsdWdpblNlYXJjaFJlc3VsdH1zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoQ29tbXVuaXR5UGx1Z2lucyhxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxDb21tdW5pdHlQbHVnaW5TZWFyY2hSZXN1bHRbXT4ge1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luRW50cmllcygpO1xuICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PlxuICAgICAgZW50cnkuaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpXG4gICAgICB8fCBlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgICAgfHwgZW50cnkuYXV0aG9yLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgICAgfHwgZW50cnkuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpXG4gICAgKVxuICAgIC5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgaWQ6IGVudHJ5LmlkLFxuICAgICAgbmFtZTogZW50cnkubmFtZVxuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGEgY29tbXVuaXR5IHBsdWdpbiB0byBtYXRjaCB0aGUgZGVzaXJlZCBzdGF0ZS4gRGVsZWdhdGVzIHRvXG4gKiB7QGxpbmsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lufSAvIHtAbGluayBkaXNhYmxlQ29tbXVuaXR5UGx1Z2lufSwgc28gaXQgaXMgaWRlbXBvdGVudC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBUb2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gbWF0Y2hlcyB0aGUgZGVzaXJlZCBlbmFibGVkIHN0YXRlLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IFRvZ2dsZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocGFyYW1zLmlzRW5hYmxlZCkge1xuICAgIGF3YWl0IGVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGRpc2FibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgfVxufVxuXG4vKipcbiAqIEluc3RhbGxzIG9yIHVuaW5zdGFsbHMgYSBjb21tdW5pdHkgcGx1Z2luIHRvIG1hdGNoIHRoZSBkZXNpcmVkIHN0YXRlLiBEZWxlZ2F0ZXMgdG9cbiAqIHtAbGluayBpbnN0YWxsQ29tbXVuaXR5UGx1Z2lufSAvIHtAbGluayB1bmluc3RhbGxDb21tdW5pdHlQbHVnaW59LCBzbyBpdCBpcyBpZGVtcG90ZW50LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFRvZ2dsZUluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gbWF0Y2hlcyB0aGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGUuXG4gKiBAdGhyb3dzIElmIGluc3RhbGxpbmcgYW5kIHRoZSBwbHVnaW4gaXMgbm90IGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlSW5zdGFsbENvbW11bml0eVBsdWdpbihwYXJhbXM6IFRvZ2dsZUluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBhcmFtcy5pc0luc3RhbGxlZCkge1xuICAgIGF3YWl0IGluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB1bmluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgfVxufVxuXG4vKipcbiAqIFVuaW5zdGFsbHMgYSBjb21tdW5pdHkgcGx1Z2luIGlmIGl0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQuIElkZW1wb3RlbnQg4oCUIGEgbm8tb3Agd2hlbiB0aGUgcGx1Z2luIGlzXG4gKiBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFVuaW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyB1bmluc3RhbGxlZC5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBVbmluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgcGx1Z2luSWQgPSBhd2FpdCByZXNvbHZlQ29tbXVuaXR5UGx1Z2luSWQocGFyYW1zKTtcbiAgaWYgKCFPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLm1hbmlmZXN0cywgcGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IGFwcC5wbHVnaW5zLnVuaW5zdGFsbFBsdWdpbihwbHVnaW5JZCk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhbiBpbnN0YWxsZWQgY29tbXVuaXR5IHBsdWdpbiB0byBpdHMgbGF0ZXN0IHJlbGVhc2UsIHRoZSB3YXkgdGhlIGNvbW11bml0eSBwbHVnaW4gYnJvd3NlcidzIG93blxuICogYFVwZGF0ZWAgYnV0dG9uIGRvZXMuXG4gKlxuICogT2JzaWRpYW4ncyBgaW5zdGFsbFBsdWdpbmAgd3JpdGVzIHRoZSByZWxlYXNlJ3MgZmlsZXMgb3ZlciB0aGUgaW5zdGFsbGVkIGNvcHkgYW5kLCB3aGVuIHRoZSBwbHVnaW4gaXNcbiAqIHJ1bm5pbmcsIGRpc2FibGVzIGFuZCByZS1lbmFibGVzIGl0IHNvIHRoZSBuZXcgY29kZSBsb2FkcyDigJQgcmVhZCBmcm9tIHRoZSBzaGlwcGVkIGJ1bmRsZSAoYDEuMTQuNGApLCBub3RcbiAqIGFzc3VtZWQuIEl0IHJlcG9ydHMgaXRzIG93biBmYWlsdXJlcyAoYSBmYWlsZWQgZG93bmxvYWQsIGEgbWFuaWZlc3Qgd2hvc2UgaWQgZG9lcyBub3QgbWF0Y2gpIGFzIGEgbm90aWNlXG4gKiBhbmQgUkVUVVJOUyByYXRoZXIgdGhhbiB0aHJvd2luZywgc28gdGhlIGluc3RhbGxlZCBtYW5pZmVzdCBpcyByZS1yZWFkIGFmdGVyd2FyZHMgYW5kIGEgdmVyc2lvbiB0aGF0IGRpZFxuICogbm90IG1vdmUgdG8gdGhlIHJlbGVhc2UgaXMgdGhyb3duIGFzIGEgZmFpbHVyZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBVcGRhdGVDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHtAbGluayBVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQuVXBkYXRlZH0gb25jZSB0aGUgbGF0ZXN0IHJlbGVhc2VcbiAqIGlzIGluc3RhbGxlZCwgb3Ige0BsaW5rIFVwZGF0ZUNvbW11bml0eVBsdWdpblJlc3VsdC5BbHJlYWR5VXBUb0RhdGV9IHdoZW4gdGhlIGluc3RhbGxlZCBjb3B5IGlzIG5vdCBvbGRlclxuICogdGhhbiBpdC5cbiAqIEB0aHJvd3MgSWYgdGhlIHBsdWdpbiBpcyBub3QgaW5zdGFsbGVkLCBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnksIG9yIHRoZVxuICogaW5zdGFsbCBkaWQgbm90IGxlYXZlIHRoZSBsYXRlc3QgcmVsZWFzZSBpbiBwbGFjZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IFVwZGF0ZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8VXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0PiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGNvbnN0IGluc3RhbGxlZE1hbmlmZXN0ID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW3BsdWdpbklkXTtcbiAgaWYgKCFpbnN0YWxsZWRNYW5pZmVzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICcke3BsdWdpbklkfScgaXMgbm90IGluc3RhbGxlZCwgc28gaXQgY2Fubm90IGJlIHVwZGF0ZWQuYCk7XG4gIH1cblxuICBjb25zdCByZXBvID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luUmVwbyhwbHVnaW5JZCk7XG4gIGlmICghcmVwbykge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICcke3BsdWdpbklkfScgd2FzIG5vdCBmb3VuZCBpbiB0aGUgT2JzaWRpYW4gY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0UmVsZWFzZVZlcnNpb24ocmVwbyk7XG4gIGlmIChpc0F0TGVhc3RWZXJzaW9uKGluc3RhbGxlZE1hbmlmZXN0LnZlcnNpb24sIHZlcnNpb24pKSB7XG4gICAgcmV0dXJuIFVwZGF0ZUNvbW11bml0eVBsdWdpblJlc3VsdC5BbHJlYWR5VXBUb0RhdGU7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGdldFBsdWdpbk1hbmlmZXN0KHJlcG8sIHZlcnNpb24pO1xuICBhd2FpdCBhcHAucGx1Z2lucy5pbnN0YWxsUGx1Z2luKHJlcG8sIHZlcnNpb24sIG1hbmlmZXN0KTtcblxuICBjb25zdCB1cGRhdGVkVmVyc2lvbiA9IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/LnZlcnNpb247XG4gIGlmICh1cGRhdGVkVmVyc2lvbiAhPT0gbWFuaWZlc3QudmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBVcGRhdGluZyBwbHVnaW4gJyR7cGx1Z2luSWR9JyB0byAke21hbmlmZXN0LnZlcnNpb259IGxlZnQgdmVyc2lvbiAke3VwZGF0ZWRWZXJzaW9uID8/ICcobm9uZSknfSBpbnN0YWxsZWQuIE9ic2lkaWFuIHJlcG9ydHMgdGhlIGNhdXNlIGFzIGEgbm90aWNlLmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFVwZGF0ZUNvbW11bml0eVBsdWdpblJlc3VsdC5VcGRhdGVkO1xufVxuXG4vLyBXaGV0aGVyIGEgcGx1Z2luJ3MgYHBsdWdpblNldHRpbmdzQ29tcG9uZW50YCBjYW4gY29uZmlndXJlIGl0c2VsZiBpbiBwbGFjZS4gU3RydWN0dXJhbCByYXRoZXIgdGhhbiBhblxuLy8gYGluc3RhbmNlb2ZgOiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgZnJvbSBpdHMgb3duIGJ1bmRsZSwgc28gZXZlbiBhIHBsdWdpbiBidWlsdCBvbiB0aGlzIHZlcnkgbGlicmFyeVxuLy8gY2FycmllcyBpdHMgb3duIGNvcHkgb2YgdGhlIGNsYXNzIGFuZCB3b3VsZCBmYWlsIGFuIGlkZW50aXR5IGNoZWNrLlxuZnVuY3Rpb24gY2hlY2tIYXNFZGl0QW5kU2F2ZShzZXR0aW5nc0NvbXBvbmVudDogdW5rbm93bik6IHNldHRpbmdzQ29tcG9uZW50IGlzIEVkaXRhYmxlU2V0dGluZ3NDb21wb25lbnQge1xuICByZXR1cm4gdHlwZW9mIHNldHRpbmdzQ29tcG9uZW50ID09PSAnb2JqZWN0J1xuICAgICYmIHNldHRpbmdzQ29tcG9uZW50ICE9PSBudWxsXG4gICAgJiYgJ2VkaXRBbmRTYXZlJyBpbiBzZXR0aW5nc0NvbXBvbmVudFxuICAgICYmIHR5cGVvZiBzZXR0aW5nc0NvbXBvbmVudC5lZGl0QW5kU2F2ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hDb21tdW5pdHlQbHVnaW5FbnRyaWVzKCk6IFByb21pc2U8Q29tbXVuaXR5UGx1Z2luRW50cnlbXT4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoQ09NTVVOSVRZX1BMVUdJTlNfVVJMKTtcbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24gYXMgQ29tbXVuaXR5UGx1Z2luRW50cnlbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29tbXVuaXR5UGx1Z2luRW50cmllcygpOiBQcm9taXNlPENvbW11bml0eVBsdWdpbkVudHJ5W10+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRPYnNpZGlhbkxpYlN0YXRlPG51bGwgfCBQcm9taXNlPENvbW11bml0eVBsdWdpbkVudHJ5W10+PihDT01NVU5JVFlfUExVR0lOU19TVEFURV9LRVksIG51bGwpO1xuICBjYWNoZS52YWx1ZSA/Pz0gZmV0Y2hDb21tdW5pdHlQbHVnaW5FbnRyaWVzKCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY2FjaGUudmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FjaGUudmFsdWUgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBsdWdpbk1hbmlmZXN0KHJlcG86IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5NYW5pZmVzdD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG99L3JlbGVhc2VzL2Rvd25sb2FkLyR7dmVyc2lvbn0vbWFuaWZlc3QuanNvbmApO1xuICByZXR1cm4gcmVzcG9uc2UuanNvbiBhcyBQbHVnaW5NYW5pZmVzdDtcbn1cblxuLy8gUmVhZHMgYSBsb2FkZWQgcGx1Z2luJ3MgYHBsdWdpblNldHRpbmdzQ29tcG9uZW50YCwgb3IgYG51bGxgIHdoZW4gaXQgaGFzIG5vbmUuIFRha2VzIGB1bmtub3duYCBiZWNhdXNlXG4vLyBBIHBsdWdpbiBpcyB1bmRlciBubyBvYmxpZ2F0aW9uIHRvIGV4cG9zZSBvbmUsIHNvIHRoZXJlIGlzIG5vIHR5cGUgdG8gbmFycm93IGZyb20uXG5mdW5jdGlvbiBnZXRTZXR0aW5nc0NvbXBvbmVudChwbHVnaW46IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIHR5cGVvZiBwbHVnaW4gIT09ICdvYmplY3QnIHx8IHBsdWdpbiA9PT0gbnVsbCB8fCAhKCdwbHVnaW5TZXR0aW5nc0NvbXBvbmVudCcgaW4gcGx1Z2luKSA/IG51bGwgOiBwbHVnaW4ucGx1Z2luU2V0dGluZ3NDb21wb25lbnQ7XG59XG5cbi8vIEEgdmVyc2lvbiB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgcmVhZHMgYXMgb2xkZXIsIHNvIGFuIHVwZGF0ZSBpcyBhdHRlbXB0ZWQgcmF0aGVyIHRoYW4gc2tpcHBlZDogdGhlIGluc3RhbGwnc1xuLy8gb3duIHZlcnNpb24gY2hlY2sgYWZ0ZXJ3YXJkcyBzdGlsbCBjYXRjaGVzIGEgcmVsZWFzZSB0aGF0IGRvZXMgbm90IG1vdmUgaXQuXG5mdW5jdGlvbiBpc0F0TGVhc3RWZXJzaW9uKGluc3RhbGxlZFZlcnNpb246IHN0cmluZywgbGF0ZXN0VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNvbXBhcmVWZXJzaW9ucyhpbnN0YWxsZWRWZXJzaW9uLCBsYXRlc3RWZXJzaW9uLCAnPj0nKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChyZWZlcmVuY2U6IENvbW11bml0eVBsdWdpblJlZik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmICgncGx1Z2luSWQnIGluIHJlZmVyZW5jZSkge1xuICAgIHJldHVybiByZWZlcmVuY2UucGx1Z2luSWQ7XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luRW50cmllcygpO1xuICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gcmVmZXJlbmNlLnBsdWdpbk5hbWUpO1xuICBpZiAoIWVudHJ5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gbmFtZWQgJyR7cmVmZXJlbmNlLnBsdWdpbk5hbWV9JyB3YXMgbm90IGZvdW5kIGluIHRoZSBPYnNpZGlhbiBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgfVxuICByZXR1cm4gZW50cnkuaWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUJBLDhCQUEyQztBQUMzQyxzQkFBMkI7QUFFM0IsZ0NBQW9DO0FBMExwQyxN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QixrQkFBMEIsZUFBZ0M7QUFDbEYsTUFBSTtBQUNGLGVBQU8sd0JBQUFDLFNBQWdCLGtCQUFrQixlQUFlLElBQUk7QUFBQSxFQUM5RCxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLGVBQWUseUJBQXlCLFdBQWdEO0FBQ3RGLE1BQUksY0FBYyxXQUFXO0FBQzNCLFdBQU8sVUFBVTtBQUFBLEVBQ25CO0FBRUEsUUFBTSxVQUFVLE1BQU0sMEJBQTBCO0FBQ2hELFFBQU0sUUFBUSxRQUFRLEtBQUssQ0FBQyxjQUFjLFVBQVUsU0FBUyxVQUFVLFVBQVU7QUFDakYsTUFBSSxDQUFDLE9BQU87QUFDVixVQUFNLElBQUksTUFBTSxpQkFBaUIsVUFBVSxVQUFVLDZEQUE2RDtBQUFBLEVBQ3BIO0FBQ0EsU0FBTyxNQUFNO0FBQ2Y7IiwibmFtZXMiOlsiQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0IiwiVXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0IiwiY29tcGFyZVZlcnNpb25zIl19
@@ -161,6 +161,19 @@ export declare enum UpdateCommunityPluginResult {
161
161
  */
162
162
  Updated = "updated"
163
163
  }
164
+ /**
165
+ * Thrown when Obsidian refuses to enable a plugin: its `enablePlugin` / `enablePluginAndSave` resolved
166
+ * `false`, because the plugin is unknown, deprecated, desktop-only on mobile, or threw while loading.
167
+ */
168
+ export declare class PluginEnableRefusedError extends Error {
169
+ readonly pluginId: string;
170
+ /**
171
+ * Creates a {@link PluginEnableRefusedError}.
172
+ *
173
+ * @param pluginId - The id of the plugin Obsidian refused to enable.
174
+ */
175
+ constructor(pluginId: string);
176
+ }
164
177
  /**
165
178
  * Configures a community plugin, preferring the running plugin's own settings component over its
166
179
  * `data.json`.
@@ -202,6 +215,7 @@ export declare function disableCommunityPlugin(params: DisableCommunityPluginPar
202
215
  * @param params - The {@link EnableCommunityPluginParams}.
203
216
  * @returns A {@link Promise} that resolves once the plugin is enabled.
204
217
  * @throws If selected by `pluginName` and the name is not listed in Obsidian's community plugins registry.
218
+ * @throws {@link PluginEnableRefusedError} If Obsidian refused to enable the plugin; nothing is saved then.
205
219
  */
206
220
  export declare function enableCommunityPlugin(params: EnableCommunityPluginParams): Promise<void>;
207
221
  /**
@@ -204,7 +204,7 @@ class BulkOperationCommitComponent extends import_component_ex.ComponentEx {
204
204
  if (!repo) {
205
205
  return await params.operation();
206
206
  }
207
- const { commitSha, operationId, result } = await repo.runBulkOperation({
207
+ const { commitSha, operationId, recoveredOperationId, result } = await repo.runBulkOperation({
208
208
  operation: async () => await params.operation(),
209
209
  pluginId: this.pluginId,
210
210
  settle: () => this.settle(),
@@ -213,6 +213,9 @@ class BulkOperationCommitComponent extends import_component_ex.ComponentEx {
213
213
  (0, import_debug.getObsidianLibDebugger)("BulkOperationCommitComponent")(
214
214
  commitSha === null ? `${operationId} changed nothing` : `${operationId} committed as ${commitSha}`
215
215
  );
216
+ if (recoveredOperationId !== null) {
217
+ this.pluginNoticeComponent.showNotice((0, import_i18n.t)(($) => $.obsidianLib.bulkOperation.resumedAfterRecovery, { operationId, recoveredOperationId }));
218
+ }
216
219
  return result;
217
220
  }
218
221
  /**
@@ -334,4 +337,4 @@ function formatCommit(commit) {
334
337
  0 && (module.exports = {
335
338
  BulkOperationCommitComponent
336
339
  });
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2J1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIGNsYXNzIHtAbGluayBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50fSB0aGF0IHdyYXBzIGEgcGx1Z2luJ3MgYnVsayBvcGVyYXRpb25zIGluIGdpdCBjb21taXRzLCBzb1xuICogYGdpdCByZXZlcnRgIHVuZG9lcyBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEV2ZW50UmVmXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIGludm9rZUFzeW5jU2FmZWx5LFxuICBzZXRUaW1lb3V0QXN5bmNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgRmlsZVN5c3RlbUFkYXB0ZXIsXG4gIFBsYXRmb3JtXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBCdWxrT3BlcmF0aW9uQ29tbWl0IH0gZnJvbSAnLi4vYnVsay1vcGVyYXRpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBCdWxrT3BlcmF0aW9uR2l0UmVwbyB9IGZyb20gJy4uL2Rlc2t0b3AtYnVsay1vcGVyYXRpb24tZ2l0LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IHJlcG9ydEJ1bGtPcGVyYXRpb25Qcm9ncmVzcyB9IGZyb20gJy4uL2J1bGstb3BlcmF0aW9uLXByb2dyZXNzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5IH0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgc2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGFscy9zZWxlY3QtaXRlbS50cyc7XG5pbXBvcnQgeyBmbHVzaFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsdWdpbidzIG9wdC1pbiBzZXR0aW5nIGZvciBidWxrLW9wZXJhdGlvbiBjb21taXRzIGlzIG9uLiBSZWFkIG9uIGV2ZXJ5IG9wZXJhdGlvbiwgc28gYSBzZXR0aW5nc1xuICAgKiBjaGFuZ2UgYXBwbGllcyB0byB0aGUgbmV4dCBvbmUuXG4gICAqL1xuICByZWFkb25seSBpc0VuYWJsZWQ6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsb25nZXN0IHRoZSBzZXR0bGUgc3RlcCB3YWl0cyBmb3IgdGhlIHZhdWx0IHRvIGdvIHF1aWV0IGFmdGVyIGFuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwXzAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNldHRsZVRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBwbHVnaW4gd2hvc2Ugb3BlcmF0aW9ucyBhcmUgY29tbWl0dGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvYmxlbXMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIHZhdWx0IG11c3QgZ28gd2l0aG91dCBhIGNoYW5nZSBhZnRlciBhbiBvcGVyYXRpb24gYmVmb3JlIGl0cyBjb21taXQgaXMgbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDIwMDBgXG4gICAqL1xuICByZWFkb25seSBxdWlldFBlcmlvZEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50LnJ1bkJ1bGtPcGVyYXRpb259LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudFJ1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2FibGU8VD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QsIHN1Y2ggYXMgYENvbGxlY3QgYXR0YWNobWVudHMgaW4gTm90ZXNgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VtbWFyeTogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX01BWF9TRVRUTEVfVElNRV9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBERUZBVUxUX1FVSUVUX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgU0hPUlRfU0hBX0xFTkdUSCA9IDg7XG5cbi8qKlxuICogV3JhcHMgYSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMgaW4gZ2l0IGNvbW1pdHMsIHNvIGBnaXQgcmV2ZXJ0YCBvZiBvbmUgY29tbWl0IHVuZG9lcyBvbmUgb3BlcmF0aW9uLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHQtaW4gdGhyb3VnaCB0aGUgcGx1Z2luJ3Mgb3duIHNldHRpbmcsIGFuZCBhY3RpdmUgb25seSBvbiBkZXNrdG9wLCBmb3IgYSB2YXVsdCBpbnNpZGUgYSBnaXQgd29yayB0cmVlLiBXaGVuIGl0XG4gKiBpcyBub3QgYWN0aXZlLCB7QGxpbmsgcnVuQnVsa09wZXJhdGlvbn0gc2ltcGx5IHJ1bnMgdGhlIG9wZXJhdGlvbi4gV2hlbiBpdCBpcywgdGhlIG9wZXJhdGlvbiBydW5zIGJldHdlZW4gYVxuICogYGNob3JlOiBiZWZvcmUgT1A8bj5gIGNvbW1pdCBvZiB3aGF0ZXZlciB3YXMgcGVuZGluZyBhbmQgYW4gYE9QPG4+OiA8c3VtbWFyeT5gIGNvbW1pdCBvZiB3aGF0IGl0IGNoYW5nZWQsIHVuZGVyXG4gKiBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5IHRoYXQgdGhlIHNjaGVkdWxlZCB2YXVsdCBhdXRvY29tbWl0IGhvbm9ycy4gVGhlIGxvY2sncyBoZWFydGJlYXRcbiAqIGlzIHJlZnJlc2hlZCBieSB0aGUgb3BlcmF0aW9uJ3MgcHJvZ3Jlc3M6IGV2ZXJ5IGBsb29wKClgIGl0ZW0sIG9yIGFuIGV4cGxpY2l0IGByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKWAuXG4gKlxuICogT24gbG9hZCBpdCByZWNvdmVycyBhIGxvY2sgbGVmdCBzdGFsZSBieSBhIGNyYXNoLCBjb21taXR0aW5nIHRoZSBsZWZ0b3ZlcnMgYXMgYE9QPG4+IGludGVycnVwdGVkYC5cbiAqXG4gKiBQYWlyIGl0IHdpdGggYFVuZG9CdWxrT3BlcmF0aW9uQ29tbWFuZEhhbmRsZXJgLCB3aGljaCBsaXN0cyB0aGUgcGx1Z2luJ3Mgb3BlcmF0aW9ucyBhbmQgcmV2ZXJ0cyBvbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB0aGlzLmJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKG5ldyBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50KHtcbiAqICAgYXBwOiB0aGlzLmFwcCxcbiAqICAgaXNFbmFibGVkOiAoKSA9PiB0aGlzLnNldHRpbmdzLnNob3VsZENvbW1pdEJ1bGtPcGVyYXRpb25zLFxuICogICBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZCxcbiAqICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICogfSkpO1xuICpcbiAqIGF3YWl0IHRoaXMuYnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudC5ydW5CdWxrT3BlcmF0aW9uKHtcbiAqICAgb3BlcmF0aW9uOiAoKSA9PiBjb2xsZWN0QXR0YWNobWVudHNJbkZvbGRlcihmb2xkZXIpLFxuICogICBzdW1tYXJ5OiBgQ29sbGVjdCBhdHRhY2htZW50cyBpbiAke2ZvbGRlci5wYXRofWBcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luJ3Mgb3B0LWluIHNldHRpbmcgaXMgb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNFbmFibGVkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHBsdWdpbiB3aG9zZSBvcGVyYXRpb25zIGFyZSBjb21taXR0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvYmxlbXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTZXR0bGVUaW1lSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWlldFBlcmlvZEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVwb1Byb21pc2U6IG51bGwgfCBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmlzRW5hYmxlZCA9IHBhcmFtcy5pc0VuYWJsZWQ7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5tYXhTZXR0bGVUaW1lSW5NaWxsaXNlY29uZHMgPSBwYXJhbXMubWF4U2V0dGxlVGltZUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfTUFYX1NFVFRMRV9USU1FX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnF1aWV0UGVyaW9kSW5NaWxsaXNlY29uZHMgPSBwYXJhbXMucXVpZXRQZXJpb2RJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1FVSUVUX1BFUklPRF9JTl9NSUxMSVNFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYnVsayBvcGVyYXRpb25zIGFyZSBjdXJyZW50bHkgY29tbWl0dGVkOiB0aGUgc2V0dGluZyBpcyBvbiwgdGhlIGFwcCBpcyBkZXNrdG9wIGFuZCB0aGUgdmF1bHQgaXNcbiAgICogaW5zaWRlIGEgZ2l0IHdvcmsgdHJlZS5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciBidWxrIG9wZXJhdGlvbnMgYXJlIGNvbW1pdHRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja0FjdGl2ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRSZXBvKCkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlcnMgYSBzdGFsZSBsb2NrIGxlZnQgYnkgYSBjcmFzaGVkIG9wZXJhdGlvbiBvbmNlIHRoZSBjb21wb25lbnQgbG9hZHMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHRoaXMucmVjb3ZlclN0YWxlTG9jaygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYnVsayBvcGVyYXRpb24sIHdyYXBwZWQgaW4gZ2l0IGNvbW1pdHMgd2hlbiBidWxrLW9wZXJhdGlvbiBjb21taXRzIGFyZSBhY3RpdmUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5CdWxrT3BlcmF0aW9uPFQ+KHBhcmFtczogQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudFJ1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXBvID0gYXdhaXQgdGhpcy5nZXRSZXBvKCk7XG4gICAgaWYgKCFyZXBvKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29tbWl0U2hhLCBvcGVyYXRpb25JZCwgcmVzdWx0IH0gPSBhd2FpdCByZXBvLnJ1bkJ1bGtPcGVyYXRpb24oe1xuICAgICAgb3BlcmF0aW9uOiBhc3luYyAoKSA9PiBhd2FpdCBwYXJhbXMub3BlcmF0aW9uKCksXG4gICAgICBwbHVnaW5JZDogdGhpcy5wbHVnaW5JZCxcbiAgICAgIHNldHRsZTogKCkgPT4gdGhpcy5zZXR0bGUoKSxcbiAgICAgIHN1bW1hcnk6IHBhcmFtcy5zdW1tYXJ5XG4gICAgfSk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudCcpKFxuICAgICAgY29tbWl0U2hhID09PSBudWxsID8gYCR7b3BlcmF0aW9uSWR9IGNoYW5nZWQgbm90aGluZ2AgOiBgJHtvcGVyYXRpb25JZH0gY29tbWl0dGVkIGFzICR7Y29tbWl0U2hhfWBcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTGV0cyB0aGUgdXNlciBwaWNrIG9uZSBvZiB0aGUgcGx1Z2luJ3MgYnVsayBvcGVyYXRpb25zIGFuZCByZXZlcnRzIGl0cyBjb21taXQuXG4gICAqXG4gICAqIEEgY29uZmxpY3QgaXMgcmVwb3J0ZWQgYW5kIGxlZnQgZm9yIHRoZSB1c2VyIHRvIHJlc29sdmU7IHRoZSByZXZlcnQgaXMgbmV2ZXIgYWJvcnRlZC5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbklkIC0gVGhlIG9wZXJhdGlvbiB0byB1bmRvLCBzdWNoIGFzIGBPUDEyYC4gV2hlbiBvbWl0dGVkLCB0aGUgdXNlciBwaWNrcyBmcm9tIGV2ZXJ5IG9wZXJhdGlvblxuICAgKiBvZiB0aGUgcGx1Z2luLiBXaGVuIHR3byBjb21taXRzIHNoYXJlIHRoZSBpZCAodHdvIG1hY2hpbmVzIG1pbnRlZCBpdCBiZWZvcmUgc3luY2luZyksIHRoZSB1c2VyIHBpY2tzIGJldHdlZW5cbiAgICogdGhlbS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bmRvQnVsa09wZXJhdGlvbihvcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdldFJlcG8oKTtcbiAgICBpZiAoIXJlcG8pIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLm5vdEFjdGl2ZSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb21taXRzID0gYXdhaXQgcmVwby5saXN0QnVsa09wZXJhdGlvbkNvbW1pdHModGhpcy5wbHVnaW5JZCk7XG4gICAgaWYgKG9wZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbW1pdHMgPSBjb21taXRzLmZpbHRlcigoY29tbWl0KSA9PiBjb21taXQub3BlcmF0aW9uSWQgPT09IG9wZXJhdGlvbklkKTtcbiAgICB9XG5cbiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLm5vT3BlcmF0aW9ucykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1pdCA9IGNvbW1pdHMubGVuZ3RoID09PSAxICYmIG9wZXJhdGlvbklkICE9PSB1bmRlZmluZWRcbiAgICAgID8gZW5zdXJlTm9uTnVsbGFibGUoY29tbWl0c1swXSlcbiAgICAgIDogYXdhaXQgc2VsZWN0SXRlbSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGl0ZW1zOiBjb21taXRzLFxuICAgICAgICBpdGVtVGV4dEZ1bmN0aW9uOiBmb3JtYXRDb21taXQsXG4gICAgICAgIHBsYWNlaG9sZGVyOiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1bGtPcGVyYXRpb24uc2VsZWN0T3BlcmF0aW9uKVxuICAgICAgfSk7XG4gICAgaWYgKCFjb21taXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmV2ZXJ0UmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXZlcnRSZXN1bHQgPSBhd2FpdCByZXBvLnJldmVydEJ1bGtPcGVyYXRpb25Db21taXQoY29tbWl0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShcbiAgICAgICAgdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLnJldmVydEZhaWxlZCwgeyBlcnJvcjogZXJyb3JUb1N0cmluZyhlcnJvciksIG9wZXJhdGlvbklkOiBjb21taXQub3BlcmF0aW9uSWQgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHJldmVydFJlc3VsdC5pc0NvbmZsaWN0KSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZXZlcnRDb25mbGljdCwgeyBvcGVyYXRpb25JZDogY29tbWl0Lm9wZXJhdGlvbklkIH0pLCB7XG4gICAgICAgIGlzUGVybWFuZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZXZlcnRlZCwgeyBvcGVyYXRpb25JZDogY29tbWl0Lm9wZXJhdGlvbklkIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZFJlcG8oKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uR2l0UmVwbyB8IG51bGw+IHtcbiAgICBpZiAoIVBsYXRmb3JtLmlzRGVza3RvcEFwcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgIGlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtQWRhcHRlcikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBDb25kaXRpb25hbCBpbXBvcnQgb2YgdGhlIGRlc2t0b3Atb25seSBnaXQgbGF5ZXI7IHRoaXMgcnVucyBvbmx5IG9uIGRlc2t0b3AsIGtlZXBpbmcgaXRzIE5vZGUgYnVpbHRpbnMgb2ZmXG4gICAgLy8gdGhlIG1vYmlsZSBsb2FkIHBhdGguXG4gICAgY29uc3QgeyBCdWxrT3BlcmF0aW9uR2l0UmVwbzogR2l0UmVwbyB9ID0gYXdhaXQgaW1wb3J0KCcuLi9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cycpO1xuICAgIHJldHVybiBhd2FpdCBHaXRSZXBvLm9wZW4oYWRhcHRlci5nZXRCYXNlUGF0aCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVwbygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVwb1Byb21pc2UgPz89IHRoaXMuZmluZFJlcG8oKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvUHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlclN0YWxlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXBvID0gYXdhaXQgdGhpcy5nZXRSZXBvKCk7XG4gICAgaWYgKCFyZXBvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgcmVwby5yZWNvdmVyU3RhbGVMb2NrKCk7XG4gICAgaWYgKG9wZXJhdGlvbklkICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZWNvdmVyZWRJbnRlcnJ1cHRlZCwgeyBvcGVyYXRpb25JZCB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR0bGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmx1c2hRdWV1ZSgpO1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXModGhpcy5hcHApO1xuICAgIGF3YWl0IGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeSh0aGlzLmFwcCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yUXVpZXRWYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yUXVpZXRWYXVsdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdENoYW5nZUF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBsYXN0Q2hhbmdlQXQgKyB0aGlzLm1heFNldHRsZVRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICBmdW5jdGlvbiBvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICAgIGxhc3RDaGFuZ2VBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH1cbiAgICBjb25zdCBldmVudFJlZnM6IEV2ZW50UmVmW10gPSBbXG4gICAgICB0aGlzLmFwcC52YXVsdC5vbignY3JlYXRlJywgb25DaGFuZ2UpLFxuICAgICAgdGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIG9uQ2hhbmdlKSxcbiAgICAgIHRoaXMuYXBwLnZhdWx0Lm9uKCdtb2RpZnknLCBvbkNoYW5nZSksXG4gICAgICB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgb25DaGFuZ2UpXG4gICAgXTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgY29uc3QgcXVpZXRSZW1haW5pbmcgPSBsYXN0Q2hhbmdlQXQgKyB0aGlzLnF1aWV0UGVyaW9kSW5NaWxsaXNlY29uZHMgLSBub3c7XG4gICAgICAgIGlmIChxdWlldFJlbWFpbmluZyA8PSAwIHx8IG5vdyA+PSBkZWFkbGluZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dEFzeW5jKE1hdGgubWluKHF1aWV0UmVtYWluaW5nLCBkZWFkbGluZSAtIG5vdykpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50UmVmIG9mIGV2ZW50UmVmcykge1xuICAgICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRDb21taXQoY29tbWl0OiBCdWxrT3BlcmF0aW9uQ29tbWl0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvbW1pdC5zdWJqZWN0fSAoJHtjb21taXQuZGF0ZX0sICR7Y29tbWl0LnNoYS5zbGljZSgwLCBTSE9SVF9TSEFfTEVOR1RIKX0pYDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQSxtQkFHTztBQUNQLG1CQUE4QjtBQUM5Qix5QkFBa0M7QUFDbEMsc0JBR087QUFNUCxxQ0FBNEM7QUFDNUMsbUJBQXVDO0FBQ3ZDLDBCQUEwQztBQUMxQyxrQkFBa0I7QUFDbEIsNEJBQXlDO0FBQ3pDLHlCQUEyQjtBQUMzQixtQkFBMkI7QUFDM0IsMEJBQTRCO0FBNkQ1QixNQUFNLDBDQUEwQztBQUNoRCxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQStCbEIsTUFBTSxxQ0FBcUMsZ0NBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl6QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBLEVBRUY7QUFBQSxFQUNBO0FBQUEsRUFDVCxjQUEyRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU81RCxZQUFZLFFBQXVEO0FBQ3hFLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLFlBQVksT0FBTztBQUN4QixTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLHdCQUF3QixPQUFPO0FBQ3BDLFNBQUssOEJBQThCLE9BQU8sK0JBQStCO0FBQ3pFLFNBQUssNEJBQTRCLE9BQU8sNkJBQTZCO0FBQUEsRUFDdkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWEsY0FBZ0M7QUFDM0MsV0FBTyxNQUFNLEtBQUssUUFBUSxNQUFNO0FBQUEs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
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2J1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIGNsYXNzIHtAbGluayBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50fSB0aGF0IHdyYXBzIGEgcGx1Z2luJ3MgYnVsayBvcGVyYXRpb25zIGluIGdpdCBjb21taXRzLCBzb1xuICogYGdpdCByZXZlcnRgIHVuZG9lcyBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEV2ZW50UmVmXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIGludm9rZUFzeW5jU2FmZWx5LFxuICBzZXRUaW1lb3V0QXN5bmNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgRmlsZVN5c3RlbUFkYXB0ZXIsXG4gIFBsYXRmb3JtXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBCdWxrT3BlcmF0aW9uQ29tbWl0IH0gZnJvbSAnLi4vYnVsay1vcGVyYXRpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBCdWxrT3BlcmF0aW9uR2l0UmVwbyB9IGZyb20gJy4uL2Rlc2t0b3AtYnVsay1vcGVyYXRpb24tZ2l0LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IHJlcG9ydEJ1bGtPcGVyYXRpb25Qcm9ncmVzcyB9IGZyb20gJy4uL2J1bGstb3BlcmF0aW9uLXByb2dyZXNzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5IH0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgc2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGFscy9zZWxlY3QtaXRlbS50cyc7XG5pbXBvcnQgeyBmbHVzaFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsdWdpbidzIG9wdC1pbiBzZXR0aW5nIGZvciBidWxrLW9wZXJhdGlvbiBjb21taXRzIGlzIG9uLiBSZWFkIG9uIGV2ZXJ5IG9wZXJhdGlvbiwgc28gYSBzZXR0aW5nc1xuICAgKiBjaGFuZ2UgYXBwbGllcyB0byB0aGUgbmV4dCBvbmUuXG4gICAqL1xuICByZWFkb25seSBpc0VuYWJsZWQ6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsb25nZXN0IHRoZSBzZXR0bGUgc3RlcCB3YWl0cyBmb3IgdGhlIHZhdWx0IHRvIGdvIHF1aWV0IGFmdGVyIGFuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwXzAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNldHRsZVRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBwbHVnaW4gd2hvc2Ugb3BlcmF0aW9ucyBhcmUgY29tbWl0dGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvYmxlbXMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIHZhdWx0IG11c3QgZ28gd2l0aG91dCBhIGNoYW5nZSBhZnRlciBhbiBvcGVyYXRpb24gYmVmb3JlIGl0cyBjb21taXQgaXMgbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDIwMDBgXG4gICAqL1xuICByZWFkb25seSBxdWlldFBlcmlvZEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50LnJ1bkJ1bGtPcGVyYXRpb259LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudFJ1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2FibGU8VD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QsIHN1Y2ggYXMgYENvbGxlY3QgYXR0YWNobWVudHMgaW4gTm90ZXNgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VtbWFyeTogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX01BWF9TRVRUTEVfVElNRV9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBERUZBVUxUX1FVSUVUX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgU0hPUlRfU0hBX0xFTkdUSCA9IDg7XG5cbi8qKlxuICogV3JhcHMgYSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMgaW4gZ2l0IGNvbW1pdHMsIHNvIGBnaXQgcmV2ZXJ0YCBvZiBvbmUgY29tbWl0IHVuZG9lcyBvbmUgb3BlcmF0aW9uLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHQtaW4gdGhyb3VnaCB0aGUgcGx1Z2luJ3Mgb3duIHNldHRpbmcsIGFuZCBhY3RpdmUgb25seSBvbiBkZXNrdG9wLCBmb3IgYSB2YXVsdCBpbnNpZGUgYSBnaXQgd29yayB0cmVlLiBXaGVuIGl0XG4gKiBpcyBub3QgYWN0aXZlLCB7QGxpbmsgcnVuQnVsa09wZXJhdGlvbn0gc2ltcGx5IHJ1bnMgdGhlIG9wZXJhdGlvbi4gV2hlbiBpdCBpcywgdGhlIG9wZXJhdGlvbiBydW5zIGJldHdlZW4gYVxuICogYGNob3JlOiBiZWZvcmUgT1A8bj5gIGNvbW1pdCBvZiB3aGF0ZXZlciB3YXMgcGVuZGluZyBhbmQgYW4gYE9QPG4+OiA8c3VtbWFyeT5gIGNvbW1pdCBvZiB3aGF0IGl0IGNoYW5nZWQsIHVuZGVyXG4gKiBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5IHRoYXQgdGhlIHNjaGVkdWxlZCB2YXVsdCBhdXRvY29tbWl0IGhvbm9ycy4gVGhlIGxvY2sncyBoZWFydGJlYXRcbiAqIGlzIHJlZnJlc2hlZCBieSB0aGUgb3BlcmF0aW9uJ3MgcHJvZ3Jlc3M6IGV2ZXJ5IGBsb29wKClgIGl0ZW0sIG9yIGFuIGV4cGxpY2l0IGByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKWAuXG4gKlxuICogT24gbG9hZCBpdCByZWNvdmVycyBhIGxvY2sgbGVmdCBzdGFsZSBieSBhIGNyYXNoLCBjb21taXR0aW5nIHRoZSBsZWZ0b3ZlcnMgYXMgYE9QPG4+IGludGVycnVwdGVkYC5cbiAqXG4gKiBQYWlyIGl0IHdpdGggYFVuZG9CdWxrT3BlcmF0aW9uQ29tbWFuZEhhbmRsZXJgLCB3aGljaCBsaXN0cyB0aGUgcGx1Z2luJ3Mgb3BlcmF0aW9ucyBhbmQgcmV2ZXJ0cyBvbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB0aGlzLmJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKG5ldyBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50KHtcbiAqICAgYXBwOiB0aGlzLmFwcCxcbiAqICAgaXNFbmFibGVkOiAoKSA9PiB0aGlzLnNldHRpbmdzLnNob3VsZENvbW1pdEJ1bGtPcGVyYXRpb25zLFxuICogICBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZCxcbiAqICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICogfSkpO1xuICpcbiAqIGF3YWl0IHRoaXMuYnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudC5ydW5CdWxrT3BlcmF0aW9uKHtcbiAqICAgb3BlcmF0aW9uOiAoKSA9PiBjb2xsZWN0QXR0YWNobWVudHNJbkZvbGRlcihmb2xkZXIpLFxuICogICBzdW1tYXJ5OiBgQ29sbGVjdCBhdHRhY2htZW50cyBpbiAke2ZvbGRlci5wYXRofWBcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luJ3Mgb3B0LWluIHNldHRpbmcgaXMgb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNFbmFibGVkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHBsdWdpbiB3aG9zZSBvcGVyYXRpb25zIGFyZSBjb21taXR0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgcHJvYmxlbXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTZXR0bGVUaW1lSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWlldFBlcmlvZEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVwb1Byb21pc2U6IG51bGwgfCBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmlzRW5hYmxlZCA9IHBhcmFtcy5pc0VuYWJsZWQ7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5tYXhTZXR0bGVUaW1lSW5NaWxsaXNlY29uZHMgPSBwYXJhbXMubWF4U2V0dGxlVGltZUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfTUFYX1NFVFRMRV9USU1FX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnF1aWV0UGVyaW9kSW5NaWxsaXNlY29uZHMgPSBwYXJhbXMucXVpZXRQZXJpb2RJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1FVSUVUX1BFUklPRF9JTl9NSUxMSVNFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYnVsayBvcGVyYXRpb25zIGFyZSBjdXJyZW50bHkgY29tbWl0dGVkOiB0aGUgc2V0dGluZyBpcyBvbiwgdGhlIGFwcCBpcyBkZXNrdG9wIGFuZCB0aGUgdmF1bHQgaXNcbiAgICogaW5zaWRlIGEgZ2l0IHdvcmsgdHJlZS5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciBidWxrIG9wZXJhdGlvbnMgYXJlIGNvbW1pdHRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja0FjdGl2ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRSZXBvKCkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlcnMgYSBzdGFsZSBsb2NrIGxlZnQgYnkgYSBjcmFzaGVkIG9wZXJhdGlvbiBvbmNlIHRoZSBjb21wb25lbnQgbG9hZHMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHRoaXMucmVjb3ZlclN0YWxlTG9jaygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYnVsayBvcGVyYXRpb24sIHdyYXBwZWQgaW4gZ2l0IGNvbW1pdHMgd2hlbiBidWxrLW9wZXJhdGlvbiBjb21taXRzIGFyZSBhY3RpdmUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5CdWxrT3BlcmF0aW9uPFQ+KHBhcmFtczogQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudFJ1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXBvID0gYXdhaXQgdGhpcy5nZXRSZXBvKCk7XG4gICAgaWYgKCFyZXBvKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29tbWl0U2hhLCBvcGVyYXRpb25JZCwgcmVjb3ZlcmVkT3BlcmF0aW9uSWQsIHJlc3VsdCB9ID0gYXdhaXQgcmVwby5ydW5CdWxrT3BlcmF0aW9uKHtcbiAgICAgIG9wZXJhdGlvbjogYXN5bmMgKCkgPT4gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbigpLFxuICAgICAgcGx1Z2luSWQ6IHRoaXMucGx1Z2luSWQsXG4gICAgICBzZXR0bGU6ICgpID0+IHRoaXMuc2V0dGxlKCksXG4gICAgICBzdW1tYXJ5OiBwYXJhbXMuc3VtbWFyeVxuICAgIH0pO1xuICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ0J1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnQnKShcbiAgICAgIGNvbW1pdFNoYSA9PT0gbnVsbCA/IGAke29wZXJhdGlvbklkfSBjaGFuZ2VkIG5vdGhpbmdgIDogYCR7b3BlcmF0aW9uSWR9IGNvbW1pdHRlZCBhcyAke2NvbW1pdFNoYX1gXG4gICAgKTtcbiAgICBpZiAocmVjb3ZlcmVkT3BlcmF0aW9uSWQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLnJlc3VtZWRBZnRlclJlY292ZXJ5LCB7IG9wZXJhdGlvbklkLCByZWNvdmVyZWRPcGVyYXRpb25JZCB9KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTGV0cyB0aGUgdXNlciBwaWNrIG9uZSBvZiB0aGUgcGx1Z2luJ3MgYnVsayBvcGVyYXRpb25zIGFuZCByZXZlcnRzIGl0cyBjb21taXQuXG4gICAqXG4gICAqIEEgY29uZmxpY3QgaXMgcmVwb3J0ZWQgYW5kIGxlZnQgZm9yIHRoZSB1c2VyIHRvIHJlc29sdmU7IHRoZSByZXZlcnQgaXMgbmV2ZXIgYWJvcnRlZC5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbklkIC0gVGhlIG9wZXJhdGlvbiB0byB1bmRvLCBzdWNoIGFzIGBPUDEyYC4gV2hlbiBvbWl0dGVkLCB0aGUgdXNlciBwaWNrcyBmcm9tIGV2ZXJ5IG9wZXJhdGlvblxuICAgKiBvZiB0aGUgcGx1Z2luLiBXaGVuIHR3byBjb21taXRzIHNoYXJlIHRoZSBpZCAodHdvIG1hY2hpbmVzIG1pbnRlZCBpdCBiZWZvcmUgc3luY2luZyksIHRoZSB1c2VyIHBpY2tzIGJldHdlZW5cbiAgICogdGhlbS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bmRvQnVsa09wZXJhdGlvbihvcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcG8gPSBhd2FpdCB0aGlzLmdldFJlcG8oKTtcbiAgICBpZiAoIXJlcG8pIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLm5vdEFjdGl2ZSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb21taXRzID0gYXdhaXQgcmVwby5saXN0QnVsa09wZXJhdGlvbkNvbW1pdHModGhpcy5wbHVnaW5JZCk7XG4gICAgaWYgKG9wZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbW1pdHMgPSBjb21taXRzLmZpbHRlcigoY29tbWl0KSA9PiBjb21taXQub3BlcmF0aW9uSWQgPT09IG9wZXJhdGlvbklkKTtcbiAgICB9XG5cbiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLm5vT3BlcmF0aW9ucykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1pdCA9IGNvbW1pdHMubGVuZ3RoID09PSAxICYmIG9wZXJhdGlvbklkICE9PSB1bmRlZmluZWRcbiAgICAgID8gZW5zdXJlTm9uTnVsbGFibGUoY29tbWl0c1swXSlcbiAgICAgIDogYXdhaXQgc2VsZWN0SXRlbSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGl0ZW1zOiBjb21taXRzLFxuICAgICAgICBpdGVtVGV4dEZ1bmN0aW9uOiBmb3JtYXRDb21taXQsXG4gICAgICAgIHBsYWNlaG9sZGVyOiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1bGtPcGVyYXRpb24uc2VsZWN0T3BlcmF0aW9uKVxuICAgICAgfSk7XG4gICAgaWYgKCFjb21taXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmV2ZXJ0UmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXZlcnRSZXN1bHQgPSBhd2FpdCByZXBvLnJldmVydEJ1bGtPcGVyYXRpb25Db21taXQoY29tbWl0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShcbiAgICAgICAgdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWxrT3BlcmF0aW9uLnJldmVydEZhaWxlZCwgeyBlcnJvcjogZXJyb3JUb1N0cmluZyhlcnJvciksIG9wZXJhdGlvbklkOiBjb21taXQub3BlcmF0aW9uSWQgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHJldmVydFJlc3VsdC5pc0NvbmZsaWN0KSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZXZlcnRDb25mbGljdCwgeyBvcGVyYXRpb25JZDogY29tbWl0Lm9wZXJhdGlvbklkIH0pLCB7XG4gICAgICAgIGlzUGVybWFuZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZXZlcnRlZCwgeyBvcGVyYXRpb25JZDogY29tbWl0Lm9wZXJhdGlvbklkIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZFJlcG8oKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uR2l0UmVwbyB8IG51bGw+IHtcbiAgICBpZiAoIVBsYXRmb3JtLmlzRGVza3RvcEFwcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgIGlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtQWRhcHRlcikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBDb25kaXRpb25hbCBpbXBvcnQgb2YgdGhlIGRlc2t0b3Atb25seSBnaXQgbGF5ZXI7IHRoaXMgcnVucyBvbmx5IG9uIGRlc2t0b3AsIGtlZXBpbmcgaXRzIE5vZGUgYnVpbHRpbnMgb2ZmXG4gICAgLy8gdGhlIG1vYmlsZSBsb2FkIHBhdGguXG4gICAgY29uc3QgeyBCdWxrT3BlcmF0aW9uR2l0UmVwbzogR2l0UmVwbyB9ID0gYXdhaXQgaW1wb3J0KCcuLi9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cycpO1xuICAgIHJldHVybiBhd2FpdCBHaXRSZXBvLm9wZW4oYWRhcHRlci5nZXRCYXNlUGF0aCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UmVwbygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVwb1Byb21pc2UgPz89IHRoaXMuZmluZFJlcG8oKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXBvUHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlclN0YWxlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXBvID0gYXdhaXQgdGhpcy5nZXRSZXBvKCk7XG4gICAgaWYgKCFyZXBvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgcmVwby5yZWNvdmVyU3RhbGVMb2NrKCk7XG4gICAgaWYgKG9wZXJhdGlvbklkICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVsa09wZXJhdGlvbi5yZWNvdmVyZWRJbnRlcnJ1cHRlZCwgeyBvcGVyYXRpb25JZCB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR0bGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmx1c2hRdWV1ZSgpO1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXModGhpcy5hcHApO1xuICAgIGF3YWl0IGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeSh0aGlzLmFwcCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yUXVpZXRWYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yUXVpZXRWYXVsdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdENoYW5nZUF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBsYXN0Q2hhbmdlQXQgKyB0aGlzLm1heFNldHRsZVRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICBmdW5jdGlvbiBvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICAgIGxhc3RDaGFuZ2VBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH1cbiAgICBjb25zdCBldmVudFJlZnM6IEV2ZW50UmVmW10gPSBbXG4gICAgICB0aGlzLmFwcC52YXVsdC5vbignY3JlYXRlJywgb25DaGFuZ2UpLFxuICAgICAgdGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIG9uQ2hhbmdlKSxcbiAgICAgIHRoaXMuYXBwLnZhdWx0Lm9uKCdtb2RpZnknLCBvbkNoYW5nZSksXG4gICAgICB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgb25DaGFuZ2UpXG4gICAgXTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgY29uc3QgcXVpZXRSZW1haW5pbmcgPSBsYXN0Q2hhbmdlQXQgKyB0aGlzLnF1aWV0UGVyaW9kSW5NaWxsaXNlY29uZHMgLSBub3c7XG4gICAgICAgIGlmIChxdWlldFJlbWFpbmluZyA8PSAwIHx8IG5vdyA+PSBkZWFkbGluZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dEFzeW5jKE1hdGgubWluKHF1aWV0UmVtYWluaW5nLCBkZWFkbGluZSAtIG5vdykpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50UmVmIG9mIGV2ZW50UmVmcykge1xuICAgICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRDb21taXQoY29tbWl0OiBCdWxrT3BlcmF0aW9uQ29tbWl0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2NvbW1pdC5zdWJqZWN0fSAoJHtjb21taXQuZGF0ZX0sICR7Y29tbWl0LnNoYS5zbGljZSgwLCBTSE9SVF9TSEFfTEVOR1RIKX0pYDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQSxtQkFHTztBQUNQLG1CQUE4QjtBQUM5Qix5QkFBa0M7QUFDbEMsc0JBR087QUFNUCxxQ0FBNEM7QUFDNUMsbUJBQXVDO0FBQ3ZDLDBCQUEwQztBQUMxQyxrQkFBa0I7QUFDbEIsNEJBQXlDO0FBQ3pDLHlCQUEyQjtBQUMzQixtQkFBMkI7QUFDM0IsMEJBQTRCO0FBNkQ1QixNQUFNLDBDQUEwQztBQUNoRCxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQStCbEIsTUFBTSxxQ0FBcUMsZ0NBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl6QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBLEVBRUY7QUFBQSxFQUNBO0FBQUEsRUFDVCxjQUEyRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU81RCxZQUFZLFFBQXVEO0FBQ3hFLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixT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