@mnaoumov/obsidian-lib 10.10.0 → 10.12.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 (133) hide show
  1. package/README.md +26 -0
  2. package/components/all-windows-status-bar-item-component/package.json +6 -0
  3. package/components/shared-component-pool-component/package.json +6 -0
  4. package/components/workspace-layout-state-component/package.json +6 -0
  5. package/dist/lib/cjs/__merged.cjs +90 -1
  6. package/dist/lib/cjs/__merged.d.cts +13 -4
  7. package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
  8. package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
  9. package/dist/lib/cjs/bug-report.cjs +36 -10
  10. package/dist/lib/cjs/bug-report.d.cts +65 -0
  11. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +93 -2
  12. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
  13. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
  14. package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
  15. package/dist/lib/cjs/components/embed-extensions-component.cjs +20 -3
  16. package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
  17. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +16 -2
  18. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
  19. package/dist/lib/cjs/components/index.cjs +12 -3
  20. package/dist/lib/cjs/components/index.d.cts +3 -0
  21. package/dist/lib/cjs/components/plugin-gate-component.cjs +2 -9
  22. package/dist/lib/cjs/components/plugin-settings-component.cjs +7 -2
  23. package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
  24. package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
  25. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
  26. package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
  27. package/dist/lib/cjs/css-class.cjs +5 -1
  28. package/dist/lib/cjs/css-class.d.cts +16 -0
  29. package/dist/lib/cjs/data-handler.cjs +156 -5
  30. package/dist/lib/cjs/data-handler.d.cts +128 -2
  31. package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
  32. package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
  33. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  34. package/dist/lib/cjs/git-rename-history.cjs +1 -1
  35. package/dist/lib/cjs/git-rename-history.d.cts +2 -2
  36. package/dist/lib/cjs/i18n/locales/en.cjs +29 -1
  37. package/dist/lib/cjs/i18n/locales/en.d.cts +28 -0
  38. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +28 -0
  39. package/dist/lib/cjs/index.cjs +10 -1
  40. package/dist/lib/cjs/index.d.cts +3 -0
  41. package/dist/lib/cjs/link.cjs +40 -1
  42. package/dist/lib/cjs/link.d.cts +37 -1
  43. package/dist/lib/cjs/markdown-view.cjs +191 -3
  44. package/dist/lib/cjs/markdown-view.d.cts +48 -1
  45. package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
  46. package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
  47. package/dist/lib/cjs/modals/index.cjs +7 -1
  48. package/dist/lib/cjs/modals/index.d.cts +2 -0
  49. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
  50. package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
  51. package/dist/lib/cjs/plugin/index.cjs +4 -1
  52. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  53. package/dist/lib/cjs/plugin/plugin-api.cjs +13 -4
  54. package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
  55. package/dist/lib/cjs/plugin/plugin-install-state.cjs +46 -1
  56. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
  57. package/dist/lib/cjs/plugin/plugin-instance.cjs +448 -0
  58. package/dist/lib/cjs/plugin/plugin-instance.d.cts +251 -0
  59. package/dist/lib/cjs/plugin/plugin.cjs +16 -1
  60. package/dist/lib/cjs/plugin/plugin.d.cts +7 -0
  61. package/dist/lib/cjs/reference-definition.cjs +234 -0
  62. package/dist/lib/cjs/reference-definition.d.cts +47 -0
  63. package/dist/lib/cjs/release-asset.cjs +279 -0
  64. package/dist/lib/cjs/release-asset.d.cts +190 -0
  65. package/dist/lib/cjs/workspace.cjs +3 -2
  66. package/dist/lib/cjs/workspace.d.cts +6 -0
  67. package/dist/lib/esm/__merged.d.mts +13 -4
  68. package/dist/lib/esm/__merged.mjs +97 -3
  69. package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
  70. package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
  71. package/dist/lib/esm/bug-report.d.mts +65 -0
  72. package/dist/lib/esm/bug-report.mjs +33 -10
  73. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
  74. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
  75. package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
  76. package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
  77. package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
  78. package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
  79. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
  80. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
  81. package/dist/lib/esm/components/index.d.mts +3 -0
  82. package/dist/lib/esm/components/index.mjs +8 -2
  83. package/dist/lib/esm/components/plugin-gate-component.mjs +5 -13
  84. package/dist/lib/esm/components/plugin-settings-component.mjs +7 -2
  85. package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
  86. package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
  87. package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
  88. package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
  89. package/dist/lib/esm/css-class.d.mts +16 -0
  90. package/dist/lib/esm/css-class.mjs +5 -1
  91. package/dist/lib/esm/data-handler.d.mts +128 -2
  92. package/dist/lib/esm/data-handler.mjs +152 -4
  93. package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
  94. package/dist/lib/esm/desktop-git-runner.mjs +3 -3
  95. package/dist/lib/esm/generated-during-build.mjs +2 -2
  96. package/dist/lib/esm/git-rename-history.d.mts +2 -2
  97. package/dist/lib/esm/git-rename-history.mjs +1 -1
  98. package/dist/lib/esm/i18n/locales/en.d.mts +28 -0
  99. package/dist/lib/esm/i18n/locales/en.mjs +29 -1
  100. package/dist/lib/esm/i18n/locales/translations-map.d.mts +28 -0
  101. package/dist/lib/esm/index.d.mts +3 -0
  102. package/dist/lib/esm/index.mjs +7 -1
  103. package/dist/lib/esm/link.d.mts +37 -1
  104. package/dist/lib/esm/link.mjs +40 -1
  105. package/dist/lib/esm/markdown-view.d.mts +48 -1
  106. package/dist/lib/esm/markdown-view.mjs +192 -2
  107. package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
  108. package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
  109. package/dist/lib/esm/modals/index.d.mts +2 -0
  110. package/dist/lib/esm/modals/index.mjs +5 -1
  111. package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
  112. package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
  113. package/dist/lib/esm/plugin/index.d.mts +1 -0
  114. package/dist/lib/esm/plugin/index.mjs +3 -1
  115. package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
  116. package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
  117. package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
  118. package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
  119. package/dist/lib/esm/plugin/plugin-instance.d.mts +251 -0
  120. package/dist/lib/esm/plugin/plugin-instance.mjs +366 -0
  121. package/dist/lib/esm/plugin/plugin.d.mts +7 -0
  122. package/dist/lib/esm/plugin/plugin.mjs +16 -1
  123. package/dist/lib/esm/reference-definition.d.mts +47 -0
  124. package/dist/lib/esm/reference-definition.mjs +146 -0
  125. package/dist/lib/esm/release-asset.d.mts +190 -0
  126. package/dist/lib/esm/release-asset.mjs +187 -0
  127. package/dist/lib/esm/workspace.d.mts +6 -0
  128. package/dist/lib/esm/workspace.mjs +3 -2
  129. package/dist/styles.css +16 -1
  130. package/modals/copy-text-manually/package.json +6 -0
  131. package/modals/review-bug-report-diagnostics/package.json +6 -0
  132. package/package.json +2 -1
  133. package/plugin/plugin-instance/package.json +6 -0
