obsidian-dev-utils 82.0.0 → 83.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 (134) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/dev/main.js +322 -188
  3. package/dist/lib/cjs/blob.cjs +3 -3
  4. package/dist/lib/cjs/debug.cjs +4 -11
  5. package/dist/lib/cjs/generated-during-build.cjs +139 -0
  6. package/dist/lib/cjs/generated-during-build.d.cts +19 -0
  7. package/dist/lib/cjs/html-element.cjs +103 -31
  8. package/dist/lib/cjs/html-element.d.cts +8 -8
  9. package/dist/lib/cjs/index.cjs +4 -4
  10. package/dist/lib/cjs/index.d.cts +1 -1
  11. package/dist/lib/cjs/library.cjs +58 -7
  12. package/dist/lib/cjs/library.d.cts +65 -6
  13. package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +5 -1
  14. package/dist/lib/cjs/obsidian/css-class.cjs +180 -0
  15. package/dist/lib/cjs/{css-class.d.cts → obsidian/css-class.d.cts} +9 -1
  16. package/dist/lib/cjs/obsidian/editor-lock.cjs +9 -11
  17. package/dist/lib/cjs/obsidian/editor-lock.d.cts +10 -7
  18. package/dist/lib/cjs/obsidian/{plugin/plugin-id.cjs → html-element.cjs} +11 -19
  19. package/dist/lib/cjs/obsidian/html-element.d.cts +18 -0
  20. package/dist/lib/cjs/obsidian/index.cjs +7 -1
  21. package/dist/lib/cjs/obsidian/index.d.cts +2 -0
  22. package/dist/lib/cjs/obsidian/modals/alert.cjs +2 -2
  23. package/dist/lib/cjs/obsidian/modals/confirm.cjs +2 -2
  24. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +2 -2
  25. package/dist/lib/cjs/obsidian/modals/prompt.cjs +2 -2
  26. package/dist/lib/cjs/obsidian/modals/select-item.cjs +2 -2
  27. package/dist/lib/cjs/obsidian/plugin/index.cjs +1 -4
  28. package/dist/lib/cjs/obsidian/plugin/index.d.cts +0 -1
  29. package/dist/lib/cjs/obsidian/plugin/plugin-context.cjs +15 -8
  30. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +2 -2
  31. package/dist/lib/cjs/obsidian/setting-components/checkbox-component.cjs +2 -2
  32. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +2 -2
  33. package/dist/lib/cjs/obsidian/setting-components/date-component.cjs +2 -2
  34. package/dist/lib/cjs/obsidian/setting-components/date-time-component.cjs +2 -2
  35. package/dist/lib/cjs/obsidian/setting-components/email-component.cjs +2 -2
  36. package/dist/lib/cjs/obsidian/setting-components/file-component.cjs +2 -2
  37. package/dist/lib/cjs/obsidian/setting-components/month-component.cjs +2 -2
  38. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +2 -2
  39. package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.cjs +2 -2
  40. package/dist/lib/cjs/obsidian/setting-components/multiple-file-component.cjs +2 -2
  41. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +2 -2
  42. package/dist/lib/cjs/obsidian/setting-components/number-component.cjs +2 -2
  43. package/dist/lib/cjs/obsidian/setting-components/password-component.cjs +2 -2
  44. package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.cjs +2 -2
  45. package/dist/lib/cjs/obsidian/setting-components/telephone-component.cjs +2 -2
  46. package/dist/lib/cjs/obsidian/setting-components/time-component.cjs +2 -2
  47. package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.cjs +2 -2
  48. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +2 -2
  49. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +2 -2
  50. package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +2 -2
  51. package/dist/lib/cjs/obsidian/setting-components/typed-text-component.d.cts +1 -1
  52. package/dist/lib/cjs/obsidian/setting-components/url-component.cjs +2 -2
  53. package/dist/lib/cjs/obsidian/setting-components/validator-component.cjs +2 -2
  54. package/dist/lib/cjs/obsidian/setting-components/week-component.cjs +2 -2
  55. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +60 -8
  56. package/dist/lib/cjs/script-utils/linters/eslint-agnostic-core-boundary.cjs +145 -0
  57. package/dist/lib/cjs/script-utils/linters/eslint-agnostic-core-boundary.d.cts +32 -0
  58. package/dist/lib/cjs/script-utils/linters/index.cjs +4 -1
  59. package/dist/lib/cjs/script-utils/linters/index.d.cts +1 -0
  60. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +3 -3
  61. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +4 -4
  62. package/dist/lib/cjs/setup.cjs +3 -1
  63. package/dist/lib/cjs/setup.d.cts +6 -4
  64. package/dist/lib/esm/blob.mjs +3 -3
  65. package/dist/lib/esm/debug.mjs +8 -15
  66. package/dist/lib/esm/generated-during-build.d.mts +19 -0
  67. package/dist/lib/esm/generated-during-build.mjs +30 -0
  68. package/dist/lib/esm/html-element.d.mts +8 -8
  69. package/dist/lib/esm/html-element.mjs +103 -30
  70. package/dist/lib/esm/index.d.mts +1 -1
  71. package/dist/lib/esm/index.mjs +3 -3
  72. package/dist/lib/esm/library.d.mts +65 -6
  73. package/dist/lib/esm/library.mjs +57 -5
  74. package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +5 -1
  75. package/dist/lib/esm/{css-class.d.mts → obsidian/css-class.d.mts} +9 -1
  76. package/dist/lib/esm/obsidian/css-class.mjs +72 -0
  77. package/dist/lib/esm/obsidian/editor-lock.d.mts +10 -7
  78. package/dist/lib/esm/obsidian/editor-lock.mjs +9 -11
  79. package/dist/lib/esm/obsidian/html-element.d.mts +18 -0
  80. package/dist/lib/esm/obsidian/html-element.mjs +33 -0
  81. package/dist/lib/esm/obsidian/index.d.mts +2 -0
  82. package/dist/lib/esm/obsidian/index.mjs +5 -1
  83. package/dist/lib/esm/obsidian/modals/alert.mjs +2 -2
  84. package/dist/lib/esm/obsidian/modals/confirm.mjs +2 -2
  85. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +2 -2
  86. package/dist/lib/esm/obsidian/modals/prompt.mjs +2 -2
  87. package/dist/lib/esm/obsidian/modals/select-item.mjs +2 -2
  88. package/dist/lib/esm/obsidian/plugin/index.d.mts +0 -1
  89. package/dist/lib/esm/obsidian/plugin/index.mjs +1 -3
  90. package/dist/lib/esm/obsidian/plugin/plugin-context.mjs +15 -9
  91. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +2 -2
  92. package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +2 -2
  93. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +2 -2
  94. package/dist/lib/esm/obsidian/setting-components/date-component.mjs +2 -2
  95. package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +2 -2
  96. package/dist/lib/esm/obsidian/setting-components/email-component.mjs +2 -2
  97. package/dist/lib/esm/obsidian/setting-components/file-component.mjs +2 -2
  98. package/dist/lib/esm/obsidian/setting-components/month-component.mjs +2 -2
  99. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +2 -2
  100. package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +2 -2
  101. package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +2 -2
  102. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +2 -2
  103. package/dist/lib/esm/obsidian/setting-components/number-component.mjs +2 -2
  104. package/dist/lib/esm/obsidian/setting-components/password-component.mjs +2 -2
  105. package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +2 -2
  106. package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +2 -2
  107. package/dist/lib/esm/obsidian/setting-components/time-component.mjs +2 -2
  108. package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +2 -2
  109. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +2 -2
  110. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +2 -2
  111. package/dist/lib/esm/obsidian/setting-components/typed-text-component.d.mts +1 -1
  112. package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +2 -2
  113. package/dist/lib/esm/obsidian/setting-components/url-component.mjs +2 -2
  114. package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +2 -2
  115. package/dist/lib/esm/obsidian/setting-components/week-component.mjs +2 -2
  116. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +54 -9
  117. package/dist/lib/esm/script-utils/linters/eslint-agnostic-core-boundary.d.mts +32 -0
  118. package/dist/lib/esm/script-utils/linters/eslint-agnostic-core-boundary.mjs +37 -0
  119. package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
  120. package/dist/lib/esm/script-utils/linters/index.mjs +3 -1
  121. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +4 -4
  122. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +3 -3
  123. package/dist/lib/esm/setup.d.mts +6 -4
  124. package/dist/lib/esm/setup.mjs +3 -1
  125. package/obsidian/css-class/package.json +6 -0
  126. package/obsidian/html-element/package.json +6 -0
  127. package/package.json +1 -1
  128. package/script-utils/linters/eslint-agnostic-core-boundary/package.json +6 -0
  129. package/dist/lib/cjs/css-class.cjs +0 -178
  130. package/dist/lib/cjs/obsidian/plugin/plugin-id.d.cts +0 -22
  131. package/dist/lib/esm/css-class.mjs +0 -70
  132. package/dist/lib/esm/obsidian/plugin/plugin-id.d.mts +0 -22
  133. package/dist/lib/esm/obsidian/plugin/plugin-id.mjs +0 -39
  134. package/obsidian/Plugin/plugin-id/package.json +0 -6
@@ -8,15 +8,74 @@
8
8
  *
9
9
  * Helpers for working with the `obsidian-dev-utils` library.
10
10
  */
11
- /**
12
- * A version of the `obsidian-dev-utils` library.
13
- */
14
- export declare const LIBRARY_VERSION = "$(LIBRARY_VERSION)";
15
11
  /**
16
12
  * A name of the `obsidian-dev-utils` library.
17
13
  */
18
14
  export declare const LIBRARY_NAME = "obsidian-dev-utils";
19
15
  /**
20
- * A styles of the `obsidian-dev-utils` library.
16
+ * Parameters for {@link Library.init}.
17
+ *
18
+ * These are purely cosmetic values the host plugin injects once at initialization — deliberately NOT
19
+ * the plugin ID itself, so the agnostic core cannot reconstruct a capability from them.
20
+ */
21
+ export interface LibraryInitParams {
22
+ /**
23
+ * The per-plugin CSS class scope applied alongside the library class by `addPluginCssClasses`.
24
+ */
25
+ readonly cssClassScope: string;
26
+ /**
27
+ * The namespace prefix prepended to the library's debug namespaces (e.g. `${pluginId}:`).
28
+ */
29
+ readonly debugPrefixNamespace: string;
30
+ /**
31
+ * Whether debug logging should append a rich DevTools stack trace.
32
+ */
33
+ readonly shouldPrintStackTrace: boolean;
34
+ }
35
+ /**
36
+ * The single, deterministic initialization entry point for the `obsidian-dev-utils` library.
37
+ *
38
+ * The host plugin calls {@link Library.init} exactly once (via `initPluginContext`) to push the
39
+ * cosmetic per-plugin configuration; the Obsidian-runtime-agnostic core only reads it through the
40
+ * getters. Calling {@link Library.init} more than once throws — {@link Library.resetToDefault} clears
41
+ * the state (e.g. between tests, or on plugin unload) and allows re-initialization.
42
+ */
43
+ declare class LibraryContext {
44
+ /**
45
+ * The per-plugin CSS class scope applied alongside the library class by `addPluginCssClasses`.
46
+ * Empty until {@link init} is called.
47
+ *
48
+ * @returns The CSS class scope.
49
+ */
50
+ get cssClassScope(): string;
51
+ /**
52
+ * The namespace prefix prepended to the library's debug namespaces. Empty until {@link init} is called.
53
+ *
54
+ * @returns The debug namespace prefix.
55
+ */
56
+ get debugPrefixNamespace(): string;
57
+ /**
58
+ * Whether debug logging should append a rich DevTools stack trace. `false` until {@link init} is called.
59
+ *
60
+ * @returns Whether to print stack traces.
61
+ */
62
+ get shouldPrintStackTrace(): boolean;
63
+ private isInitialized;
64
+ private params;
65
+ /**
66
+ * Initializes the library with the host plugin's cosmetic configuration. Must be called exactly
67
+ * once; calling it again before {@link resetToDefault} throws.
68
+ *
69
+ * @param params - The cosmetic configuration to inject.
70
+ */
71
+ init(params: LibraryInitParams): void;
72
+ /**
73
+ * Resets the library back to its default (uninitialized) state, allowing {@link init} to be called again.
74
+ */
75
+ resetToDefault(): void;
76
+ }
77
+ /**
78
+ * The single {@link LibraryContext} instance — the library's deterministic initialization entry point.
21
79
  */
22
- export declare const LIBRARY_STYLES = "$(LIBRARY_STYLES)";
80
+ export declare const Library: LibraryContext;
81
+ export {};
@@ -128,6 +128,7 @@ __export(plugin_context_component_exports, {
128
128
  PluginContextComponent: () => PluginContextComponent
129
129
  });
130
130
  module.exports = __toCommonJS(plugin_context_component_exports);
131
+ var import_library = require('../../library.cjs');
131
132
  var import_plugin_context = require('../plugin/plugin-context.cjs');
132
133
  var import_all_windows_event_component = require('./all-windows-event-component.cjs');
133
134
  var import_component_ex = require('./component-ex.cjs');
