@mnaoumov/obsidian-lib 10.5.0 → 10.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +6 -0
  2. package/codemirror/inline-token-widgets/package.json +6 -0
  3. package/codemirror/settings-facet/package.json +6 -0
  4. package/components/settings-facet-component/package.json +6 -0
  5. package/dist/lib/cjs/__merged.cjs +104 -1
  6. package/dist/lib/cjs/__merged.d.cts +20 -3
  7. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  8. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  9. package/dist/lib/cjs/backlink-index.cjs +44 -8
  10. package/dist/lib/cjs/backlink-index.d.cts +23 -0
  11. package/dist/lib/cjs/bug-report.cjs +4 -2
  12. package/dist/lib/cjs/bug-report.d.cts +1 -1
  13. package/dist/lib/cjs/bulk-operation-progress.cjs +16 -1
  14. package/dist/lib/cjs/bulk-operation-progress.d.cts +22 -0
  15. package/dist/lib/cjs/case-insensitive-file-index.cjs +9 -1
  16. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  17. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  18. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  19. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  20. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  21. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  22. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  23. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  24. package/dist/lib/cjs/community-plugins.cjs +19 -2
  25. package/dist/lib/cjs/community-plugins.d.cts +14 -0
  26. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +5 -2
  27. package/dist/lib/cjs/components/index.cjs +4 -1
  28. package/dist/lib/cjs/components/index.d.cts +1 -0
  29. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +105 -2
  30. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  31. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  32. package/dist/lib/cjs/css-class.cjs +8 -1
  33. package/dist/lib/cjs/css-class.d.cts +28 -0
  34. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +38 -13
  35. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +21 -1
  36. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  37. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  38. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  39. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  40. package/dist/lib/cjs/editor-suggest.cjs +198 -0
  41. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  42. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  43. package/dist/lib/cjs/hotkey.cjs +185 -0
  44. package/dist/lib/cjs/hotkey.d.cts +59 -0
  45. package/dist/lib/cjs/i18n/locales/en.cjs +14 -1
  46. package/dist/lib/cjs/i18n/locales/en.d.cts +13 -0
  47. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +13 -0
  48. package/dist/lib/cjs/index.cjs +31 -1
  49. package/dist/lib/cjs/index.d.cts +10 -0
  50. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  51. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  52. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  53. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  54. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  55. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  56. package/dist/lib/cjs/markdown.cjs +6 -1
  57. package/dist/lib/cjs/markdown.d.cts +10 -1
  58. package/dist/lib/cjs/modals/modal.cjs +8 -5
  59. package/dist/lib/cjs/modals/modal.d.cts +4 -0
  60. package/dist/lib/cjs/plugin/plugin.cjs +5 -2
  61. package/dist/lib/cjs/plugin/plugin.d.cts +2 -0
  62. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  63. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  64. package/dist/lib/cjs/request-url.cjs +523 -0
  65. package/dist/lib/cjs/request-url.d.cts +233 -0
  66. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  67. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  68. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  69. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  70. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  71. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  72. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  73. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  74. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  75. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  76. package/dist/lib/cjs/setting-ex.cjs +51 -1
  77. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  78. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  79. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  80. package/dist/lib/esm/__merged.d.mts +20 -3
  81. package/dist/lib/esm/__merged.mjs +110 -2
  82. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  83. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  84. package/dist/lib/esm/backlink-index.d.mts +23 -0
  85. package/dist/lib/esm/backlink-index.mjs +42 -7
  86. package/dist/lib/esm/bug-report.d.mts +1 -1
  87. package/dist/lib/esm/bug-report.mjs +4 -2
  88. package/dist/lib/esm/bulk-operation-progress.d.mts +22 -0
  89. package/dist/lib/esm/bulk-operation-progress.mjs +14 -1
  90. package/dist/lib/esm/case-insensitive-file-index.mjs +9 -1
  91. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  92. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  93. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  94. package/dist/lib/esm/codemirror/index.mjs +5 -1
  95. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  96. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  97. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  98. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  99. package/dist/lib/esm/community-plugins.d.mts +14 -0
  100. package/dist/lib/esm/community-plugins.mjs +18 -2
  101. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +5 -2
  102. package/dist/lib/esm/components/index.d.mts +1 -0
  103. package/dist/lib/esm/components/index.mjs +3 -1
  104. package/dist/lib/esm/components/rename-delete-handler-component.mjs +105 -2
  105. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  106. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  107. package/dist/lib/esm/css-class.d.mts +28 -0
  108. package/dist/lib/esm/css-class.mjs +8 -1
  109. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +21 -1
  110. package/dist/lib/esm/desktop-bulk-operation-git.mjs +38 -13
  111. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  112. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  113. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  114. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  115. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  116. package/dist/lib/esm/editor-suggest.mjs +109 -0
  117. package/dist/lib/esm/generated-during-build.mjs +2 -2
  118. package/dist/lib/esm/hotkey.d.mts +59 -0
  119. package/dist/lib/esm/hotkey.mjs +95 -0
  120. package/dist/lib/esm/i18n/locales/en.d.mts +13 -0
  121. package/dist/lib/esm/i18n/locales/en.mjs +14 -1
  122. package/dist/lib/esm/i18n/locales/translations-map.d.mts +13 -0
  123. package/dist/lib/esm/index.d.mts +10 -0
  124. package/dist/lib/esm/index.mjs +21 -1
  125. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  126. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  127. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  128. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  129. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  130. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  131. package/dist/lib/esm/markdown.d.mts +10 -1
  132. package/dist/lib/esm/markdown.mjs +9 -1
  133. package/dist/lib/esm/modals/modal.d.mts +4 -0
  134. package/dist/lib/esm/modals/modal.mjs +8 -5
  135. package/dist/lib/esm/plugin/plugin.d.mts +2 -0
  136. package/dist/lib/esm/plugin/plugin.mjs +5 -2
  137. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  138. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  139. package/dist/lib/esm/request-url.d.mts +233 -0
  140. package/dist/lib/esm/request-url.mjs +428 -0
  141. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  142. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  143. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  144. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  145. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  146. package/dist/lib/esm/setting-components/index.mjs +9 -1
  147. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  148. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  149. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  150. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  151. package/dist/lib/esm/setting-ex.d.mts +35 -1
  152. package/dist/lib/esm/setting-ex.mjs +51 -1
  153. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  154. package/dist/lib/esm/settings-tabs.mjs +170 -0
  155. package/dist/styles.css +83 -1
  156. package/package.json +3 -3
  157. package/setting-components/folder-list-component/package.json +6 -0
  158. package/setting-components/hotkey-component/package.json +6 -0
  159. package/setting-components/list-component/package.json +6 -0
  160. package/setting-components/tag-list-component/package.json +6 -0
