obsidian-dev-utils 80.0.2 → 81.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/dev/main.js +30208 -0
  3. package/dist/dev/manifest.json +9 -0
  4. package/dist/lib/cjs/async-events.cjs +9 -1
  5. package/dist/lib/cjs/async-events.d.cts +8 -0
  6. package/dist/lib/cjs/async.cjs +89 -34
  7. package/dist/lib/cjs/async.d.cts +67 -15
  8. package/dist/lib/cjs/debug.cjs +26 -9
  9. package/dist/lib/cjs/debug.d.cts +23 -5
  10. package/dist/lib/cjs/error.cjs +4 -5
  11. package/dist/lib/cjs/error.d.cts +19 -4
  12. package/dist/lib/cjs/html-element.cjs +1 -1
  13. package/dist/lib/cjs/html-element.d.cts +2 -0
  14. package/dist/lib/cjs/library.cjs +2 -2
  15. package/dist/lib/cjs/object-utils.cjs +233 -128
  16. package/dist/lib/cjs/object-utils.d.cts +19 -4
  17. package/dist/lib/cjs/obsidian/async-with-notice.cjs +9 -6
  18. package/dist/lib/cjs/obsidian/async-with-notice.d.cts +9 -0
  19. package/dist/lib/cjs/obsidian/attachment-path.cjs +45 -13
  20. package/dist/lib/cjs/obsidian/attachment-path.d.cts +38 -8
  21. package/dist/lib/cjs/obsidian/backlink.cjs +6 -6
  22. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +53 -16
  23. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +81 -9
  24. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +25 -5
  25. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +35 -1
  26. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +33 -19
  27. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.d.cts +43 -17
  28. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +33 -19
  29. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.d.cts +43 -17
  30. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +17 -9
  31. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +48 -8
  32. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +3 -1
  33. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +3 -1
  34. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +24 -8
  35. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +25 -4
  36. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +144 -65
  37. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +3 -0
  38. package/dist/lib/cjs/obsidian/dataview-link.cjs +7 -2
  39. package/dist/lib/cjs/obsidian/dataview-link.d.cts +20 -5
  40. package/dist/lib/cjs/obsidian/dataview.cjs +27 -10
  41. package/dist/lib/cjs/obsidian/dataview.d.cts +19 -4
  42. package/dist/lib/cjs/obsidian/file-change.cjs +103 -27
  43. package/dist/lib/cjs/obsidian/file-change.d.cts +50 -13
  44. package/dist/lib/cjs/obsidian/file-manager.cjs +61 -32
  45. package/dist/lib/cjs/obsidian/file-manager.d.cts +63 -13
  46. package/dist/lib/cjs/obsidian/file-system.cjs +122 -23
  47. package/dist/lib/cjs/obsidian/file-system.d.cts +168 -39
  48. package/dist/lib/cjs/obsidian/frontmatter.cjs +7 -2
  49. package/dist/lib/cjs/obsidian/link.cjs +266 -122
  50. package/dist/lib/cjs/obsidian/link.d.cts +84 -20
  51. package/dist/lib/cjs/obsidian/logger.cjs +48 -22
  52. package/dist/lib/cjs/obsidian/logger.d.cts +26 -5
  53. package/dist/lib/cjs/obsidian/loop.cjs +14 -4
  54. package/dist/lib/cjs/obsidian/loop.d.cts +5 -0
  55. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +155 -107
  56. package/dist/lib/cjs/obsidian/markdown.cjs +40 -11
  57. package/dist/lib/cjs/obsidian/markdown.d.cts +76 -16
  58. package/dist/lib/cjs/obsidian/metadata-cache.cjs +28 -14
  59. package/dist/lib/cjs/obsidian/metadata-cache.d.cts +76 -16
  60. package/dist/lib/cjs/obsidian/path-settings.cjs +5 -2
  61. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +5 -1
  62. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +4 -0
  63. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +15 -7
  64. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +39 -8
  65. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +3 -2
  66. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +4 -4
  67. package/dist/lib/cjs/obsidian/queue.cjs +9 -7
  68. package/dist/lib/cjs/obsidian/resource-url.cjs +7 -2
  69. package/dist/lib/cjs/obsidian/resource-url.d.cts +19 -4
  70. package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +4 -2
  71. package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +6 -2
  72. package/dist/lib/cjs/obsidian/vault-delete.cjs +19 -15
  73. package/dist/lib/cjs/obsidian/vault-delete.d.cts +11 -6
  74. package/dist/lib/cjs/obsidian/vault.cjs +116 -59
  75. package/dist/lib/cjs/obsidian/vault.d.cts +178 -41
  76. package/dist/lib/cjs/path.cjs +12 -5
  77. package/dist/lib/cjs/path.d.cts +15 -3
  78. package/dist/lib/cjs/reg-exp.cjs +101 -78
  79. package/dist/lib/cjs/script-utils/build.cjs +9 -5
  80. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +34 -14
  81. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +20 -5
  82. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +23 -5
  83. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +11 -4
  84. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +6 -2
  85. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +31 -12
  86. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +19 -4
  87. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +7 -7
  88. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +12 -3
  89. package/dist/lib/cjs/script-utils/cli-utils.cjs +6 -2
  90. package/dist/lib/cjs/script-utils/exec.cjs +47 -12
  91. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -3
  92. package/dist/lib/cjs/script-utils/json.cjs +9 -5
  93. package/dist/lib/cjs/script-utils/json.d.cts +38 -8
  94. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +8 -3
  95. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +27 -7
  96. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +7 -3
  97. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +8 -3
  98. package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -3
  99. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +3 -3
  100. package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +72 -30
  101. package/dist/lib/cjs/script-utils/npm-publish.cjs +2 -2
  102. package/dist/lib/cjs/script-utils/npm.cjs +18 -9
  103. package/dist/lib/cjs/script-utils/root.cjs +20 -5
  104. package/dist/lib/cjs/script-utils/root.d.cts +45 -9
  105. package/dist/lib/cjs/script-utils/validate-declarations.cjs +4 -3
  106. package/dist/lib/cjs/script-utils/version.cjs +36 -19
  107. package/dist/lib/cjs/strict-proxy.cjs +10 -1
  108. package/dist/lib/cjs/string.cjs +63 -22
  109. package/dist/lib/cjs/string.d.cts +188 -40
  110. package/dist/lib/esm/async-events.d.mts +8 -0
  111. package/dist/lib/esm/async-events.mjs +9 -1
  112. package/dist/lib/esm/async.d.mts +67 -15
  113. package/dist/lib/esm/async.mjs +89 -34
  114. package/dist/lib/esm/debug.d.mts +23 -5
  115. package/dist/lib/esm/debug.mjs +26 -9
  116. package/dist/lib/esm/error.d.mts +19 -4
  117. package/dist/lib/esm/error.mjs +4 -5
  118. package/dist/lib/esm/html-element.d.mts +2 -0
  119. package/dist/lib/esm/html-element.mjs +1 -1
  120. package/dist/lib/esm/library.mjs +2 -2
  121. package/dist/lib/esm/object-utils.d.mts +19 -4
  122. package/dist/lib/esm/object-utils.mjs +233 -128
  123. package/dist/lib/esm/obsidian/async-with-notice.d.mts +9 -0
  124. package/dist/lib/esm/obsidian/async-with-notice.mjs +9 -6
  125. package/dist/lib/esm/obsidian/attachment-path.d.mts +38 -8
  126. package/dist/lib/esm/obsidian/attachment-path.mjs +45 -13
  127. package/dist/lib/esm/obsidian/backlink.mjs +6 -6
  128. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +81 -9
  129. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +53 -16
  130. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +35 -1
  131. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +25 -5
  132. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.d.mts +43 -17
  133. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +33 -19
  134. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.d.mts +43 -17
  135. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +33 -19
  136. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +48 -8
  137. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +17 -9
  138. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +3 -1
  139. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +3 -1
  140. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +25 -4
  141. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +24 -8
  142. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +3 -0
  143. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +145 -69
  144. package/dist/lib/esm/obsidian/dataview-link.d.mts +20 -5
  145. package/dist/lib/esm/obsidian/dataview-link.mjs +7 -2
  146. package/dist/lib/esm/obsidian/dataview.d.mts +19 -4
  147. package/dist/lib/esm/obsidian/dataview.mjs +27 -10
  148. package/dist/lib/esm/obsidian/file-change.d.mts +50 -13
  149. package/dist/lib/esm/obsidian/file-change.mjs +104 -27
  150. package/dist/lib/esm/obsidian/file-manager.d.mts +63 -13
  151. package/dist/lib/esm/obsidian/file-manager.mjs +65 -33
  152. package/dist/lib/esm/obsidian/file-system.d.mts +168 -39
  153. package/dist/lib/esm/obsidian/file-system.mjs +122 -23
  154. package/dist/lib/esm/obsidian/frontmatter.mjs +7 -2
  155. package/dist/lib/esm/obsidian/link.d.mts +84 -20
  156. package/dist/lib/esm/obsidian/link.mjs +266 -122
  157. package/dist/lib/esm/obsidian/logger.d.mts +26 -5
  158. package/dist/lib/esm/obsidian/logger.mjs +48 -22
  159. package/dist/lib/esm/obsidian/loop.d.mts +5 -0
  160. package/dist/lib/esm/obsidian/loop.mjs +14 -4
  161. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +155 -107
  162. package/dist/lib/esm/obsidian/markdown.d.mts +76 -16
  163. package/dist/lib/esm/obsidian/markdown.mjs +40 -11
  164. package/dist/lib/esm/obsidian/metadata-cache.d.mts +76 -16
  165. package/dist/lib/esm/obsidian/metadata-cache.mjs +28 -14
  166. package/dist/lib/esm/obsidian/path-settings.mjs +5 -2
  167. package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +4 -0
  168. package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +5 -1
  169. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +39 -8
  170. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +15 -7
  171. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +4 -4
  172. package/dist/lib/esm/obsidian/plugin/plugin.mjs +5 -7
  173. package/dist/lib/esm/obsidian/queue.mjs +9 -7
  174. package/dist/lib/esm/obsidian/resource-url.d.mts +19 -4
  175. package/dist/lib/esm/obsidian/resource-url.mjs +7 -2
  176. package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +6 -2
  177. package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +4 -2
  178. package/dist/lib/esm/obsidian/vault-delete.d.mts +11 -6
  179. package/dist/lib/esm/obsidian/vault-delete.mjs +19 -15
  180. package/dist/lib/esm/obsidian/vault.d.mts +178 -41
  181. package/dist/lib/esm/obsidian/vault.mjs +116 -59
  182. package/dist/lib/esm/path.d.mts +15 -3
  183. package/dist/lib/esm/path.mjs +12 -5
  184. package/dist/lib/esm/reg-exp.mjs +101 -78
  185. package/dist/lib/esm/script-utils/build.mjs +9 -5
  186. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +34 -14
  187. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +23 -5
  188. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +20 -5
  189. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +11 -4
  190. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +6 -2
  191. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +19 -4
  192. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +31 -12
  193. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +7 -7
  194. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +12 -3
  195. package/dist/lib/esm/script-utils/cli-utils.mjs +6 -2
  196. package/dist/lib/esm/script-utils/exec.mjs +47 -12
  197. package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -3
  198. package/dist/lib/esm/script-utils/json.d.mts +38 -8
  199. package/dist/lib/esm/script-utils/json.mjs +9 -5
  200. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +8 -3
  201. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +27 -7
  202. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +7 -3
  203. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +8 -3
  204. package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -3
  205. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +3 -3
  206. package/dist/lib/esm/script-utils/linters/over-exposure.mjs +72 -30
  207. package/dist/lib/esm/script-utils/npm-publish.mjs +2 -2
  208. package/dist/lib/esm/script-utils/npm.mjs +18 -9
  209. package/dist/lib/esm/script-utils/root.d.mts +45 -9
  210. package/dist/lib/esm/script-utils/root.mjs +20 -5
  211. package/dist/lib/esm/script-utils/validate-declarations.mjs +4 -3
  212. package/dist/lib/esm/script-utils/version.mjs +36 -19
  213. package/dist/lib/esm/strict-proxy.mjs +10 -1
  214. package/dist/lib/esm/string.d.mts +188 -40
  215. package/dist/lib/esm/string.mjs +63 -22
  216. package/dist/styles.css +5 -1
  217. package/package.json +9 -9