@@ -149,6 +150,9 @@ class PluginContextComponent extends import_component_ex.ComponentEx {
149
150
  */
150
151
  onload() {
151
152
  (0, import_plugin_context.initPluginContext)(this.pluginId);
153
+ this.register(() => {
154
+ import_library.Library.resetToDefault();
155
+ });
152
156
  this.addChild(new import_all_windows_event_component.AllWindowsEventComponent(this.app)).registerAllWindowsHandler((win) => {
153
157
  (0, import_plugin_context.initDebugController)(win, this);
154
158
  });
@@ -158,4 +162,4 @@ class PluginContextComponent extends import_component_ex.ComponentEx {
158
162
  0 && (module.exports = {
159
163
  PluginContextComponent
160
164
  });
161
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLWNvbnRleHQtY29tcG9uZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcG9uZW50IHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHBsdWdpbiBjb250ZXh0LCBkZWJ1ZyBjb250cm9sbGVyLCBhbmQgbGlicmFyeSBzdHlsZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIGluaXREZWJ1Z0NvbnRyb2xsZXIsXG4gIGluaXRQbHVnaW5Db250ZXh0XG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5pbXBvcnQgeyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQgfSBmcm9tICcuL2FsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuaW50ZXJmYWNlIFBsdWdpbkNvbnRleHRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHBsdWdpbiBjb250ZXh0IChwbHVnaW4gSUQsIGRlYnVnIGNvbnRyb2xsZXIsIGxpYnJhcnkgc3R5bGVzKSBvbiBsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQ29udGV4dENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQ29udGV4dENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2luIGNvbnRleHQgYW5kIGRlYnVnIGNvbnRyb2xsZXIuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGluaXRQbHVnaW5Db250ZXh0KHRoaXMucGx1Z2luSWQpO1xuICAgIHRoaXMuYWRkQ2hpbGQobmV3IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCh0aGlzLmFwcCkpLnJlZ2lzdGVyQWxsV2luZG93c0hhbmRsZXIoKHdpbikgPT4ge1xuICAgICAgaW5pdERlYnVnQ29udHJvbGxlcih3aW4sIHRoaXMpO1xuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQSw0QkFHTztBQUNQLHlDQUF5QztBQUN6QywwQkFBNEI7QUFVckIsTUFBTSwrQkFBK0IsZ0NBQVk7QUFBQSxFQUNyQztBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQWlEO0FBQ2xFLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLFdBQVcsT0FBTztBQUFBLEVBQ3pCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZ0IsU0FBZTtBQUM3QixpREFBa0IsS0FBSyxRQUFRO0FBQy9CLFNBQUssU0FBUyxJQUFJLDREQUF5QixLQUFLLEdBQUcsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLFFBQVE7QUFDdkYscURBQW9CLEtBQUssSUFBSTtBQUFBLElBQy9CLENBQUM7QUFBQSxFQUNIO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
165
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLWNvbnRleHQtY29tcG9uZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcG9uZW50IHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHBsdWdpbiBjb250ZXh0LCBkZWJ1ZyBjb250cm9sbGVyLCBhbmQgbGlicmFyeSBzdHlsZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IExpYnJhcnkgfSBmcm9tICcuLi8uLi9saWJyYXJ5LnRzJztcbmltcG9ydCB7XG4gIGluaXREZWJ1Z0NvbnRyb2xsZXIsXG4gIGluaXRQbHVnaW5Db250ZXh0XG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5pbXBvcnQgeyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQgfSBmcm9tICcuL2FsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuaW50ZXJmYWNlIFBsdWdpbkNvbnRleHRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHBsdWdpbiBjb250ZXh0IChwbHVnaW4gSUQsIGRlYnVnIGNvbnRyb2xsZXIsIGxpYnJhcnkgc3R5bGVzKSBvbiBsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQ29udGV4dENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQ29udGV4dENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2luIGNvbnRleHQgYW5kIGRlYnVnIGNvbnRyb2xsZXIuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGluaXRQbHVnaW5Db250ZXh0KHRoaXMucGx1Z2luSWQpO1xuICAgIC8vIFJlc2V0IG9uIHVubG9hZCBzbyBhIHBsdWdpbiByZWxvYWQgY2FuIHJlLWluaXRpYWxpemUgd2l0aG91dCB0cmlwcGluZyB0aGUgb25jZS1vbmx5IGBMaWJyYXJ5LmluaXRgIGd1YXJkLlxuICAgIHRoaXMucmVnaXN0ZXIoKCkgPT4ge1xuICAgICAgTGlicmFyeS5yZXNldFRvRGVmYXVsdCgpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkQ2hpbGQobmV3IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCh0aGlzLmFwcCkpLnJlZ2lzdGVyQWxsV2luZG93c0hhbmRsZXIoKHdpbikgPT4ge1xuICAgICAgaW5pdERlYnVnQ29udHJvbGxlcih3aW4sIHRoaXMpO1xuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQSxxQkFBd0I7QUFDeEIsNEJBR087QUFDUCx5Q0FBeUM7QUFDekMsMEJBQTRCO0FBVXJCLE1BQU0sK0JBQStCLGdDQUFZO0FBQUEsRUFDckM7QUFBQSxFQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1YsWUFBWSxRQUFpRDtBQUNsRSxVQUFNO0FBQ04sU0FBSyxNQUFNLE9BQU87QUFDbEIsU0FBSyxXQUFXLE9BQU87QUFBQSxFQUN6QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLFNBQWU7QUFDN0IsaURBQWtCLEtBQUssUUFBUTtBQUUvQixTQUFLLFNBQVMsTUFBTTtBQUNsQiw2QkFBUSxlQUFlO0FBQUEsSUFDekIsQ0FBQztBQUNELFNBQUssU0FBUyxJQUFJLDREQUF5QixLQUFLLEdBQUcsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLFFBQVE7QUFDdkYscURBQW9CLEtBQUssSUFBSTtBQUFBLElBQy9CLENBQUM7QUFBQSxFQUNIO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,180 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function initCjs() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ const globalThisRecord = globalThis;
9
+ globalThisRecord['__name'] ??= name;
10
+ const originalRequire = require;
11
+ if (originalRequire && !originalRequire.__isPatched) {
12
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
13
+ require = Object.assign(
14
+ (id) => requirePatched(id),
15
+ originalRequire,
16
+ {
17
+ __isPatched: true
18
+ }
19
+ );
20
+ }
21
+
22
+ const newFuncs = {
23
+ __extractDefault() {
24
+ return extractDefault;
25
+ },
26
+ process() {
27
+ const browserProcess = {
28
+ browser: true,
29
+ cwd() {
30
+ return '/';
31
+ },
32
+ env: {},
33
+ platform: 'android'
34
+ };
35
+ return browserProcess;
36
+ }
37
+ };
38
+
39
+ for (const key of Object.keys(newFuncs)) {
40
+ globalThisRecord[key] ??= newFuncs[key]?.();
41
+ }
42
+
43
+ function name(obj) {
44
+ return obj;
45
+ }
46
+
47
+ function extractDefault(module) {
48
+ return module && module.__esModule && 'default' in module ? module.default : module;
49
+ }
50
+
51
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
52
+ 'obsidian',
53
+ '@codemirror/autocomplete',
54
+ '@codemirror/collab',
55
+ '@codemirror/commands',
56
+ '@codemirror/language',
57
+ '@codemirror/lint',
58
+ '@codemirror/search',
59
+ '@codemirror/state',
60
+ '@codemirror/text',
61
+ '@codemirror/view',
62
+ '@lezer/common',
63
+ '@lezer/lr',
64
+ '@lezer/highlight'];
65
+
66
+
67
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
68
+ '@codemirror/closebrackets',
69
+ '@codemirror/comment',
70
+ '@codemirror/fold',
71
+ '@codemirror/gutter',
72
+ '@codemirror/highlight',
73
+ '@codemirror/history',
74
+ '@codemirror/matchbrackets',
75
+ '@codemirror/panel',
76
+ '@codemirror/rangeset',
77
+ '@codemirror/rectangular-selection',
78
+ '@codemirror/stream-parser',
79
+ '@codemirror/tooltip'];
80
+
81
+
82
+ function requirePatched(id) {
83
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
84
+ return originalRequire?.(id);
85
+ }
86
+
87
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
88
+ if (globalThis.app.isMobile) {
89
+ if (id === 'process' || id === 'node:process') {
90
+ // eslint-disable-next-line no-console -- Valid usage.
91
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
92
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
93
+ return globalThis.process;
94
+ }
95
+ } else {
96
+ const module = originalRequire?.(id);
97
+ if (module) {
98
+ return extractDefault(module);
99
+ }
100
+ }
101
+
102
+ // eslint-disable-next-line no-console -- Valid usage.
103
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
104
+ return {};
105
+ }
106
+ })();
107
+
108
+ "use strict";
109
+ var __defProp = Object.defineProperty;
110
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
111
+ var __getOwnPropNames = Object.getOwnPropertyNames;
112
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
113
+ var __export = (target, all) => {
114
+ for (var name in all)
115
+ __defProp(target, name, { get: all[name], enumerable: true });
116
+ };
117
+ var __copyProps = (to, from, except, desc) => {
118
+ if (from && typeof from === "object" || typeof from === "function") {
119
+ for (let key of __getOwnPropNames(from))
120
+ if (!__hasOwnProp.call(to, key) && key !== except)
121
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
122
+ }
123
+ return to;
124
+ };
125
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
126
+ var css_class_exports = {};
127
+ __export(css_class_exports, {
128
+ CssClass: () => CssClass
129
+ });
130
+ module.exports = __toCommonJS(css_class_exports);
131
+ var CssClass = /* @__PURE__ */ ((CssClass2) => {
132
+ CssClass2["AlertModal"] = "alert-modal";
133
+ CssClass2["CancelButton"] = "cancel-button";
134
+ CssClass2["CheckboxComponent"] = "checkbox-component";
135
+ CssClass2["Code"] = "code";
136
+ CssClass2["CodeHighlighterComponent"] = "code-highlighter-component";
137
+ CssClass2["ConfirmModal"] = "confirm-modal";
138
+ CssClass2["DateComponent"] = "date-component";
139
+ CssClass2["DateTimeComponent"] = "datetime-component";
140
+ CssClass2["EmailComponent"] = "email-component";
141
+ CssClass2["FileComponent"] = "file-component";
142
+ CssClass2["IsPlaceholder"] = "is-placeholder";
143
+ CssClass2["LibraryName"] = "obsidian-dev-utils";
144
+ CssClass2["MarkdownRendered"] = "markdown-rendered";
145
+ CssClass2["MinimizableModal"] = "minimizable-modal";
146
+ CssClass2["MinimizeButton"] = "minimize-button";
147
+ CssClass2["MinimizedModalBar"] = "minimized-modal-bar";
148
+ CssClass2["MinimizedModalBarTitle"] = "minimized-modal-bar-title";
149
+ CssClass2["MonthComponent"] = "month-component";
150
+ CssClass2["MultipleDropdownComponent"] = "multiple-dropdown-component";
151
+ CssClass2["MultipleEmailComponent"] = "multiple-email-component";
152
+ CssClass2["MultipleFileComponent"] = "multiple-file-component";
153
+ CssClass2["MultipleTextComponent"] = "multiple-text-component";
154
+ CssClass2["NumberComponent"] = "number-component";
155
+ CssClass2["OkButton"] = "ok-button";
156
+ CssClass2["OverlayValidator"] = "overlay-validator";
157
+ CssClass2["PasswordComponent"] = "password-component";
158
+ CssClass2["PluginSettingsTab"] = "plugin-settings-tab";
159
+ CssClass2["PromptModal"] = "prompt-modal";
160
+ CssClass2["RestoreButton"] = "restore-button";
161
+ CssClass2["SelectItemModal"] = "select-item-modal";
162
+ CssClass2["SettingComponentWrapper"] = "setting-component-wrapper";
163
+ CssClass2["TelephoneComponent"] = "telephone-component";
164
+ CssClass2["TextBox"] = "text-box";
165
+ CssClass2["TimeComponent"] = "time-component";
166
+ CssClass2["Tooltip"] = "tooltip";
167
+ CssClass2["TooltipArrow"] = "tooltip-arrow";
168
+ CssClass2["TooltipValidator"] = "tooltip-validator";
169
+ CssClass2["TriStateCheckboxComponent"] = "tri-state-checkbox-component";
170
+ CssClass2["TypedDropdownComponent"] = "typed-dropdown-component";
171
+ CssClass2["TypedMultipleDropdownComponent"] = "typed-multiple-dropdown-component";
172
+ CssClass2["UrlComponent"] = "url-component";
173
+ CssClass2["WeekComponent"] = "week-component";
174
+ return CssClass2;
175
+ })(CssClass || {});
176
+ // Annotate the CommonJS export names for ESM import in node:
177
+ 0 && (module.exports = {
178
+ CssClass
179
+ });
180
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Nzcy1jbGFzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENTUyBjbGFzc2VzIHVzZWQgYnkgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGxpYnJhcnkuXG4gKi9cblxuLyoqXG4gKiBDU1MgY2xhc3NlcyB1c2VkIGJ5IHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBsaWJyYXJ5LlxuICovXG5leHBvcnQgZW51bSBDc3NDbGFzcyB7XG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGFsZXJ0IG1vZGFsLlxuICAgKi9cbiAgQWxlcnRNb2RhbCA9ICdhbGVydC1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY2FuY2VsIGJ1dHRvbi5cbiAgICovXG4gIENhbmNlbEJ1dHRvbiA9ICdjYW5jZWwtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjaGVja2JveCBjb21wb25lbnQuXG4gICAqL1xuICBDaGVja2JveENvbXBvbmVudCA9ICdjaGVja2JveC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBhbiBpbmxpbmUgY29kZSBlbGVtZW50ICh1c2VkIGJ5IGBhcHBlbmRDb2RlQmxvY2tgKS5cbiAgICovXG4gIENvZGUgPSAnY29kZScsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY29kZSBoaWdobGlnaHRlciBjb21wb25lbnQuXG4gICAqL1xuICBDb2RlSGlnaGxpZ2h0ZXJDb21wb25lbnQgPSAnY29kZS1oaWdobGlnaHRlci1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGNvbmZpcm0gbW9kYWwuXG4gICAqL1xuICBDb25maXJtTW9kYWwgPSAnY29uZmlybS1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgZGF0ZSBjb21wb25lbnQuXG4gICAqL1xuICBEYXRlQ29tcG9uZW50ID0gJ2RhdGUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBkYXRlIGFuZCB0aW1lIGNvbXBvbmVudC5cbiAgICovXG4gIERhdGVUaW1lQ29tcG9uZW50ID0gJ2RhdGV0aW1lLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgZW1haWwgY29tcG9uZW50LlxuICAgKi9cbiAgRW1haWxDb21wb25lbnQgPSAnZW1haWwtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBmaWxlIGNvbXBvbmVudC5cbiAgICovXG4gIEZpbGVDb21wb25lbnQgPSAnZmlsZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgSXNQbGFjZWhvbGRlciA9ICdpcy1wbGFjZWhvbGRlcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbGlicmFyeSBuYW1lLlxuICAgKi9cbiAgTGlicmFyeU5hbWUgPSAnb2JzaWRpYW4tZGV2LXV0aWxzJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBjbGFzcyBtYXJraW5nIHJlbmRlcmVkLW1hcmtkb3duIGNvbnRlbnQgKHVzZWQgYnkgYGFwcGVuZENvZGVCbG9ja2ApLlxuICAgKi9cbiAgTWFya2Rvd25SZW5kZXJlZCA9ICdtYXJrZG93bi1yZW5kZXJlZCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbWluaW1pemFibGUgbW9kYWwuXG4gICAqL1xuICBNaW5pbWl6YWJsZU1vZGFsID0gJ21pbmltaXphYmxlLW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtaW5pbWl6ZSBidXR0b24gb2YgdGhlIG1pbmltaXphYmxlIG1vZGFsLlxuICAgKi9cbiAgTWluaW1pemVCdXR0b24gPSAnbWluaW1pemUtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtaW5pbWl6ZWQgYmFyIG9mIHRoZSBtaW5pbWl6YWJsZSBtb2RhbC5cbiAgICovXG4gIE1pbmltaXplZE1vZGFsQmFyID0gJ21pbmltaXplZC1tb2RhbC1iYXInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRpdGxlIG9mIHRoZSBtaW5pbWl6ZWQgYmFyIG9mIHRoZSBtaW5pbWl6YWJsZSBtb2RhbC5cbiAgICovXG4gIE1pbmltaXplZE1vZGFsQmFyVGl0bGUgPSAnbWluaW1pemVkLW1vZGFsLWJhci10aXRsZScsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbW9udGggY29tcG9uZW50LlxuICAgKi9cbiAgTW9udGhDb21wb25lbnQgPSAnbW9udGgtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtdWx0aXBsZSBkcm9wZG93biBjb21wb25lbnQuXG4gICAqL1xuICBNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50ID0gJ211bHRpcGxlLWRyb3Bkb3duLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbXVsdGlwbGUgZW1haWwgY29tcG9uZW50LlxuICAgKi9cbiAgTXVsdGlwbGVFbWFpbENvbXBvbmVudCA9ICdtdWx0aXBsZS1lbWFpbC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG11bHRpcGxlIGZpbGUgY29tcG9uZW50LlxuICAgKi9cbiAgTXVsdGlwbGVGaWxlQ29tcG9uZW50ID0gJ211bHRpcGxlLWZpbGUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtdWx0aXBsZSB0ZXh0IGNvbXBvbmVudC5cbiAgICovXG4gIE11bHRpcGxlVGV4dENvbXBvbmVudCA9ICdtdWx0aXBsZS10ZXh0LWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbnVtYmVyIGNvbXBvbmVudC5cbiAgICovXG4gIE51bWJlckNvbXBvbmVudCA9ICdudW1iZXItY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBvayBidXR0b24uXG4gICAqL1xuICBPa0J1dHRvbiA9ICdvay1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG92ZXJsYXkgdmFsaWRhdG9yLlxuICAgKi9cbiAgT3ZlcmxheVZhbGlkYXRvciA9ICdvdmVybGF5LXZhbGlkYXRvcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcGFzc3dvcmQgY29tcG9uZW50LlxuICAgKi9cbiAgUGFzc3dvcmRDb21wb25lbnQgPSAncGFzc3dvcmQtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgUGx1Z2luU2V0dGluZ3NUYWIgPSAncGx1Z2luLXNldHRpbmdzLXRhYicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcHJvbXB0IG1vZGFsLlxuICAgKi9cbiAgUHJvbXB0TW9kYWwgPSAncHJvbXB0LW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSByZXN0b3JlIGJ1dHRvbiBvZiB0aGUgbWluaW1pemVkIG1vZGFsIGJhci5cbiAgICovXG4gIFJlc3RvcmVCdXR0b24gPSAncmVzdG9yZS1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHNlbGVjdCBpdGVtIG1vZGFsLlxuICAgKi9cbiAgU2VsZWN0SXRlbU1vZGFsID0gJ3NlbGVjdC1pdGVtLW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBzZXR0aW5nIGNvbXBvbmVudCB3cmFwcGVyLlxuICAgKi9cbiAgU2V0dGluZ0NvbXBvbmVudFdyYXBwZXIgPSAnc2V0dGluZy1jb21wb25lbnQtd3JhcHBlcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdGVsZXBob25lIGNvbXBvbmVudC5cbiAgICovXG4gIFRlbGVwaG9uZUNvbXBvbmVudCA9ICd0ZWxlcGhvbmUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0ZXh0IGJveC5cbiAgICovXG4gIFRleHRCb3ggPSAndGV4dC1ib3gnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRpbWUgY29tcG9uZW50LlxuICAgKi9cbiAgVGltZUNvbXBvbmVudCA9ICd0aW1lLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdG9vbHRpcC5cbiAgICovXG4gIFRvb2x0aXAgPSAndG9vbHRpcCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdG9vbHRpcCBhcnJvdy5cbiAgICovXG4gIFRvb2x0aXBBcnJvdyA9ICd0b29sdGlwLWFycm93JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0b29sdGlwIHZhbGlkYXRvci5cbiAgICovXG4gIFRvb2x0aXBWYWxpZGF0b3IgPSAndG9vbHRpcC12YWxpZGF0b3InLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRyaS1zdGF0ZSBjaGVja2JveCBjb21wb25lbnQuXG4gICAqL1xuICBUcmlTdGF0ZUNoZWNrYm94Q29tcG9uZW50ID0gJ3RyaS1zdGF0ZS1jaGVja2JveC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHR5cGVkIGRyb3Bkb3duIGNvbXBvbmVudC5cbiAgICovXG4gIFR5cGVkRHJvcGRvd25Db21wb25lbnQgPSAndHlwZWQtZHJvcGRvd24tY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0eXBlZCBtdWx0aXBsZSBkcm9wZG93biBjb21wb25lbnQuXG4gICAqL1xuICBUeXBlZE11bHRpcGxlRHJvcGRvd25Db21wb25lbnQgPSAndHlwZWQtbXVsdGlwbGUtZHJvcGRvd24tY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB1cmwgY29tcG9uZW50LlxuICAgKi9cbiAgVXJsQ29tcG9uZW50ID0gJ3VybC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHdlZWsgY29tcG9uZW50LlxuICAgKi9cbiAgV2Vla0NvbXBvbmVudCA9ICd3ZWVrLWNvbXBvbmVudCdcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNPLElBQUssV0FBTCxrQkFBS0EsY0FBTDtBQUlMLEVBQUFBLFVBQUEsZ0JBQWE7QUFLYixFQUFBQSxVQUFBLGtCQUFlO0FBS2YsRUFBQUEsVUFBQSx1QkFBb0I7QUFLcEIsRUFBQUEsVUFBQSxVQUFPO0FBS1AsRUFBQUEsVUFBQSw4QkFBMkI7QUFLM0IsRUFBQUEsVUFBQSxrQkFBZTtBQUtmLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsb0JBQWlCO0FBS2pCLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsaUJBQWM7QUFLZCxFQUFBQSxVQUFBLHNCQUFtQjtBQUtuQixFQUFBQSxVQUFBLHNCQUFtQjtBQUtuQixFQUFBQSxVQUFBLG9CQUFpQjtBQUtqQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLDRCQUF5QjtBQUt6QixFQUFBQSxVQUFBLG9CQUFpQjtBQUtqQixFQUFBQSxVQUFBLCtCQUE0QjtBQUs1QixFQUFBQSxVQUFBLDRCQUF5QjtBQUt6QixFQUFBQSxVQUFBLDJCQUF3QjtBQUt4QixFQUFBQSxVQUFBLDJCQUF3QjtBQUt4QixFQUFBQSxVQUFBLHFCQUFrQjtBQUtsQixFQUFBQSxVQUFBLGNBQVc7QUFLWCxFQUFBQSxVQUFBLHNCQUFtQjtBQUtuQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLGlCQUFjO0FBS2QsRUFBQUEsVUFBQSxtQkFBZ0I7QUFLaEIsRUFBQUEsVUFBQSxxQkFBa0I7QUFLbEIsRUFBQUEsVUFBQSw2QkFBMEI7QUFLMUIsRUFBQUEsVUFBQSx3QkFBcUI7QUFLckIsRUFBQUEsVUFBQSxhQUFVO0FBS1YsRUFBQUEsVUFBQSxtQkFBZ0I7QUFLaEIsRUFBQUEsVUFBQSxhQUFVO0FBS1YsRUFBQUEsVUFBQSxrQkFBZTtBQUtmLEVBQUFBLFVBQUEsc0JBQW1CO0FBS25CLEVBQUFBLFVBQUEsK0JBQTRCO0FBSzVCLEVBQUFBLFVBQUEsNEJBQXlCO0FBS3pCLEVBQUFBLFVBQUEsb0NBQWlDO0FBS2pDLEVBQUFBLFVBQUEsa0JBQWU7QUFLZixFQUFBQSxVQUFBLG1CQUFnQjtBQWpOTixTQUFBQTtBQUFBLEdBQUE7IiwKICAibmFtZXMiOiBbIkNzc0NsYXNzIl0KfQo=
@@ -1,4 +1,4 @@
1
- /// <reference path="./library.d.cts" />
1
+ /// <reference path="../library.d.cts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -20,6 +20,10 @@ export declare enum CssClass {
20
20
  * A CSS class for the checkbox component.