@@ -3,8 +3,36 @@
3
3
  * @file
4
4
  *
5
5
  * A module for handling data loading and saving to the plugin's data file.
6
+ *
7
+ * {@link PluginDataHandler} bounds the plugin's `data.json` in bytes, in both directions, because Obsidian does
8
+ * not. Read from Obsidian `1.15.1`: `Plugin.loadData` reads the whole file and `JSON.parse`s it with no limit, so an
9
+ * oversized file is fully read and parsed into memory on every startup, and `Plugin.saveData` writes
10
+ * `JSON.stringify(data, undefined, 2)` with no limit either. Obsidian also swallows a failed read or write: its
11
+ * `readJson` logs a parse failure and resolves `undefined`, and its `writeJson` catches every error. So the guard
12
+ * has to decide BEFORE handing the call to Obsidian, which is the only point where refusing still changes the
13
+ * outcome.
6
14
  */
7
15
  import type { Plugin } from 'obsidian';
16
+ /**
17
+ * The default maximum size of a plugin's `data.json`, in bytes: 16 MiB.
18
+ *
19
+ * This is a protective budget against startup exhaustion, not a sync quota. Obsidian Sync's own per-file limit
20
+ * depends on the plan and is a separate constraint a plugin may want to stay well under.
21
+ */
22
+ export declare const DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES = 16777216;
23
+ /**
24
+ * The operation a {@link PluginDataSizeLimitExceededError} refused.
25
+ */
26
+ export declare enum PluginDataOperation {
27
+ /**
28
+ * Loading the existing `data.json`.
29
+ */
30
+ Load = "load",
31
+ /**
32
+ * Saving a new `data.json`.
33
+ */
34
+ Save = "save"
35
+ }
8
36
  /**
9
37
  * A handler for loading and saving data to the plugin's data file.
10
38
  */
@@ -23,27 +51,125 @@ export interface DataHandler {
23
51
  readonly saveData: (data: unknown) => Promise<void>;
24
52
  }
25
53
  /**
26
- * A handler for loading and saving data to the plugin's data file.
54
+ * Options for {@link PluginDataHandler}.
55
+ */
56
+ export interface PluginDataHandlerConstructorOptions {
57
+ /**
58
+ * The maximum size of `data.json`, in UTF-8 bytes as written to disk. Defaults to
59
+ * {@link DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES}. Pass `Infinity` to disable the guard.
60
+ */
61
+ readonly maxSizeInBytes?: number;
62
+ }
63
+ /**
64
+ * Parameters for {@link PluginDataSizeLimitExceededError}.
65
+ */
66
+ export interface PluginDataSizeLimitExceededErrorConstructorParams {
67
+ /**
68
+ * The size limit, in bytes.
69
+ */
70
+ readonly maxSizeInBytes: number;
71
+ /**
72
+ * The refused operation.
73
+ */
74
+ readonly operation: PluginDataOperation;
75
+ /**
76
+ * The path of the plugin's `data.json`.
77
+ */
78
+ readonly path: string;
79
+ /**
80
+ * The `manifest.id` of the plugin.
81
+ */
82
+ readonly pluginId: string;
83
+ /**
84
+ * The `manifest.name` of the plugin.
85
+ */
86
+ readonly pluginName: string;
87
+ /**
88
+ * The size of the existing file (load) or of the serialized data (save), in bytes.
89
+ */
90
+ readonly sizeInBytes: number;
91
+ }
92
+ /**
93
+ * A handler for loading and saving data to the plugin's data file, refusing a `data.json` larger than a byte limit.
27
94
  */
28
95
  export declare class PluginDataHandler implements DataHandler {
29
96
  protected readonly plugin: Plugin;
97
+ /**
98
+ * The maximum size of `data.json`, in bytes.
99
+ */
100
+ protected readonly maxSizeInBytes: number;
30
101
  /**
31
102
  * Creates a new plugin data handler.
32
103
  *
33
104
  * @param plugin - The plugin instance.
105
+ * @param options - The options.
34
106
  */
35
- constructor(plugin: Plugin);
107
+ constructor(plugin: Plugin, options?: PluginDataHandlerConstructorOptions);
36
108
  /**
37
109
  * Loads data from the plugin's data file.
38
110
  *
111
+ * The file's size is read through the adapter BEFORE Obsidian reads and parses it, so an oversized file is never
112
+ * loaded into memory.
113
+ *
39
114
  * @returns The loaded data.
115
+ * @throws {@link PluginDataSizeLimitExceededError} If the existing file is larger than the limit.
40
116
  */
41
117
  loadData(): Promise<unknown>;
42
118
  /**
43
119
  * Saves data to the plugin's data file.
44
120
  *
121
+ * The data is serialized exactly as Obsidian writes it, and its UTF-8 byte length is checked before anything is
122
+ * written.
123
+ *
45
124
  * @param data - The data to save.
46
125
  * @returns A promise that resolves when the data is saved.
126
+ * @throws {@link PluginDataSizeLimitExceededError} If the serialized data is larger than the limit.
47
127
  */
48
128
  saveData(data: unknown): Promise<void>;
129
+ /**
130
+ * Gets the path of the plugin's `data.json`, as Obsidian's `Plugin.loadData` reads it.
131
+ *
132
+ * @returns The path, or `null` when the manifest has no folder.
133
+ */
134
+ protected getDataFilePath(): null | string;
135
+ private createError;
136
+ private getExistingFileSize;
137
+ }
138
+ /**
139
+ * Thrown when a plugin's `data.json` is, or would become, larger than the configured limit.
140
+ *
141
+ * The file on disk is never touched when this is thrown: an oversized existing file is left intact for the user to
142
+ * inspect or trim, and an oversized save is refused before anything is written, so the last good file remains.
143
+ */
144
+ export declare class PluginDataSizeLimitExceededError extends Error {
145
+ /**
146
+ * The size limit, in bytes.
147
+ */
148
+ readonly maxSizeInBytes: number;
149
+ /**
150
+ * The refused operation.
151
+ */
152
+ readonly operation: PluginDataOperation;
153
+ /**
154
+ * The path of the plugin's `data.json`.
155
+ */
156
+ readonly path: string;
157
+ /**
158
+ * The `manifest.id` of the plugin.
159
+ */
160
+ readonly pluginId: string;
161
+ /**
162
+ * The `manifest.name` of the plugin.
163
+ */
164
+ readonly pluginName: string;
165
+ /**
166
+ * The size of the existing file (load) or of the serialized data (save), in bytes.
167
+ */
168
+ readonly sizeInBytes: number;
169
+ /**
170
+ * Creates a {@link PluginDataSizeLimitExceededError}.
171
+ *
172
+ * @param params - The parameters for the error.
173
+ */
174
+ constructor(params: PluginDataSizeLimitExceededErrorConstructorParams);
49
175
  }