@@ -262,7 +262,11 @@ class PluginSettingsComponentBase extends import_component_ex.ComponentEx {
262
262
  const parsedSettings = await this.rawRecordToSettings(rawRecord);
263
263
  const validationResult = await this.validate(parsedSettings);
264
264
  for (const propertyName of this.propertyNames) {
265
- this.setPropertyImpl(propertyName, parsedSettings[propertyName], validationResult[propertyName]);
265
+ this.setPropertyImpl({
266
+ propertyName,
267
+ validationMessage: validationResult[propertyName],
268
+ value: parsedSettings[propertyName]
269
+ });
266
270
  }
267
271
  this.lastSavedState = await this.cloneState(this.currentState);
268
272
  const newRecord = await this.settingsToRawRecord(this.currentState.inputValues);
@@ -301,6 +305,8 @@ class PluginSettingsComponentBase extends import_component_ex.ComponentEx {
301
305
  * @param callback - The callback to call when the event is triggered.
302
306
  * @param thisArg - The context passed as `this` to the `callback`.
303
307
  * @returns A reference to the event listener.
308
+ *
309
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
304
310
  */
305
311
  on(name, callback, thisArg) {
306
312
  return this.asyncEvents.on(name, callback, thisArg);
@@ -316,6 +322,8 @@ class PluginSettingsComponentBase extends import_component_ex.ComponentEx {
316
322
  * @param callback - The callback to call when the event is triggered.
317
323
  * @param thisArg - The context passed as `this` to the `callback`.
318
324
  * @returns A reference to the event listener.
325
+ *
326
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
319
327
  */
320
328
  once(name, callback, thisArg) {
321
329
  return this.asyncEvents.once(name, callback, thisArg);
@@ -334,7 +342,7 @@ class PluginSettingsComponentBase extends import_component_ex.ComponentEx {
334
342
  */
335
343
  async onloadAsync() {
336
344
  (0, import_async_events_component.registerAsyncEvent)(this, this.on("loadSettings", this.onLoadSettings.bind(this)));
337
- (0, import_async_events_component.registerAsyncEvent)(this, this.on("saveSettings", this.onSaveSettings.bind(this)));
345
+ (0, import_async_events_component.registerAsyncEvent)(this, this.on("saveSettings", (newState, oldState, context) => this.onSaveSettings({ context, newState, oldState })));
338
346
  (0, import_async_events_component.registerAsyncEvent)(this, this.pluginEventSource.on("externalSettingsChange", this.onExternalSettingsChange.bind(this)));
339
347
  await this.loadFromFile(true);
340
348
  }
@@ -466,11 +474,14 @@ class PluginSettingsComponentBase extends import_component_ex.ComponentEx {
466
474
  /**
467
475
  * Called when settings are saved.
468
476
  *
469
- * @param _newState - The new settings state.
470
- * @param _oldState - The old settings state.
471
- * @param _context - The save context.
477
+ * @param params - The parameters.
472
478
  */
473
- async onSaveSettings(_newState, _oldState, _context) {
479
+ async onSaveSettings(params) {
480
+ const {
481
+ context: _context,
482
+ newState: _newState,
483
+ oldState: _oldState
484
+ } = params;
474
485
  await (0, import_function.noopAsync)();
475
486
  }
476
487
  /**
@@ -561,7 +572,12 @@ class PluginSettingsComponentBase extends import_component_ex.ComponentEx {
561
572
  async saveToFileImpl() {
562
573
  await this.dataHandler.saveData(await this.settingsToRawRecord(this.currentState.inputValues));
563
574
  }
564
- setPropertyImpl(propertyName, value, validationMessage) {
575
+ setPropertyImpl(params) {
576
+ const {
577
+ propertyName,
578
+ validationMessage,
579
+ value
580
+ } = params;
565
581
  const defaults = this.defaultSettings;
566
582
  this.currentState.inputValues[propertyName] = value;
567
583
  this.currentState.validationMessages[propertyName] = validationMessage ?? "";
@@ -580,4 +596,4 @@ class PluginSettingsComponentBase extends import_component_ex.ComponentEx {
580
596
  0 && (module.exports = {
581
597
  PluginSettingsComponentBase
582
598
  });
583
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbXBvbmVudCB0aGF0IG1hbmFnZXMgcGx1Z2luIHNldHRpbmdzOiBkYXRhLCBwZXJzaXN0ZW5jZSwgdmFsaWRhdGlvbiwgYW5kIGV2ZW50cy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgcHVibGljLWZhY2luZyBzZXR0aW5ncyBBUEkgZm9yIHBsdWdpbiBhdXRob3JzLlxuICogQWxsIHNldHRpbmdzIGxvZ2ljIChsb2FkLCBzYXZlLCB2YWxpZGF0ZSwgdHJhbnNmb3JtLCBjbG9uZSkgaXMgaGFuZGxlZCBkaXJlY3RseVxuICogYnkgdGhpcyBjb21wb25lbnQgXHUyMDE0IG5vIHNlcGFyYXRlIG1hbmFnZXIgY2xhc3MgaXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFzeW5jRXZlbnRSZWYsXG4gIEFzeW5jRXZlbnRTb3VyY2Vcbn0gZnJvbSAnLi4vLi4vYXN5bmMtZXZlbnRzLnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBNYXliZVJldHVybixcbiAgU3RyaW5nS2V5c1xufSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRGF0YUhhbmRsZXIgfSBmcm9tICcuLi9kYXRhLWhhbmRsZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5FdmVudFNvdXJjZSB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tZXZlbnQtc291cmNlLnRzJztcblxuaW1wb3J0IHsgQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi8uLi9kZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNcbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgY2FzdFRvLFxuICBkZWVwRXF1YWwsXG4gIGdldEFsbEtleXNcbn0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IERhdGVUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9kYXRlLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IER1cmF0aW9uVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvZHVyYXRpb24tdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgR3JvdXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9ncm91cC10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBNYXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9tYXAtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgU2V0VHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvc2V0LXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9za2lwLXByaXZhdGUtcHJvcGVydHktdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgVHdvV2F5TWFwVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvdHdvLXdheS1tYXAtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgVmFsdWVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdmFsdWUtd3JhcHBlci50cyc7XG5pbXBvcnQgeyByZWdpc3RlckFzeW5jRXZlbnQgfSBmcm9tICcuL2FzeW5jLWV2ZW50cy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbmNvbnN0IGRlZmF1bHRUcmFuc2Zvcm1lciA9IG5ldyBHcm91cFRyYW5zZm9ybWVyKFtcbiAgbmV3IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lcigpLFxuICBuZXcgRGF0ZVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEdXJhdGlvblRyYW5zZm9ybWVyKCksXG4gIG5ldyBNYXBUcmFuc2Zvcm1lcigpLFxuICBuZXcgU2V0VHJhbnNmb3JtZXIoKSxcbiAgbmV3IFR3b1dheU1hcFRyYW5zZm9ybWVyKClcbl0pO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUNvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzPiB7XG4gIC8qKlxuICAgKiBUaGUgZGF0YSBoYW5kbGVyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YUhhbmRsZXI6IERhdGFIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGV2ZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbkV2ZW50U291cmNlOiBQbHVnaW5FdmVudFNvdXJjZTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBzZXR0aW5ncyBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ2xhc3M6IENvbnN0cnVjdG9yPFBsdWdpblNldHRpbmdzLCBbXT47XG59XG5cbi8qKlxuICogQSBzbmFwc2hvdCBvZiBwbHVnaW4gc2V0dGluZ3Mgc3RhdGUsIGluY2x1ZGluZyByYXcgaW5wdXQgdmFsdWVzLCBlZmZlY3RpdmUgKHZhbGlkYXRlZCkgdmFsdWVzLFxuICogYW5kIHBlci1wcm9wZXJ0eSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBlZmZlY3RpdmUgc2V0dGluZ3MgdmFsdWVzIHVzZWQgYnkgdGhlIHBsdWdpbi4gSW52YWxpZCBwcm9wZXJ0aWVzIGFyZSByZXBsYWNlZCB3aXRoIGRlZmF1bHRzLlxuICAgKi9cbiAgZWZmZWN0aXZlVmFsdWVzOiBQbHVnaW5TZXR0aW5ncztcblxuICAvKipcbiAgICogVGhlIHJhdyBpbnB1dCB2YWx1ZXMgYXMgZW50ZXJlZCBieSB0aGUgdXNlci4gTWF5IGNvbnRhaW4gaW52YWxpZCB2YWx1ZXMuXG4gICAqL1xuICBpbnB1dFZhbHVlczogUGx1Z2luU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFBlci1wcm9wZXJ0eSB2YWxpZGF0aW9uIG1lc3NhZ2VzLiBFbXB0eSBzdHJpbmcgbWVhbnMgdmFsaWQuXG4gICAqL1xuICB2YWxpZGF0aW9uTWVzc2FnZXM6IFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBSZWFkb25seSB2ZXJzaW9uIG9mIHtAbGluayBQbHVnaW5TZXR0aW5nc30uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3M8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPjtcblxuLyoqXG4gKiBSZWFkb25seSB2ZXJzaW9uIG9mIHtAbGluayBQbHVnaW5TZXR0aW5nc1N0YXRlfSBmb3IgdXNlIGluIGV2ZW50IGNhbGxiYWNrcyBhbmQgcHVibGljIGdldHRlcnMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4+O1xuXG4vKipcbiAqIEEgdmFsaWRhdG9yIGZ1bmN0aW9uIGZvciBhIHNldHRpbmdzIHByb3BlcnR5LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lLlxuICovXG5leHBvcnQgdHlwZSBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdCwgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4gPSBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4gPSAoXG4gIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdLFxuICBzZXR0aW5nczogUGx1Z2luU2V0dGluZ3NcbikgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGxvYWRTZXR0aW5nczogW1xuICAgIGxvYWRlZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIGlzSW5pdGlhbExvYWQ6IGJvb2xlYW5cbiAgXTtcbiAgc2F2ZVNldHRpbmdzOiBbXG4gICAgbmV3U3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgb2xkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgY29udGV4dDogdW5rbm93blxuICBdO1xufVxuXG50eXBlIFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz47XG5cbnR5cGUgUHJvcGVydHlWYWx1ZXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz5dO1xuXG50eXBlIFZhbGlkYXRpb25SZXN1bHQ8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUGFydGlhbDxSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz4+O1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHBsdWdpbiBzZXR0aW5ncyBjb21wb25lbnRzLlxuICpcbiAqIE1hbmFnZXMgc2V0dGluZ3MgZGF0YSwgcGVyc2lzdGVuY2UsIHZhbGlkYXRpb24sIGFuZCBldmVudHMuXG4gKiBQbHVnaW4gYXV0aG9ycyBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHtAbGluayBjcmVhdGVEZWZhdWx0U2V0dGluZ3N9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcmVxdWlyZS1jb21wb25lbnQtc3VmZml4IC0tIE5vbi1hYnN0cmFjdCBiYXNlIGNsYXNzOyBjb25zdW1lcnMgZXh0ZW5kIGl0LlxuZXhwb3J0IGNsYXNzIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBDb21wb25lbnRFeCBpbXBsZW1lbnRzIEFzeW5jRXZlbnRTb3VyY2U8UGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+PiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWFkb25seSBkZWZhdWx0IHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBzZXR0aW5ncyAoYXMgYSByZWFkb25seSBvYmplY3QpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRTZXR0aW5nczogUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVhZG9ubHkgZWZmZWN0aXZlIHNldHRpbmdzICh2YWxpZGF0ZWQsIHdpdGggZGVmYXVsdHMgc3Vic3RpdHV0ZWQgZm9yIGludmFsaWQgdmFsdWVzKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlYWRvbmx5IGVmZmVjdGl2ZSBzZXR0aW5ncy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NTdGF0ZS5lZmZlY3RpdmVWYWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzZXR0aW5ncyBzdGF0ZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNldHRpbmdzU3RhdGUoKTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlIGFzIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFzeW5jRXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPj4oKTtcbiAgcHJpdmF0ZSBjdXJyZW50U3RhdGU6IFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFIYW5kbGVyOiBEYXRhSGFuZGxlcjtcbiAgcHJpdmF0ZSBsYXN0U2F2ZWRTdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzOiAoKHJlY29yZDogR2VuZXJpY09iamVjdCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luRXZlbnRTb3VyY2U6IFBsdWdpbkV2ZW50U291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ2xhc3M6IENvbnN0cnVjdG9yPFBsdWdpblNldHRpbmdzLCBbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlOYW1lczogUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz5bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcnMgPSBuZXcgTWFwPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncz4+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlQ29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRhdGFIYW5kbGVyID0gcGFyYW1zLmRhdGFIYW5kbGVyO1xuICAgIHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcyA9IHBhcmFtcy5wbHVnaW5TZXR0aW5nc0NsYXNzO1xuICAgIHRoaXMucGx1Z2luRXZlbnRTb3VyY2UgPSBwYXJhbXMucGx1Z2luRXZlbnRTb3VyY2U7XG5cbiAgICB0aGlzLmRlZmF1bHRTZXR0aW5ncyA9IG5ldyB0aGlzLnBsdWdpblNldHRpbmdzQ2xhc3MoKSBhcyBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLmxhc3RTYXZlZFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLnByb3BlcnR5TmFtZXMgPSBnZXRBbGxLZXlzKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcbiAgICB0aGlzLnJlZ2lzdGVyVmFsaWRhdG9ycygpO1xuICAgIHRoaXMucmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgcGx1Z2luIHNldHRpbmdzIGFuZCBzYXZlcyB0aGVtLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3NFZGl0b3IgLSBUaGUgZWRpdG9yLlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBjb250ZXh0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlZGl0QW5kU2F2ZShzZXR0aW5nc0VkaXRvcjogKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncykgPT4gUHJvbWlzYWJsZTx2b2lkPiwgY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGF3YWl0IHRoaXMuZWRpdChzZXR0aW5nc0VkaXRvcik7XG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlKGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIHNldHRpbmdzIGFyZSBzYWZlLlxuICAgKlxuICAgKiBJdCBydW5zIHZhbGlkYXRpb24gZm9yIGVhY2ggcHJvcGVydHkgYW5kIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbGlkYXRpb24gZmFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2FmZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnN1cmVTYWZlKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlKHNldHRpbmdzKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gZGVmYXVsdHNbcHJvcGVydHlOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHNhZmUgY29weSBvZiB0aGUgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2FmZSBjb3B5IG9mIHRoZSBzZXR0aW5ncy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTYWZlQ29weShzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2FmZVNldHRpbmdzID0gYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNhZmUoc2FmZVNldHRpbmdzKTtcbiAgICByZXR1cm4gc2FmZVNldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgZnJvbSB0aGUgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGlzSW5pdGlhbExvYWQgLSBXaGV0aGVyIHRoZSBzZXR0aW5ncyBhcmUgYmVpbmcgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRGcm9tRmlsZShpc0luaXRpYWxMb2FkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5kYXRhSGFuZGxlci5sb2FkRGF0YSgpO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgc2V0dGluZ3MgZnJvbSBkYXRhLmpzb24uIEV4cGVjdGVkIE9iamVjdCwgZ290OiAke3R5cGVvZiBkYXRhfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd1JlY29yZCA9IGRhdGEgYXMgR2VuZXJpY09iamVjdDtcbiAgICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0gYXdhaXQgdGhpcy5yYXdSZWNvcmRUb1NldHRpbmdzKHJhd1JlY29yZCk7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZShwYXJzZWRTZXR0aW5ncyk7XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5SW1wbChwcm9wZXJ0eU5hbWUsIHBhcnNlZFNldHRpbmdzW3Byb3BlcnR5TmFtZV0sIHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSBhd2FpdCB0aGlzLmNsb25lU3RhdGUodGhpcy5jdXJyZW50U3RhdGUpO1xuXG4gICAgICBjb25zdCBuZXdSZWNvcmQgPSBhd2FpdCB0aGlzLnNldHRpbmdzVG9SYXdSZWNvcmQodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuXG4gICAgICBpZiAoIWRlZXBFcXVhbChuZXdSZWNvcmQsIGRhdGEpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZUltcGwoKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5hc3luY0V2ZW50cy50cmlnZ2VyQXN5bmMoJ2xvYWRTZXR0aW5ncycsIHRoaXMuY3VycmVudFN0YXRlIGFzIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sIGlzSW5pdGlhbExvYWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgb2ZmPFxuICAgIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICBBcmdzIGV4dGVuZHMgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+ID8gUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+W0V2ZW50TmFtZV1cbiAgICAgIDogdW5rbm93bltdXG4gID4obmFtZTogRXZlbnROYW1lLCBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4pOiB2b2lkIHtcbiAgICB0aGlzLmFzeW5jRXZlbnRzLm9mZihuYW1lLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgdGhpcy5hc3luY0V2ZW50cy5vZmZyZWYoZXZlbnRSZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBvbjxcbiAgICBFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gICAgQXJncyBleHRlbmRzIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPiA/IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPltFdmVudE5hbWVdXG4gICAgICA6IHVua25vd25bXVxuICA+KG5hbWU6IEV2ZW50TmFtZSwgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LCB0aGlzQXJnPzogdW5rbm93bik6IEFzeW5jRXZlbnRSZWYge1xuICAgIHJldHVybiB0aGlzLmFzeW5jRXZlbnRzLm9uKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBvbmNlPFxuICAgIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICBBcmdzIGV4dGVuZHMgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+ID8gUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+W0V2ZW50TmFtZV1cbiAgICAgIDogdW5rbm93bltdXG4gID4obmFtZTogRXZlbnROYW1lLCBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4sIHRoaXNBcmc/OiB1bmtub3duKTogQXN5bmNFdmVudFJlZiB7XG4gICAgcmV0dXJuIHRoaXMuYXN5bmNFdmVudHMub25jZShuYW1lLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGV4dGVybmFsIHNldHRpbmdzIGNoYW5nZS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgcmVsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgb25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG4gICAgYXdhaXQgdGhpcy5sb2FkRnJvbUZpbGUoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHNldHRpbmdzIGZyb20gZmlsZSBhbmQgcmVnaXN0ZXJzIGV2ZW50IGhhbmRsZXJzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9ubG9hZEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCB0aGlzLm9uKCdsb2FkU2V0dGluZ3MnLCB0aGlzLm9uTG9hZFNldHRpbmdzLmJpbmQodGhpcykpKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgdGhpcy5vbignc2F2ZVNldHRpbmdzJywgdGhpcy5vblNhdmVTZXR0aW5ncy5iaW5kKHRoaXMpKSk7XG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KHRoaXMsIHRoaXMucGx1Z2luRXZlbnRTb3VyY2Uub24oJ2V4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLCB0aGlzLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZS5iaW5kKHRoaXMpKSk7XG4gICAgYXdhaXQgdGhpcy5sb2FkRnJvbUZpbGUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBMZWdhY3lTZXR0aW5ncyAtIFRoZSBsZWdhY3kgc2V0dGluZ3MgY2xhc3MuXG4gICAqIEBwYXJhbSBsZWdhY3lTZXR0aW5nc0NsYXNzIC0gVGhlIGxlZ2FjeSBzZXR0aW5ncyBjbGFzcy5cbiAgICogQHBhcmFtIGNvbnZlcnRlciAtIFRoZSBjb252ZXJ0ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcjxMZWdhY3lTZXR0aW5ncyBleHRlbmRzIG9iamVjdD4oXG4gICAgbGVnYWN5U2V0dGluZ3NDbGFzczogbmV3ICgpID0+IExlZ2FjeVNldHRpbmdzLFxuICAgIGNvbnZlcnRlcjogKGxlZ2FjeVNldHRpbmdzOiBQYXJ0aWFsPExlZ2FjeVNldHRpbmdzPiAmIFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+KSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRoaXNXcmFwcGVyID0gVmFsdWVXcmFwcGVyLm9mKHRoaXMpO1xuICAgIHRoaXMubGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzLnB1c2gobGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXIpO1xuXG4gICAgZnVuY3Rpb24gbGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXIocmVjb3JkOiBHZW5lcmljT2JqZWN0KTogdm9pZCB7XG4gICAgICBjb25zdCBsZWdhY3lTZXR0aW5nc0tleXMgPSBuZXcgU2V0PHN0cmluZz4oT2JqZWN0LmtleXMobmV3IGxlZ2FjeVNldHRpbmdzQ2xhc3MoKSkpO1xuICAgICAgY29uc3QgcGx1Z2luU2V0dGluZ0tleXMgPSBuZXcgU2V0PHN0cmluZz4odGhpc1dyYXBwZXIudmFsdWUucHJvcGVydHlOYW1lcyk7XG4gICAgICBjb25zdCBsZWdhY3lTZXR0aW5ncyA9IHJlY29yZCBhcyBQYXJ0aWFsPExlZ2FjeVNldHRpbmdzPiAmIFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+O1xuICAgICAgY29udmVydGVyKGxlZ2FjeVNldHRpbmdzKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGxlZ2FjeVNldHRpbmdzKSkge1xuICAgICAgICBpZiAocGx1Z2luU2V0dGluZ0tleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGVnYWN5U2V0dGluZ3NLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gICAgICAgIGRlbGV0ZSByZWNvcmRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmFsaWRhdG9yIGZvciBhIHByb3BlcnR5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXR0aW5ncyBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHZhbGlkYXRvciAtIFRoZSB2YWxpZGF0b3IuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJWYWxpZGF0b3I8UHJvcGVydHlOYW1lIGV4dGVuZHMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbGlkYXRvcjogU2V0dGluZ3NWYWxpZGF0b3I8UGx1Z2luU2V0dGluZ3MsIFByb3BlcnR5TmFtZT5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0b3JzLnNldChwcm9wZXJ0eU5hbWUsIHZhbGlkYXRvciBhcyBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncz4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmFsaWRhdGVzIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmV2YWxpZGF0ZSgpOiBQcm9taXNlPFJlY29yZDxQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPj4ge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG4gICAgYXdhaXQgdGhpcy5lZGl0KG5vb3ApO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXM7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIG5ldyBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgb2YgdGhlIHNhdmUgdG8gZmlsZSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVUb0ZpbGUoY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGlmIChkZWVwRXF1YWwodGhpcy5sYXN0U2F2ZWRTdGF0ZS5pbnB1dFZhbHVlcywgdGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlSW1wbCgpO1xuICAgIGF3YWl0IHRoaXMuYXN5bmNFdmVudHMudHJpZ2dlckFzeW5jKFxuICAgICAgJ3NhdmVTZXR0aW5ncycsXG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZSBhcyBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSBhcyBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgICAgY29udGV4dFxuICAgICk7XG4gICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IGF3YWl0IHRoaXMuY2xvbmVTdGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRQcm9wZXJ0eTxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsdWU6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGF3YWl0IHRoaXMuZWRpdCgoc2V0dGluZ3MpID0+IHtcbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZGF0aW9uIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ8UGx1Z2luU2V0dGluZ3M+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBWYWxpZGF0aW9uUmVzdWx0PFBsdWdpblNldHRpbmdzPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgdmFsaWRhdG9yXSBvZiB0aGlzLnZhbGlkYXRvcnMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZSA9IGF3YWl0IHZhbGlkYXRvcihzZXR0aW5nc1twcm9wZXJ0eU5hbWVdLCBzZXR0aW5ncyk7XG4gICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRyYW5zZm9ybWVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VHJhbnNmb3JtZXIoKTogVHJhbnNmb3JtZXIge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNmb3JtZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyByZWNvcmQgaXMgbG9hZGVkIGZyb20gZGlzay5cbiAgICpcbiAgICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkUmVjb3JkKHJlY29yZDogR2VuZXJpY09iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIHRoaXMubGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzKSB7XG4gICAgICBjb252ZXJ0ZXIocmVjb3JkKTtcbiAgICB9XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gc2V0dGluZ3MgYXJlIGxvYWRlZCBvciByZWxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIF9sb2FkZWRTdGF0ZSAtIFRoZSBsb2FkZWQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqIEBwYXJhbSBfaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgaW5pdGlhbCBsb2FkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uTG9hZFNldHRpbmdzKFxuICAgIF9sb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBfaXNJbml0aWFsTG9hZDogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBfbmV3U3RhdGUgLSBUaGUgbmV3IHNldHRpbmdzIHN0YXRlLlxuICAgKiBAcGFyYW0gX29sZFN0YXRlIC0gVGhlIG9sZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICogQHBhcmFtIF9jb250ZXh0IC0gVGhlIHNhdmUgY29udGV4dC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNhdmVTZXR0aW5ncyhcbiAgICBfbmV3U3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgX29sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIF9jb250ZXh0OiB1bmtub3duXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgcmVjb3JkIGlzIGFib3V0IHRvIGJlIHNhdmVkIHRvIGRpc2suXG4gICAqXG4gICAqIEBwYXJhbSBfcmVjb3JkIC0gVGhlIHJlY29yZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNhdmluZ1JlY29yZChfcmVjb3JkOiBHZW5lcmljT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBsZWdhY3kgc2V0dGluZ3MgY29udmVydGVycy5cbiAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgdmFsaWRhdG9ycy5cbiAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgdmFsaWRhdG9ycyBmb3IgcHJvcGVydGllcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlclZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9uZVNldHRpbmdzKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCB0aGlzLnNldHRpbmdzVG9SYXdSZWNvcmQoc2V0dGluZ3MpO1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShyZWNvcmQpO1xuICAgIGNvbnN0IGNsb25lUmVjb3JkID0gSlNPTi5wYXJzZShqc29uKSBhcyBHZW5lcmljT2JqZWN0O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJhd1JlY29yZFRvU2V0dGluZ3MoY2xvbmVSZWNvcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9uZVN0YXRlKFxuICAgIHN0YXRlOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPlxuICApOiBQcm9taXNlPFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVmZmVjdGl2ZVZhbHVlczogYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHN0YXRlLmVmZmVjdGl2ZVZhbHVlcyksXG4gICAgICBpbnB1dFZhbHVlczogYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHN0YXRlLmlucHV0VmFsdWVzKSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlczogeyAuLi5zdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXMgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlZmF1bHRTdGF0ZSgpOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVmZmVjdGl2ZVZhbHVlczogbmV3IHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcygpLFxuICAgICAgaW5wdXRWYWx1ZXM6IG5ldyB0aGlzLnBsdWdpblNldHRpbmdzQ2xhc3MoKSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlczogY2FzdFRvPFJlY29yZDxQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPj4oe30pXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZWRpdChzZXR0aW5nc0VkaXRvcjogKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncykgPT4gUHJvbWlzYWJsZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR0aW5nc0VkaXRvcih0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZSA9IHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSA/PyAnJztcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncyBhcyBQbHVnaW5TZXR0aW5ncztcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZWZmZWN0aXZlVmFsdWVzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZVxuICAgICAgICAgID8gZGVmYXVsdHNbcHJvcGVydHlOYW1lXVxuICAgICAgICAgIDogdGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcDogdW5rbm93bik6IHByb3AgaXMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHRoaXMucHJvcGVydHlOYW1lcyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJhd1JlY29yZFRvU2V0dGluZ3MocmF3UmVjb3JkOiBHZW5lcmljT2JqZWN0KTogUHJvbWlzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJhd1JlY29yZCA9IHRoaXMuZ2V0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm1PYmplY3RSZWN1cnNpdmVseShyYXdSZWNvcmQpO1xuICAgIGF3YWl0IHRoaXMub25Mb2FkUmVjb3JkKHJhd1JlY29yZCk7XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyB0aGlzLnBsdWdpblNldHRpbmdzQ2xhc3MoKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3UmVjb3JkKSkge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSkge1xuICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgZGVmYXVsdHNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShcbiAgICAgICAgICAnUG9zc2libGUgaW52YWxpZCB2YWx1ZSB0eXBlLiBJdCBtaWdodCBsZWFkIHRvIGFuIHVuZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbi4gVGhlcmUgaXMgYWxzbyBhIGNoYW5jZSBpdCBpcyBhIGZhbHNlLW5lZ2F0aXZlIHdhcm5pbmcsIGFzIHdlIGFyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdCB0eXBlIG9mIHRoZSB2YWx1ZSBpbiBydW50aW1lLicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZSBhcyBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncz47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlVG9GaWxlSW1wbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRhdGFIYW5kbGVyLnNhdmVEYXRhKGF3YWl0IHRoaXMuc2V0dGluZ3NUb1Jhd1JlY29yZCh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0eUltcGwoXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPixcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZXM8UGx1Z2luU2V0dGluZ3M+LFxuICAgIHZhbGlkYXRpb25NZXNzYWdlPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIHRoaXMuY3VycmVudFN0YXRlLnZhbGlkYXRpb25NZXNzYWdlc1twcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2UgPz8gJyc7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUuZWZmZWN0aXZlVmFsdWVzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZSA/IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV0gOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0dGluZ3NUb1Jhd1JlY29yZChzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPEdlbmVyaWNPYmplY3Q+IHtcbiAgICBjb25zdCByYXdSZWNvcmQ6IEdlbmVyaWNPYmplY3QgPSB7fTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgcmF3UmVjb3JkW3Byb3BlcnR5TmFtZV0gPSBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMub25TYXZpbmdSZWNvcmQocmF3UmVjb3JkKTtcblxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmF3UmVjb3JkKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNkJBLDBCQUE0QjtBQUM1QixtQkFBK0I7QUFDL0Isc0JBR087QUFDUCwwQkFJTztBQUNQLDhCQUFnQztBQUNoQyxrQ0FBb0M7QUFDcEMsK0JBQWlDO0FB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
599
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbXBvbmVudCB0aGF0IG1hbmFnZXMgcGx1Z2luIHNldHRpbmdzOiBkYXRhLCBwZXJzaXN0ZW5jZSwgdmFsaWRhdGlvbiwgYW5kIGV2ZW50cy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgcHVibGljLWZhY2luZyBzZXR0aW5ncyBBUEkgZm9yIHBsdWdpbiBhdXRob3JzLlxuICogQWxsIHNldHRpbmdzIGxvZ2ljIChsb2FkLCBzYXZlLCB2YWxpZGF0ZSwgdHJhbnNmb3JtLCBjbG9uZSkgaXMgaGFuZGxlZCBkaXJlY3RseVxuICogYnkgdGhpcyBjb21wb25lbnQgXHUyMDE0IG5vIHNlcGFyYXRlIG1hbmFnZXIgY2xhc3MgaXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFzeW5jRXZlbnRSZWYsXG4gIEFzeW5jRXZlbnRTb3VyY2Vcbn0gZnJvbSAnLi4vLi4vYXN5bmMtZXZlbnRzLnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBNYXliZVJldHVybixcbiAgU3RyaW5nS2V5c1xufSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRGF0YUhhbmRsZXIgfSBmcm9tICcuLi9kYXRhLWhhbmRsZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5FdmVudFNvdXJjZSB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tZXZlbnQtc291cmNlLnRzJztcblxuaW1wb3J0IHsgQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi8uLi9kZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNcbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgY2FzdFRvLFxuICBkZWVwRXF1YWwsXG4gIGdldEFsbEtleXNcbn0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IERhdGVUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9kYXRlLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IER1cmF0aW9uVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvZHVyYXRpb24tdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgR3JvdXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9ncm91cC10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBNYXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9tYXAtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgU2V0VHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvc2V0LXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9za2lwLXByaXZhdGUtcHJvcGVydHktdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgVHdvV2F5TWFwVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvdHdvLXdheS1tYXAtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgVmFsdWVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdmFsdWUtd3JhcHBlci50cyc7XG5pbXBvcnQgeyByZWdpc3RlckFzeW5jRXZlbnQgfSBmcm9tICcuL2FzeW5jLWV2ZW50cy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbmNvbnN0IGRlZmF1bHRUcmFuc2Zvcm1lciA9IG5ldyBHcm91cFRyYW5zZm9ybWVyKFtcbiAgbmV3IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lcigpLFxuICBuZXcgRGF0ZVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEdXJhdGlvblRyYW5zZm9ybWVyKCksXG4gIG5ldyBNYXBUcmFuc2Zvcm1lcigpLFxuICBuZXcgU2V0VHJhbnNmb3JtZXIoKSxcbiAgbmV3IFR3b1dheU1hcFRyYW5zZm9ybWVyKClcbl0pO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUNvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzPiB7XG4gIC8qKlxuICAgKiBUaGUgZGF0YSBoYW5kbGVyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YUhhbmRsZXI6IERhdGFIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGV2ZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbkV2ZW50U291cmNlOiBQbHVnaW5FdmVudFNvdXJjZTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBzZXR0aW5ncyBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ2xhc3M6IENvbnN0cnVjdG9yPFBsdWdpblNldHRpbmdzLCBbXT47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZS5vblNhdmVTZXR0aW5nc30uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlT25TYXZlU2V0dGluZ3NQYXJhbXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBzYXZlIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHNldHRpbmdzIHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcbn1cblxuLyoqXG4gKiBBIHNuYXBzaG90IG9mIHBsdWdpbiBzZXR0aW5ncyBzdGF0ZSwgaW5jbHVkaW5nIHJhdyBpbnB1dCB2YWx1ZXMsIGVmZmVjdGl2ZSAodmFsaWRhdGVkKSB2YWx1ZXMsXG4gKiBhbmQgcGVyLXByb3BlcnR5IHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIGVmZmVjdGl2ZSBzZXR0aW5ncyB2YWx1ZXMgdXNlZCBieSB0aGUgcGx1Z2luLiBJbnZhbGlkIHByb3BlcnRpZXMgYXJlIHJlcGxhY2VkIHdpdGggZGVmYXVsdHMuXG4gICAqL1xuICBlZmZlY3RpdmVWYWx1ZXM6IFBsdWdpblNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBUaGUgcmF3IGlucHV0IHZhbHVlcyBhcyBlbnRlcmVkIGJ5IHRoZSB1c2VyLiBNYXkgY29udGFpbiBpbnZhbGlkIHZhbHVlcy5cbiAgICovXG4gIGlucHV0VmFsdWVzOiBQbHVnaW5TZXR0aW5ncztcblxuICAvKipcbiAgICogUGVyLXByb3BlcnR5IHZhbGlkYXRpb24gbWVzc2FnZXMuIEVtcHR5IHN0cmluZyBtZWFucyB2YWxpZC5cbiAgICovXG4gIHZhbGlkYXRpb25NZXNzYWdlczogUmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJlYWRvbmx5IHZlcnNpb24gb2Yge0BsaW5rIFBsdWdpblNldHRpbmdzfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVhZG9ubHlQbHVnaW5TZXR0aW5nczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuXG4vKipcbiAqIFJlYWRvbmx5IHZlcnNpb24gb2Yge0BsaW5rIFBsdWdpblNldHRpbmdzU3RhdGV9IGZvciB1c2UgaW4gZXZlbnQgY2FsbGJhY2tzIGFuZCBwdWJsaWMgZ2V0dGVycy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPj47XG5cbi8qKlxuICogQSB2YWxpZGF0b3IgZnVuY3Rpb24gZm9yIGEgc2V0dGluZ3MgcHJvcGVydHkuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUuXG4gKi9cbmV4cG9ydCB0eXBlIFNldHRpbmdzVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LCBQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiA9IFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PiA9IChcbiAgdmFsdWU6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0sXG4gIHNldHRpbmdzOiBQbHVnaW5TZXR0aW5nc1xuKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgbG9hZFNldHRpbmdzOiBbXG4gICAgbG9hZGVkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgaXNJbml0aWFsTG9hZDogYm9vbGVhblxuICBdO1xuICBzYXZlU2V0dGluZ3M6IFtcbiAgICBuZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBvbGRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBjb250ZXh0OiB1bmtub3duXG4gIF07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZS5zZXRQcm9wZXJ0eUltcGx9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlU2V0UHJvcGVydHlJbXBsUGFyYW1zPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIHZhbGlkYXRpb24gbWVzc2FnZS4gRW1wdHkgb3IgdW5zZXQgbWVhbnMgdmFsaWQuXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0aW9uTWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRvIHNldC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncz47XG59XG5cbnR5cGUgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPjtcblxudHlwZSBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPl07XG5cbnR5cGUgVmFsaWRhdGlvblJlc3VsdDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBQYXJ0aWFsPFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPj47XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudHMuXG4gKlxuICogTWFuYWdlcyBzZXR0aW5ncyBkYXRhLCBwZXJzaXN0ZW5jZSwgdmFsaWRhdGlvbiwgYW5kIGV2ZW50cy5cbiAqIFBsdWdpbiBhdXRob3JzIGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBpbXBsZW1lbnQge0BsaW5rIGNyZWF0ZURlZmF1bHRTZXR0aW5nc30uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9yZXF1aXJlLWNvbXBvbmVudC1zdWZmaXggLS0gTm9uLWFic3RyYWN0IGJhc2UgY2xhc3M7IGNvbnN1bWVycyBleHRlbmQgaXQuXG5leHBvcnQgY2xhc3MgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIENvbXBvbmVudEV4IGltcGxlbWVudHMgQXN5bmNFdmVudFNvdXJjZTxQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4+IHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlYWRvbmx5IGRlZmF1bHQgc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IHNldHRpbmdzIChhcyBhIHJlYWRvbmx5IG9iamVjdCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFNldHRpbmdzOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWFkb25seSBlZmZlY3RpdmUgc2V0dGluZ3MgKHZhbGlkYXRlZCwgd2l0aCBkZWZhdWx0cyBzdWJzdGl0dXRlZCBmb3IgaW52YWxpZCB2YWx1ZXMpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVhZG9ubHkgZWZmZWN0aXZlIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXR0aW5ncygpOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1N0YXRlLmVmZmVjdGl2ZVZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHNldHRpbmdzIHN0YXRlIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3NTdGF0ZSgpOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUgYXMgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXN5bmNFdmVudHMgPSBuZXcgQXN5bmNFdmVudHM8UGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+PigpO1xuICBwcml2YXRlIGN1cnJlbnRTdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YUhhbmRsZXI6IERhdGFIYW5kbGVyO1xuICBwcml2YXRlIGxhc3RTYXZlZFN0YXRlOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcbiAgcHJpdmF0ZSByZWFkb25seSBsZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnM6ICgocmVjb3JkOiBHZW5lcmljT2JqZWN0KSA9PiB2b2lkKVtdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5FdmVudFNvdXJjZTogUGx1Z2luRXZlbnRTb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luU2V0dGluZ3NDbGFzczogQ29uc3RydWN0b3I8UGx1Z2luU2V0dGluZ3MsIFtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWVzOiBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPltdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9ycyA9IG5ldyBNYXA8UHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4sIFNldHRpbmdzVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzPj4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VDb25zdHJ1Y3RvclBhcmFtczxQbHVnaW5TZXR0aW5ncz4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBwYXJhbXMuZGF0YUhhbmRsZXI7XG4gICAgdGhpcy5wbHVnaW5TZXR0aW5nc0NsYXNzID0gcGFyYW1zLnBsdWdpblNldHRpbmdzQ2xhc3M7XG4gICAgdGhpcy5wbHVnaW5FdmVudFNvdXJjZSA9IHBhcmFtcy5wbHVnaW5FdmVudFNvdXJjZTtcblxuICAgIHRoaXMuZGVmYXVsdFNldHRpbmdzID0gbmV3IHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcygpIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMucHJvcGVydHlOYW1lcyA9IGdldEFsbEtleXModGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgIHRoaXMucmVnaXN0ZXJWYWxpZGF0b3JzKCk7XG4gICAgdGhpcy5yZWdpc3RlckxlZ2FjeVNldHRpbmdzQ29udmVydGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgYW5kIHNhdmVzIHRoZW0uXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5nc0VkaXRvciAtIFRoZSBlZGl0b3IuXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVkaXRBbmRTYXZlKHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LCBjb250ZXh0PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG4gICAgYXdhaXQgdGhpcy5lZGl0KHNldHRpbmdzRWRpdG9yKTtcbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGUoY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgc2V0dGluZ3MgYXJlIHNhZmUuXG4gICAqXG4gICAqIEl0IHJ1bnMgdmFsaWRhdGlvbiBmb3IgZWFjaCBwcm9wZXJ0eSBhbmQgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsaWRhdGlvbiBmYWlscy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYWZlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuc3VyZVNhZmUoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGUoc2V0dGluZ3MpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdFtwcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgc2FmZSBjb3B5IG9mIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzYWZlIGNvcHkgb2YgdGhlIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFNhZmVDb3B5KHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICBjb25zdCBzYWZlU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmNsb25lU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU2FmZShzYWZlU2V0dGluZ3MpO1xuICAgIHJldHVybiBzYWZlU2V0dGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIHBsdWdpbiBzZXR0aW5ncyBmcm9tIHRoZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhlIHNldHRpbmdzIGFyZSBiZWluZyBsb2FkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZEZyb21GaWxlKGlzSW5pdGlhbExvYWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmRhdGFIYW5kbGVyLmxvYWREYXRhKCk7XG4gICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IHRoaXMuY3JlYXRlRGVmYXVsdFN0YXRlKCk7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBzZXR0aW5ncyBmcm9tIGRhdGEuanNvbi4gRXhwZWN0ZWQgT2JqZWN0LCBnb3Q6ICR7dHlwZW9mIGRhdGF9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmF3UmVjb3JkID0gZGF0YSBhcyBHZW5lcmljT2JqZWN0O1xuICAgICAgY29uc3QgcGFyc2VkU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnJhd1JlY29yZFRvU2V0dGluZ3MocmF3UmVjb3JkKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlKHBhcnNlZFNldHRpbmdzKTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlJbXBsKHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2U6IHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VkU2V0dGluZ3NbcHJvcGVydHlOYW1lXVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IGF3YWl0IHRoaXMuY2xvbmVTdGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZSk7XG5cbiAgICAgIGNvbnN0IG5ld1JlY29yZCA9IGF3YWl0IHRoaXMuc2V0dGluZ3NUb1Jhd1JlY29yZCh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcyk7XG5cbiAgICAgIGlmICghZGVlcEVxdWFsKG5ld1JlY29yZCwgZGF0YSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlSW1wbCgpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmFzeW5jRXZlbnRzLnRyaWdnZXJBc3luYygnbG9hZFNldHRpbmdzJywgdGhpcy5jdXJyZW50U3RhdGUgYXMgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiwgaXNJbml0aWFsTG9hZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICovXG4gIHB1YmxpYyBvZmY8XG4gICAgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgIEFyZ3MgZXh0ZW5kcyBFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4gPyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz5bRXZlbnROYW1lXVxuICAgICAgOiB1bmtub3duW11cbiAgPihuYW1lOiBFdmVudE5hbWUsIGNhbGxiYWNrOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzYWJsZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMuYXN5bmNFdmVudHMub2ZmKG5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgYnkgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBvZmZyZWYoZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYpOiB2b2lkIHtcbiAgICB0aGlzLmFzeW5jRXZlbnRzLm9mZnJlZihldmVudFJlZik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKi9cbiAgcHVibGljIG9uPFxuICAgIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICBBcmdzIGV4dGVuZHMgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+ID8gUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+W0V2ZW50TmFtZV1cbiAgICAgIDogdW5rbm93bltdXG4gID4obmFtZTogRXZlbnROYW1lLCBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4sIHRoaXNBcmc/OiB1bmtub3duKTogQXN5bmNFdmVudFJlZiB7XG4gICAgcmV0dXJuIHRoaXMuYXN5bmNFdmVudHMub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKi9cbiAgcHVibGljIG9uY2U8XG4gICAgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgIEFyZ3MgZXh0ZW5kcyBFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4gPyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz5bRXZlbnROYW1lXVxuICAgICAgOiB1bmtub3duW11cbiAgPihuYW1lOiBFdmVudE5hbWUsIGNhbGxiYWNrOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzYWJsZTx2b2lkPiwgdGhpc0FyZz86IHVua25vd24pOiBBc3luY0V2ZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5hc3luY0V2ZW50cy5vbmNlKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSByZWxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRGcm9tRmlsZShmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgc2V0dGluZ3MgZnJvbSBmaWxlIGFuZCByZWdpc3RlcnMgZXZlbnQgaGFuZGxlcnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KHRoaXMsIHRoaXMub24oJ2xvYWRTZXR0aW5ncycsIHRoaXMub25Mb2FkU2V0dGluZ3MuYmluZCh0aGlzKSkpO1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCB0aGlzLm9uKCdzYXZlU2V0dGluZ3MnLCAobmV3U3RhdGUsIG9sZFN0YXRlLCBjb250ZXh0KSA9PiB0aGlzLm9uU2F2ZVNldHRpbmdzKHsgY29udGV4dCwgbmV3U3RhdGUsIG9sZFN0YXRlIH0pKSk7XG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KHRoaXMsIHRoaXMucGx1Z2luRXZlbnRTb3VyY2Uub24oJ2V4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLCB0aGlzLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZS5iaW5kKHRoaXMpKSk7XG4gICAgYXdhaXQgdGhpcy5sb2FkRnJvbUZpbGUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBMZWdhY3lTZXR0aW5ncyAtIFRoZSBsZWdhY3kgc2V0dGluZ3MgY2xhc3MuXG4gICAqIEBwYXJhbSBsZWdhY3lTZXR0aW5nc0NsYXNzIC0gVGhlIGxlZ2FjeSBzZXR0aW5ncyBjbGFzcy5cbiAgICogQHBhcmFtIGNvbnZlcnRlciAtIFRoZSBjb252ZXJ0ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcjxMZWdhY3lTZXR0aW5ncyBleHRlbmRzIG9iamVjdD4oXG4gICAgbGVnYWN5U2V0dGluZ3NDbGFzczogbmV3ICgpID0+IExlZ2FjeVNldHRpbmdzLFxuICAgIGNvbnZlcnRlcjogKGxlZ2FjeVNldHRpbmdzOiBQYXJ0aWFsPExlZ2FjeVNldHRpbmdzPiAmIFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+KSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRoaXNXcmFwcGVyID0gVmFsdWVXcmFwcGVyLm9mKHRoaXMpO1xuICAgIHRoaXMubGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzLnB1c2gobGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXIpO1xuXG4gICAgZnVuY3Rpb24gbGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXIocmVjb3JkOiBHZW5lcmljT2JqZWN0KTogdm9pZCB7XG4gICAgICBjb25zdCBsZWdhY3lTZXR0aW5nc0tleXMgPSBuZXcgU2V0PHN0cmluZz4oT2JqZWN0LmtleXMobmV3IGxlZ2FjeVNldHRpbmdzQ2xhc3MoKSkpO1xuICAgICAgY29uc3QgcGx1Z2luU2V0dGluZ0tleXMgPSBuZXcgU2V0PHN0cmluZz4odGhpc1dyYXBwZXIudmFsdWUucHJvcGVydHlOYW1lcyk7XG4gICAgICBjb25zdCBsZWdhY3lTZXR0aW5ncyA9IHJlY29yZCBhcyBQYXJ0aWFsPExlZ2FjeVNldHRpbmdzPiAmIFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+O1xuICAgICAgY29udmVydGVyKGxlZ2FjeVNldHRpbmdzKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGxlZ2FjeVNldHRpbmdzKSkge1xuICAgICAgICBpZiAocGx1Z2luU2V0dGluZ0tleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGVnYWN5U2V0dGluZ3NLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gICAgICAgIGRlbGV0ZSByZWNvcmRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmFsaWRhdG9yIGZvciBhIHByb3BlcnR5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXR0aW5ncyBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHZhbGlkYXRvciAtIFRoZSB2YWxpZGF0b3IuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJWYWxpZGF0b3I8UHJvcGVydHlOYW1lIGV4dGVuZHMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbGlkYXRvcjogU2V0dGluZ3NWYWxpZGF0b3I8UGx1Z2luU2V0dGluZ3MsIFByb3BlcnR5TmFtZT5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0b3JzLnNldChwcm9wZXJ0eU5hbWUsIHZhbGlkYXRvciBhcyBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncz4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmFsaWRhdGVzIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmV2YWxpZGF0ZSgpOiBQcm9taXNlPFJlY29yZDxQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPj4ge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG4gICAgYXdhaXQgdGhpcy5lZGl0KG5vb3ApO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXM7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIG5ldyBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgb2YgdGhlIHNhdmUgdG8gZmlsZSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVUb0ZpbGUoY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGlmIChkZWVwRXF1YWwodGhpcy5sYXN0U2F2ZWRTdGF0ZS5pbnB1dFZhbHVlcywgdGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlSW1wbCgpO1xuICAgIGF3YWl0IHRoaXMuYXN5bmNFdmVudHMudHJpZ2dlckFzeW5jKFxuICAgICAgJ3NhdmVTZXR0aW5ncycsXG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZSBhcyBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSBhcyBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgICAgY29udGV4dFxuICAgICk7XG4gICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IGF3YWl0IHRoaXMuY2xvbmVTdGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRQcm9wZXJ0eTxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsdWU6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGF3YWl0IHRoaXMuZWRpdCgoc2V0dGluZ3MpID0+IHtcbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZGF0aW9uIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ8UGx1Z2luU2V0dGluZ3M+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBWYWxpZGF0aW9uUmVzdWx0PFBsdWdpblNldHRpbmdzPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgdmFsaWRhdG9yXSBvZiB0aGlzLnZhbGlkYXRvcnMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZSA9IGF3YWl0IHZhbGlkYXRvcihzZXR0aW5nc1twcm9wZXJ0eU5hbWVdLCBzZXR0aW5ncyk7XG4gICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRyYW5zZm9ybWVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VHJhbnNmb3JtZXIoKTogVHJhbnNmb3JtZXIge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNmb3JtZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyByZWNvcmQgaXMgbG9hZGVkIGZyb20gZGlzay5cbiAgICpcbiAgICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkUmVjb3JkKHJlY29yZDogR2VuZXJpY09iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIHRoaXMubGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzKSB7XG4gICAgICBjb252ZXJ0ZXIocmVjb3JkKTtcbiAgICB9XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gc2V0dGluZ3MgYXJlIGxvYWRlZCBvciByZWxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIF9sb2FkZWRTdGF0ZSAtIFRoZSBsb2FkZWQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqIEBwYXJhbSBfaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgaW5pdGlhbCBsb2FkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uTG9hZFNldHRpbmdzKFxuICAgIF9sb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBfaXNJbml0aWFsTG9hZDogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNhdmVTZXR0aW5ncyhwYXJhbXM6IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZU9uU2F2ZVNldHRpbmdzUGFyYW1zPFBsdWdpblNldHRpbmdzPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRleHQ6IF9jb250ZXh0LFxuICAgICAgbmV3U3RhdGU6IF9uZXdTdGF0ZSxcbiAgICAgIG9sZFN0YXRlOiBfb2xkU3RhdGVcbiAgICB9ID0gcGFyYW1zO1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgcmVjb3JkIGlzIGFib3V0IHRvIGJlIHNhdmVkIHRvIGRpc2suXG4gICAqXG4gICAqIEBwYXJhbSBfcmVjb3JkIC0gVGhlIHJlY29yZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblNhdmluZ1JlY29yZChfcmVjb3JkOiBHZW5lcmljT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBsZWdhY3kgc2V0dGluZ3MgY29udmVydGVycy5cbiAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgdmFsaWRhdG9ycy5cbiAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgdmFsaWRhdG9ycyBmb3IgcHJvcGVydGllcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlclZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9uZVNldHRpbmdzKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCB0aGlzLnNldHRpbmdzVG9SYXdSZWNvcmQoc2V0dGluZ3MpO1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShyZWNvcmQpO1xuICAgIGNvbnN0IGNsb25lUmVjb3JkID0gSlNPTi5wYXJzZShqc29uKSBhcyBHZW5lcmljT2JqZWN0O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJhd1JlY29yZFRvU2V0dGluZ3MoY2xvbmVSZWNvcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9uZVN0YXRlKFxuICAgIHN0YXRlOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPlxuICApOiBQcm9taXNlPFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVmZmVjdGl2ZVZhbHVlczogYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHN0YXRlLmVmZmVjdGl2ZVZhbHVlcyksXG4gICAgICBpbnB1dFZhbHVlczogYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHN0YXRlLmlucHV0VmFsdWVzKSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlczogeyAuLi5zdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXMgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlZmF1bHRTdGF0ZSgpOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVmZmVjdGl2ZVZhbHVlczogbmV3IHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcygpLFxuICAgICAgaW5wdXRWYWx1ZXM6IG5ldyB0aGlzLnBsdWdpblNldHRpbmdzQ2xhc3MoKSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlczogY2FzdFRvPFJlY29yZDxQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPj4oe30pXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZWRpdChzZXR0aW5nc0VkaXRvcjogKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncykgPT4gUHJvbWlzYWJsZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR0aW5nc0VkaXRvcih0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZSA9IHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSA/PyAnJztcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncyBhcyBQbHVnaW5TZXR0aW5ncztcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZWZmZWN0aXZlVmFsdWVzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZVxuICAgICAgICAgID8gZGVmYXVsdHNbcHJvcGVydHlOYW1lXVxuICAgICAgICAgIDogdGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcDogdW5rbm93bik6IHByb3AgaXMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHRoaXMucHJvcGVydHlOYW1lcyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMocHJvcCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJhd1JlY29yZFRvU2V0dGluZ3MocmF3UmVjb3JkOiBHZW5lcmljT2JqZWN0KTogUHJvbWlzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJhd1JlY29yZCA9IHRoaXMuZ2V0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm1PYmplY3RSZWN1cnNpdmVseShyYXdSZWNvcmQpO1xuICAgIGF3YWl0IHRoaXMub25Mb2FkUmVjb3JkKHJhd1JlY29yZCk7XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyB0aGlzLnBsdWdpblNldHRpbmdzQ2xhc3MoKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3UmVjb3JkKSkge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSkge1xuICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgZGVmYXVsdHNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShcbiAgICAgICAgICAnUG9zc2libGUgaW52YWxpZCB2YWx1ZSB0eXBlLiBJdCBtaWdodCBsZWFkIHRvIGFuIHVuZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbi4gVGhlcmUgaXMgYWxzbyBhIGNoYW5jZSBpdCBpcyBhIGZhbHNlLW5lZ2F0aXZlIHdhcm5pbmcsIGFzIHdlIGFyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdCB0eXBlIG9mIHRoZSB2YWx1ZSBpbiBydW50aW1lLicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZSBhcyBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncz47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlVG9GaWxlSW1wbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRhdGFIYW5kbGVyLnNhdmVEYXRhKGF3YWl0IHRoaXMuc2V0dGluZ3NUb1Jhd1JlY29yZCh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0eUltcGwocGFyYW1zOiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VTZXRQcm9wZXJ0eUltcGxQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UsXG4gICAgICB2YWx1ZVxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncyBhcyBQbHVnaW5TZXR0aW5ncztcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZSA/PyAnJztcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lZmZlY3RpdmVWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlID8gZGVmYXVsdHNbcHJvcGVydHlOYW1lXSA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR0aW5nc1RvUmF3UmVjb3JkKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8R2VuZXJpY09iamVjdD4ge1xuICAgIGNvbnN0IHJhd1JlY29yZDogR2VuZXJpY09iamVjdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICByYXdSZWNvcmRbcHJvcGVydHlOYW1lXSA9IHNldHRpbmdzW3Byb3BlcnR5TmFtZV07XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vblNhdmluZ1JlY29yZChyYXdSZWNvcmQpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm1PYmplY3RSZWN1cnNpdmVseShyYXdSZWNvcmQpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE2QkEsMEJBQTRCO0FBQzVCLG1CQUErQjtBQUMvQixzQkFHTztBQUNQLDBCQUlPO0FBQ1AsOEJBQWdDO0FBQ2hDLGtDQUFvQztBQUNwQywrQkFBaUM7QUFDakMsNkJBQStCO0FBQy9CLDZCQUErQjtBQUMvQiwrQ0FBK0M7QUFDL0MscUNBQXFDO0FBQ3JDLDJCQUE2QjtBQUM3QixvQ0FBbUM7QUFDbkMsMEJBQTRCO0FBRTVCLE1BQU0scUJBQXFCLElBQUksMENBQWlCO0FBQUEsRUFDOUMsSUFBSSx3RUFBK0I7QUFBQSxFQUNuQyxJQUFJLHdDQUFnQjtBQUFBLEVBQ3BCLElBQUksZ0RBQW9CO0FBQUEsRUFDeEIsSUFBSSxzQ0FBZTtBQUFBLEVBQ25CLElBQUksc0NBQWU7QUFBQSxFQUNuQixJQUFJLG9EQUFxQjtBQUMzQixDQUFDO0FBK0lNLE1BQU0sb0NBQW1FLGdDQUE2RjtBQUFBO0FB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
@@ -35,6 +35,25 @@ export interface PluginSettingsComponentBaseConstructorParams<PluginSettings> {
35
35
  */
36
36
  readonly pluginSettingsClass: Constructor<PluginSettings, []>;
37
37
  }
38
+ /**
39
+ * Parameters for {@link PluginSettingsComponentBase.onSaveSettings}.
40
+ *
41
+ * @typeParam PluginSettings - The type of the plugin settings.
42
+ */
43
+ export interface PluginSettingsComponentBaseOnSaveSettingsParams<PluginSettings extends object> {
44
+ /**
45
+ * The save context.
46
+ */
47
+ readonly context: unknown;
48
+ /**
49
+ * The new settings state.
50
+ */
51
+ readonly newState: ReadonlyPluginSettingsState<PluginSettings>;
52
+ /**
53
+ * The old settings state.
54
+ */
55
+ readonly oldState: ReadonlyPluginSettingsState<PluginSettings>;
56
+ }
38
57
  /**
39
58
  * A snapshot of plugin settings state, including raw input values, effective (validated) values,
40
59
  * and per-property validation messages.
@@ -184,6 +203,8 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
184
203
  * @param callback - The callback to call when the event is triggered.
185
204
  * @param thisArg - The context passed as `this` to the `callback`.
186
205
  * @returns A reference to the event listener.
206
+ *
207
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
187
208
  */
188
209
  on<EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings>, Args extends EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings> ? PluginSettingsComponentBaseEventMap<PluginSettings>[EventName] : unknown[]>(name: EventName, callback: (...args: Args) => Promisable<void>, thisArg?: unknown): AsyncEventRef;
189
210
  /**
@@ -197,6 +218,8 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
197
218
  * @param callback - The callback to call when the event is triggered.
198
219
  * @param thisArg - The context passed as `this` to the `callback`.
199
220
  * @returns A reference to the event listener.
221
+ *
222
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
200
223
  */
201
224
  once<EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings>, Args extends EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings> ? PluginSettingsComponentBaseEventMap<PluginSettings>[EventName] : unknown[]>(name: EventName, callback: (...args: Args) => Promisable<void>, thisArg?: unknown): AsyncEventRef;
202
225
  /**
@@ -276,11 +299,9 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
276
299
  /**
277
300
  * Called when settings are saved.
278
301
  *
279
- * @param _newState - The new settings state.
280
- * @param _oldState - The old settings state.
281
- * @param _context - The save context.
302
+ * @param params - The parameters.
282
303
  */
283
- protected onSaveSettings(_newState: ReadonlyPluginSettingsState<PluginSettings>, _oldState: ReadonlyPluginSettingsState<PluginSettings>, _context: unknown): Promise<void>;
304
+ protected onSaveSettings(params: PluginSettingsComponentBaseOnSaveSettingsParams<PluginSettings>): Promise<void>;
284
305
  /**
285
306
  * Called when the plugin settings record is about to be saved to disk.
286
307
  *