21
21
  */
22
22
  CheckboxComponent = "checkbox-component",
23
+ /**
24
+ * Obsidian's class for an inline code element (used by `appendCodeBlock`).
25
+ */
26
+ Code = "code",
23
27
  /**
24
28
  * A CSS class for the code highlighter component.
25
29
  */
@@ -52,6 +56,10 @@ export declare enum CssClass {
52
56
  * A CSS class for the library name.
53
57
  */
54
58
  LibraryName = "obsidian-dev-utils",
59
+ /**
60
+ * Obsidian's class marking rendered-markdown content (used by `appendCodeBlock`).
61
+ */
62
+ MarkdownRendered = "markdown-rendered",
55
63
  /**
56
64
  * A CSS class for the minimizable modal.
57
65
  */
@@ -137,15 +137,14 @@ var import_obsidian = require('obsidian');
137
137
  var import_async = require('../async.cjs');
138
138
  var import_disposable = require('../disposable.cjs');
139
139
  var import_function = require('../function.cjs');
140
- var import_html_element = require('../html-element.cjs');
141
140
  var import_obsidian_dev_utils_state = require('../obsidian-dev-utils-state.cjs');
142
141
  var import_type_guards = require('../type-guards.cjs');
143
142
  var import_component_ex = require('./components/component-ex.cjs');
144
143
  var import_editor = require('./editor.cjs');
145
144
  var import_file_system = require('./file-system.cjs');
145
+ var import_html_element = require('./html-element.cjs');
146
146
  var import_i18n = require('./i18n/i18n.cjs');
147
147
  var import_confirm = require('./modals/confirm.cjs');
148
- var import_plugin_id = require('./plugin/plugin-id.cjs');
149
148
  const BEEP_DURATION_SECONDS = 0.08;
150
149
  const BEEP_FREQUENCY_HZ = 660;
151
150
  const BEEP_GAIN = 0.05;
@@ -472,11 +471,10 @@ class EditorLockComponent extends import_component_ex.ComponentEx {
472
471
  * Creates an editor-lock handle owned by a plugin.
473
472
  *
474
473
  * @param app - The Obsidian app instance.
475
- * @param pluginId - The id of the owning plugin. Defaults to the current plugin context's id; pass
476
- * it explicitly (e.g. from a plugin's `manifest.id`) when constructing before the plugin context is
477
- * initialized, such as inside `PluginBase.onload`.
474
+ * @param pluginId - The id of the owning plugin (e.g. its `manifest.id`). Locks are attributed to
475
+ * it for reference-counting and the indicators' "locked by" tooltip.
478
476
  */
479
- constructor(app, pluginId = (0, import_plugin_id.getPluginId)()) {
477
+ constructor(app, pluginId) {
480
478
  super();
481
479
  this.app = app;
482
480
  this.pluginId = pluginId;
@@ -524,14 +522,14 @@ class EditorLockComponent extends import_component_ex.ComponentEx {
524
522
  function isEditorLockedForPath(app, pathOrFile) {
525
523
  return getManager().isLocked(app, pathOrFile);
526
524
  }
527
- function lockEditorForPath(app, pathOrFile) {
528
- return getManager().lock(app, pathOrFile, (0, import_plugin_id.getPluginId)());
525
+ function lockEditorForPath(app, pathOrFile, pluginId) {
526
+ return getManager().lock(app, pathOrFile, pluginId);
529
527
  }
530
528
  function requestEditorUnlockForPath(app, pathOrFile) {
531
529
  getManager().requestUnlock(app, pathOrFile);
532
530
  }
533
- function unlockEditorForPath(app, pathOrFile) {
534
- getManager().unlock(app, pathOrFile, (0, import_plugin_id.getPluginId)());
531
+ function unlockEditorForPath(app, pathOrFile, pluginId) {
532
+ getManager().unlock(app, pathOrFile, pluginId);
535
533
  }
536
534
  function getManager() {
537
535
  return (0, import_obsidian_dev_utils_state.getObsidianDevUtilsState)(EDITOR_LOCK_STATE_KEY, new EditorPathLockManager()).value;
@@ -544,4 +542,4 @@ function getManager() {
544
542
  requestEditorUnlockForPath,
545
543
  unlockEditorForPath
546
544
  });
547
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2VkaXRvci1sb2NrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTm90ZS1zY29wZWQsIHJlZmVyZW5jZS1jb3VudGVkIGVkaXRvciBsb2NraW5nLlxuICpcbiAqIFdoZXJlIHtAbGluayB0b2dnbGVFZGl0b3JSZWFkT25seX0gZnJvbSBgLi9lZGl0b3IudHNgIHRvZ2dsZXMgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiBhIHNpbmdsZVxuICoge0BsaW5rIEVkaXRvcn0gaW5zdGFuY2UsIHRoZSBoZWxwZXJzIGhlcmUgbG9jayBhIG5vdGUgYnkgaXRzICoqcGF0aCoqOiB3aGlsZSBhIHBhdGggaXNcbiAqIGxvY2tlZCwgZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IG9mIHRoYXQgbm90ZSAoaW4gYW55IHdpbmRvdywgaW5jbHVkaW5nXG4gKiBwb3BvdXRzKSBpcyBtYWRlIHJlYWQtb25seSBhbmQgc2hvd3MgYSBsb2NrIGluZGljYXRvciBpbiBpdHMgdGFiIGhlYWRlciwgaXRzIHZpZXcgYWN0aW9uIGJhciwgYW5kXG4gKiB0aGUgc3RhdHVzIGJhciAod2hpbGUgdGhlIG5vdGUgaXMgYWN0aXZlKS4gTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIHBlciBsb2NraW5nIHBsdWdpbiwgc29cbiAqIG5lc3RlZCBvciBjb25jdXJyZW50IG9wZXJhdGlvbnMgb24gdGhlIHNhbWUgbm90ZSBhcmUgc2FmZSBcdTIwMTQgdGhlIG5vdGUgaXMgdW5sb2NrZWQgb25seSB3aGVuIHRoZVxuICogbGFzdCBsb2NrIGlzIHJlbGVhc2VkIFx1MjAxNCBhbmQgdGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgd2hpY2ggcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb25cbiAqIHRoYXQgcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tFZGl0b3JGb3JQYXRoKGFwcCwgcGF0aCk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja0VkaXRvckZvclBhdGh9IHBhaXIgcmVtYWlucyBhdmFpbGFibGUgZm9yIG5vbi1gdXNpbmdgIGNhbGwgc2l0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFRBYnN0cmFjdEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBWaWV3VHlwZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICcuLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBhcHBlbmRDb2RlQmxvY2sgfSBmcm9tICcuLi9odG1sLWVsZW1lbnQudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IHRvZ2dsZUVkaXRvclJlYWRPbmx5IH0gZnJvbSAnLi9lZGl0b3IudHMnO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGNvbmZpcm0gfSBmcm9tICcuL21vZGFscy9jb25maXJtLnRzJztcbmltcG9ydCB7IGdldFBsdWdpbklkIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWlkLnRzJztcblxuY29uc3QgQkVFUF9EVVJBVElPTl9TRUNPTkRTID0gMC4wODtcbmNvbnN0IEJFRVBfRlJFUVVFTkNZX0haID0gNjYwO1xuY29uc3QgQkVFUF9HQUlOID0gMC4wNTtcbmNvbnN0IEJFRVBfVEhST1RUTEVfTUlMTElTRUNPTkRTID0gMjAwO1xuY29uc3QgRURJVE9SX0xPQ0tfU1RBVEVfS0VZID0gJ2VkaXRvckxvY2snO1xuY29uc3QgTE9DS19JQ09OX0lEID0gJ2xvY2snO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvcic7XG5jb25zdCBMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yLWZsYXNoJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcbmNvbnN0IFVOTE9DS19JQ09OX0lEID0gJ3VubG9jayc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIEVkaXRvckxvY2tDb21wb25lbnQubG9ja0ZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRvckxvY2tDb21wb25lbnRMb2NrRm9yUGF0aE9wdGlvbnMge1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NrLiBXaGVuIHRoZSBsb2NrIGluZGljYXRvciBpc1xuICAgKiByaWdodC1jbGlja2VkIGFuZCB0aGUgdXNlciBjb25maXJtcyBhbiB1bmxvY2sgKG9yIHtAbGluayByZXF1ZXN0RWRpdG9yVW5sb2NrRm9yUGF0aH0gaXMgY2FsbGVkIGZvclxuICAgKiB0aGUgcGF0aCksIHRoaXMgY29udHJvbGxlciBpcyBhYm9ydGVkIHNvIHRoZSBvcGVyYXRpb24gaG9sZGluZyB0aGUgbG9jayBjYW4gY2FuY2VsIGl0c2VsZiBhbmRcbiAgICogcmVsZWFzZSB0aGUgbG9jayBpbiBpdHMgb3duIGNsZWFudXAuXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEVkaXRvckxvY2tFdmVudHNDb21wb25lbnR9LlxuICovXG5pbnRlcmZhY2UgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIG9uQ2hhbmdlKHRoaXM6IHZvaWQpOiB2b2lkO1xuICBvbkZpbGVNZW51KHRoaXM6IHZvaWQsIG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgTG9ja0luZGljYXRvcnMge1xuICByZWFkb25seSBhY3Rpb25JY29uRWw6IEhUTUxFbGVtZW50O1xuICBkaXNwb3NlVHlwZUxpc3RlbmVyKCk6IHZvaWQ7XG4gIHJlYWRvbmx5IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlIChhbmQgdGhlIGZpbGUgY29udGV4dC1tZW51XG4gKiBldmVudCB0aGF0IG9mZmVycyBhbiBcIlVubG9ja1wiIGl0ZW0pLiBJbXBsZW1lbnRlZCBhcyBhIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb24gYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5vbkNoYW5nZSA9IHBhcmFtcy5vbkNoYW5nZTtcbiAgICB0aGlzLm9uRmlsZU1lbnUgPSBwYXJhbXMub25GaWxlTWVudTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gU2FtZS1sZWFmIG5hdmlnYXRpb24gdG8gYW5vdGhlciBub3RlIGZpcmVzIG5vIGxlYWYvbGF5b3V0IGNoYW5nZTsgd2l0aG91dCB0aGlzIGl0IHN0YXlzIHJlYWQtb25seS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gQWRkcyBhbiBcIlVubG9ja1wiIGl0ZW0gdG8gYSBsb2NrZWQgbm90ZSdzIHRhYi9maWxlIGNvbnRleHQgbWVudSAoYWxvbmdzaWRlIHRoZSBpbmRpY2F0b3IgbWVudXMpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtbWVudScsIHRoaXMub25GaWxlTWVudSkpO1xuICB9XG59XG5cbi8qKlxuICogVHJhY2tzIHJlZmVyZW5jZS1jb3VudGVkLCBwYXRoLXNjb3BlZCBlZGl0b3IgbG9ja3MgYW5kIGtlZXBzIGV2ZXJ5IG9wZW4ge0BsaW5rIE1hcmtkb3duVmlld30gaW5cbiAqIHN5bmMgd2l0aCB0aGUgbG9ja2VkLXBhdGggc2V0LiBBIHNpbmdsZSBpbnN0YW5jZSBsaXZlcyBvbiB0aGUgc2hhcmVkIGBvYnNpZGlhbi1kZXYtdXRpbHNgIHN0YXRlLlxuICogRm9yIGVhY2ggbG9ja2VkIHBhdGggdGhlIGxvY2sgY291bnQgaXMgdHJhY2tlZCBwZXIgbG9ja2luZyBwbHVnaW4sIHNvIHRoZSBpbmRpY2F0b3JzIGNhbiByZXBvcnRcbiAqIHdoaWNoIHBsdWdpbnMgY3VycmVudGx5IGhvbGQgYSBsb2NrLlxuICovXG5jbGFzcyBFZGl0b3JQYXRoTG9ja01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcnNCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgU2V0PEFib3J0Q29udHJvbGxlcj4+KCk7XG4gIHByaXZhdGUgYXVkaW9Db250ZXh0OiBBdWRpb0NvbnRleHQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBldmVudHNDb21wb25lbnQ6IEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSBsYXN0QmVlcE1pbGxpc2Vjb25kcyA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgaXNMb2NrZWQoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGhMb2NrZWQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nLCBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXIpOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGxldCBsb2NrQ291bnRCeVBsdWdpbklkID0gdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWxvY2tDb3VudEJ5UGx1Z2luSWQpIHtcbiAgICAgIGxvY2tDb3VudEJ5UGx1Z2luSWQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLnNldChwYXRoLCBsb2NrQ291bnRCeVBsdWdpbklkKTtcbiAgICB9XG4gICAgbG9ja0NvdW50QnlQbHVnaW5JZC5zZXQocGx1Z2luSWQsIChsb2NrQ291bnRCeVBsdWdpbklkLmdldChwbHVnaW5JZCkgPz8gMCkgKyAxKTtcbiAgICBpZiAoYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICBsZXQgYWJvcnRDb250cm9sbGVycyA9IHRoaXMuYWJvcnRDb250cm9sbGVyc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgICBpZiAoIWFib3J0Q29udHJvbGxlcnMpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVycyA9IG5ldyBTZXQ8QWJvcnRDb250cm9sbGVyPigpO1xuICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlcnNCeVBhdGguc2V0KHBhdGgsIGFib3J0Q29udHJvbGxlcnMpO1xuICAgICAgfVxuICAgICAgYWJvcnRDb250cm9sbGVycy5hZGQoYWJvcnRDb250cm9sbGVyKTtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcblxuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJzID0gdGhpcy5hYm9ydENvbnRyb2xsZXJzQnlQYXRoLmdldChwYXRoKTtcbiAgICAgICAgICAvLyBUaGUgc2V0IHdhcyBjcmVhdGVkIHdoZW4gdGhpcyBsb2NrIGFkZGVkIGl0cyBjb250cm9sbGVyIGFuZCBpcyBvbmx5IHJlbW92ZWQgaGVyZS5cbiAgICAgICAgICAvLyBJdCBpcyB0aGVyZWZvcmUgYWx3YXlzIHByZXNlbnQgd2hpbGUgdGhpcyAoc2luZ2xlLXJ1bikgZGlzcG9zYWJsZSBjYWxsYmFjayBleGVjdXRlcy5cbiAgICAgICAgICBhc3NlcnROb25OdWxsYWJsZShhYm9ydENvbnRyb2xsZXJzKTtcbiAgICAgICAgICBhYm9ydENvbnRyb2xsZXJzLmRlbGV0ZShhYm9ydENvbnRyb2xsZXIpO1xuICAgICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyc0J5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudW5sb2NrUGF0aChhcHAsIHBhdGgsIHBsdWdpbklkKTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgd2hpY2hcbiAgICogY2FuY2VscyB0aGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrLiBFYWNoIG9wZXJhdGlvbiByZWxlYXNlcyBpdHMgb3duIGxvY2sgaW4gaXRzIGBmaW5hbGx5YFxuICAgKiB3aGVuIGl0IG9ic2VydmVzIHRoZSBhYm9ydCwgc28gdGhpcyBkb2VzIG5vdCB1bmxvY2sgdGhlIHBhdGggZGlyZWN0bHkuIEEgbm8tb3Agd2hlbiBubyBjb250cm9sbGVyXG4gICAqIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHJlcXVlc3QgYW4gdW5sb2NrIGZvci5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0VW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVycyA9IHRoaXMuYWJvcnRDb250cm9sbGVyc0J5UGF0aC5nZXQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAoIWFib3J0Q29udHJvbGxlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIGFib3J0Q29udHJvbGxlcnMpIHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmxvY2tQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpLCBwbHVnaW5JZCk7XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrQWxsRm9yUGx1Z2luKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbcGF0aCwgbG9ja0NvdW50QnlQbHVnaW5JZF0gb2YgdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoKSB7XG4gICAgICBpZiAobG9ja0NvdW50QnlQbHVnaW5JZC5kZWxldGUocGx1Z2luSWQpICYmIGxvY2tDb3VudEJ5UGx1Z2luSWQuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5sb2NrTWVudUl0ZW0oYXBwOiBBcHAsIG1lbnU6IE1lbnUsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgaXRlbVxuICAgICAgICAuc2V0VGl0bGUodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmVkaXRvckxvY2sudW5sb2NrTWVudUl0ZW0pKVxuICAgICAgICAuc2V0SWNvbihVTkxPQ0tfSUNPTl9JRClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICAgICAgYXBwLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy51bmxvY2tDb25maXJtTWVzc2FnZShhcHAsIHBhdGgpLFxuICAgICAgICAgICAgdGl0bGU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5lZGl0b3JMb2NrLnVubG9ja0NvbmZpcm1UaXRsZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNDb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdFVubG9jayhhcHAsIHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiZWVwKCk6IHZvaWQge1xuICAgIC8vIFRocm90dGxlIHNvIGEgYnVyc3Qgb2Yga2V5c3Ryb2tlcyBkb2VzIG5vdCBzdGFjayBvdmVybGFwcGluZyB0b25lcyBpbnRvIGEgYnV6ei5cbiAgICBjb25zdCBub3dNaWxsaXNlY29uZHMgPSBEYXRlLm5vdygpO1xuICAgIGlmIChub3dNaWxsaXNlY29uZHMgLSB0aGlzLmxhc3RCZWVwTWlsbGlzZWNvbmRzIDwgQkVFUF9USFJPVFRMRV9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYXN0QmVlcE1pbGxpc2Vjb25kcyA9IG5vd01pbGxpc2Vjb25kcztcblxuICAgIC8vIGBsaWIuZG9tYCB0eXBlcyBgQXVkaW9Db250ZXh0YCBhcyBhbHdheXMgcHJlc2VudCwgYnV0IGl0IGlzIGFic2VudCBpbiBzb21lIHJ1bnRpbWVzXG4gICAgLy8gKGUuZy4gdGhlIGpzZG9tIHRlc3QgZW52aXJvbm1lbnQpLCBzbyB0aGlzIGd1YXJkIGlzIHJlYWwsIG5vdCByZWR1bmRhbnQuXG4gICAgY29uc3QgQXVkaW9Db250ZXh0Q2xhc3MgPSB3aW5kb3cuQXVkaW9Db250ZXh0O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNlZSB0aGUgY29tbWVudCBhYm92ZS5cbiAgICBpZiAoIUF1ZGlvQ29udGV4dENsYXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXVkaW9Db250ZXh0ID8/PSBuZXcgQXVkaW9Db250ZXh0Q2xhc3MoKTtcbiAgICBjb25zdCBhdWRpb0NvbnRleHQgPSB0aGlzLmF1ZGlvQ29udGV4dDtcbiAgICBjb25zdCBvc2NpbGxhdG9yID0gYXVkaW9Db250ZXh0LmNyZWF0ZU9zY2lsbGF0b3IoKTtcbiAgICBjb25zdCBnYWluTm9kZSA9IGF1ZGlvQ29udGV4dC5jcmVhdGVHYWluKCk7XG4gICAgb3NjaWxsYXRvci50eXBlID0gJ3NpbmUnO1xuICAgIG9zY2lsbGF0b3IuZnJlcXVlbmN5LnZhbHVlID0gQkVFUF9GUkVRVUVOQ1lfSFo7XG4gICAgZ2Fpbk5vZGUuZ2Fpbi52YWx1ZSA9IEJFRVBfR0FJTjtcbiAgICBvc2NpbGxhdG9yLmNvbm5lY3QoZ2Fpbk5vZGUpO1xuICAgIGdhaW5Ob2RlLmNvbm5lY3QoYXVkaW9Db250ZXh0LmRlc3RpbmF0aW9uKTtcbiAgICBvc2NpbGxhdG9yLnN0YXJ0KCk7XG4gICAgb3NjaWxsYXRvci5zdG9wKGF1ZGlvQ29udGV4dC5jdXJyZW50VGltZSArIEJFRVBfRFVSQVRJT05fU0VDT05EUyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUluZGljYXRvcnMoYXBwOiBBcHAsIHZpZXc6IE1hcmtkb3duVmlldywgcGF0aDogc3RyaW5nLCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgKCkgPT4gcGF0aCk7XG5cbiAgICBsZXQgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHRhYlN0YXR1c0NvbnRhaW5lckVsID0gdmlldy5sZWFmLnRhYkhlYWRlclN0YXR1c0NvbnRhaW5lckVsO1xuICAgIGlmICh0YWJTdGF0dXNDb250YWluZXJFbCkge1xuICAgICAgdGFiSWNvbkVsID0gdGFiU3RhdHVzQ29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IGNsczogTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTIH0pO1xuICAgICAgc2V0SWNvbih0YWJJY29uRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKHRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRhYkljb25FbCwgKCkgPT4gcGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXAoKTtcbiAgICB9O1xuICAgIHZpZXcuY29udGVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZWlucHV0Jywgb25UeXBlQXR0ZW1wdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uSWNvbkVsLFxuICAgICAgZGlzcG9zZVR5cGVMaXN0ZW5lcjogKCk6IHZvaWQgPT4ge1xuICAgICAgICB2aWV3LmNvbnRlbnRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuICAgICAgfSxcbiAgICAgIHRhYkljb25FbFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudCh7XG4gICAgICBhcHAsXG4gICAgICBvbkNoYW5nZTogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgICAgfSxcbiAgICAgIG9uRmlsZU1lbnU6IChtZW51LCBmaWxlKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRmlsZU1lbnUoYXBwLCBtZW51LCBmaWxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmV2ZW50c0NvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoRWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbC5yZW1vdmVDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICAgIC8vIFJlYWQgbGF5b3V0IHRvIGZvcmNlIGEgcmVmbG93IHNvIHRoZSBmbGFzaCBhbmltYXRpb24gcmVzdGFydHMgb24gZXZlcnkgcmVqZWN0ZWQga2V5c3Ryb2tlLlxuICAgIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGVsLmFkZENsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIFtpbmRpY2F0b3JzPy5hY3Rpb25JY29uRWwsIGluZGljYXRvcnM/LnRhYkljb25FbCwgdGhpcy5zdGF0dXNCYXJJdGVtRWxdKSB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgdGhpcy5mbGFzaEVsZW1lbnQoZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmlsZU1lbnUoYXBwOiBBcHAsIG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1BhdGhMb2NrZWQoZmlsZS5wYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgZmlsZS5wYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoTG9ja2VkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmdldChwYXRoKT8uc2l6ZSA/PyAwKSA+IDA7XG4gIH1cblxuICBwcml2YXRlIGxvY2tpbmdQbHVnaW5OYW1lcyhhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGxvY2tDb3VudEJ5UGx1Z2luSWQgPSB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZ2V0KHBhdGgpO1xuICAgIC8vIGBsb2NraW5nUGx1Z2luTmFtZXNgIGlzIG9ubHkgZXZlciBjYWxsZWQgZm9yIGEgbG9ja2VkIHBhdGgsIHNvIHRoZSBwZXItcGx1Z2luIG1hcCBpcyBhbHdheXMgcHJlc2VudC5cbiAgICBhc3NlcnROb25OdWxsYWJsZShsb2NrQ291bnRCeVBsdWdpbklkKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShsb2NrQ291bnRCeVBsdWdpbklkLmtleXMoKSkubWFwKChwbHVnaW5JZCkgPT4gYXBwLnBsdWdpbnMubWFuaWZlc3RzW3BsdWdpbklkXT8ubmFtZSA/PyBwbHVnaW5JZCk7XG4gIH1cblxuICBwcml2YXRlIGxvY2tUb29sdGlwKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhlYWRlciA9IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5lZGl0b3JMb2NrLmxvY2tlZEJ5VG9vbHRpcCk7XG4gICAgLy8gQSBydW50aW1lLWxlbmd0aCBsaXN0IG9mIHBsdWdpbiBuYW1lcywgb25lIHBlciBsaW5lIHVuZGVyIHRoZSBoZWFkZXIuXG4gICAgcmV0dXJuIFtoZWFkZXIsIC4uLnRoaXMubG9ja2luZ1BsdWdpbk5hbWVzKGFwcCwgcGF0aCldLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGUoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3c1RvTG9jayA9IG5ldyBTZXQ8TWFya2Rvd25WaWV3PigpO1xuICAgIGZvciAoY29uc3QgbGVhZiBvZiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5NYXJrZG93bikpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSBsZWFmLnZpZXc7XG4gICAgICBpZiAoISh2aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0aCA9IHZpZXcuZmlsZT8ucGF0aDtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzUGF0aExvY2tlZChwYXRoKSkge1xuICAgICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLmxvY2tUb29sdGlwKGFwcCwgcGF0aCk7XG4gICAgICAgIC8vIFJlLWFwcGx5IHRoZSByZWFkLW9ubHkgdG9nZ2xlIG9uIGV2ZXJ5IHJlY29uY2lsZSwgbm90IG9ubHkgdGhlIGZpcnN0IHRpbWUgYSB2aWV3IGlzIHRyYWNrZWQuXG4gICAgICAgIC8vIFRoZSB0b2dnbGUgaXMgaWRlbXBvdGVudCwgc28gcmUtYXBwbHlpbmcgdG8gYW4gYWxyZWFkeS1sb2NrZWQgdmlldyBpcyBjaGVhcC5cbiAgICAgICAgLy8gQSB2aWV3IG9wZW5lZCBhZnRlciB0aGUgbG9jayBpcyByZWNvbmNpbGVkIHN5bmNocm9ub3VzbHksIGJlZm9yZSBpdHMgQ29kZU1pcnJvciBpcyByZWFkeS5cbiAgICAgICAgLy8gSXRzIGZpcnN0IHRvZ2dsZSBpcyB0aGVyZWZvcmUgYSBuby1vcDsgcmUtYXBwbHlpbmcgbWFrZXMgdGhlIGxvY2sgdGFrZSBob2xkIG9uY2UgaXQgc2V0dGxlcy5cbiAgICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIHRydWUpO1xuICAgICAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICAgICAgaWYgKGluZGljYXRvcnMpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUluZGljYXRvclRvb2x0aXBzKGluZGljYXRvcnMsIHRvb2x0aXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5zZXQodmlldywgdGhpcy5jcmVhdGVJbmRpY2F0b3JzKGFwcCwgdmlldywgcGF0aCwgdG9vbHRpcCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbdmlldywgaW5kaWNhdG9yc10gb2YgdGhpcy5pbmRpY2F0b3JzQnlWaWV3KSB7XG4gICAgICBpZiAoIXZpZXdzVG9Mb2NrLmhhcyh2aWV3KSkge1xuICAgICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgZmFsc2UpO1xuICAgICAgICBpbmRpY2F0b3JzLmRpc3Bvc2VUeXBlTGlzdGVuZXIoKTtcbiAgICAgICAgaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwucmVtb3ZlKCk7XG4gICAgICAgIGluZGljYXRvcnMudGFiSWNvbkVsPy5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmRlbGV0ZSh2aWV3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhcihhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGVBbmRDbGVhbnVwKGFwcDogQXBwKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgICBpZiAodGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJVbmxvY2tNZW51KGFwcDogQXBwLCBlbDogSFRNTEVsZW1lbnQsIGdldENvbnRleHRQYXRoOiAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAvLyBBIHBsYWluIGxpc3RlbmVyIGRpZXMgd2l0aCB0aGUgZWxlbWVudCB3aGVuIGl0IGlzIGAucmVtb3ZlKClgZCBvbiB1bmxvY2ssIHNvIGl0IG5ldmVyIGxlYWtzLlxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGV2dCkgPT4ge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0Q29udGV4dFBhdGgoKTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVudSA9IG5ldyBNZW51KCk7XG4gICAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgcGF0aCk7XG4gICAgICBtZW51LnNob3dBdE1vdXNlRXZlbnQoZXZ0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5lZGl0b3JMb2NrLnVubG9ja0NvbmZpcm1NZXNzYWdlKSk7XG4gICAgLy8gQSBydW50aW1lLWxlbmd0aCBsaXN0IG9mIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jaywgZWFjaCBhcyBhIGNvZGUgYmxvY2sgb24gaXRzIG93biBsaW5lLlxuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpKSB7XG4gICAgICBmcmFnbWVudC5jcmVhdGVFbCgnYnInKTtcbiAgICAgIGFwcGVuZENvZGVCbG9jayhmcmFnbWVudCwgbmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbG9ja0NvdW50QnlQbHVnaW5JZCA9IHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFsb2NrQ291bnRCeVBsdWdpbklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY291bnQgPSBsb2NrQ291bnRCeVBsdWdpbklkLmdldChwbHVnaW5JZCkgPz8gMDtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgbG9ja0NvdW50QnlQbHVnaW5JZC5kZWxldGUocGx1Z2luSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NrQ291bnRCeVBsdWdpbklkLnNldChwbHVnaW5JZCwgY291bnQgLSAxKTtcbiAgICB9XG5cbiAgICBpZiAobG9ja0NvdW50QnlQbHVnaW5JZC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cblxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzOiBMb2NrSW5kaWNhdG9ycywgdG9vbHRpcDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLmFjdGlvbkljb25FbCwgdG9vbHRpcCk7XG4gICAgaWYgKGluZGljYXRvcnMudGFiSWNvbkVsKSB7XG4gICAgICBzZXRUb29sdGlwKGluZGljYXRvcnMudGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c0JhcihhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBjb25zdCBhY3RpdmVQYXRoID0gYWN0aXZlVmlldz8uZmlsZT8ucGF0aDtcbiAgICBjb25zdCBpc0FjdGl2ZUxvY2tlZCA9IGFjdGl2ZVBhdGggIT09IHVuZGVmaW5lZCAmJiB0aGlzLmlzUGF0aExvY2tlZChhY3RpdmVQYXRoKTtcblxuICAgIGlmICghaXNBY3RpdmVMb2NrZWQgfHwgIWFjdGl2ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFySXRlbUVsKSB7XG4gICAgICBjb25zdCBzdGF0dXNCYXJFbCA9IGFjdGl2ZVZpZXcuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SKTtcbiAgICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBzdGF0dXNCYXJFbC5jcmVhdGVEaXYoeyBjbHM6IFtTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTLCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1NdIH0pO1xuICAgICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIC8vIFRoZSBzaW5nbGUgc3RhdHVzLWJhciBpdGVtIGlzIHJldXNlZCBhY3Jvc3MgYWN0aXZlLW5vdGUgc3dpdGNoZXMuXG4gICAgICAvLyBJdCBtdXN0IHJlc29sdmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbm90ZSdzIHBhdGggYXQgY2xpY2sgdGltZSByYXRoZXIgdGhhbiBjYXB0dXJpbmcgb25lIHBhdGguXG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRoaXMuc3RhdHVzQmFySXRlbUVsLCAoKSA9PiBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZmlsZT8ucGF0aCk7XG4gICAgfVxuXG4gICAgc2V0VG9vbHRpcCh0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgdGhpcy5sb2NrVG9vbHRpcChhcHAsIGFjdGl2ZVBhdGgpKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGVyLXBsdWdpbiBoYW5kbGUgZm9yIG5vdGUtc2NvcGVkIGVkaXRvciBsb2NraW5nLiBBZGQgaXQgYXMgYSBjaGlsZCBvZiB5b3VyIHBsdWdpblxuICogKGB0aGlzLmFkZENoaWxkKG5ldyBFZGl0b3JMb2NrQ29tcG9uZW50KHRoaXMuYXBwKSlgKSBzbyB0aGF0IGFueSBsb2NrcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVsZWFzZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMgXHUyMDE0IGEgbm90ZSBjYW4gbmV2ZXIgYmUgbGVmdCBzdHVjayByZWFkLW9ubHkgYmVjYXVzZSB0aGVcbiAqIHBsdWdpbiB0aGF0IGxvY2tlZCBpdCB3YXMgZGlzYWJsZWQgb3IgcmVsb2FkZWQgbWlkLW9wZXJhdGlvbi5cbiAqXG4gKiBMb2NrcyBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYW5kIGF0dHJpYnV0ZWQgdG8gdGhpcyBwbHVnaW4sIHNvIHRoZSBsb2NrIGluZGljYXRvcnMnIHRvb2x0aXAgbmFtZXNcbiAqIGl0IGFtb25nIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jay5cbiAqL1xuZXhwb3J0IGNsYXNzIEVkaXRvckxvY2tDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlZGl0b3ItbG9jayBoYW5kbGUgb3duZWQgYnkgYSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4uIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsdWdpbiBjb250ZXh0J3MgaWQ7IHBhc3NcbiAgICogaXQgZXhwbGljaXRseSAoZS5nLiBmcm9tIGEgcGx1Z2luJ3MgYG1hbmlmZXN0LmlkYCkgd2hlbiBjb25zdHJ1Y3RpbmcgYmVmb3JlIHRoZSBwbHVnaW4gY29udGV4dCBpc1xuICAgKiBpbml0aWFsaXplZCwgc3VjaCBhcyBpbnNpZGUgYFBsdWdpbkJhc2Uub25sb2FkYC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZyA9IGdldFBsdWdpbklkKCkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGJ5IGFueSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZCh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggb24gYmVoYWxmIG9mIHRoaXMgcGx1Z2luLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnRcbiAgICogYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZC4gUmVmZXJlbmNlLWNvdW50ZWQ6IGJhbGFuY2UgZWFjaCBjYWxsXG4gICAqIHdpdGggYSBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKGlkZWFsbHkgdmlhIGB1c2luZ2ApIG9yIHtAbGluayB1bmxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgbG9ja2luZyBvcHRpb25zLiBQYXNzIGFuXG4gICAqIHtAbGluayBFZGl0b3JMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zLmFib3J0Q29udHJvbGxlcn0gdG8gbWFrZSB0aGUgbG9jayBjYW5jZWxhYmxlIHZpYSB0aGVcbiAgICogaW5kaWNhdG9yJ3MgcmlnaHQtY2xpY2sgXCJ1bmxvY2tcIiBtZW51IG9yIHtAbGluayByZXF1ZXN0RWRpdG9yVW5sb2NrRm9yUGF0aH0uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIG9wdGlvbnM/OiBFZGl0b3JMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkLCBvcHRpb25zPy5hYm9ydENvbnRyb2xsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGV2ZXJ5IGxvY2sgc3RpbGwgaGVsZCBieSB0aGlzIHBsdWdpbiB3aGVuIHRoZSBjb21wb25lbnQgKGFuZCB0aHVzIHRoZSBwbHVnaW4pIHVubG9hZHMsXG4gICAqIHNvIG5vIG5vdGUgaXMgbGVmdCBzdHVjayByZWFkLW9ubHkgYnkgYW4gb3BlcmF0aW9uIHRoYXQgbmV2ZXIgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2tBbGxGb3JQbHVnaW4odGhpcy5hcHAsIHRoaXMucGx1Z2luSWQpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSwgdGhpcy5wbHVnaW5JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFZGl0b3JMb2NrZWRGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQoYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50IGFuZCBmdXR1cmVcbiAqIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCBhbmQgc2hvd2luZyBhIGxvY2sgaW5kaWNhdG9yIGluIHRoZSB0YWIgaGVhZGVyLFxuICogdmlldyBhY3Rpb24gYmFyLCBhbmQgKHdoaWxlIGFjdGl2ZSkgdGhlIHN0YXR1cyBiYXIuIFRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHRoZSBwbHVnaW5zXG4gKiB0aGF0IGN1cnJlbnRseSBob2xkIGEgbG9jayBvbiB0aGUgbm90ZS5cbiAqXG4gKiBUaGUgbG9jayBpcyByZWZlcmVuY2UtY291bnRlZCBwZXIgY2FsbGluZyBwbHVnaW46IGVhY2ggY2FsbCBtdXN0IGJlIGJhbGFuY2VkIGJ5IGV4YWN0bHkgb25lXG4gKiByZWxlYXNlIChlaXRoZXIgZGlzcG9zaW5nIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gXHUyMDE0IGlkZWFsbHkgdmlhIGEgYHVzaW5nYCBkZWNsYXJhdGlvbiBcdTIwMTQgb3JcbiAqIGEgbWF0Y2hpbmcge0BsaW5rIHVubG9ja0VkaXRvckZvclBhdGh9IGNhbGwpLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tFZGl0b3JGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayhhcHAsIHBhdGhPckZpbGUsIGdldFBsdWdpbklkKCkpO1xufVxuXG4vKipcbiAqIFJlcXVlc3RzIGFuIHVubG9jayBvZiB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBieSBhYm9ydGluZyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSB0aGF0IHdhc1xuICogYXNzb2NpYXRlZCB3aXRoIGEgbG9jayBvbiBpdCAodmlhIHtAbGluayBFZGl0b3JMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofSdzXG4gKiB7QGxpbmsgRWRpdG9yTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoT3B0aW9ucy5hYm9ydENvbnRyb2xsZXJ9KS4gVGhlIG9wZXJhdGlvbnMgaG9sZGluZyB0aGUgbG9ja1xuICogb2JzZXJ2ZSB0aGUgYWJvcnQgYW5kIHJlbGVhc2UgdGhlaXIgb3duIGxvY2tzLiBBIG5vLW9wIHdoZW4gbm8gYWJvcnRhYmxlIGxvY2sgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlXG4gKiBwYXRoLlxuICpcbiAqIFRoaXMgbGV0cyBhIGNvbnN1bWluZyBwbHVnaW4gd2lyZSBpdHMgb3duIFwidW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCB3aXRob3V0IHJlYWNoaW5nIGludG8gdGhlXG4gKiBsb2NrIG1hbmFnZXIgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdEVkaXRvclVubG9ja0ZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnJlcXVlc3RVbmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tFZGl0b3JGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tFZGl0b3JGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS51bmxvY2soYXBwLCBwYXRoT3JGaWxlLCBnZXRQbHVnaW5JZCgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBFZGl0b3JQYXRoTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPEVkaXRvclBhdGhMb2NrTWFuYWdlcj4oRURJVE9SX0xPQ0tfU1RBVEVfS0VZLCBuZXcgRWRpdG9yUGF0aExvY2tNYW5hZ2VyKCkpLnZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE4QkEsNkJBQXlCO0FBQ3pCLHNCQU1PO0FBSVAsbUJBQW1DO0FBQ25DLHdCQUdPO0FBQ1Asc0JBQXFCO0FBQ3JCLDBCQUFnQztBQUNoQyxzQ0FBeUM7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
545
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2VkaXRvci1sb2NrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTm90ZS1zY29wZWQsIHJlZmVyZW5jZS1jb3VudGVkIGVkaXRvciBsb2NraW5nLlxuICpcbiAqIFdoZXJlIHtAbGluayB0b2dnbGVFZGl0b3JSZWFkT25seX0gZnJvbSBgLi9lZGl0b3IudHNgIHRvZ2dsZXMgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiBhIHNpbmdsZVxuICoge0BsaW5rIEVkaXRvcn0gaW5zdGFuY2UsIHRoZSBoZWxwZXJzIGhlcmUgbG9jayBhIG5vdGUgYnkgaXRzICoqcGF0aCoqOiB3aGlsZSBhIHBhdGggaXNcbiAqIGxvY2tlZCwgZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IG9mIHRoYXQgbm90ZSAoaW4gYW55IHdpbmRvdywgaW5jbHVkaW5nXG4gKiBwb3BvdXRzKSBpcyBtYWRlIHJlYWQtb25seSBhbmQgc2hvd3MgYSBsb2NrIGluZGljYXRvciBpbiBpdHMgdGFiIGhlYWRlciwgaXRzIHZpZXcgYWN0aW9uIGJhciwgYW5kXG4gKiB0aGUgc3RhdHVzIGJhciAod2hpbGUgdGhlIG5vdGUgaXMgYWN0aXZlKS4gTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIHBlciBsb2NraW5nIHBsdWdpbiwgc29cbiAqIG5lc3RlZCBvciBjb25jdXJyZW50IG9wZXJhdGlvbnMgb24gdGhlIHNhbWUgbm90ZSBhcmUgc2FmZSBcdTIwMTQgdGhlIG5vdGUgaXMgdW5sb2NrZWQgb25seSB3aGVuIHRoZVxuICogbGFzdCBsb2NrIGlzIHJlbGVhc2VkIFx1MjAxNCBhbmQgdGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgd2hpY2ggcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb25cbiAqIHRoYXQgcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tFZGl0b3JGb3JQYXRoKGFwcCwgcGF0aCwgdGhpcy5tYW5pZmVzdC5pZCk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja0VkaXRvckZvclBhdGh9IHBhaXIgcmVtYWlucyBhdmFpbGFibGUgZm9yIG5vbi1gdXNpbmdgIGNhbGwgc2l0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFRBYnN0cmFjdEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBWaWV3VHlwZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICcuLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50cy9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgdG9nZ2xlRWRpdG9yUmVhZE9ubHkgfSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyBhcHBlbmRDb2RlQmxvY2sgfSBmcm9tICcuL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gJy4vbW9kYWxzL2NvbmZpcm0udHMnO1xuXG5jb25zdCBCRUVQX0RVUkFUSU9OX1NFQ09ORFMgPSAwLjA4O1xuY29uc3QgQkVFUF9GUkVRVUVOQ1lfSFogPSA2NjA7XG5jb25zdCBCRUVQX0dBSU4gPSAwLjA1O1xuY29uc3QgQkVFUF9USFJPVFRMRV9NSUxMSVNFQ09ORFMgPSAyMDA7XG5jb25zdCBFRElUT1JfTE9DS19TVEFURV9LRVkgPSAnZWRpdG9yTG9jayc7XG5jb25zdCBMT0NLX0lDT05fSUQgPSAnbG9jayc7XG5jb25zdCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yJztcbmNvbnN0IExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyA9ICdvYnNpZGlhbi1kZXYtdXRpbHMtbG9jay1pbmRpY2F0b3ItZmxhc2gnO1xuY29uc3QgU1RBVFVTX0JBUl9JVEVNX0NTU19DTEFTUyA9ICdzdGF0dXMtYmFyLWl0ZW0nO1xuY29uc3QgU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IgPSAnLnN0YXR1cy1iYXInO1xuY29uc3QgVU5MT0NLX0lDT05fSUQgPSAndW5sb2NrJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgRWRpdG9yTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdG9yTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2suIFdoZW4gdGhlIGxvY2sgaW5kaWNhdG9yIGlzXG4gICAqIHJpZ2h0LWNsaWNrZWQgYW5kIHRoZSB1c2VyIGNvbmZpcm1zIGFuIHVubG9jayAob3Ige0BsaW5rIHJlcXVlc3RFZGl0b3JVbmxvY2tGb3JQYXRofSBpcyBjYWxsZWQgZm9yXG4gICAqIHRoZSBwYXRoKSwgdGhpcyBjb250cm9sbGVyIGlzIGFib3J0ZWQgc28gdGhlIG9wZXJhdGlvbiBob2xkaW5nIHRoZSBsb2NrIGNhbiBjYW5jZWwgaXRzZWxmIGFuZFxuICAgKiByZWxlYXNlIHRoZSBsb2NrIGluIGl0cyBvd24gY2xlYW51cC5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBFZGl0b3JMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgb25DaGFuZ2UodGhpczogdm9pZCk6IHZvaWQ7XG4gIG9uRmlsZU1lbnUodGhpczogdm9pZCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBMb2NrSW5kaWNhdG9ycyB7XG4gIHJlYWRvbmx5IGFjdGlvbkljb25FbDogSFRNTEVsZW1lbnQ7XG4gIGRpc3Bvc2VUeXBlTGlzdGVuZXIoKTogdm9pZDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byB0aGUgd29ya3NwYWNlIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgbG9jayByZWNvbmNpbGUgKGFuZCB0aGUgZmlsZSBjb250ZXh0LW1lbnVcbiAqIGV2ZW50IHRoYXQgb2ZmZXJzIGFuIFwiVW5sb2NrXCIgaXRlbSkuIEltcGxlbWVudGVkIGFzIGEge0BsaW5rIENvbXBvbmVudEV4fSBzbyB0aGUgc3Vic2NyaXB0aW9ucyBhcmVcbiAqIHJlZ2lzdGVyZWQgb24gYGxvYWQoKWAgYW5kIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvbiBgdW5sb2FkKClgLCBpbnN0ZWFkIG9mIGJlaW5nIHRyYWNrZWQgYnkgaGFuZC5cbiAqL1xuY2xhc3MgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkZpbGVNZW51OiAobWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSkgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBFZGl0b3JMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLm9uQ2hhbmdlID0gcGFyYW1zLm9uQ2hhbmdlO1xuICAgIHRoaXMub25GaWxlTWVudSA9IHBhcmFtcy5vbkZpbGVNZW51O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBTYW1lLWxlYWYgbmF2aWdhdGlvbiB0byBhbm90aGVyIG5vdGUgZmlyZXMgbm8gbGVhZi9sYXlvdXQgY2hhbmdlOyB3aXRob3V0IHRoaXMgaXQgc3RheXMgcmVhZC1vbmx5LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBBZGRzIGFuIFwiVW5sb2NrXCIgaXRlbSB0byBhIGxvY2tlZCBub3RlJ3MgdGFiL2ZpbGUgY29udGV4dCBtZW51IChhbG9uZ3NpZGUgdGhlIGluZGljYXRvciBtZW51cykuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1tZW51JywgdGhpcy5vbkZpbGVNZW51KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFja3MgcmVmZXJlbmNlLWNvdW50ZWQsIHBhdGgtc2NvcGVkIGVkaXRvciBsb2NrcyBhbmQga2VlcHMgZXZlcnkgb3BlbiB7QGxpbmsgTWFya2Rvd25WaWV3fSBpblxuICogc3luYyB3aXRoIHRoZSBsb2NrZWQtcGF0aCBzZXQuIEEgc2luZ2xlIGluc3RhbmNlIGxpdmVzIG9uIHRoZSBzaGFyZWQgYG9ic2lkaWFuLWRldi11dGlsc2Agc3RhdGUuXG4gKiBGb3IgZWFjaCBsb2NrZWQgcGF0aCB0aGUgbG9jayBjb3VudCBpcyB0cmFja2VkIHBlciBsb2NraW5nIHBsdWdpbiwgc28gdGhlIGluZGljYXRvcnMgY2FuIHJlcG9ydFxuICogd2hpY2ggcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKi9cbmNsYXNzIEVkaXRvclBhdGhMb2NrTWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8QWJvcnRDb250cm9sbGVyPj4oKTtcbiAgcHJpdmF0ZSBhdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGV2ZW50c0NvbXBvbmVudDogRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzQnlWaWV3ID0gbmV3IE1hcDxNYXJrZG93blZpZXcsIExvY2tJbmRpY2F0b3JzPigpO1xuICBwcml2YXRlIGxhc3RCZWVwTWlsbGlzZWNvbmRzID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+KCk7XG4gIHByaXZhdGUgc3RhdHVzQmFySXRlbUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBpc0xvY2tlZChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGF0aExvY2tlZChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICB9XG5cbiAgcHVibGljIGxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcsIGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcik6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgbGV0IGxvY2tDb3VudEJ5UGx1Z2luSWQgPSB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghbG9ja0NvdW50QnlQbHVnaW5JZCkge1xuICAgICAgbG9ja0NvdW50QnlQbHVnaW5JZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguc2V0KHBhdGgsIGxvY2tDb3VudEJ5UGx1Z2luSWQpO1xuICAgIH1cbiAgICBsb2NrQ291bnRCeVBsdWdpbklkLnNldChwbHVnaW5JZCwgKGxvY2tDb3VudEJ5UGx1Z2luSWQuZ2V0KHBsdWdpbklkKSA/PyAwKSArIDEpO1xuICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIGxldCBhYm9ydENvbnRyb2xsZXJzID0gdGhpcy5hYm9ydENvbnRyb2xsZXJzQnlQYXRoLmdldChwYXRoKTtcbiAgICAgIGlmICghYWJvcnRDb250cm9sbGVycykge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXJzID0gbmV3IFNldDxBYm9ydENvbnRyb2xsZXI+KCk7XG4gICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyc0J5UGF0aC5zZXQocGF0aCwgYWJvcnRDb250cm9sbGVycyk7XG4gICAgICB9XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLmFkZChhYm9ydENvbnRyb2xsZXIpO1xuICAgIH1cbiAgICB0aGlzLmVuc3VyZVN1YnNjcmliZWQoYXBwKTtcbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuXG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGFib3J0Q29udHJvbGxlcikge1xuICAgICAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlcnMgPSB0aGlzLmFib3J0Q29udHJvbGxlcnNCeVBhdGguZ2V0KHBhdGgpO1xuICAgICAgICAgIC8vIFRoZSBzZXQgd2FzIGNyZWF0ZWQgd2hlbiB0aGlzIGxvY2sgYWRkZWQgaXRzIGNvbnRyb2xsZXIgYW5kIGlzIG9ubHkgcmVtb3ZlZCBoZXJlLlxuICAgICAgICAgIC8vIEl0IGlzIHRoZXJlZm9yZSBhbHdheXMgcHJlc2VudCB3aGlsZSB0aGlzIChzaW5nbGUtcnVuKSBkaXNwb3NhYmxlIGNhbGxiYWNrIGV4ZWN1dGVzLlxuICAgICAgICAgIGFzc2VydE5vbk51bGxhYmxlKGFib3J0Q29udHJvbGxlcnMpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKGFib3J0Q29udHJvbGxlcik7XG4gICAgICAgICAgaWYgKGFib3J0Q29udHJvbGxlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXJzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bmxvY2tQYXRoKGFwcCwgcGF0aCwgcGx1Z2luSWQpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaFxuICAgKiBjYW5jZWxzIHRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2suIEVhY2ggb3BlcmF0aW9uIHJlbGVhc2VzIGl0cyBvd24gbG9jayBpbiBpdHMgYGZpbmFsbHlgXG4gICAqIHdoZW4gaXQgb2JzZXJ2ZXMgdGhlIGFib3J0LCBzbyB0aGlzIGRvZXMgbm90IHVubG9jayB0aGUgcGF0aCBkaXJlY3RseS4gQSBuby1vcCB3aGVuIG5vIGNvbnRyb2xsZXJcbiAgICogaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJzID0gdGhpcy5hYm9ydENvbnRyb2xsZXJzQnlQYXRoLmdldChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICAgIGlmICghYWJvcnRDb250cm9sbGVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgYWJvcnRDb250cm9sbGVycykge1xuICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVubG9ja1BhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSksIHBsdWdpbklkKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBsb2NrQ291bnRCeVBsdWdpbklkXSBvZiB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGgpIHtcbiAgICAgIGlmIChsb2NrQ291bnRCeVBsdWdpbklkLmRlbGV0ZShwbHVnaW5JZCkgJiYgbG9ja0NvdW50QnlQbHVnaW5JZC5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRVbmxvY2tNZW51SXRlbShhcHA6IEFwcCwgbWVudTogTWVudSwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgbWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG4gICAgICBpdGVtXG4gICAgICAgIC5zZXRUaXRsZSh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMuZWRpdG9yTG9jay51bmxvY2tNZW51SXRlbSkpXG4gICAgICAgIC5zZXRJY29uKFVOTE9DS19JQ09OX0lEKVxuICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgY29uZmlybSh7XG4gICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnVubG9ja0NvbmZpcm1NZXNzYWdlKGFwcCwgcGF0aCksXG4gICAgICAgICAgICB0aXRsZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmVkaXRvckxvY2sudW5sb2NrQ29uZmlybVRpdGxlKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJlZXAoKTogdm9pZCB7XG4gICAgLy8gVGhyb3R0bGUgc28gYSBidXJzdCBvZiBrZXlzdHJva2VzIGRvZXMgbm90IHN0YWNrIG92ZXJsYXBwaW5nIHRvbmVzIGludG8gYSBidXp6LlxuICAgIGNvbnN0IG5vd01pbGxpc2Vjb25kcyA9IERhdGUubm93KCk7XG4gICAgaWYgKG5vd01pbGxpc2Vjb25kcyAtIHRoaXMubGFzdEJlZXBNaWxsaXNlY29uZHMgPCBCRUVQX1RIUk9UVExFX01JTExJU0VDT05EUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxhc3RCZWVwTWlsbGlzZWNvbmRzID0gbm93TWlsbGlzZWNvbmRzO1xuXG4gICAgLy8gYGxpYi5kb21gIHR5cGVzIGBBdWRpb0NvbnRleHRgIGFzIGFsd2F5cyBwcmVzZW50LCBidXQgaXQgaXMgYWJzZW50IGluIHNvbWUgcnVudGltZXNcbiAgICAvLyAoZS5nLiB0aGUganNkb20gdGVzdCBlbnZpcm9ubWVudCksIHNvIHRoaXMgZ3VhcmQgaXMgcmVhbCwgbm90IHJlZHVuZGFudC5cbiAgICBjb25zdCBBdWRpb0NvbnRleHRDbGFzcyA9IHdpbmRvdy5BdWRpb0NvbnRleHQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc2VlIHRoZSBjb21tZW50IGFib3ZlLlxuICAgIGlmICghQXVkaW9Db250ZXh0Q2xhc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hdWRpb0NvbnRleHQgPz89IG5ldyBBdWRpb0NvbnRleHRDbGFzcygpO1xuICAgIGNvbnN0IGF1ZGlvQ29udGV4dCA9IHRoaXMuYXVkaW9Db250ZXh0O1xuICAgIGNvbnN0IG9zY2lsbGF0b3IgPSBhdWRpb0NvbnRleHQuY3JlYXRlT3NjaWxsYXRvcigpO1xuICAgIGNvbnN0IGdhaW5Ob2RlID0gYXVkaW9Db250ZXh0LmNyZWF0ZUdhaW4oKTtcbiAgICBvc2NpbGxhdG9yLnR5cGUgPSAnc2luZSc7XG4gICAgb3NjaWxsYXRvci5mcmVxdWVuY3kudmFsdWUgPSBCRUVQX0ZSRVFVRU5DWV9IWjtcbiAgICBnYWluTm9kZS5nYWluLnZhbHVlID0gQkVFUF9HQUlOO1xuICAgIG9zY2lsbGF0b3IuY29ubmVjdChnYWluTm9kZSk7XG4gICAgZ2Fpbk5vZGUuY29ubmVjdChhdWRpb0NvbnRleHQuZGVzdGluYXRpb24pO1xuICAgIG9zY2lsbGF0b3Iuc3RhcnQoKTtcbiAgICBvc2NpbGxhdG9yLnN0b3AoYXVkaW9Db250ZXh0LmN1cnJlbnRUaW1lICsgQkVFUF9EVVJBVElPTl9TRUNPTkRTKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW5kaWNhdG9ycyhhcHA6IEFwcCwgdmlldzogTWFya2Rvd25WaWV3LCBwYXRoOiBzdHJpbmcsIHRvb2x0aXA6IHN0cmluZyk6IExvY2tJbmRpY2F0b3JzIHtcbiAgICBjb25zdCBhY3Rpb25JY29uRWwgPSB2aWV3LmFkZEFjdGlvbihMT0NLX0lDT05fSUQsIHRvb2x0aXAsIG5vb3ApO1xuICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgYWN0aW9uSWNvbkVsLCAoKSA9PiBwYXRoKTtcblxuICAgIGxldCB0YWJJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgdGFiU3RhdHVzQ29udGFpbmVyRWwgPSB2aWV3LmxlYWYudGFiSGVhZGVyU3RhdHVzQ29udGFpbmVyRWw7XG4gICAgaWYgKHRhYlN0YXR1c0NvbnRhaW5lckVsKSB7XG4gICAgICB0YWJJY29uRWwgPSB0YWJTdGF0dXNDb250YWluZXJFbC5jcmVhdGVTcGFuKHsgY2xzOiBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgfSk7XG4gICAgICBzZXRJY29uKHRhYkljb25FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIHNldFRvb2x0aXAodGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGFiSWNvbkVsLCAoKSA9PiBwYXRoKTtcbiAgICB9XG5cbiAgICAvLyBBIGxvY2tlZCB2aWV3IGlzIHJlYWQtb25seSBidXQgc3RpbGwgZWRpdGFibGUtZm9jdXNhYmxlLCBzbyBhIGtleXN0cm9rZSBmaXJlcyBgYmVmb3JlaW5wdXRgLlxuICAgIC8vIE9uIHRoYXQgcmVqZWN0ZWQgYXR0ZW1wdCwgZmxhc2ggdGhlIGluZGljYXRvcnMgYW5kIGJlZXAgc28gaXQncyBjbGVhciB0aGUgbm90ZSBpcyBsb2NrZWQuXG4gICAgLy8gVGhlIGxpc3RlbmVyIGlzIHJlbW92ZWQgb24gdW5sb2NrLlxuICAgIGNvbnN0IG9uVHlwZUF0dGVtcHQgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmZsYXNoSW5kaWNhdG9ycyh2aWV3KTtcbiAgICAgIHRoaXMuYmVlcCgpO1xuICAgIH07XG4gICAgdmlldy5jb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25JY29uRWwsXG4gICAgICBkaXNwb3NlVHlwZUxpc3RlbmVyOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHZpZXcuY29udGVudEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZWlucHV0Jywgb25UeXBlQXR0ZW1wdCk7XG4gICAgICB9LFxuICAgICAgdGFiSWNvbkVsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlU3Vic2NyaWJlZChhcHA6IEFwcCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV2ZW50c0NvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50c0NvbXBvbmVudCA9IG5ldyBFZGl0b3JMb2NrRXZlbnRzQ29tcG9uZW50KHtcbiAgICAgIGFwcCxcbiAgICAgIG9uQ2hhbmdlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgICB9LFxuICAgICAgb25GaWxlTWVudTogKG1lbnUsIGZpbGUpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWxlTWVudShhcHAsIG1lbnUsIGZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hFbGVtZW50KGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGVsLnJlbW92ZUNsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gICAgLy8gUmVhZCBsYXlvdXQgdG8gZm9yY2UgYSByZWZsb3cgc28gdGhlIGZsYXNoIGFuaW1hdGlvbiByZXN0YXJ0cyBvbiBldmVyeSByZWplY3RlZCBrZXlzdHJva2UuXG4gICAgZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgZWwuYWRkQ2xhc3MoTE9DS19JTkRJQ0FUT1JfRkxBU0hfQ1NTX0NMQVNTKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hJbmRpY2F0b3JzKHZpZXc6IE1hcmtkb3duVmlldyk6IHZvaWQge1xuICAgIGNvbnN0IGluZGljYXRvcnMgPSB0aGlzLmluZGljYXRvcnNCeVZpZXcuZ2V0KHZpZXcpO1xuICAgIGZvciAoY29uc3QgZWwgb2YgW2luZGljYXRvcnM/LmFjdGlvbkljb25FbCwgaW5kaWNhdG9ycz8udGFiSWNvbkVsLCB0aGlzLnN0YXR1c0Jhckl0ZW1FbF0pIHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICB0aGlzLmZsYXNoRWxlbWVudChlbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzUGF0aExvY2tlZChmaWxlLnBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBmaWxlLnBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhMb2NrZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZ2V0KHBhdGgpPy5zaXplID8/IDApID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja2luZ1BsdWdpbk5hbWVzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbG9ja0NvdW50QnlQbHVnaW5JZCA9IHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gdGhlIHBlci1wbHVnaW4gbWFwIGlzIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGxvY2tDb3VudEJ5UGx1Z2luSWQpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGxvY2tDb3VudEJ5UGx1Z2luSWQua2V5cygpKS5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmVkaXRvckxvY2subG9ja2VkQnlUb29sdGlwKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgcGx1Z2luIG5hbWVzLCBvbmUgcGVyIGxpbmUgdW5kZXIgdGhlIGhlYWRlci5cbiAgICByZXR1cm4gW2hlYWRlciwgLi4udGhpcy5sb2NraW5nUGx1Z2luTmFtZXMoYXBwLCBwYXRoKV0uam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZShhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXdzVG9Mb2NrID0gbmV3IFNldDxNYXJrZG93blZpZXc+KCk7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgICAgY29uc3QgdmlldyA9IGxlYWYudmlldztcbiAgICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNQYXRoTG9ja2VkKHBhdGgpKSB7XG4gICAgICAgIHZpZXdzVG9Mb2NrLmFkZCh2aWV3KTtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBwYXRoKTtcbiAgICAgICAgLy8gUmUtYXBwbHkgdGhlIHJlYWQtb25seSB0b2dnbGUgb24gZXZlcnkgcmVjb25jaWxlLCBub3Qgb25seSB0aGUgZmlyc3QgdGltZSBhIHZpZXcgaXMgdHJhY2tlZC5cbiAgICAgICAgLy8gVGhlIHRvZ2dsZSBpcyBpZGVtcG90ZW50LCBzbyByZS1hcHBseWluZyB0byBhbiBhbHJlYWR5LWxvY2tlZCB2aWV3IGlzIGNoZWFwLlxuICAgICAgICAvLyBBIHZpZXcgb3BlbmVkIGFmdGVyIHRoZSBsb2NrIGlzIHJlY29uY2lsZWQgc3luY2hyb25vdXNseSwgYmVmb3JlIGl0cyBDb2RlTWlycm9yIGlzIHJlYWR5LlxuICAgICAgICAvLyBJdHMgZmlyc3QgdG9nZ2xlIGlzIHRoZXJlZm9yZSBhIG5vLW9wOyByZS1hcHBseWluZyBtYWtlcyB0aGUgbG9jayB0YWtlIGhvbGQgb25jZSBpdCBzZXR0bGVzLlxuICAgICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGluZGljYXRvcnMgPSB0aGlzLmluZGljYXRvcnNCeVZpZXcuZ2V0KHZpZXcpO1xuICAgICAgICBpZiAoaW5kaWNhdG9ycykge1xuICAgICAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9ycywgdG9vbHRpcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LnNldCh2aWV3LCB0aGlzLmNyZWF0ZUluZGljYXRvcnMoYXBwLCB2aWV3LCBwYXRoLCB0b29sdGlwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFt2aWV3LCBpbmRpY2F0b3JzXSBvZiB0aGlzLmluZGljYXRvcnNCeVZpZXcpIHtcbiAgICAgIGlmICghdmlld3NUb0xvY2suaGFzKHZpZXcpKSB7XG4gICAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCBmYWxzZSk7XG4gICAgICAgIGluZGljYXRvcnMuZGlzcG9zZVR5cGVMaXN0ZW5lcigpO1xuICAgICAgICBpbmRpY2F0b3JzLmFjdGlvbkljb25FbC5yZW1vdmUoKTtcbiAgICAgICAgaW5kaWNhdG9ycy50YWJJY29uRWw/LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuZGVsZXRlKHZpZXcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZUFuZENsZWFudXAoYXBwOiBBcHApOiB2b2lkIHtcbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgIGlmICh0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclVubG9ja01lbnUoYXBwOiBBcHAsIGVsOiBIVE1MRWxlbWVudCwgZ2V0Q29udGV4dFBhdGg6ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIEEgcGxhaW4gbGlzdGVuZXIgZGllcyB3aXRoIHRoZSBlbGVtZW50IHdoZW4gaXQgaXMgYC5yZW1vdmUoKWBkIG9uIHVubG9jaywgc28gaXQgbmV2ZXIgbGVha3MuXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZXZ0KSA9PiB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRDb250ZXh0UGF0aCgpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZW51ID0gbmV3IE1lbnUoKTtcbiAgICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBwYXRoKTtcbiAgICAgIG1lbnUuc2hvd0F0TW91c2VFdmVudChldnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmxvY2tDb25maXJtTWVzc2FnZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGZyYWdtZW50LmFwcGVuZFRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmVkaXRvckxvY2sudW5sb2NrQ29uZmlybU1lc3NhZ2UpKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgdGhlIHBsdWdpbnMgY3VycmVudGx5IGhvbGRpbmcgYSBsb2NrLCBlYWNoIGFzIGEgY29kZSBibG9jayBvbiBpdHMgb3duIGxpbmUuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMubG9ja2luZ1BsdWdpbk5hbWVzKGFwcCwgcGF0aCkpIHtcbiAgICAgIGZyYWdtZW50LmNyZWF0ZUVsKCdicicpO1xuICAgICAgYXBwZW5kQ29kZUJsb2NrKGZyYWdtZW50LCBuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSB1bmxvY2tQYXRoKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBsb2NrQ291bnRCeVBsdWdpbklkID0gdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWxvY2tDb3VudEJ5UGx1Z2luSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudCA9IGxvY2tDb3VudEJ5UGx1Z2luSWQuZ2V0KHBsdWdpbklkKSA/PyAwO1xuICAgIGlmIChjb3VudCA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICBsb2NrQ291bnRCeVBsdWdpbklkLmRlbGV0ZShwbHVnaW5JZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2tDb3VudEJ5UGx1Z2luSWQuc2V0KHBsdWdpbklkLCBjb3VudCAtIDEpO1xuICAgIH1cblxuICAgIGlmIChsb2NrQ291bnRCeVBsdWdpbklkLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUluZGljYXRvclRvb2x0aXBzKGluZGljYXRvcnM6IExvY2tJbmRpY2F0b3JzLCB0b29sdGlwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzZXRUb29sdGlwKGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLCB0b29sdGlwKTtcbiAgICBpZiAoaW5kaWNhdG9ycy50YWJJY29uRWwpIHtcbiAgICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy50YWJJY29uRWwsIHRvb2x0aXApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzQmFyKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgIGNvbnN0IGFjdGl2ZVBhdGggPSBhY3RpdmVWaWV3Py5maWxlPy5wYXRoO1xuICAgIGNvbnN0IGlzQWN0aXZlTG9ja2VkID0gYWN0aXZlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNQYXRoTG9ja2VkKGFjdGl2ZVBhdGgpO1xuXG4gICAgaWYgKCFpc0FjdGl2ZUxvY2tlZCB8fCAhYWN0aXZlVmlldykge1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0dXNCYXJJdGVtRWwpIHtcbiAgICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IpO1xuICAgICAgaWYgKCFzdGF0dXNCYXJFbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogW1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsIExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTU10gfSk7XG4gICAgICBzZXRJY29uKHRoaXMuc3RhdHVzQmFySXRlbUVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgLy8gVGhlIHNpbmdsZSBzdGF0dXMtYmFyIGl0ZW0gaXMgcmV1c2VkIGFjcm9zcyBhY3RpdmUtbm90ZSBzd2l0Y2hlcy5cbiAgICAgIC8vIEl0IG11c3QgcmVzb2x2ZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBub3RlJ3MgcGF0aCBhdCBjbGljayB0aW1lIHJhdGhlciB0aGFuIGNhcHR1cmluZyBvbmUgcGF0aC5cbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGhpcy5zdGF0dXNCYXJJdGVtRWwsICgpID0+IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5maWxlPy5wYXRoKTtcbiAgICB9XG5cbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0aGlzLmxvY2tUb29sdGlwKGFwcCwgYWN0aXZlUGF0aCkpO1xuICB9XG59XG5cbi8qKlxuICogQSBwZXItcGx1Z2luIGhhbmRsZSBmb3Igbm90ZS1zY29wZWQgZWRpdG9yIGxvY2tpbmcuIEFkZCBpdCBhcyBhIGNoaWxkIG9mIHlvdXIgcGx1Z2luXG4gKiAoYHRoaXMuYWRkQ2hpbGQobmV3IEVkaXRvckxvY2tDb21wb25lbnQodGhpcy5hcHApKWApIHNvIHRoYXQgYW55IGxvY2tzIGl0IHN0aWxsIGhvbGRzIGFyZSByZWxlYXNlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2FkcyBcdTIwMTQgYSBub3RlIGNhbiBuZXZlciBiZSBsZWZ0IHN0dWNrIHJlYWQtb25seSBiZWNhdXNlIHRoZVxuICogcGx1Z2luIHRoYXQgbG9ja2VkIGl0IHdhcyBkaXNhYmxlZCBvciByZWxvYWRlZCBtaWQtb3BlcmF0aW9uLlxuICpcbiAqIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBhbmQgYXR0cmlidXRlZCB0byB0aGlzIHBsdWdpbiwgc28gdGhlIGxvY2sgaW5kaWNhdG9ycycgdG9vbHRpcCBuYW1lc1xuICogaXQgYW1vbmcgdGhlIHBsdWdpbnMgY3VycmVudGx5IGhvbGRpbmcgYSBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgRWRpdG9yTG9ja0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVkaXRvci1sb2NrIGhhbmRsZSBvd25lZCBieSBhIHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgb3duaW5nIHBsdWdpbiAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCkuIExvY2tzIGFyZSBhdHRyaWJ1dGVkIHRvXG4gICAqIGl0IGZvciByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGJ5IGFueSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZCh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggb24gYmVoYWxmIG9mIHRoaXMgcGx1Z2luLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnRcbiAgICogYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZC4gUmVmZXJlbmNlLWNvdW50ZWQ6IGJhbGFuY2UgZWFjaCBjYWxsXG4gICAqIHdpdGggYSBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKGlkZWFsbHkgdmlhIGB1c2luZ2ApIG9yIHtAbGluayB1bmxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgbG9ja2luZyBvcHRpb25zLiBQYXNzIGFuXG4gICAqIHtAbGluayBFZGl0b3JMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zLmFib3J0Q29udHJvbGxlcn0gdG8gbWFrZSB0aGUgbG9jayBjYW5jZWxhYmxlIHZpYSB0aGVcbiAgICogaW5kaWNhdG9yJ3MgcmlnaHQtY2xpY2sgXCJ1bmxvY2tcIiBtZW51IG9yIHtAbGluayByZXF1ZXN0RWRpdG9yVW5sb2NrRm9yUGF0aH0uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIG9wdGlvbnM/OiBFZGl0b3JMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkLCBvcHRpb25zPy5hYm9ydENvbnRyb2xsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGV2ZXJ5IGxvY2sgc3RpbGwgaGVsZCBieSB0aGlzIHBsdWdpbiB3aGVuIHRoZSBjb21wb25lbnQgKGFuZCB0aHVzIHRoZSBwbHVnaW4pIHVubG9hZHMsXG4gICAqIHNvIG5vIG5vdGUgaXMgbGVmdCBzdHVjayByZWFkLW9ubHkgYnkgYW4gb3BlcmF0aW9uIHRoYXQgbmV2ZXIgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2tBbGxGb3JQbHVnaW4odGhpcy5hcHAsIHRoaXMucGx1Z2luSWQpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSwgdGhpcy5wbHVnaW5JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFZGl0b3JMb2NrZWRGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQoYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50IGFuZCBmdXR1cmVcbiAqIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCBhbmQgc2hvd2luZyBhIGxvY2sgaW5kaWNhdG9yIGluIHRoZSB0YWIgaGVhZGVyLFxuICogdmlldyBhY3Rpb24gYmFyLCBhbmQgKHdoaWxlIGFjdGl2ZSkgdGhlIHN0YXR1cyBiYXIuIFRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHRoZSBwbHVnaW5zXG4gKiB0aGF0IGN1cnJlbnRseSBob2xkIGEgbG9jayBvbiB0aGUgbm90ZS5cbiAqXG4gKiBUaGUgbG9jayBpcyByZWZlcmVuY2UtY291bnRlZCBwZXIgY2FsbGluZyBwbHVnaW46IGVhY2ggY2FsbCBtdXN0IGJlIGJhbGFuY2VkIGJ5IGV4YWN0bHkgb25lXG4gKiByZWxlYXNlIChlaXRoZXIgZGlzcG9zaW5nIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gXHUyMDE0IGlkZWFsbHkgdmlhIGEgYHVzaW5nYCBkZWNsYXJhdGlvbiBcdTIwMTQgb3JcbiAqIGEgbWF0Y2hpbmcge0BsaW5rIHVubG9ja0VkaXRvckZvclBhdGh9IGNhbGwpLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIGxvY2tpbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gVGhlIGxvY2sgaXMgYXR0cmlidXRlZCB0b1xuICogaXQgZm9yIHJlZmVyZW5jZS1jb3VudGluZyBhbmQgdGhlIGluZGljYXRvcnMnIFwibG9ja2VkIGJ5XCIgdG9vbHRpcC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9ja0VkaXRvckZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiBEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKGFwcCwgcGF0aE9yRmlsZSwgcGx1Z2luSWQpO1xufVxuXG4vKipcbiAqIFJlcXVlc3RzIGFuIHVubG9jayBvZiB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBieSBhYm9ydGluZyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSB0aGF0IHdhc1xuICogYXNzb2NpYXRlZCB3aXRoIGEgbG9jayBvbiBpdCAodmlhIHtAbGluayBFZGl0b3JMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofSdzXG4gKiB7QGxpbmsgRWRpdG9yTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoT3B0aW9ucy5hYm9ydENvbnRyb2xsZXJ9KS4gVGhlIG9wZXJhdGlvbnMgaG9sZGluZyB0aGUgbG9ja1xuICogb2JzZXJ2ZSB0aGUgYWJvcnQgYW5kIHJlbGVhc2UgdGhlaXIgb3duIGxvY2tzLiBBIG5vLW9wIHdoZW4gbm8gYWJvcnRhYmxlIGxvY2sgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlXG4gKiBwYXRoLlxuICpcbiAqIFRoaXMgbGV0cyBhIGNvbnN1bWluZyBwbHVnaW4gd2lyZSBpdHMgb3duIFwidW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCB3aXRob3V0IHJlYWNoaW5nIGludG8gdGhlXG4gKiBsb2NrIG1hbmFnZXIgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdEVkaXRvclVubG9ja0ZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnJlcXVlc3RVbmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tFZGl0b3JGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGhvbGRzIHRoZSBsb2NrIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKTsgb25lIG9mIGl0c1xuICogbG9ja3Mgb24gdGhlIG5vdGUgaXMgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tFZGl0b3JGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS51bmxvY2soYXBwLCBwYXRoT3JGaWxlLCBwbHVnaW5JZCk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZXIoKTogRWRpdG9yUGF0aExvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxFZGl0b3JQYXRoTG9ja01hbmFnZXI+KEVESVRPUl9MT0NLX1NUQVRFX0tFWSwgbmV3IEVkaXRvclBhdGhMb2NrTWFuYWdlcigpKS52YWx1ZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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