@@ -0,0 +1,167 @@
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 () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import {
34
+ Decoration,
35
+ ViewPlugin,
36
+ WidgetType
37
+ } from "@codemirror/view";
38
+ import { castTo } from "@mnaoumov/typescript-lib/object-utils";
39
+ import {
40
+ editorInfoField,
41
+ editorLivePreviewField
42
+ } from "obsidian";
43
+ import { CssClass } from "../css-class.mjs";
44
+ const editorInfoStateField = castTo(editorInfoField);
45
+ const editorLivePreviewStateField = castTo(editorLivePreviewField);
46
+ class InlineTokenWidget extends WidgetType {
47
+ configVersion;
48
+ match;
49
+ render;
50
+ sourcePath;
51
+ state;
52
+ constructor(params) {
53
+ super();
54
+ this.configVersion = params.configVersion;
55
+ this.match = params.match;
56
+ this.render = params.render;
57
+ this.sourcePath = params.sourcePath;
58
+ this.state = params.state;
59
+ }
60
+ eq(other) {
61
+ return other instanceof InlineTokenWidget && other.configVersion === this.configVersion && other.render === this.render && other.sourcePath === this.sourcePath && areMatchesEqual(other.match, this.match);
62
+ }
63
+ toDOM(view) {
64
+ const containerEl = view.dom.ownerDocument.win.createSpan();
65
+ containerEl.classList.add(CssClass.LibraryName, CssClass.InlineToken);
66
+ this.render({
67
+ containerEl,
68
+ match: this.match,
69
+ sourcePath: this.sourcePath,
70
+ state: this.state
71
+ });
72
+ return containerEl;
73
+ }
74
+ }
75
+ function createInlineTokenWidgetsExtension(params) {
76
+ const regExp = toGlobalRegExp(params.regExp);
77
+ const shouldRevealOnSelection = params.shouldRevealOnSelection ?? true;
78
+ class InlineTokenWidgetsPluginValue {
79
+ decorations;
80
+ configVersion = 0;
81
+ /**
82
+ * Builds the decorations of a new editor.
83
+ *
84
+ * @param view - The editor view.
85
+ */
86
+ constructor(view) {
87
+ this.decorations = this.buildDecorations(view);
88
+ }
89
+ /**
90
+ * Rebuilds the decorations when what they depend on changed.
91
+ *
92
+ * @param update - The view update.
93
+ */
94
+ update(update) {
95
+ const isReconfigured = update.transactions.some((transaction) => transaction.reconfigured);
96
+ if (isReconfigured) {
97
+ this.configVersion++;
98
+ }
99
+ if (update.docChanged || update.viewportChanged || update.selectionSet || isReconfigured || isLivePreview(update.startState) !== isLivePreview(update.state)) {
100
+ this.decorations = this.buildDecorations(update.view);
101
+ }
102
+ }
103
+ buildDecorations(view) {
104
+ const state = view.state;
105
+ if (!isLivePreview(state)) {
106
+ return Decoration.none;
107
+ }
108
+ const sourcePath = state.field(editorInfoStateField, false)?.file?.path ?? "";
109
+ const ranges = [];
110
+ let lastLineNumber = 0;
111
+ for (const visibleRange of view.visibleRanges) {
112
+ const firstLineNumber = Math.max(state.doc.lineAt(visibleRange.from).number, lastLineNumber + 1);
113
+ const endLineNumber = state.doc.lineAt(visibleRange.to).number;
114
+ for (let lineNumber = firstLineNumber; lineNumber <= endLineNumber; lineNumber++) {
115
+ const line = state.doc.line(lineNumber);
116
+ for (const match of execAll(regExp, line.text)) {
117
+ const from = line.from + match.index;
118
+ const to = from + match[0].length;
119
+ if (shouldRevealOnSelection && state.selection.ranges.some((range) => range.from <= to && range.to >= from)) {
120
+ continue;
121
+ }
122
+ if (params.shouldDecorate && !params.shouldDecorate({ from, match, state, to })) {
123
+ continue;
124
+ }
125
+ ranges.push(
126
+ Decoration.replace({
127
+ widget: new InlineTokenWidget({ configVersion: this.configVersion, match, render: params.render, sourcePath, state })
128
+ }).range(from, to)
129
+ );
130
+ }
131
+ }
132
+ lastLineNumber = endLineNumber;
133
+ }
134
+ return Decoration.set(ranges);
135
+ }
136
+ }
137
+ return ViewPlugin.fromClass(InlineTokenWidgetsPluginValue, {
138
+ decorations: (value) => value.decorations
139
+ });
140
+ }
141
+ function execAll(regExp, text) {
142
+ const matches = [];
143
+ regExp.lastIndex = 0;
144
+ for (let match = regExp.exec(text); match !== null; match = regExp.exec(text)) {
145
+ if (match[0] === "") {
146
+ regExp.lastIndex++;
147
+ continue;
148
+ }
149
+ matches.push(match);
150
+ }
151
+ return matches;
152
+ }
153
+ function toGlobalRegExp(regExp) {
154
+ return new RegExp(regExp.source, regExp.global ? regExp.flags : `${regExp.flags}g`);
155
+ }
156
+ function areMatchesEqual(a, b) {
157
+ return a.length === b.length && a.every((value, index) => value === b[index]);
158
+ }
159
+ function isLivePreview(state) {
160
+ return state.field(editorLivePreviewStateField, false) ?? true;
161
+ }
162
+ export {
163
+ createInlineTokenWidgetsExtension,
164
+ execAll,
165
+ toGlobalRegExp
166
+ };
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb2RlbWlycm9yL2lubGluZS10b2tlbi13aWRnZXRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDcmVhdGVzIGFuIGVkaXRvciBleHRlbnNpb24gdGhhdCByZXBsYWNlcyBldmVyeSBtYXRjaCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgd2lkZ2V0IGluIExpdmUgUHJldmlldywgYW5kXG4gKiBzaG93cyB0aGUgc291cmNlIGFnYWluIHdoaWxlIGEgc2VsZWN0aW9uIHRvdWNoZXMgaXQsIHRoZSB3YXkgT2JzaWRpYW4gdHJlYXRzIGl0cyBvd24gbGlua3MgYW5kIGZvcm1hdHRpbmcuXG4gKlxuICogT25seSB0aGUgdmlzaWJsZSByYW5nZXMgYXJlIG1hdGNoZWQsIGxpbmUgYnkgbGluZSwgc28gYSB0b2tlbiBuZXZlciBzcGFucyB0d28gbGluZXMuIFRoZSBkZWNvcmF0aW9ucyBhcmUgcmVidWlsdFxuICogd2hlbiB0aGUgZG9jdW1lbnQsIHRoZSB2aWV3cG9ydCwgdGhlIHNlbGVjdGlvbiwgdGhlIExpdmUgUHJldmlldyBtb2RlIG9yIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXM7IGFcbiAqIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGlzIHdoYXQgYSBgU2V0dGluZ3NGYWNldENvbXBvbmVudGAgZGlzcGF0Y2hlcywgc28gYSByZW5kZXIgdGhhdCByZWFkcyBhIHNldHRpbmdzIGZhY2V0XG4gKiByZS1ydW5zIHdoZW4gdGhlIHNldHRpbmdzIGRvLlxuICpcbiAqIE91dHNpZGUgYW4gT2JzaWRpYW4gTWFya2Rvd24gZWRpdG9yIHRoZXJlIGlzIG5vIGBlZGl0b3JMaXZlUHJldmlld0ZpZWxkYCwgYW5kIHRoZSB3aWRnZXRzIGFyZSBzaG93bi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEVkaXRvclN0YXRlLFxuICBFeHRlbnNpb24sXG4gIFJhbmdlLFxuICBTdGF0ZUZpZWxkXG59IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB0eXBlIHtcbiAgRGVjb3JhdGlvblNldCxcbiAgRWRpdG9yVmlldyxcbiAgUGx1Z2luVmFsdWUsXG4gIFZpZXdVcGRhdGVcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtkb3duRmlsZUluZm8gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIERlY29yYXRpb24sXG4gIFZpZXdQbHVnaW4sXG4gIFdpZGdldFR5cGVcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBjYXN0VG8gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7XG4gIGVkaXRvckluZm9GaWVsZCxcbiAgZWRpdG9yTGl2ZVByZXZpZXdGaWVsZFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcblxuLy8gT2JzaWRpYW4uZC50cyByZWFjaGVzIEBjb2RlbWlycm9yL3N0YXRlIHRocm91Z2ggaXRzIENvbW1vbkpTIGRlY2xhcmF0aW9ucyBhbmQgdGhpcyBtb2R1bGUgdGhyb3VnaCB0aGUgRVMgb25lcywgYW5kXG4vLyBTdGF0ZUZpZWxkIGhhcyBwcml2YXRlIG1lbWJlcnMsIHNvIHRoZSB0d28gZGVjbGFyYXRpb25zIG9mIG9uZSBydW50aW1lIGNsYXNzIGRvIG5vdCB0eXBlLWNoZWNrIGFnYWluc3QgZWFjaCBvdGhlci5cbmNvbnN0IGVkaXRvckluZm9TdGF0ZUZpZWxkID0gY2FzdFRvPFN0YXRlRmllbGQ8TWFya2Rvd25GaWxlSW5mbz4+KGVkaXRvckluZm9GaWVsZCk7XG5jb25zdCBlZGl0b3JMaXZlUHJldmlld1N0YXRlRmllbGQgPSBjYXN0VG88U3RhdGVGaWVsZDxib29sZWFuPj4oZWRpdG9yTGl2ZVByZXZpZXdGaWVsZCk7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUlubGluZVRva2VuV2lkZ2V0c0V4dGVuc2lvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSW5saW5lVG9rZW5XaWRnZXRzRXh0ZW5zaW9uUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYSB0b2tlbiBtYXRjaGVzLiBUaGUgYGdgIGZsYWcgaXMgYWRkZWQgd2hlbiBtaXNzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnRXhwOiBSZWdFeHA7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSB0b2tlbiBpbnRvIHRoZSB3aWRnZXQncyBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyOiBJbmxpbmVUb2tlblJlbmRlckZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBtYXRjaCBiZWNvbWVzIGEgd2lkZ2V0LCBzdWNoIGFzIHRvIHNraXAgYSBtYXRjaCBpbnNpZGUgY29kZS4gRXZlcnkgbWF0Y2ggZG9lcyBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGVjb3JhdGU/OiAocGFyYW1zOiBJbmxpbmVUb2tlblNob3VsZERlY29yYXRlUGFyYW1zKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdG9rZW4gc2hvd3MgaXRzIHNvdXJjZSB3aGlsZSBhIHNlbGVjdGlvbiwgdGhlIGN1cnNvciBpbmNsdWRlZCwgdG91Y2hlcyBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXZlYWxPblNlbGVjdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBpbmxpbmUgdG9rZW4gaW50byBpdHMgY29udGFpbmVyIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSByZW5kZXIgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgSW5saW5lVG9rZW5SZW5kZXJGdW5jdGlvbiA9IChwYXJhbXM6IElubGluZVRva2VuUmVuZGVyUGFyYW1zKSA9PiB2b2lkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgaGFuZGVkIHRvIGFuIGlubGluZSB0b2tlbiByZW5kZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lVG9rZW5SZW5kZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gcmVuZGVyIHRoZSB0b2tlbiBpbnRvLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF0Y2ggb2YgdGhlIHRva2VuJ3MgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIG5vdGUgdGhlIHRva2VuIGlzIGluLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdCBpcyBub3Qga25vd24uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlZGl0b3Igc3RhdGUsIHdoZW4gdGhlIHRva2VuIHJlbmRlcnMgaW4gYW4gZWRpdG9yLiBBYnNlbnQgaW4gUmVhZGluZyB2aWV3LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU/OiBFZGl0b3JTdGF0ZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGhhbmRlZCB0byB7QGxpbmsgQ3JlYXRlSW5saW5lVG9rZW5XaWRnZXRzRXh0ZW5zaW9uUGFyYW1zLnNob3VsZERlY29yYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVUb2tlblNob3VsZERlY29yYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkb2N1bWVudCBwb3NpdGlvbiB0aGUgbWF0Y2ggc3RhcnRzIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF0Y2ggb2YgdGhlIHRva2VuJ3MgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheTtcblxuICAvKipcbiAgICogVGhlIGVkaXRvciBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlOiBFZGl0b3JTdGF0ZTtcblxuICAvKipcbiAgICogVGhlIGRvY3VtZW50IHBvc2l0aW9uIHRoZSBtYXRjaCBlbmRzIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgdG86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElubGluZVRva2VuV2lkZ2V0UGFyYW1zIHtcbiAgcmVhZG9ubHkgY29uZmlnVmVyc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBtYXRjaDogUmVnRXhwRXhlY0FycmF5O1xuICByZWFkb25seSByZW5kZXI6IElubGluZVRva2VuUmVuZGVyRnVuY3Rpb247XG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhdGU6IEVkaXRvclN0YXRlO1xufVxuXG5jbGFzcyBJbmxpbmVUb2tlbldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1ZlcnNpb246IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXRjaDogUmVnRXhwRXhlY0FycmF5O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcjogSW5saW5lVG9rZW5SZW5kZXJGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGU6IEVkaXRvclN0YXRlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IElubGluZVRva2VuV2lkZ2V0UGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZ1ZlcnNpb24gPSBwYXJhbXMuY29uZmlnVmVyc2lvbjtcbiAgICB0aGlzLm1hdGNoID0gcGFyYW1zLm1hdGNoO1xuICAgIHRoaXMucmVuZGVyID0gcGFyYW1zLnJlbmRlcjtcbiAgICB0aGlzLnNvdXJjZVBhdGggPSBwYXJhbXMuc291cmNlUGF0aDtcbiAgICB0aGlzLnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGVxKG90aGVyOiBXaWRnZXRUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgSW5saW5lVG9rZW5XaWRnZXRcbiAgICAgICYmIG90aGVyLmNvbmZpZ1ZlcnNpb24gPT09IHRoaXMuY29uZmlnVmVyc2lvblxuICAgICAgJiYgb3RoZXIucmVuZGVyID09PSB0aGlzLnJlbmRlclxuICAgICAgJiYgb3RoZXIuc291cmNlUGF0aCA9PT0gdGhpcy5zb3VyY2VQYXRoXG4gICAgICAmJiBhcmVNYXRjaGVzRXF1YWwob3RoZXIubWF0Y2gsIHRoaXMubWF0Y2gpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHRvRE9NKHZpZXc6IEVkaXRvclZpZXcpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50Lndpbi5jcmVhdGVTcGFuKCk7XG4gICAgY29udGFpbmVyRWwuY2xhc3NMaXN0LmFkZChDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuSW5saW5lVG9rZW4pO1xuICAgIHRoaXMucmVuZGVyKHtcbiAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgbWF0Y2g6IHRoaXMubWF0Y2gsXG4gICAgICBzb3VyY2VQYXRoOiB0aGlzLnNvdXJjZVBhdGgsXG4gICAgICBzdGF0ZTogdGhpcy5zdGF0ZVxuICAgIH0pO1xuICAgIHJldHVybiBjb250YWluZXJFbDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZWRpdG9yIGV4dGVuc2lvbiB0aGF0IHJlcGxhY2VzIGV2ZXJ5IG1hdGNoIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggYSB3aWRnZXQgaW4gTGl2ZSBQcmV2aWV3LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXh0ZW5zaW9uIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgZWRpdG9yIGV4dGVuc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlubGluZVRva2VuV2lkZ2V0c0V4dGVuc2lvbihwYXJhbXM6IENyZWF0ZUlubGluZVRva2VuV2lkZ2V0c0V4dGVuc2lvblBhcmFtcyk6IEV4dGVuc2lvbiB7XG4gIGNvbnN0IHJlZ0V4cCA9IHRvR2xvYmFsUmVnRXhwKHBhcmFtcy5yZWdFeHApO1xuICBjb25zdCBzaG91bGRSZXZlYWxPblNlbGVjdGlvbiA9IHBhcmFtcy5zaG91bGRSZXZlYWxPblNlbGVjdGlvbiA/PyB0cnVlO1xuXG4gIGNsYXNzIElubGluZVRva2VuV2lkZ2V0c1BsdWdpblZhbHVlIGltcGxlbWVudHMgUGx1Z2luVmFsdWUge1xuICAgIHB1YmxpYyBkZWNvcmF0aW9uczogRGVjb3JhdGlvblNldDtcbiAgICBwcml2YXRlIGNvbmZpZ1ZlcnNpb24gPSAwO1xuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBkZWNvcmF0aW9ucyBvZiBhIG5ldyBlZGl0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlldyAtIFRoZSBlZGl0b3Igdmlldy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IodmlldzogRWRpdG9yVmlldykge1xuICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvcmF0aW9ucyh2aWV3KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWJ1aWxkcyB0aGUgZGVjb3JhdGlvbnMgd2hlbiB3aGF0IHRoZXkgZGVwZW5kIG9uIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXBkYXRlIC0gVGhlIHZpZXcgdXBkYXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlKTogdm9pZCB7XG4gICAgICBjb25zdCBpc1JlY29uZmlndXJlZCA9IHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSgodHJhbnNhY3Rpb24pID0+IHRyYW5zYWN0aW9uLnJlY29uZmlndXJlZCk7XG4gICAgICBpZiAoaXNSZWNvbmZpZ3VyZWQpIHtcbiAgICAgICAgdGhpcy5jb25maWdWZXJzaW9uKys7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHVwZGF0ZS5kb2NDaGFuZ2VkXG4gICAgICAgIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWRcbiAgICAgICAgfHwgdXBkYXRlLnNlbGVjdGlvblNldFxuICAgICAgICB8fCBpc1JlY29uZmlndXJlZFxuICAgICAgICB8fCBpc0xpdmVQcmV2aWV3KHVwZGF0ZS5zdGFydFN0YXRlKSAhPT0gaXNMaXZlUHJldmlldyh1cGRhdGUuc3RhdGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvcmF0aW9ucyh1cGRhdGUudmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZERlY29yYXRpb25zKHZpZXc6IEVkaXRvclZpZXcpOiBEZWNvcmF0aW9uU2V0IHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdmlldy5zdGF0ZTtcbiAgICAgIGlmICghaXNMaXZlUHJldmlldyhzdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHN0YXRlLmZpZWxkKGVkaXRvckluZm9TdGF0ZUZpZWxkLCBmYWxzZSk/LmZpbGU/LnBhdGggPz8gJyc7XG4gICAgICBjb25zdCByYW5nZXM6IFJhbmdlPERlY29yYXRpb24+W10gPSBbXTtcbiAgICAgIGxldCBsYXN0TGluZU51bWJlciA9IDA7XG5cbiAgICAgIGZvciAoY29uc3QgdmlzaWJsZVJhbmdlIG9mIHZpZXcudmlzaWJsZVJhbmdlcykge1xuICAgICAgICBjb25zdCBmaXJzdExpbmVOdW1iZXIgPSBNYXRoLm1heChzdGF0ZS5kb2MubGluZUF0KHZpc2libGVSYW5nZS5mcm9tKS5udW1iZXIsIGxhc3RMaW5lTnVtYmVyICsgMSk7XG4gICAgICAgIGNvbnN0IGVuZExpbmVOdW1iZXIgPSBzdGF0ZS5kb2MubGluZUF0KHZpc2libGVSYW5nZS50bykubnVtYmVyO1xuICAgICAgICBmb3IgKGxldCBsaW5lTnVtYmVyID0gZmlyc3RMaW5lTnVtYmVyOyBsaW5lTnVtYmVyIDw9IGVuZExpbmVOdW1iZXI7IGxpbmVOdW1iZXIrKykge1xuICAgICAgICAgIGNvbnN0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShsaW5lTnVtYmVyKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGV4ZWNBbGwocmVnRXhwLCBsaW5lLnRleHQpKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tID0gbGluZS5mcm9tICsgbWF0Y2guaW5kZXg7XG4gICAgICAgICAgICBjb25zdCB0byA9IGZyb20gKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmV2ZWFsT25TZWxlY3Rpb24gJiYgc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5zb21lKChyYW5nZSkgPT4gcmFuZ2UuZnJvbSA8PSB0byAmJiByYW5nZS50byA+PSBmcm9tKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJhbXMuc2hvdWxkRGVjb3JhdGUgJiYgIXBhcmFtcy5zaG91bGREZWNvcmF0ZSh7IGZyb20sIG1hdGNoLCBzdGF0ZSwgdG8gfSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBJbmxpbmVUb2tlbldpZGdldCh7IGNvbmZpZ1ZlcnNpb246IHRoaXMuY29uZmlnVmVyc2lvbiwgbWF0Y2gsIHJlbmRlcjogcGFyYW1zLnJlbmRlciwgc291cmNlUGF0aCwgc3RhdGUgfSlcbiAgICAgICAgICAgICAgfSkucmFuZ2UoZnJvbSwgdG8pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsYXN0TGluZU51bWJlciA9IGVuZExpbmVOdW1iZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChyYW5nZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBWaWV3UGx1Z2luLmZyb21DbGFzcyhJbmxpbmVUb2tlbldpZGdldHNQbHVnaW5WYWx1ZSwge1xuICAgIGRlY29yYXRpb25zOiAodmFsdWUpID0+IHZhbHVlLmRlY29yYXRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IG5vbi1lbXB0eSBtYXRjaCBvZiBhIGdsb2JhbCByZWd1bGFyIGV4cHJlc3Npb24gaW4gYSB0ZXh0LlxuICpcbiAqIEBwYXJhbSByZWdFeHAgLSBUaGUgZ2xvYmFsIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyBUaGUgbWF0Y2hlcywgaW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjQWxsKHJlZ0V4cDogUmVnRXhwLCB0ZXh0OiBzdHJpbmcpOiBSZWdFeHBFeGVjQXJyYXlbXSB7XG4gIGNvbnN0IG1hdGNoZXM6IFJlZ0V4cEV4ZWNBcnJheVtdID0gW107XG4gIHJlZ0V4cC5sYXN0SW5kZXggPSAwO1xuICBmb3IgKGxldCBtYXRjaCA9IHJlZ0V4cC5leGVjKHRleHQpOyBtYXRjaCAhPT0gbnVsbDsgbWF0Y2ggPSByZWdFeHAuZXhlYyh0ZXh0KSkge1xuICAgIGlmIChtYXRjaFswXSA9PT0gJycpIHtcbiAgICAgIHJlZ0V4cC5sYXN0SW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuXG4vKipcbiAqIENvcGllcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIHRoZSBgZ2AgZmxhZyBzZXQsIHNvIG1hdGNoaW5nIG5ldmVyIG1vdmVzIHRoZSBjYWxsZXIncyBgbGFzdEluZGV4YC5cbiAqXG4gKiBAcGFyYW0gcmVnRXhwIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIEEgZ2xvYmFsIGNvcHkgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvR2xvYmFsUmVnRXhwKHJlZ0V4cDogUmVnRXhwKTogUmVnRXhwIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAocmVnRXhwLnNvdXJjZSwgcmVnRXhwLmdsb2JhbCA/IHJlZ0V4cC5mbGFncyA6IGAke3JlZ0V4cC5mbGFnc31nYCk7XG59XG5cbmZ1bmN0aW9uIGFyZU1hdGNoZXNFcXVhbChhOiBSZWdFeHBFeGVjQXJyYXksIGI6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IGJbaW5kZXhdKTtcbn1cblxuZnVuY3Rpb24gaXNMaXZlUHJldmlldyhzdGF0ZTogRWRpdG9yU3RhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0YXRlLmZpZWxkKGVkaXRvckxpdmVQcmV2aWV3U3RhdGVGaWVsZCwgZmFsc2UpID8/IHRydWU7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsZ0JBQWdCO0FBSXpCLE1BQU0sdUJBQXVCLE9BQXFDLGVBQWU7QUFDakYsTUFBTSw4QkFBOEIsT0FBNEIsc0JBQXNCO0FBOEZ0RixNQUFNLDBCQUEwQixXQUFXO0FBQUEsRUFDeEI7QUFBQSxFQUNBO0FB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
@@ -0,0 +1,19 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Creates a CodeMirror {@link Facet} that carries a plugin's settings into its editor extensions.
6
+ *
7
+ * An extension reads the settings with `state.facet(settingsFacet)` instead of closing over a settings object, so a
8
+ * change reaches every editor as an ordinary reconfigure: `SettingsFacetComponent` swaps `settingsFacet.of(settings)`
9
+ * in a compartment, and every view plugin and state field sees the new value in the same update.
10
+ */
11
+ import { Facet } from '@codemirror/state';
12
+ /**
13
+ * Creates a facet whose value is the last settings value provided, or the default when none is.
14
+ *
15
+ * @typeParam T - The settings type.
16
+ * @param defaultValue - The value an editor reads when no settings are provided.
17
+ * @returns The settings facet.
18
+ */
19
+ export declare function createSettingsFacet<T>(defaultValue: T): Facet<T, T>;
@@ -0,0 +1,44 @@
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 () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { Facet } from "@codemirror/state";
34
+ function createSettingsFacet(defaultValue) {
35
+ return Facet.define({
36
+ combine(values) {
37
+ return values.length === 0 ? defaultValue : values.at(-1);
38
+ }
39
+ });
40
+ }
41
+ export {
42
+ createSettingsFacet
43
+ };
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb2RlbWlycm9yL3NldHRpbmdzLWZhY2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDcmVhdGVzIGEgQ29kZU1pcnJvciB7QGxpbmsgRmFjZXR9IHRoYXQgY2FycmllcyBhIHBsdWdpbidzIHNldHRpbmdzIGludG8gaXRzIGVkaXRvciBleHRlbnNpb25zLlxuICpcbiAqIEFuIGV4dGVuc2lvbiByZWFkcyB0aGUgc2V0dGluZ3Mgd2l0aCBgc3RhdGUuZmFjZXQoc2V0dGluZ3NGYWNldClgIGluc3RlYWQgb2YgY2xvc2luZyBvdmVyIGEgc2V0dGluZ3Mgb2JqZWN0LCBzbyBhXG4gKiBjaGFuZ2UgcmVhY2hlcyBldmVyeSBlZGl0b3IgYXMgYW4gb3JkaW5hcnkgcmVjb25maWd1cmU6IGBTZXR0aW5nc0ZhY2V0Q29tcG9uZW50YCBzd2FwcyBgc2V0dGluZ3NGYWNldC5vZihzZXR0aW5ncylgXG4gKiBpbiBhIGNvbXBhcnRtZW50LCBhbmQgZXZlcnkgdmlldyBwbHVnaW4gYW5kIHN0YXRlIGZpZWxkIHNlZXMgdGhlIG5ldyB2YWx1ZSBpbiB0aGUgc2FtZSB1cGRhdGUuXG4gKi9cblxuaW1wb3J0IHsgRmFjZXQgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZhY2V0IHdob3NlIHZhbHVlIGlzIHRoZSBsYXN0IHNldHRpbmdzIHZhbHVlIHByb3ZpZGVkLCBvciB0aGUgZGVmYXVsdCB3aGVuIG5vbmUgaXMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHNldHRpbmdzIHR5cGUuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gVGhlIHZhbHVlIGFuIGVkaXRvciByZWFkcyB3aGVuIG5vIHNldHRpbmdzIGFyZSBwcm92aWRlZC5cbiAqIEByZXR1cm5zIFRoZSBzZXR0aW5ncyBmYWNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldHRpbmdzRmFjZXQ8VD4oZGVmYXVsdFZhbHVlOiBUKTogRmFjZXQ8VCwgVD4ge1xuICByZXR1cm4gRmFjZXQuZGVmaW5lPFQsIFQ+KHtcbiAgICBjb21iaW5lKHZhbHVlcykge1xuICAgICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPT09IDAgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZXMuYXQoLTEpIGFzIFQ7XG4gICAgfVxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLGFBQWE7QUFTZixTQUFTLG9CQUF1QixjQUE4QjtBQUNuRSxTQUFPLE1BQU0sT0FBYTtBQUFBLElBQ3hCLFFBQVEsUUFBUTtBQUNkLGFBQU8sT0FBTyxXQUFXLElBQUksZUFBZSxPQUFPLEdBQUcsRUFBRTtBQUFBLElBQzFEO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwibmFtZXMiOltdfQ==
@@ -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
  /**
@@ -47,6 +47,19 @@ var UpdateCommunityPluginResult = /* @__PURE__ */ ((UpdateCommunityPluginResult2
47
47
  UpdateCommunityPluginResult2["Updated"] = "updated";
48
48
  return UpdateCommunityPluginResult2;
49
49
  })(UpdateCommunityPluginResult || {});