@@ -2,36 +2,184 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
5
29
 
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { normalizePath } from "obsidian";
34
+ const OBSIDIAN_JSON_INDENT = 2;
35
+ const DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES = 16777216;
36
+ var PluginDataOperation = /* @__PURE__ */ ((PluginDataOperation2) => {
37
+ PluginDataOperation2["Load"] = "load";
38
+ PluginDataOperation2["Save"] = "save";
39
+ return PluginDataOperation2;
40
+ })(PluginDataOperation || {});
6
41
  class PluginDataHandler {
7
42
  /**
8
43
  * Creates a new plugin data handler.
9
44
  *
10
45
  * @param plugin - The plugin instance.
46
+ * @param options - The options.
11
47
  */
12
- constructor(plugin) {
48
+ constructor(plugin, options = {}) {
13
49
  this.plugin = plugin;
50
+ const maxSizeInBytes = options.maxSizeInBytes ?? DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES;
51
+ if (Number.isNaN(maxSizeInBytes) || maxSizeInBytes < 0) {
52
+ throw new RangeError(`maxSizeInBytes must be a non-negative number, got ${String(maxSizeInBytes)}.`);
53
+ }
54
+ this.maxSizeInBytes = maxSizeInBytes;
14
55
  }
15
56
  plugin;
57
+ /**
58
+ * The maximum size of `data.json`, in bytes.
59
+ */
60
+ maxSizeInBytes;
16
61
  /**
17
62
  * Loads data from the plugin's data file.
18
63
  *
64
+ * The file's size is read through the adapter BEFORE Obsidian reads and parses it, so an oversized file is never
65
+ * loaded into memory.
66
+ *
19
67
  * @returns The loaded data.
68
+ * @throws {@link PluginDataSizeLimitExceededError} If the existing file is larger than the limit.
20
69
  */
21
70
  async loadData() {
71
+ const sizeInBytes = await this.getExistingFileSize();
72
+ if (sizeInBytes !== null && sizeInBytes > this.maxSizeInBytes) {
73
+ throw this.createError("load" /* Load */, sizeInBytes);
74
+ }
22
75
  return this.plugin.loadData();
23
76
  }
24
77
  /**
25
78
  * Saves data to the plugin's data file.
26
79
  *
80
+ * The data is serialized exactly as Obsidian writes it, and its UTF-8 byte length is checked before anything is
81
+ * written.
82
+ *
27
83
  * @param data - The data to save.
28
84
  * @returns A promise that resolves when the data is saved.
85
+ * @throws {@link PluginDataSizeLimitExceededError} If the serialized data is larger than the limit.
29
86
  */
30
87
  async saveData(data) {
31
- return this.plugin.saveData(data);
88
+ if (this.maxSizeInBytes !== Infinity) {
89
+ const serialized = JSON.stringify(data, void 0, OBSIDIAN_JSON_INDENT);
90
+ if (serialized !== void 0) {
91
+ const sizeInBytes = new TextEncoder().encode(serialized).byteLength;
92
+ if (sizeInBytes > this.maxSizeInBytes) {
93
+ throw this.createError("save" /* Save */, sizeInBytes);
94
+ }
95
+ }
96
+ }
97
+ await this.plugin.saveData(data);
98
+ }
99
+ /**
100
+ * Gets the path of the plugin's `data.json`, as Obsidian's `Plugin.loadData` reads it.
101
+ *
102
+ * @returns The path, or `null` when the manifest has no folder.
103
+ */
104
+ getDataFilePath() {
105
+ const directory = this.plugin.manifest.dir;
106
+ return directory ? normalizePath(`${directory}/data.json`) : null;
107
+ }
108
+ createError(operation, sizeInBytes) {
109
+ return new PluginDataSizeLimitExceededError({
110
+ maxSizeInBytes: this.maxSizeInBytes,
111
+ operation,
112
+ path: this.getDataFilePath() ?? "data.json",
113
+ pluginId: this.plugin.manifest.id,
114
+ pluginName: this.plugin.manifest.name,
115
+ sizeInBytes
116
+ });
117
+ }
118
+ async getExistingFileSize() {
119
+ if (this.maxSizeInBytes === Infinity) {
120
+ return null;
121
+ }
122
+ const path = this.getDataFilePath();
123
+ if (path === null) {
124
+ return null;
125
+ }
126
+ try {
127
+ const stat = await this.plugin.app.vault.adapter.stat(path);
128
+ return stat?.size ?? null;
129
+ } catch {
130
+ return null;
131
+ }
132
+ }
133
+ }
134
+ class PluginDataSizeLimitExceededError extends Error {
135
+ /**
136
+ * The size limit, in bytes.
137
+ */
138
+ maxSizeInBytes;
139
+ /**
140
+ * The refused operation.
141
+ */
142
+ operation;
143
+ /**
144
+ * The path of the plugin's `data.json`.
145
+ */
146
+ path;
147
+ /**
148
+ * The `manifest.id` of the plugin.
149
+ */
150
+ pluginId;
151
+ /**
152
+ * The `manifest.name` of the plugin.
153
+ */
154
+ pluginName;
155
+ /**
156
+ * The size of the existing file (load) or of the serialized data (save), in bytes.
157
+ */
158
+ sizeInBytes;
159
+ /**
160
+ * Creates a {@link PluginDataSizeLimitExceededError}.
161
+ *
162
+ * @param params - The parameters for the error.
163
+ */
164
+ constructor(params) {
165
+ const what = params.operation === "load" /* Load */ ? `Refusing to load "${params.path}": the file is ${String(params.sizeInBytes)} bytes` : `Refusing to save "${params.path}": the data would be ${String(params.sizeInBytes)} bytes`;
166
+ const consequence = params.operation === "load" /* Load */ ? "The file was left untouched." : "Nothing was written, so the last saved file remains.";
167
+ super(
168
+ `Plugin "${params.pluginName}" (${params.pluginId}): ${what}, over the ${String(params.maxSizeInBytes)}-byte limit. ${consequence} Keep data.json for small settings, and move large or growing state to LocalDataStore or SharedDataStore.`
169
+ );
170
+ this.name = "PluginDataSizeLimitExceededError";
171
+ this.maxSizeInBytes = params.maxSizeInBytes;
172
+ this.operation = params.operation;
173
+ this.path = params.path;
174
+ this.pluginId = params.pluginId;
175
+ this.pluginName = params.pluginName;
176
+ this.sizeInBytes = params.sizeInBytes;
32
177
  }
33
178
  }
34
179
  export {
35
- PluginDataHandler
180
+ DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES,
181
+ PluginDataHandler,
182
+ PluginDataOperation,
183
+ PluginDataSizeLimitExceededError
36
184
  };
37
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RhdGEtaGFuZGxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgbW9kdWxlIGZvciBoYW5kbGluZyBkYXRhIGxvYWRpbmcgYW5kIHNhdmluZyB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgbG9hZGluZyBhbmQgc2F2aW5nIGRhdGEgdG8gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhSGFuZGxlciB7XG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIGxvYWQgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsb2FkZWQgZGF0YS5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWREYXRhOiAoKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIHNhdmUgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIHNhdmUuXG4gICAqL1xuICByZWFkb25seSBzYXZlRGF0YTogKGRhdGE6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRGF0YUhhbmRsZXIgaW1wbGVtZW50cyBEYXRhSGFuZGxlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBkYXRhIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwbHVnaW46IFBsdWdpbikge31cblxuICAvKipcbiAgICogTG9hZHMgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsb2FkZWQgZGF0YS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkRGF0YSgpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5wbHVnaW4ubG9hZERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBkYXRhIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGRhdGEgdG8gc2F2ZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGF0YSBpcyBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlRGF0YShkYXRhOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLnNhdmVEYXRhKGRhdGEpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQThCTyxNQUFNLGtCQUF5QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU03QyxZQUErQixRQUFnQjtBQUFoQjtBQUFBLEVBQWlCO0FBQUEsRUFBakI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPdEMsTUFBYSxXQUE2QjtBQUN4QyxXQUFPLEtBQUssT0FBTyxTQUFTO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWEsU0FBUyxNQUE4QjtBQUNsRCxXQUFPLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxFQUNsQztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhLWhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgbW9kdWxlIGZvciBoYW5kbGluZyBkYXRhIGxvYWRpbmcgYW5kIHNhdmluZyB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICpcbiAqIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlcn0gYm91bmRzIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCBpbiBieXRlcywgaW4gYm90aCBkaXJlY3Rpb25zLCBiZWNhdXNlIE9ic2lkaWFuIGRvZXNcbiAqIG5vdC4gUmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjFgOiBgUGx1Z2luLmxvYWREYXRhYCByZWFkcyB0aGUgd2hvbGUgZmlsZSBhbmQgYEpTT04ucGFyc2VgcyBpdCB3aXRoIG5vIGxpbWl0LCBzbyBhblxuICogb3ZlcnNpemVkIGZpbGUgaXMgZnVsbHkgcmVhZCBhbmQgcGFyc2VkIGludG8gbWVtb3J5IG9uIGV2ZXJ5IHN0YXJ0dXAsIGFuZCBgUGx1Z2luLnNhdmVEYXRhYCB3cml0ZXNcbiAqIGBKU09OLnN0cmluZ2lmeShkYXRhLCB1bmRlZmluZWQsIDIpYCB3aXRoIG5vIGxpbWl0IGVpdGhlci4gT2JzaWRpYW4gYWxzbyBzd2FsbG93cyBhIGZhaWxlZCByZWFkIG9yIHdyaXRlOiBpdHNcbiAqIGByZWFkSnNvbmAgbG9ncyBhIHBhcnNlIGZhaWx1cmUgYW5kIHJlc29sdmVzIGB1bmRlZmluZWRgLCBhbmQgaXRzIGB3cml0ZUpzb25gIGNhdGNoZXMgZXZlcnkgZXJyb3IuIFNvIHRoZSBndWFyZFxuICogaGFzIHRvIGRlY2lkZSBCRUZPUkUgaGFuZGluZyB0aGUgY2FsbCB0byBPYnNpZGlhbiwgd2hpY2ggaXMgdGhlIG9ubHkgcG9pbnQgd2hlcmUgcmVmdXNpbmcgc3RpbGwgY2hhbmdlcyB0aGVcbiAqIG91dGNvbWUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogVGhlIGluZGVudGF0aW9uIE9ic2lkaWFuJ3MgYFZhdWx0LndyaXRlSnNvbmAgcGFzc2VzIHRvIGBKU09OLnN0cmluZ2lmeWAgZm9yIGBkYXRhLmpzb25gIChyZWFkIGZyb20gYDEuMTUuMWApLlxuICovXG5jb25zdCBPQlNJRElBTl9KU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgbWF4aW11bSBzaXplIG9mIGEgcGx1Z2luJ3MgYGRhdGEuanNvbmAsIGluIGJ5dGVzOiAxNiBNaUIuXG4gKlxuICogVGhpcyBpcyBhIHByb3RlY3RpdmUgYnVkZ2V0IGFnYWluc3Qgc3RhcnR1cCBleGhhdXN0aW9uLCBub3QgYSBzeW5jIHF1b3RhLiBPYnNpZGlhbiBTeW5jJ3Mgb3duIHBlci1maWxlIGxpbWl0XG4gKiBkZXBlbmRzIG9uIHRoZSBwbGFuIGFuZCBpcyBhIHNlcGFyYXRlIGNvbnN0cmFpbnQgYSBwbHVnaW4gbWF5IHdhbnQgdG8gc3RheSB3ZWxsIHVuZGVyLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QTFVHSU5fREFUQV9NQVhfU0laRV9JTl9CWVRFUyA9IDE2Xzc3N18yMTY7XG5cbi8qKlxuICogVGhlIG9wZXJhdGlvbiBhIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0gcmVmdXNlZC5cbiAqL1xuZXhwb3J0IGVudW0gUGx1Z2luRGF0YU9wZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBMb2FkaW5nIHRoZSBleGlzdGluZyBgZGF0YS5qc29uYC5cbiAgICovXG4gIExvYWQgPSAnbG9hZCcsXG5cbiAgLyoqXG4gICAqIFNhdmluZyBhIG5ldyBgZGF0YS5qc29uYC5cbiAgICovXG4gIFNhdmUgPSAnc2F2ZSdcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIGxvYWRpbmcgYW5kIHNhdmluZyBkYXRhIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUhhbmRsZXIge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0byBsb2FkIGRhdGEgZnJvbSB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIGRhdGEuXG4gICAqL1xuICByZWFkb25seSBsb2FkRGF0YTogKCkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0byBzYXZlIGRhdGEgdG8gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBzYXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2F2ZURhdGE6IChkYXRhOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5EYXRhSGFuZGxlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGF0YUhhbmRsZXJDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gc2l6ZSBvZiBgZGF0YS5qc29uYCwgaW4gVVRGLTggYnl0ZXMgYXMgd3JpdHRlbiB0byBkaXNrLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9QTFVHSU5fREFUQV9NQVhfU0laRV9JTl9CWVRFU30uIFBhc3MgYEluZmluaXR5YCB0byBkaXNhYmxlIHRoZSBndWFyZC5cbiAgICovXG4gIHJlYWRvbmx5IG1heFNpemVJbkJ5dGVzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplSW5CeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmdXNlZCBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IFBsdWdpbkRhdGFPcGVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QubmFtZWAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGV4aXN0aW5nIGZpbGUgKGxvYWQpIG9yIG9mIHRoZSBzZXJpYWxpemVkIGRhdGEgKHNhdmUpLCBpbiBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZGF0YSB0byB0aGUgcGx1Z2luJ3MgZGF0YSBmaWxlLCByZWZ1c2luZyBhIGBkYXRhLmpzb25gIGxhcmdlciB0aGFuIGEgYnl0ZSBsaW1pdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkRhdGFIYW5kbGVyIGltcGxlbWVudHMgRGF0YUhhbmRsZXIge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gc2l6ZSBvZiBgZGF0YS5qc29uYCwgaW4gYnl0ZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gZGF0YSBoYW5kbGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW4sIG9wdGlvbnM6IFBsdWdpbkRhdGFIYW5kbGVyQ29uc3RydWN0b3JPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBtYXhTaXplSW5CeXRlcyA9IG9wdGlvbnMubWF4U2l6ZUluQnl0ZXMgPz8gREVGQVVMVF9QTFVHSU5fREFUQV9NQVhfU0laRV9JTl9CWVRFUztcbiAgICBpZiAoTnVtYmVyLmlzTmFOKG1heFNpemVJbkJ5dGVzKSB8fCBtYXhTaXplSW5CeXRlcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBtYXhTaXplSW5CeXRlcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKG1heFNpemVJbkJ5dGVzKX0uYCk7XG4gICAgfVxuICAgIHRoaXMubWF4U2l6ZUluQnl0ZXMgPSBtYXhTaXplSW5CeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBkYXRhIGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZmlsZS5cbiAgICpcbiAgICogVGhlIGZpbGUncyBzaXplIGlzIHJlYWQgdGhyb3VnaCB0aGUgYWRhcHRlciBCRUZPUkUgT2JzaWRpYW4gcmVhZHMgYW5kIHBhcnNlcyBpdCwgc28gYW4gb3ZlcnNpemVkIGZpbGUgaXMgbmV2ZXJcbiAgICogbG9hZGVkIGludG8gbWVtb3J5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIGRhdGEuXG4gICAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yfSBJZiB0aGUgZXhpc3RpbmcgZmlsZSBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZERhdGEoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3Qgc2l6ZUluQnl0ZXMgPSBhd2FpdCB0aGlzLmdldEV4aXN0aW5nRmlsZVNpemUoKTtcbiAgICBpZiAoc2l6ZUluQnl0ZXMgIT09IG51bGwgJiYgc2l6ZUluQnl0ZXMgPiB0aGlzLm1heFNpemVJbkJ5dGVzKSB7XG4gICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKFBsdWdpbkRhdGFPcGVyYXRpb24uTG9hZCwgc2l6ZUluQnl0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbHVnaW4ubG9hZERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBkYXRhIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGZpbGUuXG4gICAqXG4gICAqIFRoZSBkYXRhIGlzIHNlcmlhbGl6ZWQgZXhhY3RseSBhcyBPYnNpZGlhbiB3cml0ZXMgaXQsIGFuZCBpdHMgVVRGLTggYnl0ZSBsZW5ndGggaXMgY2hlY2tlZCBiZWZvcmUgYW55dGhpbmcgaXNcbiAgICogd3JpdHRlbi5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBzYXZlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkYXRhIGlzIHNhdmVkLlxuICAgKiBAdGhyb3dzIHtAbGluayBQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcn0gSWYgdGhlIHNlcmlhbGl6ZWQgZGF0YSBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZURhdGEoZGF0YTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1heFNpemVJbkJ5dGVzICE9PSBJbmZpbml0eSkge1xuICAgICAgLy8gT2JzaWRpYW4ncyBgd3JpdGVKc29uYCB3b3VsZCBzd2FsbG93IGEgc2VyaWFsaXphdGlvbiBmYWlsdXJlIGFuZCB3cml0ZSBub3RoaW5nOyB0aHJvd2luZyBoZXJlIGluc3RlYWQga2VlcHNcbiAgICAgIC8vIHRoZSBkaXNrIHVuY2hhbmdlZCB0b28sIGFuZCB0ZWxscyB0aGUgY2FsbGVyLlxuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIHVuZGVmaW5lZCwgT0JTSURJQU5fSlNPTl9JTkRFTlQpO1xuICAgICAgaWYgKHNlcmlhbGl6ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBzaXplSW5CeXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShzZXJpYWxpemVkKS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAoc2l6ZUluQnl0ZXMgPiB0aGlzLm1heFNpemVJbkJ5dGVzKSB7XG4gICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihQbHVnaW5EYXRhT3BlcmF0aW9uLlNhdmUsIHNpemVJbkJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YShkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXRoIG9mIHRoZSBwbHVnaW4ncyBgZGF0YS5qc29uYCwgYXMgT2JzaWRpYW4ncyBgUGx1Z2luLmxvYWREYXRhYCByZWFkcyBpdC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHBhdGgsIG9yIGBudWxsYCB3aGVuIHRoZSBtYW5pZmVzdCBoYXMgbm8gZm9sZGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldERhdGFGaWxlUGF0aCgpOiBudWxsIHwgc3RyaW5nIHtcbiAgICBjb25zdCBkaXJlY3RvcnkgPSB0aGlzLnBsdWdpbi5tYW5pZmVzdC5kaXI7XG4gICAgcmV0dXJuIGRpcmVjdG9yeSA/IG5vcm1hbGl6ZVBhdGgoYCR7ZGlyZWN0b3J5fS9kYXRhLmpzb25gKSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVycm9yKG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbiwgc2l6ZUluQnl0ZXM6IG51bWJlcik6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yKHtcbiAgICAgIG1heFNpemVJbkJ5dGVzOiB0aGlzLm1heFNpemVJbkJ5dGVzLFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgcGF0aDogdGhpcy5nZXREYXRhRmlsZVBhdGgoKSA/PyAnZGF0YS5qc29uJyxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5pZCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUsXG4gICAgICBzaXplSW5CeXRlc1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRFeGlzdGluZ0ZpbGVTaXplKCk6IFByb21pc2U8bnVsbCB8IG51bWJlcj4ge1xuICAgIGlmICh0aGlzLm1heFNpemVJbkJ5dGVzID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldERhdGFGaWxlUGF0aCgpO1xuICAgIGlmIChwYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpO1xuICAgICAgcmV0dXJuIHN0YXQ/LnNpemUgPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBzaXplIGlzIHVua25vd24sIG5vdCBvdmVyc2l6ZWQ6IE9ic2lkaWFuJ3Mgb3duIHJlYWQgZGVjaWRlcyB3aGF0IGhhcHBlbnMgbmV4dCwgYXMgYmVmb3JlIHRoaXMgZ3VhcmQuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbidzIGBkYXRhLmpzb25gIGlzLCBvciB3b3VsZCBiZWNvbWUsIGxhcmdlciB0aGFuIHRoZSBjb25maWd1cmVkIGxpbWl0LlxuICpcbiAqIFRoZSBmaWxlIG9uIGRpc2sgaXMgbmV2ZXIgdG91Y2hlZCB3aGVuIHRoaXMgaXMgdGhyb3duOiBhbiBvdmVyc2l6ZWQgZXhpc3RpbmcgZmlsZSBpcyBsZWZ0IGludGFjdCBmb3IgdGhlIHVzZXIgdG9cbiAqIGluc3BlY3Qgb3IgdHJpbSwgYW5kIGFuIG92ZXJzaXplZCBzYXZlIGlzIHJlZnVzZWQgYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIHRoZSBsYXN0IGdvb2QgZmlsZSByZW1haW5zLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4U2l6ZUluQnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlZnVzZWQgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbjogUGx1Z2luRGF0YU9wZXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIHBsdWdpbidzIGBkYXRhLmpzb25gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0Lm5hbWVgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgZXhpc3RpbmcgZmlsZSAobG9hZCkgb3Igb2YgdGhlIHNlcmlhbGl6ZWQgZGF0YSAoc2F2ZSksIGluIGJ5dGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpemVJbkJ5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luRGF0YVNpemVMaW1pdEV4Y2VlZGVkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkRhdGFTaXplTGltaXRFeGNlZWRlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBjb25zdCB3aGF0ID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/IGBSZWZ1c2luZyB0byBsb2FkIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGZpbGUgaXMgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgXG4gICAgICA6IGBSZWZ1c2luZyB0byBzYXZlIFwiJHtwYXJhbXMucGF0aH1cIjogdGhlIGRhdGEgd291bGQgYmUgJHtTdHJpbmcocGFyYW1zLnNpemVJbkJ5dGVzKX0gYnl0ZXNgO1xuICAgIGNvbnN0IGNvbnNlcXVlbmNlID0gcGFyYW1zLm9wZXJhdGlvbiA9PT0gUGx1Z2luRGF0YU9wZXJhdGlvbi5Mb2FkXG4gICAgICA/ICdUaGUgZmlsZSB3YXMgbGVmdCB1bnRvdWNoZWQuJ1xuICAgICAgOiAnTm90aGluZyB3YXMgd3JpdHRlbiwgc28gdGhlIGxhc3Qgc2F2ZWQgZmlsZSByZW1haW5zLic7XG4gICAgc3VwZXIoXG4gICAgICBgUGx1Z2luIFwiJHtwYXJhbXMucGx1Z2luTmFtZX1cIiAoJHtwYXJhbXMucGx1Z2luSWR9KTogJHt3aGF0fSwgb3ZlciB0aGUgJHtTdHJpbmcocGFyYW1zLm1heFNpemVJbkJ5dGVzKX0tYnl0ZSBsaW1pdC4gJHtjb25zZXF1ZW5jZX0gYFxuICAgICAgICArICdLZWVwIGRhdGEuanNvbiBmb3Igc21hbGwgc2V0dGluZ3MsIGFuZCBtb3ZlIGxhcmdlIG9yIGdyb3dpbmcgc3RhdGUgdG8gTG9jYWxEYXRhU3RvcmUgb3IgU2hhcmVkRGF0YVN0b3JlLidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5EYXRhU2l6ZUxpbWl0RXhjZWVkZWRFcnJvcic7XG4gICAgdGhpcy5tYXhTaXplSW5CeXRlcyA9IHBhcmFtcy5tYXhTaXplSW5CeXRlcztcbiAgICB0aGlzLm9wZXJhdGlvbiA9IHBhcmFtcy5vcGVyYXRpb247XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgICB0aGlzLnNpemVJbkJ5dGVzID0gcGFyYW1zLnNpemVJbkJ5dGVzO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBLFNBQVMscUJBQXFCO0FBSzlCLE1BQU0sdUJBQXVCO0FBUXRCLE1BQU0sd0NBQXdDO0FBSzlDLElBQUssc0JBQUwsa0JBQUtBLHlCQUFMO0FBSUwsRUFBQUEscUJBQUEsVUFBTztBQUtQLEVBQUFBLHFCQUFBLFVBQU87QUFURyxTQUFBQTtBQUFBLEdBQUE7QUFnRkwsTUFBTSxrQkFBeUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVk3QyxZQUErQixRQUFnQixVQUErQyxDQUFDLEdBQUc7QUFBbkU7QUFDcEMsVUFBTSxpQkFBaUIsUUFBUSxrQkFBa0I7QUFDakQsUUFBSSxPQUFPLE1BQU0sY0FBYyxLQUFLLGlCQUFpQixHQUFHO0FBQ3RELFlBQU0sSUFBSSxXQUFXLHFEQUFxRCxPQUFPLGNBQWMsQ0FBQyxHQUFHO0FBQUEsSUFDckc7QUFDQSxTQUFLLGlCQUFpQjtBQUFBLEVBQ3hCO0FBQUEsRUFOc0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVJuQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBeUJuQixNQUFhLFdBQTZCO0FB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
@@ -2,14 +2,20 @@
2
2
  /**
3
3
  * @file
4
4
  *
5
- * Desktop git runner with Node modules loaded only when a command runs.
5
+ * Desktop git runner.
6
+ *
7
+ * Desktop-only (`node:child_process`, `node:util`), but inert to import on mobile: nothing here reads either
8
+ * module until the runner executes a command. The imports are static on purpose. A plugin ships one CommonJS
9
+ * `main.js`, and esbuild turns a static import of an external module into a `require()`, which Obsidian's renderer
10
+ * serves, while it keeps a dynamic `import('node:child_process')` as a native `import()`, which the renderer
11
+ * cannot load. That failed every command, and `loadGitRenames` answered no renames at all.
6
12
  */
7
13
  import type { GitRunner } from './git-rename-history.mjs';
8
14
  /**
9
15
  * Creates a {@link GitRunner} for a folder.
10
16
  *
11
17
  * Call the runner only on desktop, behind `Platform.isDesktopApp`. Importing this module and creating a
12
- * runner are safe on mobile: Node modules load only when the runner executes a command.
18
+ * runner are safe on mobile: Node modules are read only when the runner executes a command.
13
19
  *
14
20
  * @param cwd - The folder to run `git` in.
15
21
  * @returns The runner.
@@ -3,11 +3,11 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
5
 
6
+ import { execFile } from "node:child_process";
7
+ import { promisify } from "node:util";
6
8
  const GIT_OUTPUT_LIMIT_IN_BYTES = 268435456;
7
9
  function createDesktopGitRunner(cwd) {
8
10
  return async (arguments_) => {
9
- const { execFile } = await import("node:child_process");
10
- const { promisify } = await import("node:util");
11
11
  const execFileAsync = promisify(execFile);
12
12
  const { stdout } = await execFileAsync("git", [...arguments_], { cwd, encoding: "utf-8", maxBuffer: GIT_OUTPUT_LIMIT_IN_BYTES, windowsHide: true });
13
13
  return stdout;
@@ -16,4 +16,4 @@ function createDesktopGitRunner(cwd) {
16
16
  export {
17
17
  createDesktopGitRunner
18
18
  };
19
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rlc2t0b3AtZ2l0LXJ1bm5lci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgZ2l0IHJ1bm5lciB3aXRoIE5vZGUgbW9kdWxlcyBsb2FkZWQgb25seSB3aGVuIGEgY29tbWFuZCBydW5zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgR2l0UnVubmVyIH0gZnJvbSAnLi9naXQtcmVuYW1lLWhpc3RvcnkudHMnO1xuXG4vKipcbiAqIExhcmdlIGVub3VnaCBmb3IgdGhlIHJlbmFtZSBoaXN0b3J5IG9mIGFueSB2YXVsdDogYC0tZGlmZi1maWx0ZXI9UmAga2VlcHMgb25seSB0aGUgcmVuYW1lcy4gMjU2IE1pQi5cbiAqL1xuY29uc3QgR0lUX09VVFBVVF9MSU1JVF9JTl9CWVRFUyA9IDI2OF80MzVfNDU2O1xuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgR2l0UnVubmVyfSBmb3IgYSBmb2xkZXIuXG4gKlxuICogQ2FsbCB0aGUgcnVubmVyIG9ubHkgb24gZGVza3RvcCwgYmVoaW5kIGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgLiBJbXBvcnRpbmcgdGhpcyBtb2R1bGUgYW5kIGNyZWF0aW5nIGFcbiAqIHJ1bm5lciBhcmUgc2FmZSBvbiBtb2JpbGU6IE5vZGUgbW9kdWxlcyBsb2FkIG9ubHkgd2hlbiB0aGUgcnVubmVyIGV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGZvbGRlciB0byBydW4gYGdpdGAgaW4uXG4gKiBAcmV0dXJucyBUaGUgcnVubmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVza3RvcEdpdFJ1bm5lcihjd2Q6IHN0cmluZyk6IEdpdFJ1bm5lciB7XG4gIHJldHVybiBhc3luYyAoYXJndW1lbnRzXykgPT4ge1xuICAgIGNvbnN0IHsgZXhlY0ZpbGUgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpjaGlsZF9wcm9jZXNzJyk7XG4gICAgY29uc3QgeyBwcm9taXNpZnkgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTp1dGlsJyk7XG4gICAgY29uc3QgZXhlY0ZpbGVBc3luYyA9IHByb21pc2lmeShleGVjRmlsZSk7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWNGaWxlQXN5bmMoJ2dpdCcsIFsuLi5hcmd1bWVudHNfXSwgeyBjd2QsIGVuY29kaW5nOiAndXRmLTgnLCBtYXhCdWZmZXI6IEdJVF9PVVRQVVRfTElNSVRfSU5fQllURVMsIHdpbmRvd3NIaWRlOiB0cnVlIH0pO1xuICAgIHJldHVybiBzdGRvdXQ7XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQVdBLE1BQU0sNEJBQTRCO0FBVzNCLFNBQVMsdUJBQXVCLEtBQXdCO0FBQzdELFNBQU8sT0FBTyxlQUFlO0FBQzNCLFVBQU0sRUFBRSxTQUFTLElBQUksTUFBTSxPQUFPLG9CQUFvQjtBQUN0RCxVQUFNLEVBQUUsVUFBVSxJQUFJLE1BQU0sT0FBTyxXQUFXO0FBQzlDLFVBQU0sZ0JBQWdCLFVBQVUsUUFBUTtBQUN4QyxVQUFNLEVBQUUsT0FBTyxJQUFJLE1BQU0sY0FBYyxPQUFPLENBQUMsR0FBRyxVQUFVLEdBQUcsRUFBRSxLQUFLLFVBQVUsU0FBUyxXQUFXLDJCQUEyQixhQUFhLEtBQUssQ0FBQztBQUNsSixXQUFPO0FBQUEsRUFDVDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
19
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rlc2t0b3AtZ2l0LXJ1bm5lci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgZ2l0IHJ1bm5lci5cbiAqXG4gKiBEZXNrdG9wLW9ubHkgKGBub2RlOmNoaWxkX3Byb2Nlc3NgLCBgbm9kZTp1dGlsYCksIGJ1dCBpbmVydCB0byBpbXBvcnQgb24gbW9iaWxlOiBub3RoaW5nIGhlcmUgcmVhZHMgZWl0aGVyXG4gKiBtb2R1bGUgdW50aWwgdGhlIHJ1bm5lciBleGVjdXRlcyBhIGNvbW1hbmQuIFRoZSBpbXBvcnRzIGFyZSBzdGF0aWMgb24gcHVycG9zZS4gQSBwbHVnaW4gc2hpcHMgb25lIENvbW1vbkpTXG4gKiBgbWFpbi5qc2AsIGFuZCBlc2J1aWxkIHR1cm5zIGEgc3RhdGljIGltcG9ydCBvZiBhbiBleHRlcm5hbCBtb2R1bGUgaW50byBhIGByZXF1aXJlKClgLCB3aGljaCBPYnNpZGlhbidzIHJlbmRlcmVyXG4gKiBzZXJ2ZXMsIHdoaWxlIGl0IGtlZXBzIGEgZHluYW1pYyBgaW1wb3J0KCdub2RlOmNoaWxkX3Byb2Nlc3MnKWAgYXMgYSBuYXRpdmUgYGltcG9ydCgpYCwgd2hpY2ggdGhlIHJlbmRlcmVyXG4gKiBjYW5ub3QgbG9hZC4gVGhhdCBmYWlsZWQgZXZlcnkgY29tbWFuZCwgYW5kIGBsb2FkR2l0UmVuYW1lc2AgYW5zd2VyZWQgbm8gcmVuYW1lcyBhdCBhbGwuXG4gKi9cblxuaW1wb3J0IHsgZXhlY0ZpbGUgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJztcblxuaW1wb3J0IHR5cGUgeyBHaXRSdW5uZXIgfSBmcm9tICcuL2dpdC1yZW5hbWUtaGlzdG9yeS50cyc7XG5cbi8qKlxuICogTGFyZ2UgZW5vdWdoIGZvciB0aGUgcmVuYW1lIGhpc3Rvcnkgb2YgYW55IHZhdWx0OiBgLS1kaWZmLWZpbHRlcj1SYCBrZWVwcyBvbmx5IHRoZSByZW5hbWVzLiAyNTYgTWlCLlxuICovXG5jb25zdCBHSVRfT1VUUFVUX0xJTUlUX0lOX0JZVEVTID0gMjY4XzQzNV80NTY7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBHaXRSdW5uZXJ9IGZvciBhIGZvbGRlci5cbiAqXG4gKiBDYWxsIHRoZSBydW5uZXIgb25seSBvbiBkZXNrdG9wLCBiZWhpbmQgYFBsYXRmb3JtLmlzRGVza3RvcEFwcGAuIEltcG9ydGluZyB0aGlzIG1vZHVsZSBhbmQgY3JlYXRpbmcgYVxuICogcnVubmVyIGFyZSBzYWZlIG9uIG1vYmlsZTogTm9kZSBtb2R1bGVzIGFyZSByZWFkIG9ubHkgd2hlbiB0aGUgcnVubmVyIGV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGZvbGRlciB0byBydW4gYGdpdGAgaW4uXG4gKiBAcmV0dXJucyBUaGUgcnVubmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVza3RvcEdpdFJ1bm5lcihjd2Q6IHN0cmluZyk6IEdpdFJ1bm5lciB7XG4gIHJldHVybiBhc3luYyAoYXJndW1lbnRzXykgPT4ge1xuICAgIGNvbnN0IGV4ZWNGaWxlQXN5bmMgPSBwcm9taXNpZnkoZXhlY0ZpbGUpO1xuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBleGVjRmlsZUFzeW5jKCdnaXQnLCBbLi4uYXJndW1lbnRzX10sIHsgY3dkLCBlbmNvZGluZzogJ3V0Zi04JywgbWF4QnVmZmVyOiBHSVRfT1VUUFVUX0xJTUlUX0lOX0JZVEVTLCB3aW5kb3dzSGlkZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gc3Rkb3V0O1xuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFZQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLGlCQUFpQjtBQU8xQixNQUFNLDRCQUE0QjtBQVczQixTQUFTLHVCQUF1QixLQUF3QjtBQUM3RCxTQUFPLE9BQU8sZUFBZTtBQUMzQixVQUFNLGdCQUFnQixVQUFVLFFBQVE7QUFDeEMsVUFBTSxFQUFFLE9BQU8sSUFBSSxNQUFNLGNBQWMsT0FBTyxDQUFDLEdBQUcsVUFBVSxHQUFHLEVBQUUsS0FBSyxVQUFVLFNBQVMsV0FBVywyQkFBMkIsYUFBYSxLQUFLLENBQUM7QUFDbEosV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K