@mnaoumov/obsidian-lib 10.9.0 → 10.11.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.
- package/codemirror/editor-mode-extension/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +42 -1
- package/dist/lib/cjs/__merged.d.cts +6 -1
- package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +180 -0
- package/dist/lib/cjs/codemirror/editor-mode-extension.d.cts +50 -0
- package/dist/lib/cjs/codemirror/index.cjs +4 -1
- package/dist/lib/cjs/codemirror/index.d.cts +1 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +4 -7
- package/dist/lib/cjs/components/plugin-settings-component.cjs +4 -3
- package/dist/lib/cjs/components/plugin-settings-component.d.cts +2 -1
- package/dist/lib/cjs/css-class.cjs +7 -1
- package/dist/lib/cjs/css-class.d.cts +24 -0
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/i18n/i18n.cjs +38 -10
- package/dist/lib/cjs/i18n/i18n.d.cts +29 -2
- package/dist/lib/cjs/i18n/locales/en.cjs +19 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +18 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +18 -0
- package/dist/lib/cjs/index.cjs +7 -1
- package/dist/lib/cjs/index.d.cts +2 -0
- package/dist/lib/cjs/link.cjs +40 -1
- package/dist/lib/cjs/link.d.cts +37 -1
- package/dist/lib/cjs/modals/code-block-builder.cjs +486 -0
- package/dist/lib/cjs/modals/code-block-builder.d.cts +321 -0
- package/dist/lib/cjs/modals/index.cjs +4 -1
- package/dist/lib/cjs/modals/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/index.cjs +4 -1
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +189 -0
- package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +111 -0
- package/dist/lib/cjs/plugin/plugin.cjs +47 -2
- package/dist/lib/cjs/plugin/plugin.d.cts +25 -1
- package/dist/lib/cjs/reference-definition.cjs +234 -0
- package/dist/lib/cjs/reference-definition.d.cts +47 -0
- package/dist/lib/cjs/release-asset.cjs +279 -0
- package/dist/lib/cjs/release-asset.d.cts +190 -0
- package/dist/lib/cjs/workspace.cjs +3 -2
- package/dist/lib/cjs/workspace.d.cts +6 -0
- package/dist/lib/esm/__merged.d.mts +6 -1
- package/dist/lib/esm/__merged.mjs +45 -1
- package/dist/lib/esm/codemirror/editor-mode-extension.d.mts +50 -0
- package/dist/lib/esm/codemirror/editor-mode-extension.mjs +93 -0
- package/dist/lib/esm/codemirror/index.d.mts +1 -0
- package/dist/lib/esm/codemirror/index.mjs +3 -1
- package/dist/lib/esm/codemirror/inline-token-widgets.mjs +3 -9
- package/dist/lib/esm/components/plugin-settings-component.d.mts +2 -1
- package/dist/lib/esm/components/plugin-settings-component.mjs +4 -3
- package/dist/lib/esm/css-class.d.mts +24 -0
- package/dist/lib/esm/css-class.mjs +7 -1
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/i18n/i18n.d.mts +29 -2
- package/dist/lib/esm/i18n/i18n.mjs +40 -10
- package/dist/lib/esm/i18n/locales/en.d.mts +18 -0
- package/dist/lib/esm/i18n/locales/en.mjs +19 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +18 -0
- package/dist/lib/esm/index.d.mts +2 -0
- package/dist/lib/esm/index.mjs +5 -1
- package/dist/lib/esm/link.d.mts +37 -1
- package/dist/lib/esm/link.mjs +40 -1
- package/dist/lib/esm/modals/code-block-builder.d.mts +321 -0
- package/dist/lib/esm/modals/code-block-builder.mjs +408 -0
- package/dist/lib/esm/modals/index.d.mts +1 -0
- package/dist/lib/esm/modals/index.mjs +3 -1
- package/dist/lib/esm/plugin/index.d.mts +1 -0
- package/dist/lib/esm/plugin/index.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +111 -0
- package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +96 -0
- package/dist/lib/esm/plugin/plugin.d.mts +25 -1
- package/dist/lib/esm/plugin/plugin.mjs +52 -2
- package/dist/lib/esm/reference-definition.d.mts +47 -0
- package/dist/lib/esm/reference-definition.mjs +146 -0
- package/dist/lib/esm/release-asset.d.mts +190 -0
- package/dist/lib/esm/release-asset.mjs +187 -0
- package/dist/lib/esm/workspace.d.mts +6 -0
- package/dist/lib/esm/workspace.mjs +3 -2
- package/dist/styles.css +31 -1
- package/modals/code-block-builder/package.json +6 -0
- package/package.json +1 -1
- package/plugin/plugin-async-cleanup/package.json +6 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/// <reference lib="dom" />
|
|
3
|
+
/**
|
|
4
|
+
* @file
|
|
5
|
+
*
|
|
6
|
+
* Contains {@link showCodeBlockBuilder}, a modal that builds a plugin's code block from a declarative list of fields, and
|
|
7
|
+
* {@link formatCodeBlock}, the pure formatter behind it.
|
|
8
|
+
*
|
|
9
|
+
* Every field renders as one settings row. A field whose value differs from its default writes one `key: value` line
|
|
10
|
+
* into the block (a required field always does), the block is shown live with an optional preview the plugin draws, and
|
|
11
|
+
* the user copies it or inserts it into the note being edited.
|
|
12
|
+
*
|
|
13
|
+
* Adapted from the code block creator modal of altarok's `obsidian-dev-utils`
|
|
14
|
+
* (https://github.com/altarok/obsidian-dev-utils, `src/code-block-creator/`), under the MIT license below. The port
|
|
15
|
+
* takes the app from the caller, moves the styles into the library stylesheet, reuses this library's setting
|
|
16
|
+
* components, and picks a fence longer than any backtick run in the values.
|
|
17
|
+
*
|
|
18
|
+
* Copyright (c) 2026 Altarok
|
|
19
|
+
*
|
|
20
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
|
21
|
+
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
|
22
|
+
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
|
23
|
+
* permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
24
|
+
*
|
|
25
|
+
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
|
26
|
+
* Software.
|
|
27
|
+
*
|
|
28
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
29
|
+
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
30
|
+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
31
|
+
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
32
|
+
*/
|
|
33
|
+
import type { Editor } from 'obsidian' with { 'resolution-mode': 'import' };
|
|
34
|
+
import type { ModalParamsBase } from './modal.cjs';
|
|
35
|
+
/**
|
|
36
|
+
* A boolean field, rendered as a toggle.
|
|
37
|
+
*/
|
|
38
|
+
export interface CodeBlockBuilderBooleanField extends CodeBlockBuilderFieldBase<boolean> {
|
|
39
|
+
/**
|
|
40
|
+
* The kind of the field.
|
|
41
|
+
*/
|
|
42
|
+
readonly type: 'boolean';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A color field, rendered as a color picker. The value is the color as `#rrggbb`.
|
|
46
|
+
*/
|
|
47
|
+
export interface CodeBlockBuilderColorField extends CodeBlockBuilderFieldBase<string> {
|
|
48
|
+
/**
|
|
49
|
+
* The kind of the field.
|
|
50
|
+
*/
|
|
51
|
+
readonly type: 'color';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A pair of cascading dropdowns: the first picks a group, the second one of that group's options. Only the second
|
|
55
|
+
* dropdown's value is written into the code block.
|
|
56
|
+
*/
|
|
57
|
+
export interface CodeBlockBuilderConditionalDropdownField extends CodeBlockBuilderFieldBase<string> {
|
|
58
|
+
/**
|
|
59
|
+
* The groups of options. The group containing {@link CodeBlockBuilderFieldBase.defaultValue} is selected first, else
|
|
60
|
+
* the first group.
|
|
61
|
+
*/
|
|
62
|
+
readonly groups: readonly CodeBlockBuilderOptionGroup[];
|
|
63
|
+
/**
|
|
64
|
+
* The kind of the field.
|
|
65
|
+
*/
|
|
66
|
+
readonly type: 'conditionalDropdown';
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A single-choice dropdown field.
|
|
70
|
+
*/
|
|
71
|
+
export interface CodeBlockBuilderDropdownField extends CodeBlockBuilderFieldBase<string> {
|
|
72
|
+
/**
|
|
73
|
+
* The options of the dropdown.
|
|
74
|
+
*/
|
|
75
|
+
readonly options: CodeBlockBuilderOptions;
|
|
76
|
+
/**
|
|
77
|
+
* The kind of the field.
|
|
78
|
+
*/
|
|
79
|
+
readonly type: 'dropdown';
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A field of the code block builder, other than a {@link CodeBlockBuilderGroup}.
|
|
83
|
+
*/
|
|
84
|
+
export type CodeBlockBuilderField = CodeBlockBuilderBooleanField | CodeBlockBuilderColorField | CodeBlockBuilderConditionalDropdownField | CodeBlockBuilderDropdownField | CodeBlockBuilderFolderField | CodeBlockBuilderMultipleDropdownField | CodeBlockBuilderSliderField | CodeBlockBuilderTextField;
|
|
85
|
+
/**
|
|
86
|
+
* The members every {@link CodeBlockBuilderField} has.
|
|
87
|
+
*
|
|
88
|
+
* @typeParam Value - The type of the field's value.
|
|
89
|
+
*/
|
|
90
|
+
export interface CodeBlockBuilderFieldBase<Value extends CodeBlockBuilderValue> {
|
|
91
|
+
/**
|
|
92
|
+
* The value the field starts with. While the field holds it, the field writes nothing into the code block, unless it
|
|
93
|
+
* is {@link CodeBlockBuilderFieldBase.isRequired}.
|
|
94
|
+
*/
|
|
95
|
+
readonly defaultValue: Value;
|
|
96
|
+
/**
|
|
97
|
+
* A description shown under the field's name.
|
|
98
|
+
*/
|
|
99
|
+
readonly description?: string;
|
|
100
|
+
/**
|
|
101
|
+
* Whether the field is always written into the code block. A required field is shown above the optional ones and has
|
|
102
|
+
* no reset button.
|
|
103
|
+
*
|
|
104
|
+
* @default `false`
|
|
105
|
+
*/
|
|
106
|
+
readonly isRequired?: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* The key the field's line is written with, and the key of its value in the values the preview receives. Unique across
|
|
109
|
+
* all fields.
|
|
110
|
+
*/
|
|
111
|
+
readonly key: string;
|
|
112
|
+
/**
|
|
113
|
+
* The name of the field, shown to the user.
|
|
114
|
+
*/
|
|
115
|
+
readonly name: string;
|
|
116
|
+
/**
|
|
117
|
+
* Whether the field's line holds its value alone, without the `key: ` prefix.
|
|
118
|
+
*
|
|
119
|
+
* @default `false`
|
|
120
|
+
*/
|
|
121
|
+
readonly shouldOmitKey?: boolean;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* A folder field: a dropdown of every folder of the vault. The value is the folder path, `/` for the vault root.
|
|
125
|
+
*/
|
|
126
|
+
export interface CodeBlockBuilderFolderField extends CodeBlockBuilderFieldBase<string> {
|
|
127
|
+
/**
|
|
128
|
+
* The kind of the field.
|
|
129
|
+
*/
|
|
130
|
+
readonly type: 'folder';
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* A collapsible group of fields. One group is expanded at a time: expanding a group collapses the others.
|
|
134
|
+
*/
|
|
135
|
+
export interface CodeBlockBuilderGroup {
|
|
136
|
+
/**
|
|
137
|
+
* The fields of the group. A required field inside a group is still written into the code block.
|
|
138
|
+
*/
|
|
139
|
+
readonly fields: readonly CodeBlockBuilderField[];
|
|
140
|
+
/**
|
|
141
|
+
* Whether the group starts expanded.
|
|
142
|
+
*
|
|
143
|
+
* @default `false`
|
|
144
|
+
*/
|
|
145
|
+
readonly isInitiallyExpanded?: boolean;
|
|
146
|
+
/**
|
|
147
|
+
* The heading of the group.
|
|
148
|
+
*/
|
|
149
|
+
readonly name: string;
|
|
150
|
+
/**
|
|
151
|
+
* The kind of the entry.
|
|
152
|
+
*/
|
|
153
|
+
readonly type: 'group';
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* An entry of {@link ShowCodeBlockBuilderParams.fields}: a field, or a group of fields.
|
|
157
|
+
*/
|
|
158
|
+
export type CodeBlockBuilderInput = CodeBlockBuilderField | CodeBlockBuilderGroup;
|
|
159
|
+
/**
|
|
160
|
+
* A multiple-choice dropdown field. Its line holds the selected options joined by
|
|
161
|
+
* {@link CodeBlockBuilderMultipleDropdownField.separator}.
|
|
162
|
+
*/
|
|
163
|
+
export interface CodeBlockBuilderMultipleDropdownField extends CodeBlockBuilderFieldBase<readonly string[]> {
|
|
164
|
+
/**
|
|
165
|
+
* The options of the dropdown.
|
|
166
|
+
*/
|
|
167
|
+
readonly options: CodeBlockBuilderOptions;
|
|
168
|
+
/**
|
|
169
|
+
* The text the selected options are joined with.
|
|
170
|
+
*
|
|
171
|
+
* @default `','`
|
|
172
|
+
*/
|
|
173
|
+
readonly separator?: string;
|
|
174
|
+
/**
|
|
175
|
+
* The kind of the field.
|
|
176
|
+
*/
|
|
177
|
+
readonly type: 'multipleDropdown';
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* A named group of options of a {@link CodeBlockBuilderConditionalDropdownField}.
|
|
181
|
+
*/
|
|
182
|
+
export interface CodeBlockBuilderOptionGroup {
|
|
183
|
+
/**
|
|
184
|
+
* The name of the group, shown in the first dropdown.
|
|
185
|
+
*/
|
|
186
|
+
readonly name: string;
|
|
187
|
+
/**
|
|
188
|
+
* The options of the group, shown in the second dropdown.
|
|
189
|
+
*/
|
|
190
|
+
readonly options: CodeBlockBuilderOptions;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* The options of a dropdown: a list of values shown as they are, or a map from each value to its display text.
|
|
194
|
+
*/
|
|
195
|
+
export type CodeBlockBuilderOptions = Readonly<Record<string, string>> | readonly string[];
|
|
196
|
+
/**
|
|
197
|
+
* The parameters of {@link ShowCodeBlockBuilderParams.onUpdatePreview}.
|
|
198
|
+
*/
|
|
199
|
+
export interface CodeBlockBuilderPreviewParams {
|
|
200
|
+
/**
|
|
201
|
+
* The code block as it stands.
|
|
202
|
+
*/
|
|
203
|
+
readonly codeBlock: string;
|
|
204
|
+
/**
|
|
205
|
+
* The element to draw the preview into. The modal never clears it.
|
|
206
|
+
*/
|
|
207
|
+
readonly previewEl: HTMLElement;
|
|
208
|
+
/**
|
|
209
|
+
* The current value of every field, by its key.
|
|
210
|
+
*/
|
|
211
|
+
readonly values: ReadonlyMap<string, CodeBlockBuilderValue>;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* A slider field. A {@link CodeBlockBuilderFieldBase.defaultValue} outside the bounds widens them.
|
|
215
|
+
*/
|
|
216
|
+
export interface CodeBlockBuilderSliderField extends CodeBlockBuilderFieldBase<number> {
|
|
217
|
+
/**
|
|
218
|
+
* The upper bound.
|
|
219
|
+
*/
|
|
220
|
+
readonly max: number;
|
|
221
|
+
/**
|
|
222
|
+
* The lower bound.
|
|
223
|
+
*/
|
|
224
|
+
readonly min: number;
|
|
225
|
+
/**
|
|
226
|
+
* The step.
|
|
227
|
+
*/
|
|
228
|
+
readonly step: number;
|
|
229
|
+
/**
|
|
230
|
+
* The kind of the field.
|
|
231
|
+
*/
|
|
232
|
+
readonly type: 'slider';
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* A text field.
|
|
236
|
+
*/
|
|
237
|
+
export interface CodeBlockBuilderTextField extends CodeBlockBuilderFieldBase<string> {
|
|
238
|
+
/**
|
|
239
|
+
* A placeholder shown while the field is empty.
|
|
240
|
+
*/
|
|
241
|
+
readonly placeholder?: string;
|
|
242
|
+
/**
|
|
243
|
+
* The kind of the field.
|
|
244
|
+
*/
|
|
245
|
+
readonly type: 'text';
|
|
246
|
+
/**
|
|
247
|
+
* A pattern the value must match. While it does not, the field is marked invalid and keeps its last valid value.
|
|
248
|
+
*/
|
|
249
|
+
readonly validationPattern?: RegExp;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* The value of a {@link CodeBlockBuilderField}.
|
|
253
|
+
*/
|
|
254
|
+
export type CodeBlockBuilderValue = boolean | number | readonly string[] | string;
|
|
255
|
+
/**
|
|
256
|
+
* The parameters of {@link formatCodeBlock}.
|
|
257
|
+
*/
|
|
258
|
+
export interface FormatCodeBlockParams {
|
|
259
|
+
/**
|
|
260
|
+
* The fields of the code block.
|
|
261
|
+
*/
|
|
262
|
+
readonly fields: readonly CodeBlockBuilderInput[];
|
|
263
|
+
/**
|
|
264
|
+
* The language of the code block.
|
|
265
|
+
*/
|
|
266
|
+
readonly language: string;
|
|
267
|
+
/**
|
|
268
|
+
* The value of each field, by its key. A field missing from it holds its default value.
|
|
269
|
+
*/
|
|
270
|
+
readonly values: ReadonlyMap<string, CodeBlockBuilderValue>;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* The parameters of {@link showCodeBlockBuilder}.
|
|
274
|
+
*/
|
|
275
|
+
export interface ShowCodeBlockBuilderParams extends ModalParamsBase {
|
|
276
|
+
/**
|
|
277
|
+
* The editor the Insert button writes into.
|
|
278
|
+
*
|
|
279
|
+
* @default The active editor when the modal opens.
|
|
280
|
+
*/
|
|
281
|
+
readonly editor?: Editor | null;
|
|
282
|
+
/**
|
|
283
|
+
* The fields of the code block, in the order they are written into it. Required fields are shown first.
|
|
284
|
+
*/
|
|
285
|
+
readonly fields: readonly CodeBlockBuilderInput[];
|
|
286
|
+
/**
|
|
287
|
+
* The language of the code block: the text after its opening fence.
|
|
288
|
+
*/
|
|
289
|
+
readonly language: string;
|
|
290
|
+
/**
|
|
291
|
+
* Draws a live preview of the code block. Called once when the modal opens and again after every change.
|
|
292
|
+
*
|
|
293
|
+
* @param params - The preview element, the code block and the current values.
|
|
294
|
+
*/
|
|
295
|
+
readonly onUpdatePreview?: (params: CodeBlockBuilderPreviewParams) => void;
|
|
296
|
+
/**
|
|
297
|
+
* The title of the modal.
|
|
298
|
+
*
|
|
299
|
+
* @default `'Code block builder'`
|
|
300
|
+
*/
|
|
301
|
+
readonly title?: string;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Formats a code block from its fields and their values.
|
|
305
|
+
*
|
|
306
|
+
* Each field holding a value other than its default, or marked {@link CodeBlockBuilderFieldBase.isRequired}, writes one
|
|
307
|
+
* line, in the order of the fields; an empty value writes nothing. The fence is one backtick longer than the longest
|
|
308
|
+
* backtick run in the lines, and never shorter than three.
|
|
309
|
+
*
|
|
310
|
+
* @param params - The fields, the language and the values.
|
|
311
|
+
* @returns The code block, without a trailing newline.
|
|
312
|
+
*/
|
|
313
|
+
export declare function formatCodeBlock(params: FormatCodeBlockParams): string;
|
|
314
|
+
/**
|
|
315
|
+
* Opens the code block builder modal.
|
|
316
|
+
*
|
|
317
|
+
* @param params - The fields of the code block and how to present them.
|
|
318
|
+
* @returns A {@link Promise} that resolves with the code block when the user inserted it into the note, or with `null`
|
|
319
|
+
* when the modal was closed otherwise.
|
|
320
|
+
*/
|
|
321
|
+
export declare function showCodeBlockBuilder(params: ShowCodeBlockBuilderParams): Promise<null | string>;
|
|
@@ -98,6 +98,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
98
98
|
var modals_exports = {};
|
|
99
99
|
__export(modals_exports, {
|
|
100
100
|
alert: () => alert,
|
|
101
|
+
"code-block-builder": () => code_block_builder,
|
|
101
102
|
confirm: () => confirm,
|
|
102
103
|
"minimizable-modal": () => minimizable_modal,
|
|
103
104
|
modal: () => modal,
|
|
@@ -109,6 +110,7 @@ __export(modals_exports, {
|
|
|
109
110
|
});
|
|
110
111
|
module.exports = __toCommonJS(modals_exports);
|
|
111
112
|
var alert = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./alert.cjs')), 1);
|
|
113
|
+
var code_block_builder = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./code-block-builder.cjs')), 1);
|
|
112
114
|
var confirm = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./confirm.cjs')), 1);
|
|
113
115
|
var minimizable_modal = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./minimizable-modal.cjs')), 1);
|
|
114
116
|
var modal_command_builder = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./modal-command-builder.cjs')), 1);
|
|
@@ -120,6 +122,7 @@ var suggest_modal_command_builder = __toESM(((module) => module && module.__esMo
|
|
|
120
122
|
// Annotate the CommonJS export names for ESM import in node:
|
|
121
123
|
0 && (module.exports = {
|
|
122
124
|
alert,
|
|
125
|
+
"code-block-builder": null,
|
|
123
126
|
confirm,
|
|
124
127
|
"minimizable-modal": null,
|
|
125
128
|
modal,
|
|
@@ -129,4 +132,4 @@ var suggest_modal_command_builder = __toESM(((module) => module && module.__esMo
|
|
|
129
132
|
"select-option": null,
|
|
130
133
|
"suggest-modal-command-builder": null
|
|
131
134
|
});
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tb2RhbHMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhbGVydCcgZnJvbSAnLi9hbGVydC50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1ibG9jay1idWlsZGVyJyBmcm9tICcuL2NvZGUtYmxvY2stYnVpbGRlci50cyc7XG5leHBvcnQgKiBhcyAnY29uZmlybScgZnJvbSAnLi9jb25maXJtLnRzJztcbmV4cG9ydCAqIGFzICdtaW5pbWl6YWJsZS1tb2RhbCcgZnJvbSAnLi9taW5pbWl6YWJsZS1tb2RhbC50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwtY29tbWFuZC1idWlsZGVyJyBmcm9tICcuL21vZGFsLWNvbW1hbmQtYnVpbGRlci50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwnIGZyb20gJy4vbW9kYWwudHMnO1xuZXhwb3J0ICogYXMgJ3Byb21wdCcgZnJvbSAnLi9wcm9tcHQudHMnO1xuZXhwb3J0ICogYXMgJ3NlbGVjdC1pdGVtJyBmcm9tICcuL3NlbGVjdC1pdGVtLnRzJztcbmV4cG9ydCAqIGFzICdzZWxlY3Qtb3B0aW9uJyBmcm9tICcuL3NlbGVjdC1vcHRpb24udHMnO1xuZXhwb3J0ICogYXMgJ3N1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyJyBmcm9tICcuL3N1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyLnRzJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBLDhCQUFBQTtBQUFBLEVBQUE7QUFBQSw2QkFBQUM7QUFBQSxFQUFBO0FBQUEsaUNBQUFDO0FBQUEsRUFBQTtBQUFBLHVCQUFBQztBQUFBLEVBQUEsdUJBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQTtBQUFBO0FBRUEsWUFBeUI7QUFDekIsSUFBQUwscUJBQXNDO0FBQ3RDLGNBQTJCO0FBQzNCLElBQUFDLG9CQUFxQztBQUNyQyxJQUFBQyx3QkFBeUM7QUFDekMsWUFBeUI7QUFDekIsYUFBMEI7QUFDMUIsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsZ0JBQWlDO0FBQ2pDLElBQUFDLGdDQUFpRDsiLCJuYW1lcyI6WyJjb2RlLWJsb2NrLWJ1aWxkZXIiLCJtaW5pbWl6YWJsZS1tb2RhbCIsIm1vZGFsLWNvbW1hbmQtYnVpbGRlciIsInNlbGVjdC1pdGVtIiwic2VsZWN0LW9wdGlvbiIsInN1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyIl19
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../library-references.d.cts" />
|
|
2
2
|
export * as 'alert' from './alert.cjs';
|
|
3
|
+
export * as 'code-block-builder' from './code-block-builder.cjs';
|
|
3
4
|
export * as 'confirm' from './confirm.cjs';
|
|
4
5
|
export * as 'minimizable-modal' from './minimizable-modal.cjs';
|
|
5
6
|
export * as 'modal-command-builder' from './modal-command-builder.cjs';
|
|
@@ -99,6 +99,7 @@ var plugin_exports = {};
|
|
|
99
99
|
__export(plugin_exports, {
|
|
100
100
|
plugin: () => plugin,
|
|
101
101
|
"plugin-api": () => plugin_api,
|
|
102
|
+
"plugin-async-cleanup": () => plugin_async_cleanup,
|
|
102
103
|
"plugin-context": () => plugin_context,
|
|
103
104
|
"plugin-event-source": () => plugin_event_source,
|
|
104
105
|
"plugin-install-state": () => plugin_install_state,
|
|
@@ -108,6 +109,7 @@ __export(plugin_exports, {
|
|
|
108
109
|
});
|
|
109
110
|
module.exports = __toCommonJS(plugin_exports);
|
|
110
111
|
var plugin_api = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./plugin-api.cjs')), 1);
|
|
112
|
+
var plugin_async_cleanup = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./plugin-async-cleanup.cjs')), 1);
|
|
111
113
|
var plugin_context = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./plugin-context.cjs')), 1);
|
|
112
114
|
var plugin_event_source = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./plugin-event-source.cjs')), 1);
|
|
113
115
|
var plugin_install_state = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./plugin-install-state.cjs')), 1);
|
|
@@ -119,6 +121,7 @@ var settings_migration_api = __toESM(((module) => module && module.__esModule &&
|
|
|
119
121
|
0 && (module.exports = {
|
|
120
122
|
plugin,
|
|
121
123
|
"plugin-api": null,
|
|
124
|
+
"plugin-async-cleanup": null,
|
|
122
125
|
"plugin-context": null,
|
|
123
126
|
"plugin-event-source": null,
|
|
124
127
|
"plugin-install-state": null,
|
|
@@ -126,4 +129,4 @@ var settings_migration_api = __toESM(((module) => module && module.__esModule &&
|
|
|
126
129
|
"plugin-settings-tab": null,
|
|
127
130
|
"settings-migration-api": null
|
|
128
131
|
});
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdwbHVnaW4tYXBpJyBmcm9tICcuL3BsdWdpbi1hcGkudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1hc3luYy1jbGVhbnVwJyBmcm9tICcuL3BsdWdpbi1hc3luYy1jbGVhbnVwLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tY29udGV4dCcgZnJvbSAnLi9wbHVnaW4tY29udGV4dC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWV2ZW50LXNvdXJjZScgZnJvbSAnLi9wbHVnaW4tZXZlbnQtc291cmNlLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4taW5zdGFsbC1zdGF0ZScgZnJvbSAnLi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWxpZmVjeWNsZS1ldmVudHMnIGZyb20gJy4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy10YWInIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luJyBmcm9tICcuL3BsdWdpbi50cyc7XG5leHBvcnQgKiBhcyAnc2V0dGluZ3MtbWlncmF0aW9uLWFwaScgZnJvbSAnLi9zZXR0aW5ncy1taWdyYXRpb24tYXBpLnRzJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUFBQTtBQUFBLEVBQUEsOEJBQUFDO0FBQUEsRUFBQSx3QkFBQUM7QUFBQSxFQUFBLDZCQUFBQztBQUFBLEVBQUEsOEJBQUFDO0FBQUEsRUFBQSxpQ0FBQUM7QUFBQSxFQUFBLDZCQUFBQztBQUFBLEVBQUEsZ0NBQUFDO0FBQUE7QUFBQTtBQUVBLElBQUFQLGFBQThCO0FBQzlCLElBQUFDLHVCQUF3QztBQUN4QyxJQUFBQyxpQkFBa0M7QUFDbEMsSUFBQUMsc0JBQXVDO0FBQ3ZDLElBQUFDLHVCQUF3QztBQUN4QyxJQUFBQywwQkFBMkM7QUFDM0MsSUFBQUMsc0JBQXVDO0FBQ3ZDLGFBQTBCO0FBQzFCLElBQUFDLHlCQUEwQzsiLCJuYW1lcyI6WyJwbHVnaW4tYXBpIiwicGx1Z2luLWFzeW5jLWNsZWFudXAiLCJwbHVnaW4tY29udGV4dCIsInBsdWdpbi1ldmVudC1zb3VyY2UiLCJwbHVnaW4taW5zdGFsbC1zdGF0ZSIsInBsdWdpbi1saWZlY3ljbGUtZXZlbnRzIiwicGx1Z2luLXNldHRpbmdzLXRhYiIsInNldHRpbmdzLW1pZ3JhdGlvbi1hcGkiXX0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../library-references.d.cts" />
|
|
2
2
|
export * as 'plugin-api' from './plugin-api.cjs';
|
|
3
|
+
export * as 'plugin-async-cleanup' from './plugin-async-cleanup.cjs';
|
|
3
4
|
export * as 'plugin-context' from './plugin-context.cjs';
|
|
4
5
|
export * as 'plugin-event-source' from './plugin-event-source.cjs';
|
|
5
6
|
export * as 'plugin-install-state' from './plugin-install-state.cjs';
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
(function patchObsidianRequire() {
|
|
33
|
+
const originalRequire = require;
|
|
34
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
require = Object.assign(
|
|
38
|
+
(id) => requirePatched(id),
|
|
39
|
+
originalRequire,
|
|
40
|
+
{
|
|
41
|
+
__isPatched: true
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
function extractDefault($module) {
|
|
45
|
+
return $module && $module.__esModule && "default" in $module ? $module.default : $module;
|
|
46
|
+
}
|
|
47
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
48
|
+
"@codemirror/autocomplete",
|
|
49
|
+
"@codemirror/collab",
|
|
50
|
+
"@codemirror/commands",
|
|
51
|
+
"@codemirror/language",
|
|
52
|
+
"@codemirror/lint",
|
|
53
|
+
"@codemirror/search",
|
|
54
|
+
"@codemirror/state",
|
|
55
|
+
"@codemirror/text",
|
|
56
|
+
"@codemirror/view",
|
|
57
|
+
"@lezer/common",
|
|
58
|
+
"@lezer/highlight",
|
|
59
|
+
"@lezer/lr",
|
|
60
|
+
"obsidian"
|
|
61
|
+
]);
|
|
62
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
63
|
+
"@codemirror/closebrackets",
|
|
64
|
+
"@codemirror/comment",
|
|
65
|
+
"@codemirror/fold",
|
|
66
|
+
"@codemirror/gutter",
|
|
67
|
+
"@codemirror/highlight",
|
|
68
|
+
"@codemirror/history",
|
|
69
|
+
"@codemirror/matchbrackets",
|
|
70
|
+
"@codemirror/panel",
|
|
71
|
+
"@codemirror/rangeset",
|
|
72
|
+
"@codemirror/rectangular-selection",
|
|
73
|
+
"@codemirror/stream-parser",
|
|
74
|
+
"@codemirror/tooltip"
|
|
75
|
+
]);
|
|
76
|
+
function requirePatched(id) {
|
|
77
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
78
|
+
return originalRequire?.(id);
|
|
79
|
+
}
|
|
80
|
+
const app = globalThis.app;
|
|
81
|
+
if (app?.isMobile) {
|
|
82
|
+
if (id === "process" || id === "node:process") {
|
|
83
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
84
|
+
return process;
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
const $module = originalRequire?.(id);
|
|
88
|
+
if ($module) {
|
|
89
|
+
return extractDefault($module);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
})();
|
|
96
|
+
|
|
97
|
+
"use strict";
|
|
98
|
+
var __defProp = Object.defineProperty;
|
|
99
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
100
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
101
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
102
|
+
var __export = (target, all) => {
|
|
103
|
+
for (var name in all)
|
|
104
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
105
|
+
};
|
|
106
|
+
var __copyProps = (to, from, except, desc) => {
|
|
107
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
108
|
+
for (let key of __getOwnPropNames(from))
|
|
109
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
110
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
111
|
+
}
|
|
112
|
+
return to;
|
|
113
|
+
};
|
|
114
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
115
|
+
var plugin_async_cleanup_exports = {};
|
|
116
|
+
__export(plugin_async_cleanup_exports, {
|
|
117
|
+
DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS: () => DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS,
|
|
118
|
+
PLUGIN_ASYNC_CLEANUPS_STATE_KEY: () => PLUGIN_ASYNC_CLEANUPS_STATE_KEY,
|
|
119
|
+
didPluginAsyncCleanupsSettle: () => didPluginAsyncCleanupsSettle,
|
|
120
|
+
hasPendingPluginAsyncCleanups: () => hasPendingPluginAsyncCleanups,
|
|
121
|
+
registerPluginAsyncCleanup: () => registerPluginAsyncCleanup,
|
|
122
|
+
trackPluginAsyncCleanup: () => trackPluginAsyncCleanup
|
|
123
|
+
});
|
|
124
|
+
module.exports = __toCommonJS(plugin_async_cleanup_exports);
|
|
125
|
+
var import_error = require('@mnaoumov/typescript-lib/error');
|
|
126
|
+
var import_obsidian_lib_state = require('../obsidian-lib-state.cjs');
|
|
127
|
+
const PLUGIN_ASYNC_CLEANUPS_STATE_KEY = "pluginAsyncCleanupsV1";
|
|
128
|
+
const DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS = 1e4;
|
|
129
|
+
async function didPluginAsyncCleanupsSettle(params) {
|
|
130
|
+
const promise = getPendingCleanups().get(params.pluginId);
|
|
131
|
+
if (!promise) {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
let timeoutId;
|
|
135
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
136
|
+
timeoutId = window.setTimeout(() => {
|
|
137
|
+
resolve(false);
|
|
138
|
+
}, params.timeoutInMilliseconds ?? DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS);
|
|
139
|
+
});
|
|
140
|
+
try {
|
|
141
|
+
return await Promise.race([promise.then(() => true), timeoutPromise]);
|
|
142
|
+
} finally {
|
|
143
|
+
window.clearTimeout(timeoutId);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function hasPendingPluginAsyncCleanups(pluginId) {
|
|
147
|
+
return getPendingCleanups().has(pluginId);
|
|
148
|
+
}
|
|
149
|
+
function registerPluginAsyncCleanup(params) {
|
|
150
|
+
params.component.register(() => {
|
|
151
|
+
trackPluginAsyncCleanup({
|
|
152
|
+
cleanup: params.cleanup,
|
|
153
|
+
pluginId: params.pluginId
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function trackPluginAsyncCleanup(params) {
|
|
158
|
+
const pendingCleanups = getPendingCleanups();
|
|
159
|
+
const previousPromise = pendingCleanups.get(params.pluginId);
|
|
160
|
+
const cleanupPromise = runCleanupSafely(params);
|
|
161
|
+
const entry = {};
|
|
162
|
+
entry.promise = (async () => {
|
|
163
|
+
await Promise.all([previousPromise, cleanupPromise]);
|
|
164
|
+
if (pendingCleanups.get(params.pluginId) === entry.promise) {
|
|
165
|
+
pendingCleanups.delete(params.pluginId);
|
|
166
|
+
}
|
|
167
|
+
})();
|
|
168
|
+
pendingCleanups.set(params.pluginId, entry.promise);
|
|
169
|
+
}
|
|
170
|
+
function getPendingCleanups() {
|
|
171
|
+
return (0, import_obsidian_lib_state.getObsidianLibState)(PLUGIN_ASYNC_CLEANUPS_STATE_KEY, /* @__PURE__ */ new Map()).value;
|
|
172
|
+
}
|
|
173
|
+
async function runCleanupSafely(params) {
|
|
174
|
+
try {
|
|
175
|
+
await params.cleanup();
|
|
176
|
+
} catch (error) {
|
|
177
|
+
(0, import_error.printError)(new Error(`Async cleanup of plugin ${params.pluginId} failed`, { cause: error }));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
181
|
+
0 && (module.exports = {
|
|
182
|
+
DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS,
|
|
183
|
+
PLUGIN_ASYNC_CLEANUPS_STATE_KEY,
|
|
184
|
+
didPluginAsyncCleanupsSettle,
|
|
185
|
+
hasPendingPluginAsyncCleanups,
|
|
186
|
+
registerPluginAsyncCleanup,
|
|
187
|
+
trackPluginAsyncCleanup
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWFzeW5jLWNsZWFudXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGNsZWFudXAgdGhhdCBvdXRsaXZlcyBhIHBsdWdpbiBpbnN0YW5jZSwgc28gdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgcGx1Z2luIGNhbiBhd2FpdCBpdC5cbiAqXG4gKiBPYnNpZGlhbidzIGBvbnVubG9hZGAgaXMgc3luY2hyb25vdXMgYW5kIG5vdGhpbmcgYXdhaXRzIHdoYXQgaXQgc3RhcnRzLiBSZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMWA6XG4gKiBgUGx1Z2lucy51bmxvYWRQbHVnaW5gIGNhbGxzIHRoZSBvbGQgaW5zdGFuY2UncyBgdW5sb2FkKClgIGFuZCByZXR1cm5zLCBhbmQgYGVuYWJsZVBsdWdpbmAgdGhlbiBjb25zdHJ1Y3RzIHRoZSBuZXdcbiAqIGluc3RhbmNlIGFuZCBhd2FpdHMgaXRzIGBsb2FkKClgLiBTbyBvbiBhIGRpc2FibGUgLyBlbmFibGUsIGEgcmVsb2FkIG9yIGFuIHVwZGF0ZSB3aGlsZSBlbmFibGVkLCB3b3JrIGxpa2UgY2xvc2luZ1xuICogYW4gSW5kZXhlZERCIGNvbm5lY3Rpb24gaXMgc3RpbGwgaW4gZmxpZ2h0IHdoZW4gdGhlIG5ldyBpbnN0YW5jZSBzdGFydHMsIGFuZCB0aGUgbmV3IGluc3RhbmNlIGNhbiBvcGVuIGEgZGF0YWJhc2VcbiAqIHRoZSBvbGQgb25lIHN0aWxsIGhvbGRzLlxuICpcbiAqIFRoZSByZWdpc3RyeSBoZXJlIGNsb3NlcyB0aGF0IGdhcCB3aXRob3V0IG93bmluZyB0aGUgcmVsb2FkIGxpZmVjeWNsZTogYSBjbGVhbnVwIHN0YXJ0cyB3aGVuIHRoZSBjb21wb25lbnQgaXQgaXNcbiAqIHJlZ2lzdGVyZWQgb24gdW5sb2FkcywgaXRzIHByb21pc2UgaXMga2VwdCByZWFsbS13aWRlIHVuZGVyIHRoZSBwbHVnaW4gaWQsIGFuZCB0aGUgbmV4dCBpbnN0YW5jZSBhd2FpdHMgaXQsIGJvdW5kZWRcbiAqIGJ5IGEgdGltZW91dCwgYmVmb3JlIGl0IHN0YXJ0cy4gYFBsdWdpbkJhc2VgIGRvZXMgYm90aCBoYWx2ZXMgaXRzZWxmLlxuICpcbiAqIFRoZSByZWdpc3RyeSBsaXZlcyBpbiB0aGUgcmVhbG0tZ2xvYmFsIHNoYXJlZC1zdGF0ZSBiYWcgdW5kZXIgdGhlIHZlcnNpb25lZCBrZXkgYHBsdWdpbkFzeW5jQ2xlYW51cHNWMWAsIGJlY2F1c2UgdGhlXG4gKiBvbGQgaW5zdGFuY2UgYW5kIHRoZSBuZXcgb25lIG1heSBidW5kbGUgZGlmZmVyZW50IGNvcGllcyBvZiB0aGlzIGxpYnJhcnkuIEl0IGlzIGEgd2lyZSBmb3JtYXQgYmV0d2VlbiB0aG9zZSBjb3BpZXM6XG4gKiBhIHBsYWluIGBNYXBgIGZyb20gcGx1Z2luIGlkIHRvIGEgYFByb21pc2U8dm9pZD5gIHRoYXQgbmV2ZXIgcmVqZWN0cy4gQSBjaGFuZ2Ugb2YgbWVhbmluZyBtb3ZlcyB0byBhIG5ldyBrZXkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogVGhlIHNoYXJlZC1zdGF0ZSBrZXkgb2YgdGhlIHBlbmRpbmcgY2xlYW51cHMuIFZlcnNpb25lZCwgYmVjYXVzZSBpdCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW4gY29waWVzIG9mIHRoaXMgbGlicmFyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9BU1lOQ19DTEVBTlVQU19TVEFURV9LRVkgPSAncGx1Z2luQXN5bmNDbGVhbnVwc1YxJztcblxuLyoqXG4gKiBIb3cgbG9uZyBhIG5ldyBwbHVnaW4gaW5zdGFuY2Ugd2FpdHMgZm9yIHRoZSBwcmV2aW91cyBpbnN0YW5jZSdzIGNsZWFudXBzIGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BMVUdJTl9BU1lOQ19DTEVBTlVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkaWRQbHVnaW5Bc3luY0NsZWFudXBzU2V0dGxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWRQbHVnaW5Bc3luY0NsZWFudXBzU2V0dGxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHdob3NlIHBlbmRpbmcgY2xlYW51cHMgdG8gYXdhaXQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1BMVUdJTl9BU1lOQ19DTEVBTlVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTfS5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBbiBhc3luYyBjbGVhbnVwLlxuICovXG5leHBvcnQgdHlwZSBQbHVnaW5Bc3luY0NsZWFudXAgPSAoKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlclBsdWdpbkFzeW5jQ2xlYW51cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQbHVnaW5Bc3luY0NsZWFudXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNsZWFudXAgdG8gcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW51cDogUGx1Z2luQXN5bmNDbGVhbnVwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHdob3NlIHVubG9hZCBzdGFydHMgdGhlIGNsZWFudXAuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ6IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBwbHVnaW4gdGhlIGNsZWFudXAgYmVsb25ncyB0bywgd2hpY2ggdGhlIG5leHQgaW5zdGFuY2Ugd2FpdHMgdW5kZXIuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB0cmFja1BsdWdpbkFzeW5jQ2xlYW51cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2tQbHVnaW5Bc3luY0NsZWFudXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNsZWFudXAgdG8gcnVuIG5vdy5cbiAgICovXG4gIHJlYWRvbmx5IGNsZWFudXA6IFBsdWdpbkFzeW5jQ2xlYW51cDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBwbHVnaW4gdGhlIGNsZWFudXAgYmVsb25ncyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUcmFja2VkQ2xlYW51cEVudHJ5IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gQXNzaWduZWQgb25jZSB0aGUgc2VsZi1yZW1vdmluZyBwcm9taXNlIGV4aXN0cy5cbiAgcHJvbWlzZT86IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQXdhaXRzIGV2ZXJ5IGNsZWFudXAgc3RpbGwgaW4gZmxpZ2h0IGZvciB0aGUgcGx1Z2luLCBib3VuZGVkIGJ5IGEgdGltZW91dC5cbiAqXG4gKiBSZXNvbHZlcyBhdCBvbmNlIHdoZW4gbm90aGluZyBpcyBwZW5kaW5nLiBOZXZlciByZWplY3RzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBldmVyeSBwZW5kaW5nIGNsZWFudXAgc2V0dGxlZCBpbiB0aW1lLCBgZmFsc2VgIGlmIHRoZSB0aW1lb3V0IHdhcyByZWFjaGVkIGZpcnN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlkUGx1Z2luQXN5bmNDbGVhbnVwc1NldHRsZShwYXJhbXM6IERpZFBsdWdpbkFzeW5jQ2xlYW51cHNTZXR0bGVQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcHJvbWlzZSA9IGdldFBlbmRpbmdDbGVhbnVwcygpLmdldChwYXJhbXMucGx1Z2luSWQpO1xuICBpZiAoIXByb21pc2UpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCB0aW1lb3V0SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxmYWxzZT4oKHJlc29sdmUpID0+IHtcbiAgICB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9LCBwYXJhbXMudGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfUExVR0lOX0FTWU5DX0NMRUFOVVBfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpO1xuICB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW3Byb21pc2UudGhlbigoKSA9PiB0cnVlKSwgdGltZW91dFByb21pc2VdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHBsdWdpbiBoYXMgY2xlYW51cHMgc3RpbGwgaW4gZmxpZ2h0LlxuICpcbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBwbHVnaW4gaWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGFueSBjbGVhbnVwIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGlkIGhhcyBub3Qgc2V0dGxlZCB5ZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQZW5kaW5nUGx1Z2luQXN5bmNDbGVhbnVwcyhwbHVnaW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRQZW5kaW5nQ2xlYW51cHMoKS5oYXMocGx1Z2luSWQpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBhc3luYyBjbGVhbnVwIHRoYXQgc3RhcnRzIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzIGFuZCB0aGF0IHRoZSBuZXh0IGluc3RhbmNlIG9mIHRoZSBwbHVnaW4gYXdhaXRzLlxuICpcbiAqIFRoZSBjbGVhbnVwIHJ1bnMgZXhhY3RseSBvbmNlLCBvbiB0aGUgY29tcG9uZW50J3MgdW5sb2FkLiBSZWdpc3RlciBpdCBvbiB0aGUgY29tcG9uZW50IHdob3NlIGxpZmV0aW1lIG1hdGNoZXMgdGhlXG4gKiByZXNvdXJjZTogYSBgUGx1Z2luQmFzZWAgc3ViY2xhc3MgY2FsbHMgYHJlZ2lzdGVyQXN5bmNDbGVhbnVwYCBpbnN0ZWFkLCB3aGljaCBzY29wZXMgaXQgdG8gdGhlIGZlYXR1cmUgc3VyZmFjZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclBsdWdpbkFzeW5jQ2xlYW51cChwYXJhbXM6IFJlZ2lzdGVyUGx1Z2luQXN5bmNDbGVhbnVwUGFyYW1zKTogdm9pZCB7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIoKCkgPT4ge1xuICAgIHRyYWNrUGx1Z2luQXN5bmNDbGVhbnVwKHtcbiAgICAgIGNsZWFudXA6IHBhcmFtcy5jbGVhbnVwLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSdW5zIGFuIGFzeW5jIGNsZWFudXAgbm93IGFuZCB0cmFja3MgaXQgdW5kZXIgdGhlIHBsdWdpbiBpZCB1bnRpbCBpdCBzZXR0bGVzLlxuICpcbiAqIEEgY2xlYW51cCB0aGF0IHRocm93cyBvciByZWplY3RzIGlzIHByaW50ZWQgYW5kIGNvdW50cyBhcyBzZXR0bGVkLCBzbyBhIGZhaWxpbmcgY2xlYW51cCBuZXZlciBzdG9wcyB0aGUgbmV4dFxuICogaW5zdGFuY2UgZnJvbSBsb2FkaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrUGx1Z2luQXN5bmNDbGVhbnVwKHBhcmFtczogVHJhY2tQbHVnaW5Bc3luY0NsZWFudXBQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgcGVuZGluZ0NsZWFudXBzID0gZ2V0UGVuZGluZ0NsZWFudXBzKCk7XG4gIGNvbnN0IHByZXZpb3VzUHJvbWlzZSA9IHBlbmRpbmdDbGVhbnVwcy5nZXQocGFyYW1zLnBsdWdpbklkKTtcbiAgY29uc3QgY2xlYW51cFByb21pc2UgPSBydW5DbGVhbnVwU2FmZWx5KHBhcmFtcyk7XG4gIC8vIE5ldmVyIHJlamVjdHM6IGBydW5DbGVhbnVwU2FmZWx5YCBjYXRjaGVzLCBhbmQgc28gZGlkIHdoaWNoZXZlciBjYWxsIHRyYWNrZWQgYHByZXZpb3VzUHJvbWlzZWAuXG4gIGNvbnN0IGVudHJ5OiBUcmFja2VkQ2xlYW51cEVudHJ5ID0ge307XG4gIGVudHJ5LnByb21pc2UgPSAoYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtwcmV2aW91c1Byb21pc2UsIGNsZWFudXBQcm9taXNlXSk7XG4gICAgLy8gQSBsYXRlciBjYWxsIG1heSBoYXZlIGNoYWluZWQgb250byB0aGlzIGVudHJ5IGFscmVhZHk7IG9ubHkgdGhlIGxhdGVzdCBlbnRyeSByZW1vdmVzIGl0c2VsZi5cbiAgICBpZiAocGVuZGluZ0NsZWFudXBzLmdldChwYXJhbXMucGx1Z2luSWQpID09PSBlbnRyeS5wcm9taXNlKSB7XG4gICAgICBwZW5kaW5nQ2xlYW51cHMuZGVsZXRlKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgfVxuICB9KSgpO1xuICBwZW5kaW5nQ2xlYW51cHMuc2V0KHBhcmFtcy5wbHVnaW5JZCwgZW50cnkucHJvbWlzZSk7XG59XG5cbmZ1bmN0aW9uIGdldFBlbmRpbmdDbGVhbnVwcygpOiBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkxpYlN0YXRlKFBMVUdJTl9BU1lOQ19DTEVBTlVQU19TVEFURV9LRVksIG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpKS52YWx1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQ2xlYW51cFNhZmVseShwYXJhbXM6IFRyYWNrUGx1Z2luQXN5bmNDbGVhbnVwUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcGFyYW1zLmNsZWFudXAoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKG5ldyBFcnJvcihgQXN5bmMgY2xlYW51cCBvZiBwbHVnaW4gJHtwYXJhbXMucGx1Z2luSWR9IGZhaWxlZGAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVCQSxtQkFBMkI7QUFFM0IsZ0NBQW9DO0FBSzdCLE1BQU0sa0NBQWtDO0FBS3hDLE1BQU0sdURBQXVEO0FBc0VwRSxlQUFzQiw2QkFBNkIsUUFBOEQ7QUFDL0csUUFBTSxVQUFVLG1CQUFtQixFQUFFLElBQUksT0FBTyxRQUFRO0FBQ3hELE1BQUksQ0FBQyxTQUFTO0FBQ1osV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBQ0osUUFBTSxpQkFBaUIsSUFBSSxRQUFlLENBQUMsWUFBWTtBQUNyRCxnQkFBWSxPQUFPLFdBQVcsTUFBTTtBQUNsQyxjQUFRLEtBQUs7QUFBQSxJQUNmLEdBQUcsT0FBTyx5QkFBeUIsb0RBQW9EO0FBQUEsRUFDekYsQ0FBQztBQUVELE1BQUk7QUFDRixXQUFPLE1BQU0sUUFBUSxLQUFLLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQztBQUFBLEVBQ3RFLFVBQUU7QUFDQSxXQUFPLGFBQWEsU0FBUztBQUFBLEVBQy9CO0FBQ0Y7QUFRTyxTQUFTLDhCQUE4QixVQUEyQjtBQUN2RSxTQUFPLG1CQUFtQixFQUFFLElBQUksUUFBUTtBQUMxQztBQVVPLFNBQVMsMkJBQTJCLFFBQWdEO0FBQ3pGLFNBQU8sVUFBVSxTQUFTLE1BQU07QUFDOUIsNEJBQXdCO0FBQUEsTUFDdEIsU0FBUyxPQUFPO0FBQUEsTUFDaEIsVUFBVSxPQUFPO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBVU8sU0FBUyx3QkFBd0IsUUFBNkM7QUFDbkYsUUFBTSxrQkFBa0IsbUJBQW1CO0FBQzNDLFFBQU0sa0JBQWtCLGdCQUFnQixJQUFJLE9BQU8sUUFBUTtBQUMzRCxRQUFNLGlCQUFpQixpQkFBaUIsTUFBTTtBQUU5QyxRQUFNLFFBQTZCLENBQUM7QUFDcEMsUUFBTSxXQUFXLFlBQTJCO0FBQzFDLFVBQU0sUUFBUSxJQUFJLENBQUMsaUJBQWlCLGNBQWMsQ0FBQztBQUVuRCxRQUFJLGdCQUFnQixJQUFJLE9BQU8sUUFBUSxNQUFNLE1BQU0sU0FBUztBQUMxRCxzQkFBZ0IsT0FBTyxPQUFPLFFBQVE7QUFBQSxJQUN4QztBQUFBLEVBQ0YsR0FBRztBQUNILGtCQUFnQixJQUFJLE9BQU8sVUFBVSxNQUFNLE9BQU87QUFDcEQ7QUFFQSxTQUFTLHFCQUFpRDtBQUN4RCxhQUFPLCtDQUFvQixpQ0FBaUMsb0JBQUksSUFBMkIsQ0FBQyxFQUFFO0FBQ2hHO0FBRUEsZUFBZSxpQkFBaUIsUUFBc0Q7QUFDcEYsTUFBSTtBQUNGLFVBQU0sT0FBTyxRQUFRO0FBQUEsRUFDdkIsU0FBUyxPQUFPO0FBQ2QsaUNBQVcsSUFBSSxNQUFNLDJCQUEyQixPQUFPLFFBQVEsV0FBVyxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFBQSxFQUM3RjtBQUNGOyIsIm5hbWVzIjpbXX0=
|