50
+ class PluginEnableRefusedError extends Error {
51
+ /**
52
+ * Creates a {@link PluginEnableRefusedError}.
53
+ *
54
+ * @param pluginId - The id of the plugin Obsidian refused to enable.
55
+ */
56
+ constructor(pluginId) {
57
+ super(`Obsidian refused to enable the plugin "${pluginId}".`);
58
+ this.pluginId = pluginId;
59
+ this.name = "PluginEnableRefusedError";
60
+ }
61
+ pluginId;
62
+ }
50
63
  async function configureCommunityPlugin(params) {
51
64
  const { app, settings } = params;
52
65
  const pluginId = await resolveCommunityPluginId(params);
@@ -89,7 +102,9 @@ async function enableCommunityPlugin(params) {
89
102
  if (app.plugins.enabledPlugins.has(pluginId)) {
90
103
  return;
91
104
  }
92
- await app.plugins.enablePluginAndSave(pluginId);
105
+ if (!await app.plugins.enablePluginAndSave(pluginId)) {
106
+ throw new PluginEnableRefusedError(pluginId);
107
+ }
93
108
  }
94
109
  async function getCommunityPluginRepo(pluginId) {
95
110
  const entries = await getCommunityPluginEntries();
@@ -228,6 +243,7 @@ async function resolveCommunityPluginId(reference) {
228
243
  }
229
244
  export {
230
245
  ConfigureCommunityPluginResult,
246
+ PluginEnableRefusedError,
231
247
  UpdateCommunityPluginResult,
232
248
  configureCommunityPlugin,
233
249
  disableCommunityPlugin,
@@ -242,4 +258,4 @@ export {
242
258
  uninstallCommunityPlugin,
243
259
  updateCommunityPlugin
244
260
  };
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tdW5pdHktcGx1Z2lucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogUmVzb2x2ZXMsIHNlYXJjaGVzIGFuZCBtYW5hZ2VzIGNvbW11bml0eSBwbHVnaW5zIHRocm91Z2ggT2JzaWRpYW4ncyBwdWJsaWMgcGx1Z2luIHJlZ2lzdHJ5IGFuZFxuICogc3RvcmUtaW5zdGFsbCBwYXRoLlxuICpcbiAqIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSB0aGF0IG1hcHMgYSBwbHVnaW4gYGlkYCB0byBpdHNcbiAqIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeSDigJQgdGhlIHBsdWdpbiBtYW5pZmVzdCBpdHNlbGYgY2FycmllcyBubyByZXBvc2l0b3J5LiBUaGlzIG1vZHVsZSB1c2VzXG4gKiBpdCB0byBzZWFyY2ggdGhlIHJlZ2lzdHJ5LCB0byBsb2NhdGUgYSBwbHVnaW4ncyBHaXRIdWIgcmVsZWFzZXMgKGUuZy4gdG8gZG93bmxvYWQgaXRzIHNoaXBwZWRcbiAqIGRlbW8tdmF1bHQgYXJjaGl2ZSksIGFuZCB0byBpbnN0YWxsL3VwZGF0ZS91bmluc3RhbGwvZW5hYmxlL2Rpc2FibGUgYW4gYXJiaXRyYXJ5IGNvbW11bml0eSBwbHVnaW4g4oCUIHNlbGVjdGVkXG4gKiBieSBlaXRoZXIgaXRzIGBpZGAgb3IgaXRzIGRpc3BsYXkgYG5hbWVgIOKAlCB2aWEgT2JzaWRpYW4ncyBvd24gc3RvcmUgcGF0aCAoYGFwcC5wbHVnaW5zLmluc3RhbGxQbHVnaW5gXG4gKiArIGBlbmFibGVQbHVnaW5BbmRTYXZlYCksIHNvIGFueSBkZXYvZGVwbG95IG9yIHRvb2xpbmcgZmxvdyBjYW4gcmV1c2UgaXQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFBsdWdpbk1hbmlmZXN0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29tcGFyZSBhcyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7IHJlcXVlc3RVcmwgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogU2VsZWN0cyBhIGNvbW11bml0eSBwbHVnaW4gZWl0aGVyIGJ5IGl0cyBpZCAoe0BsaW5rIENvbW11bml0eVBsdWdpbkJ5SWRSZWZ9KSBvciBieSBpdHMgZGlzcGxheSBuYW1lXG4gKiAoe0BsaW5rIENvbW11bml0eVBsdWdpbkJ5TmFtZVJlZn0pLlxuICovXG5leHBvcnQgdHlwZSBDb21tdW5pdHlQbHVnaW5SZWYgPSBDb21tdW5pdHlQbHVnaW5CeUlkUmVmIHwgQ29tbXVuaXR5UGx1Z2luQnlOYW1lUmVmO1xuXG4vKipcbiAqIEEgc2luZ2xlIHJlc3VsdCBvZiB7QGxpbmsgc2VhcmNoQ29tbXVuaXR5UGx1Z2luc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luU2VhcmNoUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBDb21tdW5pdHlQbHVnaW5TZXR0aW5ncztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGlzYWJsZUNvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvclxuICogYHBsdWdpbk5hbWVgLlxuICovXG5leHBvcnQgdHlwZSBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zID0gQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCAmIENvbW11bml0eVBsdWdpblJlZjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIEVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluc3RhbGxDb21tdW5pdHlQbHVnaW59LiBTZWxlY3RzIHRoZSBwbHVnaW4gYnkgZWl0aGVyIGBwbHVnaW5JZGAgb3JcbiAqIGBwbHVnaW5OYW1lYC5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluc3RhbGxDb25maWd1cmVFbmFibGVDb21tdW5pdHlQbHVnaW59LiBTZWxlY3RzIHRoZSBwbHVnaW4gYnkgZWl0aGVyIGBwbHVnaW5JZGBcbiAqIG9yIGBwbHVnaW5OYW1lYDsgYHNldHRpbmdzYCBpcyBvcHRpb25hbCAob21pdCBmb3IgYSBwbHVnaW4gdGhhdCBuZWVkcyBubyBjb25maWd1cmF0aW9uKS5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBQYXJ0aWFsPENvbW11bml0eVBsdWdpblNldHRpbmdzPjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9nZ2xlRW5hYmxlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFRvZ2dsZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBDb21tdW5pdHlQbHVnaW5Ub2dnbGVFbmFibGVTdGF0ZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9nZ2xlSW5zdGFsbENvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvclxuICogYHBsdWdpbk5hbWVgLlxuICovXG5leHBvcnQgdHlwZSBUb2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zID0gQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCAmIENvbW11bml0eVBsdWdpblJlZiAmIENvbW11bml0eVBsdWdpblRvZ2dsZUluc3RhbGxTdGF0ZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHVwZGF0ZUNvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvciBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogU2VsZWN0cyBhIGNvbW11bml0eSBwbHVnaW4gYnkgaXRzIGlkLlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luQnlJZFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZWxlY3RzIGEgY29tbXVuaXR5IHBsdWdpbiBieSBpdHMgZGlzcGxheSBuYW1lIChhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcmVnaXN0cnkpLlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luQnlOYW1lUmVmIHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gZGlzcGxheSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudHJ5IGluIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHJlZ2lzdHJ5LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luRW50cnkge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBhdXRob3IuXG4gICAqL1xuICByZWFkb25seSBhdXRob3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlIGEgY29tbXVuaXR5LXBsdWdpbiBvcGVyYXRpb24gcnVucyBhZ2FpbnN0LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRvIG1lcmdlIGludG8gYSBjb21tdW5pdHkgcGx1Z2luJ3MgYGRhdGEuanNvbmAuXG4gKi9cbmludGVyZmFjZSBDb21tdW5pdHlQbHVnaW5TZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3Mgb2JqZWN0IHNoYWxsb3ctbWVyZ2VkIG92ZXIgdGhlIHBsdWdpbidzIGV4aXN0aW5nIGBkYXRhLmpzb25gICh0aGUgZmlsZSBpcyBjcmVhdGVkIGlmXG4gICAqIGFic2VudCkuXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5nczogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSBkZXNpcmVkIGVuYWJsZWQgc3RhdGUgZm9yIHtAbGluayB0b2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW59LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luVG9nZ2xlRW5hYmxlU3RhdGUge1xuICAvKipcbiAgICogVGhlIGRlc2lyZWQgZW5hYmxlZCBzdGF0ZTogYHRydWVgIGVuYWJsZXMgdGhlIHBsdWdpbiwgYGZhbHNlYCBkaXNhYmxlcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGUgZm9yIHtAbGluayB0b2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2lufS5cbiAqL1xuaW50ZXJmYWNlIENvbW11bml0eVBsdWdpblRvZ2dsZUluc3RhbGxTdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGU6IGB0cnVlYCBpbnN0YWxscyB0aGUgcGx1Z2luLCBgZmFsc2VgIHVuaW5zdGFsbHMgaXQuXG4gICAqL1xuICByZWFkb25seSBpc0luc3RhbGxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgb25lIG1ldGhvZCB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufSBuZWVkcyBmcm9tIGEgcGx1Z2luJ3Mgc2V0dGluZ3MgY29tcG9uZW50IHRvIGNvbmZpZ3VyZVxuICogaXQgbGl2ZS4gRGVjbGFyZWQgc3RydWN0dXJhbGx5IHJhdGhlciB0aGFuIGltcG9ydGluZyBgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRgLCBzbyBhIHBsdWdpbiBidWlsdCBvblxuICogYW55IHZlcnNpb24gb2YgaXQgLS0gb3Igb24gaXRzIG93biBlcXVpdmFsZW50IC0tIGlzIGNvbmZpZ3VyYWJsZSB3aXRob3V0IGEgc2hhcmVkIG5vbWluYWwgdHlwZS5cbiAqL1xuaW50ZXJmYWNlIEVkaXRhYmxlU2V0dGluZ3NDb21wb25lbnQge1xuICByZWFkb25seSBlZGl0QW5kU2F2ZTogKHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IG9iamVjdCkgPT4gdm9pZCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgR2l0SHViIHJlbGVhc2Ugd2UgcmVhZC5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2Uge1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgdGFnLCBhIGJhcmUgdmVyc2lvbiBzdWNoIGFzIGAxLjIuM2AuXG4gICAqL1xuICByZWFkb25seSB0YWdfbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19TVEFURV9LRVkgPSAnY29tbXVuaXR5UGx1Z2luRW50cmllc1Byb21pc2UnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfVVJMID0gJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL0hFQUQvY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayBjb25maWd1cmVDb21tdW5pdHlQbHVnaW59LlxuICovXG5leHBvcnQgZW51bSBDb25maWd1cmVDb21tdW5pdHlQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHdlcmUgYXBwbGllZCB0aHJvdWdoIHRoZSBydW5uaW5nIHBsdWdpbidzIG93biBzZXR0aW5ncyBjb21wb25lbnQsIHdoaWNoIGJvdGggdXBkYXRlZFxuICAgKiB0aGVtIGluIG1lbW9yeSBhbmQgcGVyc2lzdGVkIHRoZW0uIFRoZSBwbHVnaW4gaXMgYWxyZWFkeSB1c2luZyB0aGVtLCBzbyBpdCBtdXN0IE5PVCBiZSByZWxvYWRlZC5cbiAgICovXG4gIEFwcGxpZWRMaXZlID0gJ2FwcGxpZWRMaXZlJyxcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHdlcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgc28gbm90aGluZyB3YXMgd3JpdHRlbi5cbiAgICovXG4gIFNraXBwZWQgPSAnc2tpcHBlZCcsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyB3ZXJlIG1lcmdlZCBpbnRvIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgd2hpY2ggd2FzIHdyaXR0ZW4uXG4gICAqL1xuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgdXBkYXRlQ29tbXVuaXR5UGx1Z2lufS5cbiAqL1xuZXhwb3J0IGVudW0gVXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YWxsZWQgY29weSBpcyBhbHJlYWR5IGF0IChvciBwYXN0KSB0aGUgbGF0ZXN0IHJlbGVhc2UsIHNvIG5vdGhpbmcgd2FzIGRvd25sb2FkZWQuXG4gICAqL1xuICBBbHJlYWR5VXBUb0RhdGUgPSAnYWxyZWFkeVVwVG9EYXRlJyxcblxuICAvKipcbiAgICogVGhlIGxhdGVzdCByZWxlYXNlIHdhcyBpbnN0YWxsZWQgb3ZlciB0aGUgb2xkIGNvcHksIHdoaWNoIE9ic2lkaWFuIHJlbG9hZGVkIGlmIGl0IHdhcyBydW5uaW5nLlxuICAgKi9cbiAgVXBkYXRlZCA9ICd1cGRhdGVkJ1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb21tdW5pdHkgcGx1Z2luLCBwcmVmZXJyaW5nIHRoZSBydW5uaW5nIHBsdWdpbidzIG93biBzZXR0aW5ncyBjb21wb25lbnQgb3ZlciBpdHNcbiAqIGBkYXRhLmpzb25gLlxuICpcbiAqIFdoZW4gdGhlIHBsdWdpbiBpcyBsb2FkZWQgQU5EIGV4cG9zZXMgYSBgcGx1Z2luU2V0dGluZ3NDb21wb25lbnRgIHdpdGggYW4gYGVkaXRBbmRTYXZlYCBtZXRob2QsIHRoZVxuICogc2V0dGluZ3MgYXJlIHNoYWxsb3ctbWVyZ2VkIHRocm91Z2ggaXQ6IHRoZXkgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkgYW5kIGFyZSBwZXJzaXN0ZWQsIHNvIHRoZSBwbHVnaW5cbiAqIG5lZWRzIG5vIHJlbG9hZCBhbmQge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5BcHBsaWVkTGl2ZX0gaXMgcmV0dXJuZWQuIFRoaXMgaXMgd2hhdCBsZXRzIGFcbiAqIHBsdWdpbidzIG93biBzY3JpcHQgcmVjb25maWd1cmUgaXQgd2l0aG91dCB0aGUgZGlzYWJsZS9lbmFibGUgY3ljbGUgdGhhdCB3b3VsZCB0ZWFyIGRvd24gdGhlIHZlcnkgY29kZVxuICogZG9pbmcgdGhlIHJlY29uZmlndXJpbmcuIE5vdGUgdGhhdCB0aGlzIHBhdGggcnVucyB0aGUgcGx1Z2luJ3Mgc2V0dGluZyB2YWxpZGF0b3JzLCBzbyBhbiBpbnZhbGlkIHZhbHVlXG4gKiBpcyByZXBsYWNlZCBieSBpdHMgZGVmYXVsdCByYXRoZXIgdGhhbiB3cml0dGVuIHRocm91Z2ggdmVyYmF0aW0uXG4gKlxuICogT3RoZXJ3aXNlIHRoZSBzZXR0aW5ncyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgc2hhbGxvdy1tZXJnZWQgb3ZlciBhbnkgZXhpc3RpbmdcbiAqIHNldHRpbmdzIChjcmVhdGluZyB0aGUgZmlsZSBpZiBhYnNlbnQpLiBXcml0aW5nIHNldHRpbmdzIEJFRk9SRSB0aGUgcGx1Z2luIGlzIGVuYWJsZWQgbWFrZXMgaXQgbG9hZFxuICogYWxyZWFkeSBjb25maWd1cmVkLCB3aXRoIG5vIHJlbG9hZC4gQSBuby1vcCB3cml0ZSBpcyBza2lwcGVkOiB3aGVuIHRoZSBtZXJnZSBjaGFuZ2VzIG5vdGhpbmcsIHRoZSBmaWxlXG4gKiBpcyBsZWZ0IHVudG91Y2hlZCBhbmQge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkfSBpcyByZXR1cm5lZCwgc28gYSBjYWxsZXIgY2FuIGF2b2lkXG4gKiByZWxvYWRpbmcgYW4gYWxyZWFkeS1jb3JyZWN0bHktY29uZmlndXJlZCBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8ge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5BcHBsaWVkTGl2ZX0gaWYgdGhlXG4gKiBydW5uaW5nIHBsdWdpbiBhcHBsaWVkIHRoZW0gaXRzZWxmIChubyByZWxvYWQgbmVlZGVkKSwge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5TdWNjZXNzfSBpZlxuICogdGhlIGBkYXRhLmpzb25gIGNvbnRlbnQgY2hhbmdlZCAoYW5kIHdhcyB3cml0dGVuKSwgb3Ige0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkfSBpZlxuICogdGhlIHNldHRpbmdzIHdlcmUgYWxyZWFkeSBwcmVzZW50IChub3RoaW5nIHdyaXR0ZW4pLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8Q29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0PiB7XG4gIGNvbnN0IHsgYXBwLCBzZXR0aW5ncyB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuXG4gIGNvbnN0IHNldHRpbmdzQ29tcG9uZW50ID0gZ2V0U2V0dGluZ3NDb21wb25lbnQoYXBwLnBsdWdpbnMucGx1Z2luc1twbHVnaW5JZF0pO1xuICBpZiAoY2hlY2tIYXNFZGl0QW5kU2F2ZShzZXR0aW5nc0NvbXBvbmVudCkpIHtcbiAgICBhd2FpdCBzZXR0aW5nc0NvbXBvbmVudC5lZGl0QW5kU2F2ZSgocGx1Z2luU2V0dGluZ3MpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICB9KTtcbiAgICByZXR1cm4gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LkFwcGxpZWRMaXZlO1xuICB9XG5cbiAgY29uc3QgZGF0YVBhdGggPSBgJHthcHAudmF1bHQuY29uZmlnRGlyfS9wbHVnaW5zLyR7cGx1Z2luSWR9L2RhdGEuanNvbmA7XG5cbiAgbGV0IGRhdGE6IG9iamVjdCA9IHt9O1xuICBpZiAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGRhdGFQYXRoKSkge1xuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChkYXRhUGF0aCkpO1xuICAgIGlmIChwYXJzZWQgIT09IG51bGwgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBwYXJzZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZEJlZm9yZSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICBPYmplY3QuYXNzaWduKGRhdGEsIHNldHRpbmdzKTtcbiAgaWYgKEpTT04uc3RyaW5naWZ5KGRhdGEpID09PSBzZXJpYWxpemVkQmVmb3JlKSB7XG4gICAgcmV0dXJuIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZCA9IFN0cmluZyhKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gIGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGRhdGFQYXRoLCBgJHtzZXJpYWxpemVkfVxcbmApO1xuICByZXR1cm4gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LlN1Y2Nlc3M7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgYSBjb21tdW5pdHkgcGx1Z2luIChwZXJzaXN0aW5nIHRoZSBjaGFuZ2UpIGlmIGl0IGlzIGN1cnJlbnRseSBlbmFibGVkLiBJZGVtcG90ZW50IOKAlCBhIG5vLW9wXG4gKiB3aGVuIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBkaXNhYmxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGRpc2FibGVkLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2FibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmICghYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBhcHAucGx1Z2lucy5kaXNhYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5JZCk7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIGNvbW11bml0eSBwbHVnaW4gKHBlcnNpc3RpbmcgdGhlIGNoYW5nZSkgaWYgaXQgaXMgbm90IGFscmVhZHkgZW5hYmxlZC4gSWRlbXBvdGVudCDigJQgYSBuby1vcFxuICogd2hlbiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgZW5hYmxlZC5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmFibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgcGx1Z2luSWQgPSBhd2FpdCByZXNvbHZlQ29tbXVuaXR5UGx1Z2luSWQocGFyYW1zKTtcbiAgaWYgKGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwbHVnaW5JZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5JZCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeSBvZiBhIGNvbW11bml0eSBwbHVnaW4gZnJvbSBPYnNpZGlhbidzIHB1YmxpY1xuICogYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHJlZ2lzdHJ5LlxuICpcbiAqIFRoZSByZWdpc3RyeSBpcyBmZXRjaGVkIG9uY2UgYW5kIGNhY2hlZCBvbiB0aGUgc2hhcmVkIHBsdWdpbiBzdGF0ZSBmb3Igc3Vic2VxdWVudCBjYWxsczsgYSBmYWlsZWRcbiAqIGZldGNoIGlzIG5vdCBjYWNoZWQsIHNvIGEgbGF0ZXIgY2FsbCByZXRyaWVzLlxuICpcbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBwbHVnaW4gaWQgdG8gbG9vayB1cC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgcGx1Z2luJ3MgYG93bmVyL25hbWVgIHJlcG9zaXRvcnksIG9yIGBudWxsYCBpZiB0aGVcbiAqIHBsdWdpbiBpcyBub3QgbGlzdGVkIGluIHRoZSByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbW11bml0eVBsdWdpblJlcG8ocGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luRW50cmllcygpO1xuICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHBsdWdpbklkKTtcbiAgcmV0dXJuIGVudHJ5Py5yZXBvID8/IG51bGw7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGxhdGVzdCByZWxlYXNlIHZlcnNpb24gKHRoZSByZWxlYXNlIGB0YWdfbmFtZWAsIGEgYmFyZSB2ZXJzaW9uIHN1Y2ggYXMgYDEuMi4zYCkgb2YgYVxuICogR2l0SHViIHJlcG9zaXRvcnkuXG4gKlxuICogQHBhcmFtIHJlcG8gLSBUaGUgYG93bmVyL25hbWVgIEdpdEh1YiByZXBvc2l0b3J5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBsYXRlc3QgcmVsZWFzZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0UmVsZWFzZVZlcnNpb24ocmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cmVwb30vcmVsZWFzZXMvbGF0ZXN0YCk7XG4gIGNvbnN0IHJlbGVhc2UgPSByZXNwb25zZS5qc29uIGFzIEdpdEh1YlJlbGVhc2U7XG4gIHJldHVybiByZWxlYXNlLnRhZ19uYW1lO1xufVxuXG4vKipcbiAqIEluc3RhbGxzIGEgY29tbXVuaXR5IHBsdWdpbiBmcm9tIHRoZSBvZmZpY2lhbCBzdG9yZSBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQuIElkZW1wb3RlbnQg4oCUIGFcbiAqIG5vLW9wIHdoZW4gdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGluc3RhbGxlZC4gUmVzb2x2ZXMgdGhlIHBsdWdpbidzIHJlcG9zaXRvcnkgZnJvbSBPYnNpZGlhbidzXG4gKiBjb21tdW5pdHkgcmVnaXN0cnksIHJlYWRzIHRoZSBsYXRlc3QgcmVsZWFzZSB2ZXJzaW9uIGFuZCBpdHMgbWFuaWZlc3QsIGFuZCBpbnN0YWxscyBpdCB0aHJvdWdoXG4gKiBPYnNpZGlhbidzIG93biBgaW5zdGFsbFBsdWdpbmAgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZC5cbiAqIEB0aHJvd3MgSWYgdGhlIHBsdWdpbiBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQ29tbXVuaXR5UGx1Z2luKHBhcmFtczogSW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuICBpZiAoT2JqZWN0Lmhhc093bihhcHAucGx1Z2lucy5tYW5pZmVzdHMsIHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlcG8gPSBhd2FpdCBnZXRDb21tdW5pdHlQbHVnaW5SZXBvKHBsdWdpbklkKTtcbiAgaWYgKCFyZXBvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJyR7cGx1Z2luSWR9JyB3YXMgbm90IGZvdW5kIGluIHRoZSBPYnNpZGlhbiBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgfVxuXG4gIGNvbnN0IHZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RSZWxlYXNlVmVyc2lvbihyZXBvKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBnZXRQbHVnaW5NYW5pZmVzdChyZXBvLCB2ZXJzaW9uKTtcbiAgYXdhaXQgYXBwLnBsdWdpbnMuaW5zdGFsbFBsdWdpbihyZXBvLCB2ZXJzaW9uLCBtYW5pZmVzdCk7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgYSBjb21tdW5pdHkgcGx1Z2luLCB3cml0ZXMgaXRzIHNldHRpbmdzLCBUSEVOIGVuYWJsZXMgaXQg4oCUIGluIHRoYXQgb3JkZXIg4oCUIHNvIHRoZSBwbHVnaW5cbiAqIGxvYWRzIGFscmVhZHkgY29uZmlndXJlZCAoYSBwbHVnaW4gZW5hYmxlZCBiZWZvcmUgaXQgaXMgY29uZmlndXJlZCBydW5zIGl0cyBgb25sb2FkYCB3aXRoIGRlZmF1bHRcbiAqIHNldHRpbmdzIGFuZCBkb2VzIG5vdGhpbmcgdXNlZnVsKS4gSWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGVuYWJsZWQgYW5kIHRoZSBzZXR0aW5ncyBjaGFuZ2VkLCBpdCBpc1xuICogZGlzYWJsZWQgYW5kIHJlLWVuYWJsZWQgc28gdGhlIG5ldyBzZXR0aW5ncyB0YWtlIGVmZmVjdC4gYHNldHRpbmdzYCBpcyBvcHRpb25hbDogb21pdCBpdCBmb3IgYSBwbHVnaW5cbiAqIHRoYXQgbmVlZHMgbm8gY29uZmlndXJhdGlvbi4gQ29tcG9zZXMge0BsaW5rIGluc3RhbGxDb21tdW5pdHlQbHVnaW59LCB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufSxcbiAqIHtAbGluayBlbmFibGVDb21tdW5pdHlQbHVnaW59IGFuZCB7QGxpbmsgZGlzYWJsZUNvbW11bml0eVBsdWdpbn0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgSW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQsIGNvbmZpZ3VyZWQgYW5kIGVuYWJsZWQuXG4gKiBAdGhyb3dzIElmIHNlbGVjdGVkIGJ5IGBwbHVnaW5OYW1lYCBhbmQgdGhlIG5hbWUgaXMgbm90IGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IEluc3RhbGxDb25maWd1cmVFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAsIHNldHRpbmdzIH0gPSBwYXJhbXM7XG4gIGF3YWl0IGluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgY29uc3QgZGlkU2V0dGluZ3NDaGFuZ2UgPSBzZXR0aW5ncyA/IGF3YWl0IGNvbmZpZ3VyZUNvbW11bml0eVBsdWdpbih7IC4uLnBhcmFtcywgc2V0dGluZ3MgfSkgPT09IENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5TdWNjZXNzIDogZmFsc2U7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmICghYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIGF3YWl0IGVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICB9IGVsc2UgaWYgKGRpZFNldHRpbmdzQ2hhbmdlKSB7XG4gICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICAgIGF3YWl0IGVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICB9XG59XG5cbi8qKlxuICogU2VhcmNoZXMgT2JzaWRpYW4ncyBwdWJsaWMgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnksIHJldHVybmluZyB0aGUgaWQgYW5kIGRpc3BsYXkgbmFtZSBvZiBldmVyeVxuICogcGx1Z2luIHdob3NlIGlkLCBuYW1lLCBhdXRob3Igb3IgZGVzY3JpcHRpb24gY29udGFpbnMgdGhlIHF1ZXJ5IChjYXNlLWluc2Vuc2l0aXZlKS4gQW4gZW1wdHkgcXVlcnlcbiAqIG1hdGNoZXMgZXZlcnkgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBxdWVyeSAtIFRoZSBzZWFyY2ggcXVlcnkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIG1hdGNoaW5nIHBsdWdpbnMnIHtAbGluayBDb21tdW5pdHlQbHVnaW5TZWFyY2hSZXN1bHR9cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaENvbW11bml0eVBsdWdpbnMocXVlcnk6IHN0cmluZyk6IFByb21pc2U8Q29tbXVuaXR5UGx1Z2luU2VhcmNoUmVzdWx0W10+IHtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpbkVudHJpZXMoKTtcbiAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKChlbnRyeSkgPT5cbiAgICAgIGVudHJ5LmlkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgICAgfHwgZW50cnkubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgIHx8IGVudHJ5LmF1dGhvci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgIHx8IGVudHJ5LmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgIClcbiAgICAubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGlkOiBlbnRyeS5pZCxcbiAgICAgIG5hbWU6IGVudHJ5Lm5hbWVcbiAgICB9KSk7XG59XG5cbi8qKlxuICogRW5hYmxlcyBvciBkaXNhYmxlcyBhIGNvbW11bml0eSBwbHVnaW4gdG8gbWF0Y2ggdGhlIGRlc2lyZWQgc3RhdGUuIERlbGVnYXRlcyB0b1xuICoge0BsaW5rIGVuYWJsZUNvbW11bml0eVBsdWdpbn0gLyB7QGxpbmsgZGlzYWJsZUNvbW11bml0eVBsdWdpbn0sIHNvIGl0IGlzIGlkZW1wb3RlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgVG9nZ2xlRW5hYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIG1hdGNoZXMgdGhlIGRlc2lyZWQgZW5hYmxlZCBzdGF0ZS5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBUb2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBhcmFtcy5pc0VuYWJsZWQpIHtcbiAgICBhd2FpdCBlbmFibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnN0YWxscyBvciB1bmluc3RhbGxzIGEgY29tbXVuaXR5IHBsdWdpbiB0byBtYXRjaCB0aGUgZGVzaXJlZCBzdGF0ZS4gRGVsZWdhdGVzIHRvXG4gKiB7QGxpbmsgaW5zdGFsbENvbW11bml0eVBsdWdpbn0gLyB7QGxpbmsgdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2lufSwgc28gaXQgaXMgaWRlbXBvdGVudC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBUb2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIG1hdGNoZXMgdGhlIGRlc2lyZWQgaW5zdGFsbGVkIHN0YXRlLlxuICogQHRocm93cyBJZiBpbnN0YWxsaW5nIGFuZCB0aGUgcGx1Z2luIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBUb2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwYXJhbXMuaXNJbnN0YWxsZWQpIHtcbiAgICBhd2FpdCBpbnN0YWxsQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBVbmluc3RhbGxzIGEgY29tbXVuaXR5IHBsdWdpbiBpZiBpdCBpcyBjdXJyZW50bHkgaW5zdGFsbGVkLiBJZGVtcG90ZW50IOKAlCBhIG5vLW9wIHdoZW4gdGhlIHBsdWdpbiBpc1xuICogbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBVbmluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgdW5pbnN0YWxsZWQuXG4gKiBAdGhyb3dzIElmIHNlbGVjdGVkIGJ5IGBwbHVnaW5OYW1lYCBhbmQgdGhlIG5hbWUgaXMgbm90IGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2luKHBhcmFtczogVW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmICghT2JqZWN0Lmhhc093bihhcHAucGx1Z2lucy5tYW5pZmVzdHMsIHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBhcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4ocGx1Z2luSWQpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYW4gaW5zdGFsbGVkIGNvbW11bml0eSBwbHVnaW4gdG8gaXRzIGxhdGVzdCByZWxlYXNlLCB0aGUgd2F5IHRoZSBjb21tdW5pdHkgcGx1Z2luIGJyb3dzZXIncyBvd25cbiAqIGBVcGRhdGVgIGJ1dHRvbiBkb2VzLlxuICpcbiAqIE9ic2lkaWFuJ3MgYGluc3RhbGxQbHVnaW5gIHdyaXRlcyB0aGUgcmVsZWFzZSdzIGZpbGVzIG92ZXIgdGhlIGluc3RhbGxlZCBjb3B5IGFuZCwgd2hlbiB0aGUgcGx1Z2luIGlzXG4gKiBydW5uaW5nLCBkaXNhYmxlcyBhbmQgcmUtZW5hYmxlcyBpdCBzbyB0aGUgbmV3IGNvZGUgbG9hZHMg4oCUIHJlYWQgZnJvbSB0aGUgc2hpcHBlZCBidW5kbGUgKGAxLjE0LjRgKSwgbm90XG4gKiBhc3N1bWVkLiBJdCByZXBvcnRzIGl0cyBvd24gZmFpbHVyZXMgKGEgZmFpbGVkIGRvd25sb2FkLCBhIG1hbmlmZXN0IHdob3NlIGlkIGRvZXMgbm90IG1hdGNoKSBhcyBhIG5vdGljZVxuICogYW5kIFJFVFVSTlMgcmF0aGVyIHRoYW4gdGhyb3dpbmcsIHNvIHRoZSBpbnN0YWxsZWQgbWFuaWZlc3QgaXMgcmUtcmVhZCBhZnRlcndhcmRzIGFuZCBhIHZlcnNpb24gdGhhdCBkaWRcbiAqIG5vdCBtb3ZlIHRvIHRoZSByZWxlYXNlIGlzIHRocm93biBhcyBhIGZhaWx1cmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgVXBkYXRlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB7QGxpbmsgVXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LlVwZGF0ZWR9IG9uY2UgdGhlIGxhdGVzdCByZWxlYXNlXG4gKiBpcyBpbnN0YWxsZWQsIG9yIHtAbGluayBVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQuQWxyZWFkeVVwVG9EYXRlfSB3aGVuIHRoZSBpbnN0YWxsZWQgY29weSBpcyBub3Qgb2xkZXJcbiAqIHRoYW4gaXQuXG4gKiBAdGhyb3dzIElmIHRoZSBwbHVnaW4gaXMgbm90IGluc3RhbGxlZCwgaXMgbm90IGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LCBvciB0aGVcbiAqIGluc3RhbGwgZGlkIG5vdCBsZWF2ZSB0aGUgbGF0ZXN0IHJlbGVhc2UgaW4gcGxhY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBVcGRhdGVDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPFVwZGF0ZUNvbW11bml0eVBsdWdpblJlc3VsdD4ge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuICBjb25zdCBpbnN0YWxsZWRNYW5pZmVzdCA9IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF07XG4gIGlmICghaW5zdGFsbGVkTWFuaWZlc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAnJHtwbHVnaW5JZH0nIGlzIG5vdCBpbnN0YWxsZWQsIHNvIGl0IGNhbm5vdCBiZSB1cGRhdGVkLmApO1xuICB9XG5cbiAgY29uc3QgcmVwbyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpblJlcG8ocGx1Z2luSWQpO1xuICBpZiAoIXJlcG8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAnJHtwbHVnaW5JZH0nIHdhcyBub3QgZm91bmQgaW4gdGhlIE9ic2lkaWFuIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LmApO1xuICB9XG5cbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFJlbGVhc2VWZXJzaW9uKHJlcG8pO1xuICBpZiAoaXNBdExlYXN0VmVyc2lvbihpbnN0YWxsZWRNYW5pZmVzdC52ZXJzaW9uLCB2ZXJzaW9uKSkge1xuICAgIHJldHVybiBVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQuQWxyZWFkeVVwVG9EYXRlO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBnZXRQbHVnaW5NYW5pZmVzdChyZXBvLCB2ZXJzaW9uKTtcbiAgYXdhaXQgYXBwLnBsdWdpbnMuaW5zdGFsbFBsdWdpbihyZXBvLCB2ZXJzaW9uLCBtYW5pZmVzdCk7XG5cbiAgY29uc3QgdXBkYXRlZFZlcnNpb24gPSBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy52ZXJzaW9uO1xuICBpZiAodXBkYXRlZFZlcnNpb24gIT09IG1hbmlmZXN0LnZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVXBkYXRpbmcgcGx1Z2luICcke3BsdWdpbklkfScgdG8gJHttYW5pZmVzdC52ZXJzaW9ufSBsZWZ0IHZlcnNpb24gJHt1cGRhdGVkVmVyc2lvbiA/PyAnKG5vbmUpJ30gaW5zdGFsbGVkLiBPYnNpZGlhbiByZXBvcnRzIHRoZSBjYXVzZSBhcyBhIG5vdGljZS5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQuVXBkYXRlZDtcbn1cblxuLy8gV2hldGhlciBhIHBsdWdpbidzIGBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudGAgY2FuIGNvbmZpZ3VyZSBpdHNlbGYgaW4gcGxhY2UuIFN0cnVjdHVyYWwgcmF0aGVyIHRoYW4gYW5cbi8vIGBpbnN0YW5jZW9mYDogdGhlIHBsdWdpbiB3YXMgbG9hZGVkIGZyb20gaXRzIG93biBidW5kbGUsIHNvIGV2ZW4gYSBwbHVnaW4gYnVpbHQgb24gdGhpcyB2ZXJ5IGxpYnJhcnlcbi8vIGNhcnJpZXMgaXRzIG93biBjb3B5IG9mIHRoZSBjbGFzcyBhbmQgd291bGQgZmFpbCBhbiBpZGVudGl0eSBjaGVjay5cbmZ1bmN0aW9uIGNoZWNrSGFzRWRpdEFuZFNhdmUoc2V0dGluZ3NDb21wb25lbnQ6IHVua25vd24pOiBzZXR0aW5nc0NvbXBvbmVudCBpcyBFZGl0YWJsZVNldHRpbmdzQ29tcG9uZW50IHtcbiAgcmV0dXJuIHR5cGVvZiBzZXR0aW5nc0NvbXBvbmVudCA9PT0gJ29iamVjdCdcbiAgICAmJiBzZXR0aW5nc0NvbXBvbmVudCAhPT0gbnVsbFxuICAgICYmICdlZGl0QW5kU2F2ZScgaW4gc2V0dGluZ3NDb21wb25lbnRcbiAgICAmJiB0eXBlb2Ygc2V0dGluZ3NDb21wb25lbnQuZWRpdEFuZFNhdmUgPT09ICdmdW5jdGlvbic7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQ29tbXVuaXR5UGx1Z2luRW50cmllcygpOiBQcm9taXNlPENvbW11bml0eVBsdWdpbkVudHJ5W10+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKENPTU1VTklUWV9QTFVHSU5TX1VSTCk7XG4gIHJldHVybiByZXNwb25zZS5qc29uIGFzIENvbW11bml0eVBsdWdpbkVudHJ5W107XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENvbW11bml0eVBsdWdpbkVudHJpZXMoKTogUHJvbWlzZTxDb21tdW5pdHlQbHVnaW5FbnRyeVtdPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0T2JzaWRpYW5MaWJTdGF0ZTxudWxsIHwgUHJvbWlzZTxDb21tdW5pdHlQbHVnaW5FbnRyeVtdPj4oQ09NTVVOSVRZX1BMVUdJTlNfU1RBVEVfS0VZLCBudWxsKTtcbiAgY2FjaGUudmFsdWUgPz89IGZldGNoQ29tbXVuaXR5UGx1Z2luRW50cmllcygpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNhY2hlLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhY2hlLnZhbHVlID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQbHVnaW5NYW5pZmVzdChyZXBvOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8UGx1Z2luTWFuaWZlc3Q+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259L21hbmlmZXN0Lmpzb25gKTtcbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24gYXMgUGx1Z2luTWFuaWZlc3Q7XG59XG5cbi8vIFJlYWRzIGEgbG9hZGVkIHBsdWdpbidzIGBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudGAsIG9yIGBudWxsYCB3aGVuIGl0IGhhcyBub25lLiBUYWtlcyBgdW5rbm93bmAgYmVjYXVzZVxuLy8gQSBwbHVnaW4gaXMgdW5kZXIgbm8gb2JsaWdhdGlvbiB0byBleHBvc2Ugb25lLCBzbyB0aGVyZSBpcyBubyB0eXBlIHRvIG5hcnJvdyBmcm9tLlxuZnVuY3Rpb24gZ2V0U2V0dGluZ3NDb21wb25lbnQocGx1Z2luOiB1bmtub3duKTogdW5rbm93biB7XG4gIHJldHVybiB0eXBlb2YgcGx1Z2luICE9PSAnb2JqZWN0JyB8fCBwbHVnaW4gPT09IG51bGwgfHwgISgncGx1Z2luU2V0dGluZ3NDb21wb25lbnQnIGluIHBsdWdpbikgPyBudWxsIDogcGx1Z2luLnBsdWdpblNldHRpbmdzQ29tcG9uZW50O1xufVxuXG4vLyBBIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIHJlYWRzIGFzIG9sZGVyLCBzbyBhbiB1cGRhdGUgaXMgYXR0ZW1wdGVkIHJhdGhlciB0aGFuIHNraXBwZWQ6IHRoZSBpbnN0YWxsJ3Ncbi8vIG93biB2ZXJzaW9uIGNoZWNrIGFmdGVyd2FyZHMgc3RpbGwgY2F0Y2hlcyBhIHJlbGVhc2UgdGhhdCBkb2VzIG5vdCBtb3ZlIGl0LlxuZnVuY3Rpb24gaXNBdExlYXN0VmVyc2lvbihpbnN0YWxsZWRWZXJzaW9uOiBzdHJpbmcsIGxhdGVzdFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkVmVyc2lvbiwgbGF0ZXN0VmVyc2lvbiwgJz49Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ29tbXVuaXR5UGx1Z2luSWQocmVmZXJlbmNlOiBDb21tdW5pdHlQbHVnaW5SZWYpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoJ3BsdWdpbklkJyBpbiByZWZlcmVuY2UpIHtcbiAgICByZXR1cm4gcmVmZXJlbmNlLnBsdWdpbklkO1xuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpbkVudHJpZXMoKTtcbiAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IHJlZmVyZW5jZS5wbHVnaW5OYW1lKTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIG5hbWVkICcke3JlZmVyZW5jZS5wbHVnaW5OYW1lfScgd2FzIG5vdCBmb3VuZCBpbiB0aGUgT2JzaWRpYW4gY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuYCk7XG4gIH1cbiAgcmV0dXJuIGVudHJ5LmlkO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxTQUFTLFdBQVcsdUJBQXVCO0FBQzNDLFNBQVMsa0JBQWtCO0FBRTNCLFNBQVMsMkJBQTJCO0FBMExwQyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLHdCQUF3QjtB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QUFDdkMsVUFBTSxJQUFJO0FBQUEsTUFDUixvQkFBb0IsUUFBUSxRQUFRLFNBQVMsT0FBTyxpQkFBaUIsa0JBQWtCLFFBQVE7QUFBQSxJQUNqRztBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFLQSxTQUFTLG9CQUFvQixtQkFBNEU7QUFDdkcsU0FBTyxPQUFPLHNCQUFzQixZQUMvQixzQkFBc0IsUUFDdEIsaUJBQWlCLHFCQUNqQixPQUFPLGtCQUFrQixnQkFBZ0I7QUFDaEQ7QUFFQSxlQUFlLDhCQUErRDtBQUM1RSxRQUFNLFdBQVcsTUFBTSxXQUFXLHFCQUFxQjtBQUN2RCxTQUFPLFNBQVM7QUFDbEI7QUFFQSxlQUFlLDRCQUE2RDtBQUMxRSxRQUFNLFFBQVEsb0JBQTRELDZCQUE2QixJQUFJO0FBQzNHLFFBQU0sVUFBVSw0QkFBNEI7QUFFNUMsTUFBSTtBQUNGLFdBQU8sTUFBTSxNQUFNO0FBQUEsRUFDckIsU0FBUyxPQUFPO0FBQ2QsVUFBTSxRQUFRO0FBQ2QsVUFBTTtBQUFBLEVBQ1I7QUFDRjtBQUVBLGVBQWUsa0JBQWtCLE1BQWMsU0FBMEM7QUFDdkYsUUFBTSxXQUFXLE1BQU0sV0FBVyxzQkFBc0IsSUFBSSxzQkFBc0IsT0FBTyxnQkFBZ0I7QUFDekcsU0FBTyxTQUFTO0FBQ2xCO0FBSUEsU0FBUyxxQkFBcUIsUUFBMEI7QUFDdEQsU0FBTyxPQUFPLFdBQVcsWUFBWSxXQUFXLFFBQVEsRUFBRSw2QkFBNkIsVUFBVSxPQUFPLE9BQU87QUFDakg7QUFJQSxTQUFTLGlCQUFpQixrQkFBMEIsZUFBZ0M7QUFDbEYsTUFBSTtBQUNGLFdBQU8sZ0JBQWdCLGtCQUFrQixlQUFlLElBQUk7QUFBQSxFQUM5RCxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLGVBQWUseUJBQXlCLFdBQWdEO0FBQ3RGLE1BQUksY0FBYyxXQUFXO0FBQzNCLFdBQU8sVUFBVTtBQUFBLEVBQ25CO0FBRUEsUUFBTSxVQUFVLE1BQU0sMEJBQTBCO0FBQ2hELFFBQU0sUUFBUSxRQUFRLEtBQUssQ0FBQyxjQUFjLFVBQVUsU0FBUyxVQUFVLFVBQVU7QUFDakYsTUFBSSxDQUFDLE9BQU87QUFDVixVQUFNLElBQUksTUFBTSxpQkFBaUIsVUFBVSxVQUFVLDZEQUE2RDtBQUFBLEVBQ3BIO0FBQ0EsU0FBTyxNQUFNO0FBQ2Y7IiwibmFtZXMiOlsiQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0IiwiVXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0Il19
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tdW5pdHktcGx1Z2lucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogUmVzb2x2ZXMsIHNlYXJjaGVzIGFuZCBtYW5hZ2VzIGNvbW11bml0eSBwbHVnaW5zIHRocm91Z2ggT2JzaWRpYW4ncyBwdWJsaWMgcGx1Z2luIHJlZ2lzdHJ5IGFuZFxuICogc3RvcmUtaW5zdGFsbCBwYXRoLlxuICpcbiAqIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSB0aGF0IG1hcHMgYSBwbHVnaW4gYGlkYCB0byBpdHNcbiAqIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeSDigJQgdGhlIHBsdWdpbiBtYW5pZmVzdCBpdHNlbGYgY2FycmllcyBubyByZXBvc2l0b3J5LiBUaGlzIG1vZHVsZSB1c2VzXG4gKiBpdCB0byBzZWFyY2ggdGhlIHJlZ2lzdHJ5LCB0byBsb2NhdGUgYSBwbHVnaW4ncyBHaXRIdWIgcmVsZWFzZXMgKGUuZy4gdG8gZG93bmxvYWQgaXRzIHNoaXBwZWRcbiAqIGRlbW8tdmF1bHQgYXJjaGl2ZSksIGFuZCB0byBpbnN0YWxsL3VwZGF0ZS91bmluc3RhbGwvZW5hYmxlL2Rpc2FibGUgYW4gYXJiaXRyYXJ5IGNvbW11bml0eSBwbHVnaW4g4oCUIHNlbGVjdGVkXG4gKiBieSBlaXRoZXIgaXRzIGBpZGAgb3IgaXRzIGRpc3BsYXkgYG5hbWVgIOKAlCB2aWEgT2JzaWRpYW4ncyBvd24gc3RvcmUgcGF0aCAoYGFwcC5wbHVnaW5zLmluc3RhbGxQbHVnaW5gXG4gKiArIGBlbmFibGVQbHVnaW5BbmRTYXZlYCksIHNvIGFueSBkZXYvZGVwbG95IG9yIHRvb2xpbmcgZmxvdyBjYW4gcmV1c2UgaXQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFBsdWdpbk1hbmlmZXN0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29tcGFyZSBhcyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7IHJlcXVlc3RVcmwgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogU2VsZWN0cyBhIGNvbW11bml0eSBwbHVnaW4gZWl0aGVyIGJ5IGl0cyBpZCAoe0BsaW5rIENvbW11bml0eVBsdWdpbkJ5SWRSZWZ9KSBvciBieSBpdHMgZGlzcGxheSBuYW1lXG4gKiAoe0BsaW5rIENvbW11bml0eVBsdWdpbkJ5TmFtZVJlZn0pLlxuICovXG5leHBvcnQgdHlwZSBDb21tdW5pdHlQbHVnaW5SZWYgPSBDb21tdW5pdHlQbHVnaW5CeUlkUmVmIHwgQ29tbXVuaXR5UGx1Z2luQnlOYW1lUmVmO1xuXG4vKipcbiAqIEEgc2luZ2xlIHJlc3VsdCBvZiB7QGxpbmsgc2VhcmNoQ29tbXVuaXR5UGx1Z2luc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luU2VhcmNoUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBDb21tdW5pdHlQbHVnaW5TZXR0aW5ncztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGlzYWJsZUNvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvclxuICogYHBsdWdpbk5hbWVgLlxuICovXG5leHBvcnQgdHlwZSBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zID0gQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCAmIENvbW11bml0eVBsdWdpblJlZjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIEVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluc3RhbGxDb21tdW5pdHlQbHVnaW59LiBTZWxlY3RzIHRoZSBwbHVnaW4gYnkgZWl0aGVyIGBwbHVnaW5JZGAgb3JcbiAqIGBwbHVnaW5OYW1lYC5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGluc3RhbGxDb25maWd1cmVFbmFibGVDb21tdW5pdHlQbHVnaW59LiBTZWxlY3RzIHRoZSBwbHVnaW4gYnkgZWl0aGVyIGBwbHVnaW5JZGBcbiAqIG9yIGBwbHVnaW5OYW1lYDsgYHNldHRpbmdzYCBpcyBvcHRpb25hbCAob21pdCBmb3IgYSBwbHVnaW4gdGhhdCBuZWVkcyBubyBjb25maWd1cmF0aW9uKS5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBQYXJ0aWFsPENvbW11bml0eVBsdWdpblNldHRpbmdzPjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9nZ2xlRW5hYmxlQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFRvZ2dsZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWYgJiBDb21tdW5pdHlQbHVnaW5Ub2dnbGVFbmFibGVTdGF0ZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9nZ2xlSW5zdGFsbENvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvclxuICogYHBsdWdpbk5hbWVgLlxuICovXG5leHBvcnQgdHlwZSBUb2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zID0gQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCAmIENvbW11bml0eVBsdWdpblJlZiAmIENvbW11bml0eVBsdWdpblRvZ2dsZUluc3RhbGxTdGF0ZTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdW5pbnN0YWxsQ29tbXVuaXR5UGx1Z2lufS4gU2VsZWN0cyB0aGUgcGx1Z2luIGJ5IGVpdGhlciBgcGx1Z2luSWRgIG9yXG4gKiBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHVwZGF0ZUNvbW11bml0eVBsdWdpbn0uIFNlbGVjdHMgdGhlIHBsdWdpbiBieSBlaXRoZXIgYHBsdWdpbklkYCBvciBgcGx1Z2luTmFtZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZUNvbW11bml0eVBsdWdpblBhcmFtcyA9IENvbW11bml0eVBsdWdpbk9wZXJhdGlvbkNvbnRleHQgJiBDb21tdW5pdHlQbHVnaW5SZWY7XG5cbi8qKlxuICogU2VsZWN0cyBhIGNvbW11bml0eSBwbHVnaW4gYnkgaXRzIGlkLlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luQnlJZFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZWxlY3RzIGEgY29tbXVuaXR5IHBsdWdpbiBieSBpdHMgZGlzcGxheSBuYW1lIChhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcmVnaXN0cnkpLlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luQnlOYW1lUmVmIHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gZGlzcGxheSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudHJ5IGluIE9ic2lkaWFuJ3MgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHJlZ2lzdHJ5LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luRW50cnkge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBhdXRob3IuXG4gICAqL1xuICByZWFkb25seSBhdXRob3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGRpc3BsYXkgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGBvd25lci9uYW1lYCBHaXRIdWIgcmVwb3NpdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlIGEgY29tbXVuaXR5LXBsdWdpbiBvcGVyYXRpb24gcnVucyBhZ2FpbnN0LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luT3BlcmF0aW9uQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRvIG1lcmdlIGludG8gYSBjb21tdW5pdHkgcGx1Z2luJ3MgYGRhdGEuanNvbmAuXG4gKi9cbmludGVyZmFjZSBDb21tdW5pdHlQbHVnaW5TZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3Mgb2JqZWN0IHNoYWxsb3ctbWVyZ2VkIG92ZXIgdGhlIHBsdWdpbidzIGV4aXN0aW5nIGBkYXRhLmpzb25gICh0aGUgZmlsZSBpcyBjcmVhdGVkIGlmXG4gICAqIGFic2VudCkuXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5nczogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSBkZXNpcmVkIGVuYWJsZWQgc3RhdGUgZm9yIHtAbGluayB0b2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW59LlxuICovXG5pbnRlcmZhY2UgQ29tbXVuaXR5UGx1Z2luVG9nZ2xlRW5hYmxlU3RhdGUge1xuICAvKipcbiAgICogVGhlIGRlc2lyZWQgZW5hYmxlZCBzdGF0ZTogYHRydWVgIGVuYWJsZXMgdGhlIHBsdWdpbiwgYGZhbHNlYCBkaXNhYmxlcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGUgZm9yIHtAbGluayB0b2dnbGVJbnN0YWxsQ29tbXVuaXR5UGx1Z2lufS5cbiAqL1xuaW50ZXJmYWNlIENvbW11bml0eVBsdWdpblRvZ2dsZUluc3RhbGxTdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGU6IGB0cnVlYCBpbnN0YWxscyB0aGUgcGx1Z2luLCBgZmFsc2VgIHVuaW5zdGFsbHMgaXQuXG4gICAqL1xuICByZWFkb25seSBpc0luc3RhbGxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgb25lIG1ldGhvZCB7QGxpbmsgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2lufSBuZWVkcyBmcm9tIGEgcGx1Z2luJ3Mgc2V0dGluZ3MgY29tcG9uZW50IHRvIGNvbmZpZ3VyZVxuICogaXQgbGl2ZS4gRGVjbGFyZWQgc3RydWN0dXJhbGx5IHJhdGhlciB0aGFuIGltcG9ydGluZyBgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRgLCBzbyBhIHBsdWdpbiBidWlsdCBvblxuICogYW55IHZlcnNpb24gb2YgaXQgLS0gb3Igb24gaXRzIG93biBlcXVpdmFsZW50IC0tIGlzIGNvbmZpZ3VyYWJsZSB3aXRob3V0IGEgc2hhcmVkIG5vbWluYWwgdHlwZS5cbiAqL1xuaW50ZXJmYWNlIEVkaXRhYmxlU2V0dGluZ3NDb21wb25lbnQge1xuICByZWFkb25seSBlZGl0QW5kU2F2ZTogKHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IG9iamVjdCkgPT4gdm9pZCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgR2l0SHViIHJlbGVhc2Ugd2UgcmVhZC5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2Uge1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgdGFnLCBhIGJhcmUgdmVyc2lvbiBzdWNoIGFzIGAxLjIuM2AuXG4gICAqL1xuICByZWFkb25seSB0YWdfbmFtZTogc3RyaW5nO1xufVxuXG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19TVEFURV9LRVkgPSAnY29tbXVuaXR5UGx1Z2luRW50cmllc1Byb21pc2UnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfVVJMID0gJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL0hFQUQvY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayBjb25maWd1cmVDb21tdW5pdHlQbHVnaW59LlxuICovXG5leHBvcnQgZW51bSBDb25maWd1cmVDb21tdW5pdHlQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHdlcmUgYXBwbGllZCB0aHJvdWdoIHRoZSBydW5uaW5nIHBsdWdpbidzIG93biBzZXR0aW5ncyBjb21wb25lbnQsIHdoaWNoIGJvdGggdXBkYXRlZFxuICAgKiB0aGVtIGluIG1lbW9yeSBhbmQgcGVyc2lzdGVkIHRoZW0uIFRoZSBwbHVnaW4gaXMgYWxyZWFkeSB1c2luZyB0aGVtLCBzbyBpdCBtdXN0IE5PVCBiZSByZWxvYWRlZC5cbiAgICovXG4gIEFwcGxpZWRMaXZlID0gJ2FwcGxpZWRMaXZlJyxcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHdlcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgc28gbm90aGluZyB3YXMgd3JpdHRlbi5cbiAgICovXG4gIFNraXBwZWQgPSAnc2tpcHBlZCcsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyB3ZXJlIG1lcmdlZCBpbnRvIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgd2hpY2ggd2FzIHdyaXR0ZW4uXG4gICAqL1xuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgdXBkYXRlQ29tbXVuaXR5UGx1Z2lufS5cbiAqL1xuZXhwb3J0IGVudW0gVXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YWxsZWQgY29weSBpcyBhbHJlYWR5IGF0IChvciBwYXN0KSB0aGUgbGF0ZXN0IHJlbGVhc2UsIHNvIG5vdGhpbmcgd2FzIGRvd25sb2FkZWQuXG4gICAqL1xuICBBbHJlYWR5VXBUb0RhdGUgPSAnYWxyZWFkeVVwVG9EYXRlJyxcblxuICAvKipcbiAgICogVGhlIGxhdGVzdCByZWxlYXNlIHdhcyBpbnN0YWxsZWQgb3ZlciB0aGUgb2xkIGNvcHksIHdoaWNoIE9ic2lkaWFuIHJlbG9hZGVkIGlmIGl0IHdhcyBydW5uaW5nLlxuICAgKi9cbiAgVXBkYXRlZCA9ICd1cGRhdGVkJ1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIE9ic2lkaWFuIHJlZnVzZXMgdG8gZW5hYmxlIGEgcGx1Z2luOiBpdHMgYGVuYWJsZVBsdWdpbmAgLyBgZW5hYmxlUGx1Z2luQW5kU2F2ZWAgcmVzb2x2ZWRcbiAqIGBmYWxzZWAsIGJlY2F1c2UgdGhlIHBsdWdpbiBpcyB1bmtub3duLCBkZXByZWNhdGVkLCBkZXNrdG9wLW9ubHkgb24gbW9iaWxlLCBvciB0aHJldyB3aGlsZSBsb2FkaW5nLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRW5hYmxlUmVmdXNlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5FbmFibGVSZWZ1c2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiBPYnNpZGlhbiByZWZ1c2VkIHRvIGVuYWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBPYnNpZGlhbiByZWZ1c2VkIHRvIGVuYWJsZSB0aGUgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luRW5hYmxlUmVmdXNlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb21tdW5pdHkgcGx1Z2luLCBwcmVmZXJyaW5nIHRoZSBydW5uaW5nIHBsdWdpbidzIG93biBzZXR0aW5ncyBjb21wb25lbnQgb3ZlciBpdHNcbiAqIGBkYXRhLmpzb25gLlxuICpcbiAqIFdoZW4gdGhlIHBsdWdpbiBpcyBsb2FkZWQgQU5EIGV4cG9zZXMgYSBgcGx1Z2luU2V0dGluZ3NDb21wb25lbnRgIHdpdGggYW4gYGVkaXRBbmRTYXZlYCBtZXRob2QsIHRoZVxuICogc2V0dGluZ3MgYXJlIHNoYWxsb3ctbWVyZ2VkIHRocm91Z2ggaXQ6IHRoZXkgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkgYW5kIGFyZSBwZXJzaXN0ZWQsIHNvIHRoZSBwbHVnaW5cbiAqIG5lZWRzIG5vIHJlbG9hZCBhbmQge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5BcHBsaWVkTGl2ZX0gaXMgcmV0dXJuZWQuIFRoaXMgaXMgd2hhdCBsZXRzIGFcbiAqIHBsdWdpbidzIG93biBzY3JpcHQgcmVjb25maWd1cmUgaXQgd2l0aG91dCB0aGUgZGlzYWJsZS9lbmFibGUgY3ljbGUgdGhhdCB3b3VsZCB0ZWFyIGRvd24gdGhlIHZlcnkgY29kZVxuICogZG9pbmcgdGhlIHJlY29uZmlndXJpbmcuIE5vdGUgdGhhdCB0aGlzIHBhdGggcnVucyB0aGUgcGx1Z2luJ3Mgc2V0dGluZyB2YWxpZGF0b3JzLCBzbyBhbiBpbnZhbGlkIHZhbHVlXG4gKiBpcyByZXBsYWNlZCBieSBpdHMgZGVmYXVsdCByYXRoZXIgdGhhbiB3cml0dGVuIHRocm91Z2ggdmVyYmF0aW0uXG4gKlxuICogT3RoZXJ3aXNlIHRoZSBzZXR0aW5ncyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgc2hhbGxvdy1tZXJnZWQgb3ZlciBhbnkgZXhpc3RpbmdcbiAqIHNldHRpbmdzIChjcmVhdGluZyB0aGUgZmlsZSBpZiBhYnNlbnQpLiBXcml0aW5nIHNldHRpbmdzIEJFRk9SRSB0aGUgcGx1Z2luIGlzIGVuYWJsZWQgbWFrZXMgaXQgbG9hZFxuICogYWxyZWFkeSBjb25maWd1cmVkLCB3aXRoIG5vIHJlbG9hZC4gQSBuby1vcCB3cml0ZSBpcyBza2lwcGVkOiB3aGVuIHRoZSBtZXJnZSBjaGFuZ2VzIG5vdGhpbmcsIHRoZSBmaWxlXG4gKiBpcyBsZWZ0IHVudG91Y2hlZCBhbmQge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkfSBpcyByZXR1cm5lZCwgc28gYSBjYWxsZXIgY2FuIGF2b2lkXG4gKiByZWxvYWRpbmcgYW4gYWxyZWFkeS1jb3JyZWN0bHktY29uZmlndXJlZCBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8ge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5BcHBsaWVkTGl2ZX0gaWYgdGhlXG4gKiBydW5uaW5nIHBsdWdpbiBhcHBsaWVkIHRoZW0gaXRzZWxmIChubyByZWxvYWQgbmVlZGVkKSwge0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5TdWNjZXNzfSBpZlxuICogdGhlIGBkYXRhLmpzb25gIGNvbnRlbnQgY2hhbmdlZCAoYW5kIHdhcyB3cml0dGVuKSwgb3Ige0BsaW5rIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkfSBpZlxuICogdGhlIHNldHRpbmdzIHdlcmUgYWxyZWFkeSBwcmVzZW50IChub3RoaW5nIHdyaXR0ZW4pLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmZpZ3VyZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8Q29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0PiB7XG4gIGNvbnN0IHsgYXBwLCBzZXR0aW5ncyB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuXG4gIGNvbnN0IHNldHRpbmdzQ29tcG9uZW50ID0gZ2V0U2V0dGluZ3NDb21wb25lbnQoYXBwLnBsdWdpbnMucGx1Z2luc1twbHVnaW5JZF0pO1xuICBpZiAoY2hlY2tIYXNFZGl0QW5kU2F2ZShzZXR0aW5nc0NvbXBvbmVudCkpIHtcbiAgICBhd2FpdCBzZXR0aW5nc0NvbXBvbmVudC5lZGl0QW5kU2F2ZSgocGx1Z2luU2V0dGluZ3MpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luU2V0dGluZ3MsIHNldHRpbmdzKTtcbiAgICB9KTtcbiAgICByZXR1cm4gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LkFwcGxpZWRMaXZlO1xuICB9XG5cbiAgY29uc3QgZGF0YVBhdGggPSBgJHthcHAudmF1bHQuY29uZmlnRGlyfS9wbHVnaW5zLyR7cGx1Z2luSWR9L2RhdGEuanNvbmA7XG5cbiAgbGV0IGRhdGE6IG9iamVjdCA9IHt9O1xuICBpZiAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGRhdGFQYXRoKSkge1xuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChkYXRhUGF0aCkpO1xuICAgIGlmIChwYXJzZWQgIT09IG51bGwgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBwYXJzZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZEJlZm9yZSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICBPYmplY3QuYXNzaWduKGRhdGEsIHNldHRpbmdzKTtcbiAgaWYgKEpTT04uc3RyaW5naWZ5KGRhdGEpID09PSBzZXJpYWxpemVkQmVmb3JlKSB7XG4gICAgcmV0dXJuIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZCA9IFN0cmluZyhKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gIGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGRhdGFQYXRoLCBgJHtzZXJpYWxpemVkfVxcbmApO1xuICByZXR1cm4gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LlN1Y2Nlc3M7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgYSBjb21tdW5pdHkgcGx1Z2luIChwZXJzaXN0aW5nIHRoZSBjaGFuZ2UpIGlmIGl0IGlzIGN1cnJlbnRseSBlbmFibGVkLiBJZGVtcG90ZW50IOKAlCBhIG5vLW9wXG4gKiB3aGVuIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBkaXNhYmxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGRpc2FibGVkLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc2FibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBEaXNhYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmICghYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBhcHAucGx1Z2lucy5kaXNhYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5JZCk7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIGNvbW11bml0eSBwbHVnaW4gKHBlcnNpc3RpbmcgdGhlIGNoYW5nZSkgaWYgaXQgaXMgbm90IGFscmVhZHkgZW5hYmxlZC4gSWRlbXBvdGVudCDigJQgYSBuby1vcFxuICogd2hlbiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgZW5hYmxlZC5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKiBAdGhyb3dzIHtAbGluayBQbHVnaW5FbmFibGVSZWZ1c2VkRXJyb3J9IElmIE9ic2lkaWFuIHJlZnVzZWQgdG8gZW5hYmxlIHRoZSBwbHVnaW47IG5vdGhpbmcgaXMgc2F2ZWQgdGhlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IEVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW5JZCA9IGF3YWl0IHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChwYXJhbXMpO1xuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWF3YWl0IGFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbkFuZFNhdmUocGx1Z2luSWQpKSB7XG4gICAgdGhyb3cgbmV3IFBsdWdpbkVuYWJsZVJlZnVzZWRFcnJvcihwbHVnaW5JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYG93bmVyL25hbWVgIEdpdEh1YiByZXBvc2l0b3J5IG9mIGEgY29tbXVuaXR5IHBsdWdpbiBmcm9tIE9ic2lkaWFuJ3MgcHVibGljXG4gKiBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgcmVnaXN0cnkuXG4gKlxuICogVGhlIHJlZ2lzdHJ5IGlzIGZldGNoZWQgb25jZSBhbmQgY2FjaGVkIG9uIHRoZSBzaGFyZWQgcGx1Z2luIHN0YXRlIGZvciBzdWJzZXF1ZW50IGNhbGxzOyBhIGZhaWxlZFxuICogZmV0Y2ggaXMgbm90IGNhY2hlZCwgc28gYSBsYXRlciBjYWxsIHJldHJpZXMuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBpZCB0byBsb29rIHVwLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBwbHVnaW4ncyBgb3duZXIvbmFtZWAgcmVwb3NpdG9yeSwgb3IgYG51bGxgIGlmIHRoZVxuICogcGx1Z2luIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29tbXVuaXR5UGx1Z2luUmVwbyhwbHVnaW5JZDogc3RyaW5nKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBnZXRDb21tdW5pdHlQbHVnaW5FbnRyaWVzKCk7XG4gIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gcGx1Z2luSWQpO1xuICByZXR1cm4gZW50cnk/LnJlcG8gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbGF0ZXN0IHJlbGVhc2UgdmVyc2lvbiAodGhlIHJlbGVhc2UgYHRhZ19uYW1lYCwgYSBiYXJlIHZlcnNpb24gc3VjaCBhcyBgMS4yLjNgKSBvZiBhXG4gKiBHaXRIdWIgcmVwb3NpdG9yeS5cbiAqXG4gKiBAcGFyYW0gcmVwbyAtIFRoZSBgb3duZXIvbmFtZWAgR2l0SHViIHJlcG9zaXRvcnkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGxhdGVzdCByZWxlYXNlIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RSZWxlYXNlVmVyc2lvbihyZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvfS9yZWxlYXNlcy9sYXRlc3RgKTtcbiAgY29uc3QgcmVsZWFzZSA9IHJlc3BvbnNlLmpzb24gYXMgR2l0SHViUmVsZWFzZTtcbiAgcmV0dXJuIHJlbGVhc2UudGFnX25hbWU7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgYSBjb21tdW5pdHkgcGx1Z2luIGZyb20gdGhlIG9mZmljaWFsIHN0b3JlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGluc3RhbGxlZC4gSWRlbXBvdGVudCDigJQgYVxuICogbm8tb3Agd2hlbiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBSZXNvbHZlcyB0aGUgcGx1Z2luJ3MgcmVwb3NpdG9yeSBmcm9tIE9ic2lkaWFuJ3NcbiAqIGNvbW11bml0eSByZWdpc3RyeSwgcmVhZHMgdGhlIGxhdGVzdCByZWxlYXNlIHZlcnNpb24gYW5kIGl0cyBtYW5pZmVzdCwgYW5kIGluc3RhbGxzIGl0IHRocm91Z2hcbiAqIE9ic2lkaWFuJ3Mgb3duIGBpbnN0YWxsUGx1Z2luYCBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgaW5zdGFsbGVkLlxuICogQHRocm93cyBJZiB0aGUgcGx1Z2luIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBJbnN0YWxsQ29tbXVuaXR5UGx1Z2luUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGlmIChPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLm1hbmlmZXN0cywgcGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVwbyA9IGF3YWl0IGdldENvbW11bml0eVBsdWdpblJlcG8ocGx1Z2luSWQpO1xuICBpZiAoIXJlcG8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAnJHtwbHVnaW5JZH0nIHdhcyBub3QgZm91bmQgaW4gdGhlIE9ic2lkaWFuIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LmApO1xuICB9XG5cbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFJlbGVhc2VWZXJzaW9uKHJlcG8pO1xuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGdldFBsdWdpbk1hbmlmZXN0KHJlcG8sIHZlcnNpb24pO1xuICBhd2FpdCBhcHAucGx1Z2lucy5pbnN0YWxsUGx1Z2luKHJlcG8sIHZlcnNpb24sIG1hbmlmZXN0KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxscyBhIGNvbW11bml0eSBwbHVnaW4sIHdyaXRlcyBpdHMgc2V0dGluZ3MsIFRIRU4gZW5hYmxlcyBpdCDigJQgaW4gdGhhdCBvcmRlciDigJQgc28gdGhlIHBsdWdpblxuICogbG9hZHMgYWxyZWFkeSBjb25maWd1cmVkIChhIHBsdWdpbiBlbmFibGVkIGJlZm9yZSBpdCBpcyBjb25maWd1cmVkIHJ1bnMgaXRzIGBvbmxvYWRgIHdpdGggZGVmYXVsdFxuICogc2V0dGluZ3MgYW5kIGRvZXMgbm90aGluZyB1c2VmdWwpLiBJZiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgZW5hYmxlZCBhbmQgdGhlIHNldHRpbmdzIGNoYW5nZWQsIGl0IGlzXG4gKiBkaXNhYmxlZCBhbmQgcmUtZW5hYmxlZCBzbyB0aGUgbmV3IHNldHRpbmdzIHRha2UgZWZmZWN0LiBgc2V0dGluZ3NgIGlzIG9wdGlvbmFsOiBvbWl0IGl0IGZvciBhIHBsdWdpblxuICogdGhhdCBuZWVkcyBubyBjb25maWd1cmF0aW9uLiBDb21wb3NlcyB7QGxpbmsgaW5zdGFsbENvbW11bml0eVBsdWdpbn0sIHtAbGluayBjb25maWd1cmVDb21tdW5pdHlQbHVnaW59LFxuICoge0BsaW5rIGVuYWJsZUNvbW11bml0eVBsdWdpbn0gYW5kIHtAbGluayBkaXNhYmxlQ29tbXVuaXR5UGx1Z2lufS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBJbnN0YWxsQ29uZmlndXJlRW5hYmxlQ29tbXVuaXR5UGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGluc3RhbGxlZCwgY29uZmlndXJlZCBhbmQgZW5hYmxlZC5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQ29uZmlndXJlRW5hYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtczogSW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCwgc2V0dGluZ3MgfSA9IHBhcmFtcztcbiAgYXdhaXQgaW5zdGFsbENvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICBjb25zdCBkaWRTZXR0aW5nc0NoYW5nZSA9IHNldHRpbmdzID8gYXdhaXQgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2luKHsgLi4ucGFyYW1zLCBzZXR0aW5ncyB9KSA9PT0gQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LlN1Y2Nlc3MgOiBmYWxzZTtcbiAgY29uc3QgcGx1Z2luSWQgPSBhd2FpdCByZXNvbHZlQ29tbXVuaXR5UGx1Z2luSWQocGFyYW1zKTtcbiAgaWYgKCFhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMocGx1Z2luSWQpKSB7XG4gICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAoZGlkU2V0dGluZ3NDaGFuZ2UpIHtcbiAgICBhd2FpdCBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHBhcmFtcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWFyY2hlcyBPYnNpZGlhbidzIHB1YmxpYyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeSwgcmV0dXJuaW5nIHRoZSBpZCBhbmQgZGlzcGxheSBuYW1lIG9mIGV2ZXJ5XG4gKiBwbHVnaW4gd2hvc2UgaWQsIG5hbWUsIGF1dGhvciBvciBkZXNjcmlwdGlvbiBjb250YWlucyB0aGUgcXVlcnkgKGNhc2UtaW5zZW5zaXRpdmUpLiBBbiBlbXB0eSBxdWVyeVxuICogbWF0Y2hlcyBldmVyeSBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHNlYXJjaCBxdWVyeS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgbWF0Y2hpbmcgcGx1Z2lucycge0BsaW5rIENvbW11bml0eVBsdWdpblNlYXJjaFJlc3VsdH1zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoQ29tbXVuaXR5UGx1Z2lucyhxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxDb21tdW5pdHlQbHVnaW5TZWFyY2hSZXN1bHRbXT4ge1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luRW50cmllcygpO1xuICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PlxuICAgICAgZW50cnkuaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpXG4gICAgICB8fCBlbnRyeS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgICAgfHwgZW50cnkuYXV0aG9yLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgICAgfHwgZW50cnkuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpXG4gICAgKVxuICAgIC5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgaWQ6IGVudHJ5LmlkLFxuICAgICAgbmFtZTogZW50cnkubmFtZVxuICAgIH0pKTtcbn1cblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGEgY29tbXVuaXR5IHBsdWdpbiB0byBtYXRjaCB0aGUgZGVzaXJlZCBzdGF0ZS4gRGVsZWdhdGVzIHRvXG4gKiB7QGxpbmsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lufSAvIHtAbGluayBkaXNhYmxlQ29tbXVuaXR5UGx1Z2lufSwgc28gaXQgaXMgaWRlbXBvdGVudC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBUb2dnbGVFbmFibGVDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gbWF0Y2hlcyB0aGUgZGVzaXJlZCBlbmFibGVkIHN0YXRlLlxuICogQHRocm93cyBJZiBzZWxlY3RlZCBieSBgcGx1Z2luTmFtZWAgYW5kIHRoZSBuYW1lIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IFRvZ2dsZUVuYWJsZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocGFyYW1zLmlzRW5hYmxlZCkge1xuICAgIGF3YWl0IGVuYWJsZUNvbW11bml0eVBsdWdpbihwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGRpc2FibGVDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgfVxufVxuXG4vKipcbiAqIEluc3RhbGxzIG9yIHVuaW5zdGFsbHMgYSBjb21tdW5pdHkgcGx1Z2luIHRvIG1hdGNoIHRoZSBkZXNpcmVkIHN0YXRlLiBEZWxlZ2F0ZXMgdG9cbiAqIHtAbGluayBpbnN0YWxsQ29tbXVuaXR5UGx1Z2lufSAvIHtAbGluayB1bmluc3RhbGxDb21tdW5pdHlQbHVnaW59LCBzbyBpdCBpcyBpZGVtcG90ZW50LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFRvZ2dsZUluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gbWF0Y2hlcyB0aGUgZGVzaXJlZCBpbnN0YWxsZWQgc3RhdGUuXG4gKiBAdGhyb3dzIElmIGluc3RhbGxpbmcgYW5kIHRoZSBwbHVnaW4gaXMgbm90IGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlSW5zdGFsbENvbW11bml0eVBsdWdpbihwYXJhbXM6IFRvZ2dsZUluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBhcmFtcy5pc0luc3RhbGxlZCkge1xuICAgIGF3YWl0IGluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB1bmluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zKTtcbiAgfVxufVxuXG4vKipcbiAqIFVuaW5zdGFsbHMgYSBjb21tdW5pdHkgcGx1Z2luIGlmIGl0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQuIElkZW1wb3RlbnQg4oCUIGEgbm8tb3Agd2hlbiB0aGUgcGx1Z2luIGlzXG4gKiBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFVuaW5zdGFsbENvbW11bml0eVBsdWdpblBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyB1bmluc3RhbGxlZC5cbiAqIEB0aHJvd3MgSWYgc2VsZWN0ZWQgYnkgYHBsdWdpbk5hbWVgIGFuZCB0aGUgbmFtZSBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGxDb21tdW5pdHlQbHVnaW4ocGFyYW1zOiBVbmluc3RhbGxDb21tdW5pdHlQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgcGx1Z2luSWQgPSBhd2FpdCByZXNvbHZlQ29tbXVuaXR5UGx1Z2luSWQocGFyYW1zKTtcbiAgaWYgKCFPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLm1hbmlmZXN0cywgcGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IGFwcC5wbHVnaW5zLnVuaW5zdGFsbFBsdWdpbihwbHVnaW5JZCk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhbiBpbnN0YWxsZWQgY29tbXVuaXR5IHBsdWdpbiB0byBpdHMgbGF0ZXN0IHJlbGVhc2UsIHRoZSB3YXkgdGhlIGNvbW11bml0eSBwbHVnaW4gYnJvd3NlcidzIG93blxuICogYFVwZGF0ZWAgYnV0dG9uIGRvZXMuXG4gKlxuICogT2JzaWRpYW4ncyBgaW5zdGFsbFBsdWdpbmAgd3JpdGVzIHRoZSByZWxlYXNlJ3MgZmlsZXMgb3ZlciB0aGUgaW5zdGFsbGVkIGNvcHkgYW5kLCB3aGVuIHRoZSBwbHVnaW4gaXNcbiAqIHJ1bm5pbmcsIGRpc2FibGVzIGFuZCByZS1lbmFibGVzIGl0IHNvIHRoZSBuZXcgY29kZSBsb2FkcyDigJQgcmVhZCBmcm9tIHRoZSBzaGlwcGVkIGJ1bmRsZSAoYDEuMTQuNGApLCBub3RcbiAqIGFzc3VtZWQuIEl0IHJlcG9ydHMgaXRzIG93biBmYWlsdXJlcyAoYSBmYWlsZWQgZG93bmxvYWQsIGEgbWFuaWZlc3Qgd2hvc2UgaWQgZG9lcyBub3QgbWF0Y2gpIGFzIGEgbm90aWNlXG4gKiBhbmQgUkVUVVJOUyByYXRoZXIgdGhhbiB0aHJvd2luZywgc28gdGhlIGluc3RhbGxlZCBtYW5pZmVzdCBpcyByZS1yZWFkIGFmdGVyd2FyZHMgYW5kIGEgdmVyc2lvbiB0aGF0IGRpZFxuICogbm90IG1vdmUgdG8gdGhlIHJlbGVhc2UgaXMgdGhyb3duIGFzIGEgZmFpbHVyZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBVcGRhdGVDb21tdW5pdHlQbHVnaW5QYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHtAbGluayBVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQuVXBkYXRlZH0gb25jZSB0aGUgbGF0ZXN0IHJlbGVhc2VcbiAqIGlzIGluc3RhbGxlZCwgb3Ige0BsaW5rIFVwZGF0ZUNvbW11bml0eVBsdWdpblJlc3VsdC5BbHJlYWR5VXBUb0RhdGV9IHdoZW4gdGhlIGluc3RhbGxlZCBjb3B5IGlzIG5vdCBvbGRlclxuICogdGhhbiBpdC5cbiAqIEB0aHJvd3MgSWYgdGhlIHBsdWdpbiBpcyBub3QgaW5zdGFsbGVkLCBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnksIG9yIHRoZVxuICogaW5zdGFsbCBkaWQgbm90IGxlYXZlIHRoZSBsYXRlc3QgcmVsZWFzZSBpbiBwbGFjZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNvbW11bml0eVBsdWdpbihwYXJhbXM6IFVwZGF0ZUNvbW11bml0eVBsdWdpblBhcmFtcyk6IFByb21pc2U8VXBkYXRlQ29tbXVuaXR5UGx1Z2luUmVzdWx0PiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBsdWdpbklkID0gYXdhaXQgcmVzb2x2ZUNvbW11bml0eVBsdWdpbklkKHBhcmFtcyk7XG4gIGNvbnN0IGluc3RhbGxlZE1hbmlmZXN0ID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW3BsdWdpbklkXTtcbiAgaWYgKCFpbnN0YWxsZWRNYW5pZmVzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICcke3BsdWdpbklkfScgaXMgbm90IGluc3RhbGxlZCwgc28gaXQgY2Fubm90IGJlIHVwZGF0ZWQuYCk7XG4gIH1cblxuICBjb25zdCByZXBvID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luUmVwbyhwbHVnaW5JZCk7XG4gIGlmICghcmVwbykge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICcke3BsdWdpbklkfScgd2FzIG5vdCBmb3VuZCBpbiB0aGUgT2JzaWRpYW4gY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0UmVsZWFzZVZlcnNpb24ocmVwbyk7XG4gIGlmIChpc0F0TGVhc3RWZXJzaW9uKGluc3RhbGxlZE1hbmlmZXN0LnZlcnNpb24sIHZlcnNpb24pKSB7XG4gICAgcmV0dXJuIFVwZGF0ZUNvbW11bml0eVBsdWdpblJlc3VsdC5BbHJlYWR5VXBUb0RhdGU7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGdldFBsdWdpbk1hbmlmZXN0KHJlcG8sIHZlcnNpb24pO1xuICBhd2FpdCBhcHAucGx1Z2lucy5pbnN0YWxsUGx1Z2luKHJlcG8sIHZlcnNpb24sIG1hbmlmZXN0KTtcblxuICBjb25zdCB1cGRhdGVkVmVyc2lvbiA9IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/LnZlcnNpb247XG4gIGlmICh1cGRhdGVkVmVyc2lvbiAhPT0gbWFuaWZlc3QudmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBVcGRhdGluZyBwbHVnaW4gJyR7cGx1Z2luSWR9JyB0byAke21hbmlmZXN0LnZlcnNpb259IGxlZnQgdmVyc2lvbiAke3VwZGF0ZWRWZXJzaW9uID8/ICcobm9uZSknfSBpbnN0YWxsZWQuIE9ic2lkaWFuIHJlcG9ydHMgdGhlIGNhdXNlIGFzIGEgbm90aWNlLmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFVwZGF0ZUNvbW11bml0eVBsdWdpblJlc3VsdC5VcGRhdGVkO1xufVxuXG4vLyBXaGV0aGVyIGEgcGx1Z2luJ3MgYHBsdWdpblNldHRpbmdzQ29tcG9uZW50YCBjYW4gY29uZmlndXJlIGl0c2VsZiBpbiBwbGFjZS4gU3RydWN0dXJhbCByYXRoZXIgdGhhbiBhblxuLy8gYGluc3RhbmNlb2ZgOiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgZnJvbSBpdHMgb3duIGJ1bmRsZSwgc28gZXZlbiBhIHBsdWdpbiBidWlsdCBvbiB0aGlzIHZlcnkgbGlicmFyeVxuLy8gY2FycmllcyBpdHMgb3duIGNvcHkgb2YgdGhlIGNsYXNzIGFuZCB3b3VsZCBmYWlsIGFuIGlkZW50aXR5IGNoZWNrLlxuZnVuY3Rpb24gY2hlY2tIYXNFZGl0QW5kU2F2ZShzZXR0aW5nc0NvbXBvbmVudDogdW5rbm93bik6IHNldHRpbmdzQ29tcG9uZW50IGlzIEVkaXRhYmxlU2V0dGluZ3NDb21wb25lbnQge1xuICByZXR1cm4gdHlwZW9mIHNldHRpbmdzQ29tcG9uZW50ID09PSAnb2JqZWN0J1xuICAgICYmIHNldHRpbmdzQ29tcG9uZW50ICE9PSBudWxsXG4gICAgJiYgJ2VkaXRBbmRTYXZlJyBpbiBzZXR0aW5nc0NvbXBvbmVudFxuICAgICYmIHR5cGVvZiBzZXR0aW5nc0NvbXBvbmVudC5lZGl0QW5kU2F2ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hDb21tdW5pdHlQbHVnaW5FbnRyaWVzKCk6IFByb21pc2U8Q29tbXVuaXR5UGx1Z2luRW50cnlbXT4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoQ09NTVVOSVRZX1BMVUdJTlNfVVJMKTtcbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24gYXMgQ29tbXVuaXR5UGx1Z2luRW50cnlbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29tbXVuaXR5UGx1Z2luRW50cmllcygpOiBQcm9taXNlPENvbW11bml0eVBsdWdpbkVudHJ5W10+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRPYnNpZGlhbkxpYlN0YXRlPG51bGwgfCBQcm9taXNlPENvbW11bml0eVBsdWdpbkVudHJ5W10+PihDT01NVU5JVFlfUExVR0lOU19TVEFURV9LRVksIG51bGwpO1xuICBjYWNoZS52YWx1ZSA/Pz0gZmV0Y2hDb21tdW5pdHlQbHVnaW5FbnRyaWVzKCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY2FjaGUudmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FjaGUudmFsdWUgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBsdWdpbk1hbmlmZXN0KHJlcG86IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5NYW5pZmVzdD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG99L3JlbGVhc2VzL2Rvd25sb2FkLyR7dmVyc2lvbn0vbWFuaWZlc3QuanNvbmApO1xuICByZXR1cm4gcmVzcG9uc2UuanNvbiBhcyBQbHVnaW5NYW5pZmVzdDtcbn1cblxuLy8gUmVhZHMgYSBsb2FkZWQgcGx1Z2luJ3MgYHBsdWdpblNldHRpbmdzQ29tcG9uZW50YCwgb3IgYG51bGxgIHdoZW4gaXQgaGFzIG5vbmUuIFRha2VzIGB1bmtub3duYCBiZWNhdXNlXG4vLyBBIHBsdWdpbiBpcyB1bmRlciBubyBvYmxpZ2F0aW9uIHRvIGV4cG9zZSBvbmUsIHNvIHRoZXJlIGlzIG5vIHR5cGUgdG8gbmFycm93IGZyb20uXG5mdW5jdGlvbiBnZXRTZXR0aW5nc0NvbXBvbmVudChwbHVnaW46IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIHR5cGVvZiBwbHVnaW4gIT09ICdvYmplY3QnIHx8IHBsdWdpbiA9PT0gbnVsbCB8fCAhKCdwbHVnaW5TZXR0aW5nc0NvbXBvbmVudCcgaW4gcGx1Z2luKSA/IG51bGwgOiBwbHVnaW4ucGx1Z2luU2V0dGluZ3NDb21wb25lbnQ7XG59XG5cbi8vIEEgdmVyc2lvbiB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgcmVhZHMgYXMgb2xkZXIsIHNvIGFuIHVwZGF0ZSBpcyBhdHRlbXB0ZWQgcmF0aGVyIHRoYW4gc2tpcHBlZDogdGhlIGluc3RhbGwnc1xuLy8gb3duIHZlcnNpb24gY2hlY2sgYWZ0ZXJ3YXJkcyBzdGlsbCBjYXRjaGVzIGEgcmVsZWFzZSB0aGF0IGRvZXMgbm90IG1vdmUgaXQuXG5mdW5jdGlvbiBpc0F0TGVhc3RWZXJzaW9uKGluc3RhbGxlZFZlcnNpb246IHN0cmluZywgbGF0ZXN0VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNvbXBhcmVWZXJzaW9ucyhpbnN0YWxsZWRWZXJzaW9uLCBsYXRlc3RWZXJzaW9uLCAnPj0nKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDb21tdW5pdHlQbHVnaW5JZChyZWZlcmVuY2U6IENvbW11bml0eVBsdWdpblJlZik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmICgncGx1Z2luSWQnIGluIHJlZmVyZW5jZSkge1xuICAgIHJldHVybiByZWZlcmVuY2UucGx1Z2luSWQ7XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luRW50cmllcygpO1xuICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gcmVmZXJlbmNlLnBsdWdpbk5hbWUpO1xuICBpZiAoIWVudHJ5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gbmFtZWQgJyR7cmVmZXJlbmNlLnBsdWdpbk5hbWV9JyB3YXMgbm90IGZvdW5kIGluIHRoZSBPYnNpZGlhbiBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgfVxuICByZXR1cm4gZW50cnkuaWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLFNBQVMsV0FBVyx1QkFBdUI7QUFDM0MsU0FBUyxrQkFBa0I7QUFFM0IsU0FBUywyQkFBMkI7QUEwTHBDLE1BQU0sOEJBQThCO0FBQ3BDLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sbUJBQW1CO0FBS2xCLElBQUssaUNBQUwsa0JBQUtBLG9DQUFMO0FBS0wsRUFBQUEsZ0NBQUEsaUJBQWM7QUFLZCxFQUFBQSxnQ0FBQSxhQUFVO0FBS1YsRUFBQUEsZ0NBQUEsYUFBVTtBQWZBLFNBQUFBO0FB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QVE7QUFFdkQsUUFBTSxpQkFBaUIsSUFBSSxRQUFRLFVBQVUsUUFBUSxHQUFHO0FBQ3hELE1BQUksbUJBQW1CLFNBQVMsU0FBUztBQUN2QyxVQUFNLElBQUk7QUFBQSxNQUNSLG9CQUFvQixRQUFRLFFBQVEsU0FBUyxPQUFPLGlCQUFpQixrQkFBa0IsUUFBUTtBQUFBLElBQ2pHO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUtBLFNBQVMsb0JBQW9CLG1CQUE0RTtBQUN2RyxTQUFPLE9BQU8sc0JBQXNCLFlBQy9CLHNCQUFzQixRQUN0QixpQkFBaUIscUJBQ2pCLE9BQU8sa0JBQWtCLGdCQUFnQjtBQUNoRDtBQUVBLGVBQWUsOEJBQStEO0FBQzVFLFFBQU0sV0FBVyxNQUFNLFdBQVcscUJBQXFCO0FBQ3ZELFNBQU8sU0FBUztBQUNsQjtBQUVBLGVBQWUsNEJBQTZEO0FBQzFFLFFBQU0sUUFBUSxvQkFBNEQsNkJBQTZCLElBQUk7QUFDM0csUUFBTSxVQUFVLDRCQUE0QjtBQUU1QyxNQUFJO0FBQ0YsV0FBTyxNQUFNLE1BQU07QUFBQSxFQUNyQixTQUFTLE9BQU87QUFDZCxVQUFNLFFBQVE7QUFDZCxVQUFNO0FBQUEsRUFDUjtBQUNGO0FBRUEsZUFBZSxrQkFBa0IsTUFBYyxTQUEwQztBQUN2RixRQUFNLFdBQVcsTUFBTSxXQUFXLHNCQUFzQixJQUFJLHNCQUFzQixPQUFPLGdCQUFnQjtBQUN6RyxTQUFPLFNBQVM7QUFDbEI7QUFJQSxTQUFTLHFCQUFxQixRQUEwQjtBQUN0RCxTQUFPLE9BQU8sV0FBVyxZQUFZLFdBQVcsUUFBUSxFQUFFLDZCQUE2QixVQUFVLE9BQU8sT0FBTztBQUNqSDtBQUlBLFNBQVMsaUJBQWlCLGtCQUEwQixlQUFnQztBQUNsRixNQUFJO0FBQ0YsV0FBTyxnQkFBZ0Isa0JBQWtCLGVBQWUsSUFBSTtBQUFBLEVBQzlELFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsZUFBZSx5QkFBeUIsV0FBZ0Q7QUFDdEYsTUFBSSxjQUFjLFdBQVc7QUFDM0IsV0FBTyxVQUFVO0FBQUEsRUFDbkI7QUFFQSxRQUFNLFVBQVUsTUFBTSwwQkFBMEI7QUFDaEQsUUFBTSxRQUFRLFFBQVEsS0FBSyxDQUFDLGNBQWMsVUFBVSxTQUFTLFVBQVUsVUFBVTtBQUNqRixNQUFJLENBQUMsT0FBTztBQUNWLFVBQU0sSUFBSSxNQUFNLGlCQUFpQixVQUFVLFVBQVUsNkRBQTZEO0FBQUEsRUFDcEg7QUFDQSxTQUFPLE1BQU07QUFDZjsiLCJuYW1lcyI6WyJDb25maWd1cmVDb21tdW5pdHlQbHVnaW5SZXN1bHQiLCJVcGRhdGVDb21tdW5pdHlQbHVnaW5SZXN1bHQiXX0=