@mnaoumov/obsidian-lib 10.8.0 → 10.10.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/README.md +4 -0
- package/codemirror/editor-mode-extension/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +42 -1
- package/dist/lib/cjs/__merged.d.cts +7 -2
- package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
- 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/command-handlers/unlock-active-note-command-handler.cjs +2 -2
- package/dist/lib/cjs/community-plugins.cjs +2 -2
- package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
- package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
- package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
- package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
- 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/components/style-sheet-component.cjs +1 -4
- package/dist/lib/cjs/css-class.cjs +7 -1
- package/dist/lib/cjs/css-class.d.cts +24 -0
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +15 -4
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
- package/dist/lib/cjs/folder-note.cjs +5 -5
- package/dist/lib/cjs/formula-function.cjs +152 -0
- package/dist/lib/cjs/formula-function.d.cts +98 -0
- package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
- 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 +13 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
- package/dist/lib/cjs/index.cjs +7 -1
- package/dist/lib/cjs/index.d.cts +2 -0
- package/dist/lib/cjs/link.cjs +12 -12
- package/dist/lib/cjs/markdown.cjs +7 -7
- 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/vault.cjs +2 -2
- package/dist/lib/cjs/virtual-file.cjs +340 -0
- package/dist/lib/cjs/virtual-file.d.cts +48 -0
- package/dist/lib/esm/__merged.d.mts +7 -2
- package/dist/lib/esm/__merged.mjs +48 -2
- package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
- 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/command-handlers/unlock-active-note-command-handler.mjs +2 -2
- package/dist/lib/esm/community-plugins.mjs +2 -2
- package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
- package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
- package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
- package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
- 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/components/style-sheet-component.mjs +1 -4
- package/dist/lib/esm/css-class.d.mts +24 -0
- package/dist/lib/esm/css-class.mjs +7 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +15 -4
- package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
- package/dist/lib/esm/folder-note.mjs +5 -5
- package/dist/lib/esm/formula-function.d.mts +98 -0
- package/dist/lib/esm/formula-function.mjs +62 -0
- package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
- 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 +12 -0
- package/dist/lib/esm/i18n/locales/en.mjs +13 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
- package/dist/lib/esm/index.d.mts +2 -0
- package/dist/lib/esm/index.mjs +5 -1
- package/dist/lib/esm/link.mjs +12 -12
- package/dist/lib/esm/markdown.mjs +7 -7
- 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/vault.mjs +2 -2
- package/dist/lib/esm/virtual-file.d.mts +48 -0
- package/dist/lib/esm/virtual-file.mjs +264 -0
- package/dist/styles.css +31 -1
- package/modals/code-block-builder/package.json +6 -0
- package/package.json +5 -5
- package/plugin/plugin-async-cleanup/package.json +6 -0
|
@@ -277,12 +277,12 @@ async function markdownToHtml(params) {
|
|
|
277
277
|
const {
|
|
278
278
|
app,
|
|
279
279
|
markdown,
|
|
280
|
-
sourcePath
|
|
280
|
+
sourcePath = ""
|
|
281
281
|
} = params;
|
|
282
282
|
const component = new Component();
|
|
283
283
|
component.load();
|
|
284
284
|
const renderDiv = createDiv();
|
|
285
|
-
await MarkdownRenderer.render(app, markdown, renderDiv, sourcePath
|
|
285
|
+
await MarkdownRenderer.render(app, markdown, renderDiv, sourcePath, component);
|
|
286
286
|
const html = renderDiv.innerHTML;
|
|
287
287
|
component.unload();
|
|
288
288
|
return html;
|
|
@@ -291,7 +291,7 @@ function registerLinkHandlers(params) {
|
|
|
291
291
|
const {
|
|
292
292
|
app,
|
|
293
293
|
el,
|
|
294
|
-
sourcePath
|
|
294
|
+
sourcePath = ""
|
|
295
295
|
} = params;
|
|
296
296
|
MarkdownPreviewRenderer.registerDomEvents(
|
|
297
297
|
el,
|
|
@@ -299,7 +299,7 @@ function registerLinkHandlers(params) {
|
|
|
299
299
|
new FixedZIndexDomEventsHandlersInfo({
|
|
300
300
|
app,
|
|
301
301
|
el,
|
|
302
|
-
path: sourcePath
|
|
302
|
+
path: sourcePath
|
|
303
303
|
})
|
|
304
304
|
)
|
|
305
305
|
);
|
|
@@ -330,7 +330,7 @@ async function renderInternalLink(params) {
|
|
|
330
330
|
app,
|
|
331
331
|
folderNote,
|
|
332
332
|
pathOrAbstractFile,
|
|
333
|
-
shouldRevealFile
|
|
333
|
+
shouldRevealFile = false
|
|
334
334
|
} = params;
|
|
335
335
|
function reveal(abstractFileToReveal) {
|
|
336
336
|
invokeAsyncSafely(async () => {
|
|
@@ -365,7 +365,7 @@ async function renderInternalLink(params) {
|
|
|
365
365
|
app,
|
|
366
366
|
el: aEl
|
|
367
367
|
});
|
|
368
|
-
if (shouldRevealFile
|
|
368
|
+
if (shouldRevealFile) {
|
|
369
369
|
aEl.addEventListener("click", () => {
|
|
370
370
|
const file = getAbstractFileOrNull({ app, pathOrFile: pathOrAbstractFile });
|
|
371
371
|
if (isFile(file)) {
|
|
@@ -393,4 +393,4 @@ export {
|
|
|
393
393
|
renderExternalLink,
|
|
394
394
|
renderInternalLink
|
|
395
395
|
};
|
|
396
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXJrZG93bi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgTWFya2Rvd24gY29udGVudCBpbiBPYnNpZGlhbi5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIERvbUV2ZW50c0hhbmRsZXJzLFxuICBEb21FdmVudHNIYW5kbGVyc0luZm8sXG4gIEVtYmVkUmVnaXN0cnlFbWJlZEJ5RXh0ZW5zaW9uUmVjb3JkXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHNsZWVwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQge1xuICBnZXRaSW5kZXgsXG4gIHdhaXRVbnRpbENvbm5lY3RlZFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvaHRtbC1lbGVtZW50JztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdXJsJztcbmltcG9ydCB7IEludGVybmFsUGx1Z2luTmFtZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IHQgfSBmcm9tICdpMThuZXh0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSG92ZXJQb3BvdmVyLFxuICBLZXltYXAsXG4gIE1hcmtkb3duUHJldmlld1JlbmRlcmVyLFxuICBNYXJrZG93blJlbmRlcmVyLFxuICBNZW51LFxuICBOb3RpY2Vcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckFic3RyYWN0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBGb2xkZXJOb3RlTG9jYXRpb24gfSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcblxuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHJldmVhbEluRmlsZUV4cGxvcmVyIH0gZnJvbSAnLi9maWxlLWV4cGxvcmVyLnRzJztcbmltcG9ydCB7XG4gIGdldEFic3RyYWN0RmlsZU9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgaXNGaWxlLFxuICBpc0ZvbGRlclxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIHJlc29sdmVGb2xkZXJOb3RlLFxuICByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1xufSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcbmltcG9ydCB7XG4gIHJlZ2lzdGVyRm9sZEhhbmRsZXJzLFxuICByZWdpc3RlckZvb3Rub3RlTGlua0hhbmRsZXJcbn0gZnJvbSAnLi9yZW5kZXJlZC1tYXJrZG93bi50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgdG8gbGV0IE9ic2lkaWFuIHNldHRsZSBiZWZvcmUgb3BlbmluZyBhIGZvbGRlciBub3RlLiBUaGUgY2xpY2sgY2FuIGxhbmQgcmlnaHQgYWZ0ZXIgYW5cbiAqIG9wZXJhdGlvbiB0aGF0IGNyZWF0ZWQsIHJld3JvdGUgYW5kIHRyYXNoZWQgbm90ZXMsIGFuZCBvcGVuaW5nIGludG8gdGhlIG1pZGRsZSBvZiBPYnNpZGlhbidzIG93blxuICogcmVhY3Rpb24gdG8gdGhhdCBzaG93cyB0aGUgbm90ZSBiZWZvcmUgaXRzIG1ldGFkYXRhIGhhcyBjYXVnaHQgdXAuXG4gKi9cbmNvbnN0IERFTEFZX0JFRk9SRV9PUEVOX0lOX01JTExJU0VDT05EUyA9IDIwMDtcblxuLyoqXG4gKiBUaGUgc2VjdGlvbnMgYW4gZXh0ZXJuYWwgbGluaydzIGNvbnRleHQgbWVudSBkZWNsYXJlcywgaW4gT2JzaWRpYW4ncyBvd24gb3JkZXIuIFRoZSBvcmRlciBpcyB3aGF0XG4gKiB7QGxpbmsgTWVudS5zb3J0fSBncm91cHMgdGhlIGl0ZW1zIGJ5LCBzbyBpdCBoYXMgdG8gbWF0Y2ggd2hhdFxuICoge0BsaW5rIFdvcmtzcGFjZS5oYW5kbGVFeHRlcm5hbExpbmtDb250ZXh0TWVudX0gYW5kIGV2ZXJ5IGB1cmwtbWVudWAgbGlzdGVuZXIgZXhwZWN0IHRvIGZpbGwuXG4gKi9cbmNvbnN0IEVYVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyA9IFtcbiAgJ3RpdGxlJyxcbiAgJ29wZW4nLFxuICAnc2VsZWN0aW9uJyxcbiAgJ2NsaXBib2FyZCcsXG4gICdpbmZvJyxcbiAgJ2FjdGlvbicsXG4gICd2aWV3JyxcbiAgJycsXG4gICdkYW5nZXInXG5dO1xuXG4vKipcbiAqIFRoZSBzZWN0aW9ucyBhbiBpbnRlcm5hbCBsaW5rJ3MgY29udGV4dCBtZW51IGRlY2xhcmVzLCBpbiBPYnNpZGlhbidzIG93biBvcmRlci4gU2VlXG4gKiB7QGxpbmsgRVhURVJOQUxfTElOS19NRU5VX1NFQ1RJT05TfSDigJQgdGhlIGNvdW50ZXJwYXJ0IGZvciBgZmlsZS1tZW51YCBsaXN0ZW5lcnMuXG4gKi9cbmNvbnN0IElOVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyA9IFtcbiAgJ3RpdGxlJyxcbiAgJ29wZW4nLFxuICAnYWN0aW9uJyxcbiAgJ2NsaXBib2FyZCcsXG4gICd2aWV3JyxcbiAgJ2luZm8nLFxuICAnJyxcbiAgJ2Rhbmdlcidcbl07XG5cbi8qKlxuICogVGhlIHBhcmFtcyBmb3IgdGhlIGZ1bGwgcmVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bGxSZW5kZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29tcG9uZW50IGluc3RhbmNlIHRvIHVzZSBmb3IgdGhlIHJlbmRlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudD86IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIEhUTUxFbGVtZW50IHRvIHJlbmRlciB0by5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duIHN0cmluZyB0byByZW5kZXIuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG1ha2UgdGhlIHJlbmRlcmVkIGhlYWRpbmdzIGFuZCBuZXN0ZWQgbGlzdHMgZm9sZGFibGUsIGFzIGluIGEgUmVhZGluZyB2aWV3LiBTZWVcbiAgICoge0BsaW5rIHJlZ2lzdGVyRm9sZEhhbmRsZXJzfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJGb2xkSGFuZGxlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlZ2lzdGVyIGxpbmsgaGFuZGxlcnMgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckxpbmtIYW5kbGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCB0byByZXNvbHZlIHJlbGF0aXZlIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJy8nYFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbWFya2Rvd25Ub0h0bWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtkb3duVG9IdG1sUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIHRvIHJlc29sdmUgcmVsYXRpdmUgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyTGlua0hhbmRsZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckxpbmtIYW5kbGVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBIVE1MRWxlbWVudCB0byByZWdpc3RlciBsaW5rIGhhbmRsZXJzIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIHRvIHJlc29sdmUgcmVsYXRpdmUgbGlua3MgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVuZGVyRXh0ZXJuYWxMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJFeHRlcm5hbExpbmtQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgZXh0ZXJuYWwgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHRvIHJlbmRlciB0aGUgZXh0ZXJuYWwgbGluayBmb3IuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZm9sZGVyLW5vdGUgc2V0dXAge0BsaW5rIHJlbmRlckludGVybmFsTGlua30gcmVzb2x2ZXMgYSBmb2xkZXIgbGluaydzIG5vdGUgd2l0aCDigJQgZXZlcnl0aGluZ1xuICoge0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnfSB0YWtlcyBleGNlcHQgdGhlIGFwcCwgd2hpY2ggdGhlIGxpbmsgYWxyZWFkeSBjYXJyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckludGVybmFsTGlua0ZvbGRlck5vdGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBleHRlbnNpb25zIGEgZm9sZGVyIG5vdGUgbWF5IGNhcnJ5LiBTZWUge0BsaW5rIFJlc29sdmVGb2xkZXJOb3RlQ29uZmlnUGFyYW1zLmV4dGVuc2lvbnN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydtZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb2xkZXIgbm90ZSBpcyBoaWRkZW4gaW4gdGhlIGZpbGUgZXhwbG9yZXIuIFNlZVxuICAgKiB7QGxpbmsgUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMuaXNIaWRkZW59LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0hpZGRlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBub3RlIHNpdHMgcmVsYXRpdmUgdG8gaXRzIGZvbGRlci4gU2VlIHtAbGluayBSZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1BhcmFtcy5sb2NhdGlvbn0uXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b31cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogRm9sZGVyTm90ZUxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIuIFNlZSB7QGxpbmsgUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMucmVzb2x2ZU5hbWV9LlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciB3aG9zZSBub3RlIGlzIGJlaW5nIG5hbWVkLlxuICAgKiBAcmV0dXJucyBUaGUgbm90ZSdzIG5hbWUuXG4gICAqIEBkZWZhdWx0IGAoZm9sZGVyKSA9PiBmb2xkZXIubmFtZWBcbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVOYW1lPzogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZW5kZXJJbnRlcm5hbExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckludGVybmFsTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYSBjbGljayBoYXMgcmV2ZWFsZWQgdGhlIGxpbmsncyBkZXN0aW5hdGlvbiBpbiB0aGUgZmlsZSBleHBsb3Jlciwgb25jZSB0aGUgZXhwbG9yZXIgaGFzXG4gICAqIGZpbmlzaGVkIHRha2luZyB0aGUgZm9jdXMgZm9yIGl0IOKAlCBzbyB0aGlzIGlzIHdoZXJlIGEgY2FsbGVyIG1vdmVzIHRoZSBmb2N1cyBzb21ld2hlcmUgZWxzZS5cbiAgICpcbiAgICogQXdhaXRlZCwgYW5kIGNhbGxlZCBvbmx5IGZvciBhIGNsaWNrIHRoYXQgcmV2ZWFsczogYWx3YXlzIGZvciBhIGZvbGRlciBsaW5rLCBhbmQgZm9yIGEgZmlsZSBsaW5rIG9ubHlcbiAgICogd2l0aCB7QGxpbmsgUmVuZGVySW50ZXJuYWxMaW5rUGFyYW1zLnNob3VsZFJldmVhbEZpbGV9IGFuZCBhIGRlc3RpbmF0aW9uIHRoYXQgZXhpc3RzLiBXaXRoIHRoZSBmaWxlXG4gICAqIGV4cGxvcmVyIGRpc2FibGVkIGl0IGlzIHN0aWxsIGNhbGxlZCwgcmlnaHQgYXdheSwgc2luY2UgdGhlcmUgaXMgdGhlbiBub3RoaW5nIHRvIHdhaXQgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgYWZ0ZXJSZXZlYWw/OiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgaW50ZXJuYWwgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdG8gYW5zd2VyIHdoaWNoIG5vdGUgaXMgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSwgd2hlbiB0aGUgbGluayBuYW1lcyBhIEZPTERFUi5cbiAgICpcbiAgICogT21pdHRlZCBtZWFucyB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99OiB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgIHBsdWdpbidzIGxpdmVcbiAgICogY29uZmlndXJhdGlvbiwgb3IgYSBub3RlIG5hbWVkIGFmdGVyIGl0cyBmb2xkZXIsIGluc2lkZSBpdCwgd2hlbiB0aGF0IHBsdWdpbiBpcyBhYnNlbnQuIFBhc3NcbiAgICogYHsgbG9jYXRpb246IEZvbGRlck5vdGVMb2NhdGlvbi5Ob25lIH1gIGZvciBhIGZvbGRlciBsaW5rIHRoYXQgbXVzdCBvbmx5IGV2ZXIgcmV2ZWFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBge31gXG4gICAqL1xuICByZWFkb25seSBmb2xkZXJOb3RlPzogUmVuZGVySW50ZXJuYWxMaW5rRm9sZGVyTm90ZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmVuZGVyIHRoZSBpbnRlcm5hbCBsaW5rIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckFic3RyYWN0RmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIGEgRklMRSBsaW5rIGFsc28gaGlnaGxpZ2h0cyB0aGF0IGZpbGUgaW4gdGhlIGZpbGUgZXhwbG9yZXIsIG9uIHRvcCBvZiB0aGUgb3BlblxuICAgKiBPYnNpZGlhbidzIG93biBsaW5rIGhhbmRsZXIgcGVyZm9ybXMuXG4gICAqXG4gICAqIE9wdC1pbiwgdW5saWtlIHRoZSBmb2xkZXIgYnJhbmNoOiBhIGZvbGRlciBsaW5rIGhhcyBhbHdheXMgcmV2ZWFsZWQgKHJldmVhbGluZyB3YXMgYWxsIGl0cyBjbGlja1xuICAgKiBjb3VsZCBtZWFuKSwgd2hlcmVhcyBhIGZpbGUgbGluayBoYXMgYWx3YXlzIG9ubHkgb3BlbmVkIOKAlCBzbyB0dXJuaW5nIHRoaXMgb24gYnkgZGVmYXVsdCB3b3VsZCBjaGFuZ2VcbiAgICogd2hhdCBldmVyeSBleGlzdGluZyBjYWxsZXIncyBsaW5rIGRvZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldmVhbEZpbGU/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRml4ZWRaSW5kZXhEb21FdmVudHNIYW5kbGVyc0luZm9Db25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBlbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuY2xhc3MgRW1iZWRCeUV4dGVuc2lvbk1kUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbWJlZEJ5RXh0ZW5zaW9uOiBFbWJlZFJlZ2lzdHJ5RW1iZWRCeUV4dGVuc2lvblJlY29yZCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiB0aGlzLmVtYmVkQnlFeHRlbnNpb24sXG4gICAgICBtZXRob2ROYW1lOiAnbWQnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtjb250ZXh0XVxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb250ZXh0LmRpc3BsYXlNb2RlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvIGltcGxlbWVudHMgRG9tRXZlbnRzSGFuZGxlcnNJbmZvIHtcbiAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IGhvdmVyUG9wb3ZlcigpOiBIb3ZlclBvcG92ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faG92ZXJQb3BvdmVyO1xuICB9XG5cbiAgcHVibGljIHNldCBob3ZlclBvcG92ZXIoaG92ZXJQb3BvdmVyOiBIb3ZlclBvcG92ZXIgfCBudWxsKSB7XG4gICAgdGhpcy5faG92ZXJQb3BvdmVyID0gaG92ZXJQb3BvdmVyO1xuICAgIGlmIChob3ZlclBvcG92ZXIgJiYgdGhpcy56SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaG92ZXJQb3BvdmVyLmhvdmVyRWwuc2V0Q3NzU3R5bGVzKHtcbiAgICAgICAgekluZGV4OiBTdHJpbmcodGhpcy56SW5kZXgpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ob3ZlclBvcG92ZXI6IEhvdmVyUG9wb3ZlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWw6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgekluZGV4PzogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5lbCA9IHBhcmFtcy5lbDtcblxuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHdhaXRVbnRpbENvbm5lY3RlZCh0aGlzLmVsKTtcbiAgICAgIHRoaXMudXBkYXRlWkluZGV4KHRoaXMuZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVaSW5kZXgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnpJbmRleCA9IGdldFpJbmRleChlbGVtZW50KSArIDE7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IGEgcmVuZGVyZWQgbGluayBET0VTIHdoZW4gaXQgaXMgY2xpY2tlZCwgaG92ZXJlZCwgZHJhZ2dlZCBvciByaWdodC1jbGlja2VkLlxuICpcbiAqIHtAbGluayBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50c30gb25seSBwZXJmb3JtcyB0aGUgREVMRUdBVElPTiBoYWxmIOKAlCB3aGljaCBlbGVtZW50IGFuXG4gKiBldmVudCBsYW5kZWQgb24sIHdoaWNoIGxpbmsgdGV4dCBpdCBjYXJyaWVzLCBhbmQgd2hpY2ggb2YgdGhlc2UgbWV0aG9kcyB0byBjYWxsLiBUaGUgaGFsZiBpdCBkb2VzIG5vdFxuICogcHJvdmlkZSBpcyB0aGlzIG9uZSwgYW5kIE9ic2lkaWFuIGtlZXBzIGl0cyBvd24gaW1wbGVtZW50YXRpb24gcHJpdmF0ZTogdGhlIG9ubHkgaGFuZGxlIG9uIGl0IGlzIHRoZVxuICogaW5zdGFuY2UgYSBsaXZlIHByZXZpZXcgdmlldyBwYXNzZXMgaW4uIHtAbGluayBnZXREb21FdmVudHNIYW5kbGVyc0NvbnN0cnVjdG9yfSB1c2VkIHRvIG9idGFpbiBpdCBieVxuICogb3BlbmluZyBhIHJlYWwgbGVhZiBvbiBhbiBhcmJpdHJhcnkgbm90ZSBhbmQgaW50ZXJjZXB0aW5nIHRoYXQgY2FsbCDigJQgd2hpY2ggbXV0YXRlZCB0aGUgdXNlcidzXG4gKiB3b3Jrc3BhY2Ugb24gRVZFUlkgY29uc3VtZXIncyBsb2FkIChhIHRhYiBvcGVuaW5nIGFuZCBjbG9zaW5nLCB0d28gYGZpbGUtb3BlbmAgYW5kIHR3b1xuICogYGFjdGl2ZS1sZWFmLWNoYW5nZWAgZXZlbnRzLCBhbiB1bnJlbGF0ZWQgbm90ZSByZW5kZXJlZCBpbiBwcmV2aWV3KS5cbiAqXG4gKiBUaGVzZSBib2RpZXMgYXJlIGEgcG9ydCBvZiB0aGF0IGNsYXNzLCBzbyBub3RoaW5nIGhhcyB0byBiZSBvcGVuZWQuIEtlZXBpbmdcbiAqIHtAbGluayBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50c30gZm9yIHRoZSBkZWxlZ2F0aW9uIGlzIHdoYXQga2VlcHMgZm9vdG5vdGUgbGlua3MsXG4gKiB0YWdzLCBleHRlcm5hbCBsaW5rcywgbW9kLWNsaWNrIGFuZCBkcmFnIGJlaGF2aW5nIGV4YWN0bHkgYXMgdGhleSBkbyBpbnNpZGUgYSByZWFsIHByZXZpZXcuXG4gKi9cbmNsYXNzIExpbmtEb21FdmVudHNIYW5kbGVycyBpbXBsZW1lbnRzIERvbUV2ZW50c0hhbmRsZXJzIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW5mbzogRG9tRXZlbnRzSGFuZGxlcnNJbmZvKSB7fVxuXG4gIHB1YmxpYyBvbkV4dGVybmFsTGlua0NsaWNrKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCFpc1VybChsaW5rVGV4dCkpIHtcbiAgICAgIG5ldyBOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmZhaWxlZFRvT3BlblVybCwgeyB1cmw6IGxpbmtUZXh0IH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtb2RpZmllclBhbmVUeXBlID0gS2V5bWFwLmlzTW9kRXZlbnQoJGV2ZW50KTtcbiAgICB0YXJnZXRFbC53aW4ub3BlbihsaW5rVGV4dCwgdHlwZW9mIG1vZGlmaWVyUGFuZVR5cGUgPT09ICdib29sZWFuJyA/ICcnIDogbW9kaWZpZXJQYW5lVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgb25FeHRlcm5hbExpbmtSaWdodENsaWNrKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWVudSA9IE1lbnUuZm9yRXZlbnQoJGV2ZW50KTtcbiAgICBtZW51LmFkZFNlY3Rpb25zKEVYVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyk7XG4gICAgYWRkQ29weU1lbnVJdGVtKG1lbnUsIHRhcmdldEVsKTtcbiAgICB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS5oYW5kbGVFeHRlcm5hbExpbmtDb250ZXh0TWVudShtZW51LCBsaW5rVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcm5hbExpbmtDbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQsIF90YXJnZXRFbDogSFRNTEVsZW1lbnQsIGxpbmtUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobGlua1RleHQsIHRoaXMuaW5mby5wYXRoLCBLZXltYXAuaXNNb2RFdmVudCgkZXZlbnQpKSk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcm5hbExpbmtEcmFnKCRldmVudDogRHJhZ0V2ZW50LCBfdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRyYWdNYW5hZ2VyID0gdGhpcy5pbmZvLmFwcC5kcmFnTWFuYWdlcjtcbiAgICBkcmFnTWFuYWdlci5vbkRyYWdTdGFydCgkZXZlbnQsIGRyYWdNYW5hZ2VyLmRyYWdMaW5rKCRldmVudCwgbGlua1RleHQsIHRoaXMuaW5mby5wYXRoLCB0aXRsZSkpO1xuICB9XG5cbiAgcHVibGljIG9uSW50ZXJuYWxMaW5rTW91c2VvdmVyKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gYGhvdmVyUGFyZW50YCBpcyB0aGUgaW5mbyBvYmplY3QgaXRzZWxmLCBleGFjdGx5IGFzIE9ic2lkaWFuIHBhc3NlcyBpdHMgb3duIOKAlCB3aGljaCBpcyB3aGF0IGtlZXBzXG4gICAgLy8gYEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvYCdzIHBvcG92ZXIgei1pbmRleCBmaXggaW4gcGxheS5cbiAgICB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS50cmlnZ2VyKCdob3Zlci1saW5rJywge1xuICAgICAgZXZlbnQ6ICRldmVudCxcbiAgICAgIGhvdmVyUGFyZW50OiB0aGlzLmluZm8sXG4gICAgICBsaW5rdGV4dDogbGlua1RleHQsXG4gICAgICBzb3VyY2U6ICdwcmV2aWV3JyxcbiAgICAgIHNvdXJjZVBhdGg6IHRoaXMuaW5mby5wYXRoLFxuICAgICAgdGFyZ2V0RWxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkludGVybmFsTGlua1JpZ2h0Q2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXRFbDogSFRNTEVsZW1lbnQsIGxpbmtUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZW51ID0gTWVudS5mb3JFdmVudCgkZXZlbnQpO1xuICAgIG1lbnUuc2V0UGFyZW50RWxlbWVudCh0YXJnZXRFbCk7XG4gICAgbWVudS5hZGRTZWN0aW9ucyhJTlRFUk5BTF9MSU5LX01FTlVfU0VDVElPTlMpO1xuICAgIGFkZENvcHlNZW51SXRlbShtZW51LCB0YXJnZXRFbCk7XG4gICAgdGhpcy5pbmZvLmFwcC53b3Jrc3BhY2UuaGFuZGxlTGlua0NvbnRleHRNZW51KG1lbnUsIGxpbmtUZXh0LCB0aGlzLmluZm8ucGF0aCk7XG4gIH1cblxuICBwdWJsaWMgb25UYWdDbGljayhfJGV2ZW50OiBNb3VzZUV2ZW50LCBfdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCB0YWc6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGByZWdpc3RlckRvbUV2ZW50c2AgaGFzIGFscmVhZHkgY2FsbGVkIGBwcmV2ZW50RGVmYXVsdCgpYCBmb3IgYSB0YWcgY2xpY2suXG4gICAgdGhpcy5pbmZvLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkdsb2JhbFNlYXJjaCk/Lm9wZW5HbG9iYWxTZWFyY2goYHRhZzoke3RhZ31gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgbWFya2Rvd24gYW5kIGVtYmVkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdWxsIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdWxsIHJlbmRlciBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZ1bGxSZW5kZXIocGFyYW1zOiBGdWxsUmVuZGVyUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBwYXJhbXMuc291cmNlUGF0aCA/PyAnLyc7XG4gIGxldCBzaG91bGRVbmxvYWRDb21wb25lbnQgPSBmYWxzZTtcbiAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50O1xuICBpZiAocGFyYW1zLmNvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudCA9IHBhcmFtcy5jb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudCgpO1xuICAgIGNvbXBvbmVudC5sb2FkKCk7XG4gICAgc2hvdWxkVW5sb2FkQ29tcG9uZW50ID0gdHJ1ZTtcbiAgfVxuXG4gIHVzaW5nIF8gPSBjb21wb25lbnQuYWRkQ2hpbGQobmV3IEVtYmVkQnlFeHRlbnNpb25NZFBhdGNoQ29tcG9uZW50KHBhcmFtcy5hcHAuZW1iZWRSZWdpc3RyeS5lbWJlZEJ5RXh0ZW5zaW9uKSk7XG5cbiAgYXdhaXQgTWFya2Rvd25SZW5kZXJlci5yZW5kZXIocGFyYW1zLmFwcCwgcGFyYW1zLm1hcmtkb3duLCBwYXJhbXMuZWwsIHNvdXJjZVBhdGgsIGNvbXBvbmVudCk7XG5cbiAgaWYgKHNob3VsZFVubG9hZENvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudC51bmxvYWQoKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2hvdWxkUmVnaXN0ZXJMaW5rSGFuZGxlcnMpIHtcbiAgICByZWdpc3RlckxpbmtIYW5kbGVycyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UmVnaXN0ZXJMaW5rSGFuZGxlcnNQYXJhbXM+KHtcbiAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgIGVsOiBwYXJhbXMuZWwsXG4gICAgICBzb3VyY2VQYXRoOiBwYXJhbXMuc291cmNlUGF0aFxuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2hvdWxkUmVnaXN0ZXJGb2xkSGFuZGxlcnMpIHtcbiAgICByZWdpc3RlckZvbGRIYW5kbGVycyh7IGVsOiBwYXJhbXMuZWwgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBNYXJrZG93biB0byBIVE1MLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgSFRNTCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXJrZG93blRvSHRtbChwYXJhbXM6IE1hcmtkb3duVG9IdG1sUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBtYXJrZG93bixcbiAgICBzb3VyY2VQYXRoXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoKTtcbiAgY29tcG9uZW50LmxvYWQoKTtcbiAgY29uc3QgcmVuZGVyRGl2ID0gY3JlYXRlRGl2KCk7XG4gIGF3YWl0IE1hcmtkb3duUmVuZGVyZXIucmVuZGVyKGFwcCwgbWFya2Rvd24sIHJlbmRlckRpdiwgc291cmNlUGF0aCA/PyAnJywgY29tcG9uZW50KTtcbiAgY29uc3QgaHRtbCA9IHJlbmRlckRpdi5pbm5lckhUTUw7XG4gIGNvbXBvbmVudC51bmxvYWQoKTtcbiAgcmV0dXJuIGh0bWw7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGxpbmsgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBzbyBpdHMgbGlua3MgYWN0IGFzIHRoZXkgZG8gaW4gYSBSZWFkaW5nIHZpZXc6IGNsaWNrLFxuICogbW9kLWNsaWNrLCBtaWRkbGUtY2xpY2ssIGRyYWcsIGhvdmVyIHByZXZpZXcsIHRoZSBjb250ZXh0IG1lbnUsIHRhZ3MsIGFuZCBmb290bm90ZSBsaW5rcywgd2hpY2ggc2Nyb2xsXG4gKiB0byB0aGVpciBmb290bm90ZSBhbmQgYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlZ2lzdGVyaW5nIGxpbmsgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckxpbmtIYW5kbGVycyhwYXJhbXM6IFJlZ2lzdGVyTGlua0hhbmRsZXJzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZWwsXG4gICAgc291cmNlUGF0aFxuICB9ID0gcGFyYW1zO1xuICBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50cyhcbiAgICBlbCxcbiAgICBuZXcgTGlua0RvbUV2ZW50c0hhbmRsZXJzKFxuICAgICAgbmV3IEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBlbCxcbiAgICAgICAgcGF0aDogc291cmNlUGF0aCA/PyAnJ1xuICAgICAgfSlcbiAgICApXG4gICk7XG4gIC8vIGByZWdpc3RlckRvbUV2ZW50c2AgaGFuZGxlcyBhIGZvb3Rub3RlIGxpbmsncyBob3ZlciwgYnV0IGl0cyBjbGljayBvbmx5IGluc2lkZSBhIFJlYWRpbmcgdmlldy5cbiAgcmVnaXN0ZXJGb290bm90ZUxpbmtIYW5kbGVyKHsgZWwgfSk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBleHRlcm5hbCBsaW5rLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmVuZGVyaW5nIHRoZSBleHRlcm5hbCBsaW5rLlxuICogQHJldHVybnMgVGhlIEhUTUxBbmNob3JFbGVtZW50IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGV4dGVybmFsIGxpbmsuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJFeHRlcm5hbExpbmsocGFyYW1zOiBSZW5kZXJFeHRlcm5hbExpbmtQYXJhbXMpOiBQcm9taXNlPEhUTUxBbmNob3JFbGVtZW50PiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgdXJsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gcGFyYW1zLmRpc3BsYXlUZXh0ID8/IHVybDtcbiAgY29uc3Qgd3JhcHBlckVsID0gY3JlYXRlU3BhbigpO1xuICBhd2FpdCBmdWxsUmVuZGVyKHtcbiAgICBhcHAsXG4gICAgZWw6IHdyYXBwZXJFbCxcbiAgICBtYXJrZG93bjogYFske2Rpc3BsYXlUZXh0fV0oJHt1cmx9KWBcbiAgfSk7XG4gIGNvbnN0IGFFbCA9IHdyYXBwZXJFbC5maW5kKCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gIHJlZ2lzdGVyTGlua0hhbmRsZXJzKHtcbiAgICBhcHAsXG4gICAgZWw6IGFFbFxuICB9KTtcbiAgcmV0dXJuIGFFbDtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGFuIGludGVybmFsIGxpbmsuXG4gKlxuICogV2hhdCBjbGlja2luZyB0aGUgcmVuZGVyZWQgbGluayBkb2VzIGRlcGVuZHMgb24gd2hhdCBpdCBuYW1lczpcbiAqXG4gKiAtIEEgRklMRSBpcyBvcGVuZWQgYnkgT2JzaWRpYW4ncyBvd24gbGluayBoYW5kbGVyIOKAlCBhbmQsIHdpdGhcbiAqICAge0BsaW5rIFJlbmRlckludGVybmFsTGlua1BhcmFtcy5zaG91bGRSZXZlYWxGaWxlfSwgYWRkaXRpb25hbGx5IHJldmVhbGVkIGluIHRoZSBmaWxlIGV4cGxvcmVyLlxuICogLSBBIEZPTERFUiBjYW5ub3QgYmUgb3BlbmVkLCBzbyBpdHMgRk9MREVSIE5PVEUgaXMg4oCUIHRoZSBub3RlIHdob3NlIHByb3BlcnRpZXMgZGVzY3JpYmUgdGhlIGZvbGRlclxuICogICBpdHNlbGYsIHJlc29sdmVkIHRocm91Z2gge0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlfSAoYnkgZGVmYXVsdCBmcm9tIHRoZSBpbnN0YWxsZWQgYGZvbGRlci1ub3Rlc2BcbiAqICAgcGx1Z2luJ3MgbGl2ZSBjb25maWd1cmF0aW9uKS4gVGhlIHJldmVhbCBsYW5kcyBvbiB0aGF0IG5vdGUsIHVubGVzcyB0aGUgbm90ZSBpcyBoaWRkZW4gaW4gdGhlXG4gKiAgIGV4cGxvcmVyLCBpbiB3aGljaCBjYXNlIGl0IGxhbmRzIG9uIHRoZSBmb2xkZXIg4oCUIHJldmVhbGluZyBhIGhpZGRlbiBub3RlIHdvdWxkIGhpZ2hsaWdodCBub3RoaW5nLlxuICogICBBIGZvbGRlciB3aXRoIE5PIGZvbGRlciBub3RlIHJldmVhbHMgdGhlIGZvbGRlciBhbmQgb3BlbnMgbm90aGluZzogbm90aGluZyBoZXJlIGV2ZXIgY3JlYXRlcyBhIG5vdGUuXG4gKlxuICogRXZlcnl0aGluZyBpcyByZXNvbHZlZCBhdCBDTElDSyB0aW1lIHJhdGhlciB0aGFuIGF0IHJlbmRlciB0aW1lLCBkZWxpYmVyYXRlbHk6IGEgcmVuZGVyZWQgbGluayBvdXRsaXZlc1xuICogdGhlIG9wZXJhdGlvbiB0aGF0IHByb2R1Y2VkIGl0LCBzbyBhIGRlc3RpbmF0aW9uIHJlbmFtZWQgaW4gYmV0d2VlbiBzdGlsbCByZXZlYWxzIHRoZSByaWdodCBpdGVtLCBhbmQgYVxuICogZm9sZGVyIG5vdGUgd3JpdHRlbiBhZnRlciB0aGUgbGluayBhcHBlYXJlZCBpcyBzdGlsbCBmb3VuZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmRlcmluZyB0aGUgaW50ZXJuYWwgbGluay5cbiAqIEByZXR1cm5zIFRoZSBIVE1MQW5jaG9yRWxlbWVudCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBpbnRlcm5hbCBsaW5rLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVySW50ZXJuYWxMaW5rKHBhcmFtczogUmVuZGVySW50ZXJuYWxMaW5rUGFyYW1zKTogUHJvbWlzZTxIVE1MQW5jaG9yRWxlbWVudD4ge1xuICBjb25zdCB7XG4gICAgYWZ0ZXJSZXZlYWwsXG4gICAgYXBwLFxuICAgIGZvbGRlck5vdGUsXG4gICAgcGF0aE9yQWJzdHJhY3RGaWxlLFxuICAgIHNob3VsZFJldmVhbEZpbGVcbiAgfSA9IHBhcmFtcztcblxuICAvLyBBIERPTSBsaXN0ZW5lciBjYW5ub3QgYXdhaXQsIHNvIHRoZSByZXZlYWwsIGFuZCB0aGUgaG9vayBvcmRlcmVkIGFmdGVyIGl0LCBydW4gZGV0YWNoZWQuXG4gIGZ1bmN0aW9uIHJldmVhbChhYnN0cmFjdEZpbGVUb1JldmVhbDogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHJldmVhbEluRmlsZUV4cGxvcmVyKHsgYWJzdHJhY3RGaWxlOiBhYnN0cmFjdEZpbGVUb1JldmVhbCwgYXBwIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJSZXZlYWw/LigpO1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IGFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckFic3RyYWN0RmlsZSk7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gcGFyYW1zLmRpc3BsYXlUZXh0ID8/IHBhdGg7XG4gIGlmIChpc0ZvbGRlcihhYnN0cmFjdEZpbGUpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsKCdhJywgeyB0ZXh0OiBkaXNwbGF5VGV4dCB9LCAoYUVsKSA9PiB7XG4gICAgICBhRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBjb25maWcgPSByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZyh7IGFwcCwgLi4uZm9sZGVyTm90ZSB9KTtcbiAgICAgICAgY29uc3QgZm9sZGVyTm90ZUZpbGUgPSByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgY29uZmlnLCBmb2xkZXI6IGFic3RyYWN0RmlsZSB9KTtcbiAgICAgICAgcmV2ZWFsKGZvbGRlck5vdGVGaWxlICYmICFjb25maWcuaXNIaWRkZW4gPyBmb2xkZXJOb3RlRmlsZSA6IGFic3RyYWN0RmlsZSk7XG4gICAgICAgIGlmIChmb2xkZXJOb3RlRmlsZSkge1xuICAgICAgICAgIC8vIEEgRE9NIGxpc3RlbmVyIGNhbm5vdCBhd2FpdCwgYW5kIHRoZSBvcGVuIGhhcyB0byBvdXRsaXZlIHRoaXMgaGFuZGxlcjogaXQgc2V0dGxlcyBmaXJzdCwgZm9yXG4gICAgICAgICAgLy8gdGhlIGNsaWNrIHRoYXQgbGFuZHMgcmlnaHQgYXMgYW4gb3BlcmF0aW9uIGZpbmlzaGVzIHdyaXRpbmcuXG4gICAgICAgICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gb3BlbkFmdGVyU2V0dGxpbmcoYXBwLCBmb2xkZXJOb3RlRmlsZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZXJFbCA9IGNyZWF0ZVNwYW4oKTtcbiAgYXdhaXQgZnVsbFJlbmRlcih7XG4gICAgYXBwLFxuICAgIGVsOiB3cmFwcGVyRWwsXG4gICAgbWFya2Rvd246IGBbWyR7cGF0aH18JHtkaXNwbGF5VGV4dH1dXWBcbiAgfSk7XG4gIGNvbnN0IGFFbCA9IHdyYXBwZXJFbC5maW5kKCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gIHJlZ2lzdGVyTGlua0hhbmRsZXJzKHtcbiAgICBhcHAsXG4gICAgZWw6IGFFbFxuICB9KTtcbiAgaWYgKHNob3VsZFJldmVhbEZpbGUgPz8gZmFsc2UpIHtcbiAgICBhRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAvLyBMYXllcmVkIE9OIFRPUCBvZiBPYnNpZGlhbidzIG93biBoYW5kbGVyIOKAlCBubyBgcHJldmVudERlZmF1bHRgLCBzbyB0aGUgb3BlbiBpcyB1bnRvdWNoZWQuIEEgcGF0aFxuICAgICAgLy8gdGhhdCByZXNvbHZlcyB0byBub3RoaW5nIGdldHMgbm8gcmV2ZWFsOiBhbiB1bnJlc29sdmVkIGxpbmsgaGFzIG5vdGhpbmcgdG8gcmV2ZWFsLCBhbmQgY2xpY2tpbmdcbiAgICAgIC8vIG9uZSBDUkVBVEVTIHRoZSBub3RlIGl0IG5hbWVzLlxuICAgICAgY29uc3QgZmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICByZXZlYWwoZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGFFbDtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBgY2xpcGJvYXJkYC1zZWN0aW9uIENvcHkgaXRlbSBldmVyeSBsaW5rIGNvbnRleHQgbWVudSBjYXJyaWVzLCBjb3B5aW5nIHRoZSBsaW5rJ3MgRElTUExBWVxuICogdGV4dCDigJQgd2hpY2ggaXMgd2hhdCBPYnNpZGlhbidzIG93biBtZW51IGNvcGllcywgbm90IHRoZSB0YXJnZXQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gbWVudSAtIFRoZSBtZW51IHRvIGFkZCB0aGUgaXRlbSB0by5cbiAqIEBwYXJhbSB0YXJnZXRFbCAtIFRoZSBsaW5rIGVsZW1lbnQgdGhlIG1lbnUgd2FzIG9wZW5lZCBvbi5cbiAqL1xuZnVuY3Rpb24gYWRkQ29weU1lbnVJdGVtKG1lbnU6IE1lbnUsIHRhcmdldEVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICBpdGVtXG4gICAgICAuc2V0U2VjdGlvbignY2xpcGJvYXJkJylcbiAgICAgIC5zZXRUaXRsZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLm1lbnUuY29weSkpXG4gICAgICAuc2V0SWNvbignbHVjaWRlLWNvcHknKVxuICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0YXJnZXRFbC53aW4ubmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGFyZ2V0RWwuZ2V0VGV4dCgpKSk7XG4gICAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgYSBmaWxlIGluIHRoZSBhY3RpdmUgbGVhZiwgb25jZSB0aGUgdmF1bHQgaGFzIHNldHRsZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIG9wZW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpbGUgaXMgb3Blbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlbkFmdGVyU2V0dGxpbmcoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERUxBWV9CRUZPUkVfT1BFTl9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gIGF3YWl0IGFwcC53b3Jrc3BhY2UuZ2V0TGVhZigpLm9wZW5GaWxlKGZpbGUsIHsgYWN0aXZlOiB0cnVlIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS1AsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyw0QkFBNEI7QUFDckM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7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
|
|
396
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXJrZG93bi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgTWFya2Rvd24gY29udGVudCBpbiBPYnNpZGlhbi5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIERvbUV2ZW50c0hhbmRsZXJzLFxuICBEb21FdmVudHNIYW5kbGVyc0luZm8sXG4gIEVtYmVkUmVnaXN0cnlFbWJlZEJ5RXh0ZW5zaW9uUmVjb3JkXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHNsZWVwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQge1xuICBnZXRaSW5kZXgsXG4gIHdhaXRVbnRpbENvbm5lY3RlZFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvaHRtbC1lbGVtZW50JztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdXJsJztcbmltcG9ydCB7IEludGVybmFsUGx1Z2luTmFtZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IHQgfSBmcm9tICdpMThuZXh0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSG92ZXJQb3BvdmVyLFxuICBLZXltYXAsXG4gIE1hcmtkb3duUHJldmlld1JlbmRlcmVyLFxuICBNYXJrZG93blJlbmRlcmVyLFxuICBNZW51LFxuICBOb3RpY2Vcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckFic3RyYWN0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBGb2xkZXJOb3RlTG9jYXRpb24gfSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcblxuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHJldmVhbEluRmlsZUV4cGxvcmVyIH0gZnJvbSAnLi9maWxlLWV4cGxvcmVyLnRzJztcbmltcG9ydCB7XG4gIGdldEFic3RyYWN0RmlsZU9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgaXNGaWxlLFxuICBpc0ZvbGRlclxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIHJlc29sdmVGb2xkZXJOb3RlLFxuICByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1xufSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcbmltcG9ydCB7XG4gIHJlZ2lzdGVyRm9sZEhhbmRsZXJzLFxuICByZWdpc3RlckZvb3Rub3RlTGlua0hhbmRsZXJcbn0gZnJvbSAnLi9yZW5kZXJlZC1tYXJrZG93bi50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgdG8gbGV0IE9ic2lkaWFuIHNldHRsZSBiZWZvcmUgb3BlbmluZyBhIGZvbGRlciBub3RlLiBUaGUgY2xpY2sgY2FuIGxhbmQgcmlnaHQgYWZ0ZXIgYW5cbiAqIG9wZXJhdGlvbiB0aGF0IGNyZWF0ZWQsIHJld3JvdGUgYW5kIHRyYXNoZWQgbm90ZXMsIGFuZCBvcGVuaW5nIGludG8gdGhlIG1pZGRsZSBvZiBPYnNpZGlhbidzIG93blxuICogcmVhY3Rpb24gdG8gdGhhdCBzaG93cyB0aGUgbm90ZSBiZWZvcmUgaXRzIG1ldGFkYXRhIGhhcyBjYXVnaHQgdXAuXG4gKi9cbmNvbnN0IERFTEFZX0JFRk9SRV9PUEVOX0lOX01JTExJU0VDT05EUyA9IDIwMDtcblxuLyoqXG4gKiBUaGUgc2VjdGlvbnMgYW4gZXh0ZXJuYWwgbGluaydzIGNvbnRleHQgbWVudSBkZWNsYXJlcywgaW4gT2JzaWRpYW4ncyBvd24gb3JkZXIuIFRoZSBvcmRlciBpcyB3aGF0XG4gKiB7QGxpbmsgTWVudS5zb3J0fSBncm91cHMgdGhlIGl0ZW1zIGJ5LCBzbyBpdCBoYXMgdG8gbWF0Y2ggd2hhdFxuICoge0BsaW5rIFdvcmtzcGFjZS5oYW5kbGVFeHRlcm5hbExpbmtDb250ZXh0TWVudX0gYW5kIGV2ZXJ5IGB1cmwtbWVudWAgbGlzdGVuZXIgZXhwZWN0IHRvIGZpbGwuXG4gKi9cbmNvbnN0IEVYVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyA9IFtcbiAgJ3RpdGxlJyxcbiAgJ29wZW4nLFxuICAnc2VsZWN0aW9uJyxcbiAgJ2NsaXBib2FyZCcsXG4gICdpbmZvJyxcbiAgJ2FjdGlvbicsXG4gICd2aWV3JyxcbiAgJycsXG4gICdkYW5nZXInXG5dO1xuXG4vKipcbiAqIFRoZSBzZWN0aW9ucyBhbiBpbnRlcm5hbCBsaW5rJ3MgY29udGV4dCBtZW51IGRlY2xhcmVzLCBpbiBPYnNpZGlhbidzIG93biBvcmRlci4gU2VlXG4gKiB7QGxpbmsgRVhURVJOQUxfTElOS19NRU5VX1NFQ1RJT05TfSDigJQgdGhlIGNvdW50ZXJwYXJ0IGZvciBgZmlsZS1tZW51YCBsaXN0ZW5lcnMuXG4gKi9cbmNvbnN0IElOVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyA9IFtcbiAgJ3RpdGxlJyxcbiAgJ29wZW4nLFxuICAnYWN0aW9uJyxcbiAgJ2NsaXBib2FyZCcsXG4gICd2aWV3JyxcbiAgJ2luZm8nLFxuICAnJyxcbiAgJ2Rhbmdlcidcbl07XG5cbi8qKlxuICogVGhlIHBhcmFtcyBmb3IgdGhlIGZ1bGwgcmVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bGxSZW5kZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29tcG9uZW50IGluc3RhbmNlIHRvIHVzZSBmb3IgdGhlIHJlbmRlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudD86IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIEhUTUxFbGVtZW50IHRvIHJlbmRlciB0by5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duIHN0cmluZyB0byByZW5kZXIuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG1ha2UgdGhlIHJlbmRlcmVkIGhlYWRpbmdzIGFuZCBuZXN0ZWQgbGlzdHMgZm9sZGFibGUsIGFzIGluIGEgUmVhZGluZyB2aWV3LiBTZWVcbiAgICoge0BsaW5rIHJlZ2lzdGVyRm9sZEhhbmRsZXJzfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJGb2xkSGFuZGxlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlZ2lzdGVyIGxpbmsgaGFuZGxlcnMgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckxpbmtIYW5kbGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCB0byByZXNvbHZlIHJlbGF0aXZlIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJy8nYFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbWFya2Rvd25Ub0h0bWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtkb3duVG9IdG1sUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIHRvIHJlc29sdmUgcmVsYXRpdmUgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyTGlua0hhbmRsZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckxpbmtIYW5kbGVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBIVE1MRWxlbWVudCB0byByZWdpc3RlciBsaW5rIGhhbmRsZXJzIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIHRvIHJlc29sdmUgcmVsYXRpdmUgbGlua3MgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVuZGVyRXh0ZXJuYWxMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJFeHRlcm5hbExpbmtQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgZXh0ZXJuYWwgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHRvIHJlbmRlciB0aGUgZXh0ZXJuYWwgbGluayBmb3IuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZm9sZGVyLW5vdGUgc2V0dXAge0BsaW5rIHJlbmRlckludGVybmFsTGlua30gcmVzb2x2ZXMgYSBmb2xkZXIgbGluaydzIG5vdGUgd2l0aCDigJQgZXZlcnl0aGluZ1xuICoge0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnfSB0YWtlcyBleGNlcHQgdGhlIGFwcCwgd2hpY2ggdGhlIGxpbmsgYWxyZWFkeSBjYXJyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckludGVybmFsTGlua0ZvbGRlck5vdGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBleHRlbnNpb25zIGEgZm9sZGVyIG5vdGUgbWF5IGNhcnJ5LiBTZWUge0BsaW5rIFJlc29sdmVGb2xkZXJOb3RlQ29uZmlnUGFyYW1zLmV4dGVuc2lvbnN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydtZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb2xkZXIgbm90ZSBpcyBoaWRkZW4gaW4gdGhlIGZpbGUgZXhwbG9yZXIuIFNlZVxuICAgKiB7QGxpbmsgUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMuaXNIaWRkZW59LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0hpZGRlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBub3RlIHNpdHMgcmVsYXRpdmUgdG8gaXRzIGZvbGRlci4gU2VlIHtAbGluayBSZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1BhcmFtcy5sb2NhdGlvbn0uXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b31cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogRm9sZGVyTm90ZUxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIuIFNlZSB7QGxpbmsgUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMucmVzb2x2ZU5hbWV9LlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciB3aG9zZSBub3RlIGlzIGJlaW5nIG5hbWVkLlxuICAgKiBAcmV0dXJucyBUaGUgbm90ZSdzIG5hbWUuXG4gICAqIEBkZWZhdWx0IGAoZm9sZGVyKSA9PiBmb2xkZXIubmFtZWBcbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVOYW1lPzogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZW5kZXJJbnRlcm5hbExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckludGVybmFsTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYSBjbGljayBoYXMgcmV2ZWFsZWQgdGhlIGxpbmsncyBkZXN0aW5hdGlvbiBpbiB0aGUgZmlsZSBleHBsb3Jlciwgb25jZSB0aGUgZXhwbG9yZXIgaGFzXG4gICAqIGZpbmlzaGVkIHRha2luZyB0aGUgZm9jdXMgZm9yIGl0IOKAlCBzbyB0aGlzIGlzIHdoZXJlIGEgY2FsbGVyIG1vdmVzIHRoZSBmb2N1cyBzb21ld2hlcmUgZWxzZS5cbiAgICpcbiAgICogQXdhaXRlZCwgYW5kIGNhbGxlZCBvbmx5IGZvciBhIGNsaWNrIHRoYXQgcmV2ZWFsczogYWx3YXlzIGZvciBhIGZvbGRlciBsaW5rLCBhbmQgZm9yIGEgZmlsZSBsaW5rIG9ubHlcbiAgICogd2l0aCB7QGxpbmsgUmVuZGVySW50ZXJuYWxMaW5rUGFyYW1zLnNob3VsZFJldmVhbEZpbGV9IGFuZCBhIGRlc3RpbmF0aW9uIHRoYXQgZXhpc3RzLiBXaXRoIHRoZSBmaWxlXG4gICAqIGV4cGxvcmVyIGRpc2FibGVkIGl0IGlzIHN0aWxsIGNhbGxlZCwgcmlnaHQgYXdheSwgc2luY2UgdGhlcmUgaXMgdGhlbiBub3RoaW5nIHRvIHdhaXQgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgYWZ0ZXJSZXZlYWw/OiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgaW50ZXJuYWwgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdG8gYW5zd2VyIHdoaWNoIG5vdGUgaXMgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSwgd2hlbiB0aGUgbGluayBuYW1lcyBhIEZPTERFUi5cbiAgICpcbiAgICogT21pdHRlZCBtZWFucyB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99OiB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgIHBsdWdpbidzIGxpdmVcbiAgICogY29uZmlndXJhdGlvbiwgb3IgYSBub3RlIG5hbWVkIGFmdGVyIGl0cyBmb2xkZXIsIGluc2lkZSBpdCwgd2hlbiB0aGF0IHBsdWdpbiBpcyBhYnNlbnQuIFBhc3NcbiAgICogYHsgbG9jYXRpb246IEZvbGRlck5vdGVMb2NhdGlvbi5Ob25lIH1gIGZvciBhIGZvbGRlciBsaW5rIHRoYXQgbXVzdCBvbmx5IGV2ZXIgcmV2ZWFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBge31gXG4gICAqL1xuICByZWFkb25seSBmb2xkZXJOb3RlPzogUmVuZGVySW50ZXJuYWxMaW5rRm9sZGVyTm90ZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmVuZGVyIHRoZSBpbnRlcm5hbCBsaW5rIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckFic3RyYWN0RmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIGEgRklMRSBsaW5rIGFsc28gaGlnaGxpZ2h0cyB0aGF0IGZpbGUgaW4gdGhlIGZpbGUgZXhwbG9yZXIsIG9uIHRvcCBvZiB0aGUgb3BlblxuICAgKiBPYnNpZGlhbidzIG93biBsaW5rIGhhbmRsZXIgcGVyZm9ybXMuXG4gICAqXG4gICAqIE9wdC1pbiwgdW5saWtlIHRoZSBmb2xkZXIgYnJhbmNoOiBhIGZvbGRlciBsaW5rIGhhcyBhbHdheXMgcmV2ZWFsZWQgKHJldmVhbGluZyB3YXMgYWxsIGl0cyBjbGlja1xuICAgKiBjb3VsZCBtZWFuKSwgd2hlcmVhcyBhIGZpbGUgbGluayBoYXMgYWx3YXlzIG9ubHkgb3BlbmVkIOKAlCBzbyB0dXJuaW5nIHRoaXMgb24gYnkgZGVmYXVsdCB3b3VsZCBjaGFuZ2VcbiAgICogd2hhdCBldmVyeSBleGlzdGluZyBjYWxsZXIncyBsaW5rIGRvZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldmVhbEZpbGU/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRml4ZWRaSW5kZXhEb21FdmVudHNIYW5kbGVyc0luZm9Db25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBlbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuY2xhc3MgRW1iZWRCeUV4dGVuc2lvbk1kUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbWJlZEJ5RXh0ZW5zaW9uOiBFbWJlZFJlZ2lzdHJ5RW1iZWRCeUV4dGVuc2lvblJlY29yZCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiB0aGlzLmVtYmVkQnlFeHRlbnNpb24sXG4gICAgICBtZXRob2ROYW1lOiAnbWQnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtjb250ZXh0XVxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb250ZXh0LmRpc3BsYXlNb2RlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvIGltcGxlbWVudHMgRG9tRXZlbnRzSGFuZGxlcnNJbmZvIHtcbiAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IGhvdmVyUG9wb3ZlcigpOiBIb3ZlclBvcG92ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faG92ZXJQb3BvdmVyO1xuICB9XG5cbiAgcHVibGljIHNldCBob3ZlclBvcG92ZXIoaG92ZXJQb3BvdmVyOiBIb3ZlclBvcG92ZXIgfCBudWxsKSB7XG4gICAgdGhpcy5faG92ZXJQb3BvdmVyID0gaG92ZXJQb3BvdmVyO1xuICAgIGlmIChob3ZlclBvcG92ZXIgJiYgdGhpcy56SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaG92ZXJQb3BvdmVyLmhvdmVyRWwuc2V0Q3NzU3R5bGVzKHtcbiAgICAgICAgekluZGV4OiBTdHJpbmcodGhpcy56SW5kZXgpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ob3ZlclBvcG92ZXI6IEhvdmVyUG9wb3ZlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWw6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgekluZGV4PzogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5lbCA9IHBhcmFtcy5lbDtcblxuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHdhaXRVbnRpbENvbm5lY3RlZCh0aGlzLmVsKTtcbiAgICAgIHRoaXMudXBkYXRlWkluZGV4KHRoaXMuZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVaSW5kZXgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnpJbmRleCA9IGdldFpJbmRleChlbGVtZW50KSArIDE7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IGEgcmVuZGVyZWQgbGluayBET0VTIHdoZW4gaXQgaXMgY2xpY2tlZCwgaG92ZXJlZCwgZHJhZ2dlZCBvciByaWdodC1jbGlja2VkLlxuICpcbiAqIHtAbGluayBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50c30gb25seSBwZXJmb3JtcyB0aGUgREVMRUdBVElPTiBoYWxmIOKAlCB3aGljaCBlbGVtZW50IGFuXG4gKiBldmVudCBsYW5kZWQgb24sIHdoaWNoIGxpbmsgdGV4dCBpdCBjYXJyaWVzLCBhbmQgd2hpY2ggb2YgdGhlc2UgbWV0aG9kcyB0byBjYWxsLiBUaGUgaGFsZiBpdCBkb2VzIG5vdFxuICogcHJvdmlkZSBpcyB0aGlzIG9uZSwgYW5kIE9ic2lkaWFuIGtlZXBzIGl0cyBvd24gaW1wbGVtZW50YXRpb24gcHJpdmF0ZTogdGhlIG9ubHkgaGFuZGxlIG9uIGl0IGlzIHRoZVxuICogaW5zdGFuY2UgYSBsaXZlIHByZXZpZXcgdmlldyBwYXNzZXMgaW4uIHtAbGluayBnZXREb21FdmVudHNIYW5kbGVyc0NvbnN0cnVjdG9yfSB1c2VkIHRvIG9idGFpbiBpdCBieVxuICogb3BlbmluZyBhIHJlYWwgbGVhZiBvbiBhbiBhcmJpdHJhcnkgbm90ZSBhbmQgaW50ZXJjZXB0aW5nIHRoYXQgY2FsbCDigJQgd2hpY2ggbXV0YXRlZCB0aGUgdXNlcidzXG4gKiB3b3Jrc3BhY2Ugb24gRVZFUlkgY29uc3VtZXIncyBsb2FkIChhIHRhYiBvcGVuaW5nIGFuZCBjbG9zaW5nLCB0d28gYGZpbGUtb3BlbmAgYW5kIHR3b1xuICogYGFjdGl2ZS1sZWFmLWNoYW5nZWAgZXZlbnRzLCBhbiB1bnJlbGF0ZWQgbm90ZSByZW5kZXJlZCBpbiBwcmV2aWV3KS5cbiAqXG4gKiBUaGVzZSBib2RpZXMgYXJlIGEgcG9ydCBvZiB0aGF0IGNsYXNzLCBzbyBub3RoaW5nIGhhcyB0byBiZSBvcGVuZWQuIEtlZXBpbmdcbiAqIHtAbGluayBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50c30gZm9yIHRoZSBkZWxlZ2F0aW9uIGlzIHdoYXQga2VlcHMgZm9vdG5vdGUgbGlua3MsXG4gKiB0YWdzLCBleHRlcm5hbCBsaW5rcywgbW9kLWNsaWNrIGFuZCBkcmFnIGJlaGF2aW5nIGV4YWN0bHkgYXMgdGhleSBkbyBpbnNpZGUgYSByZWFsIHByZXZpZXcuXG4gKi9cbmNsYXNzIExpbmtEb21FdmVudHNIYW5kbGVycyBpbXBsZW1lbnRzIERvbUV2ZW50c0hhbmRsZXJzIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW5mbzogRG9tRXZlbnRzSGFuZGxlcnNJbmZvKSB7fVxuXG4gIHB1YmxpYyBvbkV4dGVybmFsTGlua0NsaWNrKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCFpc1VybChsaW5rVGV4dCkpIHtcbiAgICAgIG5ldyBOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmZhaWxlZFRvT3BlblVybCwgeyB1cmw6IGxpbmtUZXh0IH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtb2RpZmllclBhbmVUeXBlID0gS2V5bWFwLmlzTW9kRXZlbnQoJGV2ZW50KTtcbiAgICB0YXJnZXRFbC53aW4ub3BlbihsaW5rVGV4dCwgdHlwZW9mIG1vZGlmaWVyUGFuZVR5cGUgPT09ICdib29sZWFuJyA/ICcnIDogbW9kaWZpZXJQYW5lVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgb25FeHRlcm5hbExpbmtSaWdodENsaWNrKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWVudSA9IE1lbnUuZm9yRXZlbnQoJGV2ZW50KTtcbiAgICBtZW51LmFkZFNlY3Rpb25zKEVYVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyk7XG4gICAgYWRkQ29weU1lbnVJdGVtKG1lbnUsIHRhcmdldEVsKTtcbiAgICB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS5oYW5kbGVFeHRlcm5hbExpbmtDb250ZXh0TWVudShtZW51LCBsaW5rVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcm5hbExpbmtDbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQsIF90YXJnZXRFbDogSFRNTEVsZW1lbnQsIGxpbmtUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobGlua1RleHQsIHRoaXMuaW5mby5wYXRoLCBLZXltYXAuaXNNb2RFdmVudCgkZXZlbnQpKSk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcm5hbExpbmtEcmFnKCRldmVudDogRHJhZ0V2ZW50LCBfdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRyYWdNYW5hZ2VyID0gdGhpcy5pbmZvLmFwcC5kcmFnTWFuYWdlcjtcbiAgICBkcmFnTWFuYWdlci5vbkRyYWdTdGFydCgkZXZlbnQsIGRyYWdNYW5hZ2VyLmRyYWdMaW5rKCRldmVudCwgbGlua1RleHQsIHRoaXMuaW5mby5wYXRoLCB0aXRsZSkpO1xuICB9XG5cbiAgcHVibGljIG9uSW50ZXJuYWxMaW5rTW91c2VvdmVyKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gYGhvdmVyUGFyZW50YCBpcyB0aGUgaW5mbyBvYmplY3QgaXRzZWxmLCBleGFjdGx5IGFzIE9ic2lkaWFuIHBhc3NlcyBpdHMgb3duIOKAlCB3aGljaCBpcyB3aGF0IGtlZXBzXG4gICAgLy8gYEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvYCdzIHBvcG92ZXIgei1pbmRleCBmaXggaW4gcGxheS5cbiAgICB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS50cmlnZ2VyKCdob3Zlci1saW5rJywge1xuICAgICAgZXZlbnQ6ICRldmVudCxcbiAgICAgIGhvdmVyUGFyZW50OiB0aGlzLmluZm8sXG4gICAgICBsaW5rdGV4dDogbGlua1RleHQsXG4gICAgICBzb3VyY2U6ICdwcmV2aWV3JyxcbiAgICAgIHNvdXJjZVBhdGg6IHRoaXMuaW5mby5wYXRoLFxuICAgICAgdGFyZ2V0RWxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkludGVybmFsTGlua1JpZ2h0Q2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXRFbDogSFRNTEVsZW1lbnQsIGxpbmtUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZW51ID0gTWVudS5mb3JFdmVudCgkZXZlbnQpO1xuICAgIG1lbnUuc2V0UGFyZW50RWxlbWVudCh0YXJnZXRFbCk7XG4gICAgbWVudS5hZGRTZWN0aW9ucyhJTlRFUk5BTF9MSU5LX01FTlVfU0VDVElPTlMpO1xuICAgIGFkZENvcHlNZW51SXRlbShtZW51LCB0YXJnZXRFbCk7XG4gICAgdGhpcy5pbmZvLmFwcC53b3Jrc3BhY2UuaGFuZGxlTGlua0NvbnRleHRNZW51KG1lbnUsIGxpbmtUZXh0LCB0aGlzLmluZm8ucGF0aCk7XG4gIH1cblxuICBwdWJsaWMgb25UYWdDbGljayhfJGV2ZW50OiBNb3VzZUV2ZW50LCBfdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCB0YWc6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGByZWdpc3RlckRvbUV2ZW50c2AgaGFzIGFscmVhZHkgY2FsbGVkIGBwcmV2ZW50RGVmYXVsdCgpYCBmb3IgYSB0YWcgY2xpY2suXG4gICAgdGhpcy5pbmZvLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkdsb2JhbFNlYXJjaCk/Lm9wZW5HbG9iYWxTZWFyY2goYHRhZzoke3RhZ31gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgbWFya2Rvd24gYW5kIGVtYmVkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdWxsIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdWxsIHJlbmRlciBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZ1bGxSZW5kZXIocGFyYW1zOiBGdWxsUmVuZGVyUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBwYXJhbXMuc291cmNlUGF0aCA/PyAnLyc7XG4gIGxldCBzaG91bGRVbmxvYWRDb21wb25lbnQgPSBmYWxzZTtcbiAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50O1xuICBpZiAocGFyYW1zLmNvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudCA9IHBhcmFtcy5jb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudCgpO1xuICAgIGNvbXBvbmVudC5sb2FkKCk7XG4gICAgc2hvdWxkVW5sb2FkQ29tcG9uZW50ID0gdHJ1ZTtcbiAgfVxuXG4gIHVzaW5nIF8gPSBjb21wb25lbnQuYWRkQ2hpbGQobmV3IEVtYmVkQnlFeHRlbnNpb25NZFBhdGNoQ29tcG9uZW50KHBhcmFtcy5hcHAuZW1iZWRSZWdpc3RyeS5lbWJlZEJ5RXh0ZW5zaW9uKSk7XG5cbiAgYXdhaXQgTWFya2Rvd25SZW5kZXJlci5yZW5kZXIocGFyYW1zLmFwcCwgcGFyYW1zLm1hcmtkb3duLCBwYXJhbXMuZWwsIHNvdXJjZVBhdGgsIGNvbXBvbmVudCk7XG5cbiAgaWYgKHNob3VsZFVubG9hZENvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudC51bmxvYWQoKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2hvdWxkUmVnaXN0ZXJMaW5rSGFuZGxlcnMpIHtcbiAgICByZWdpc3RlckxpbmtIYW5kbGVycyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UmVnaXN0ZXJMaW5rSGFuZGxlcnNQYXJhbXM+KHtcbiAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgIGVsOiBwYXJhbXMuZWwsXG4gICAgICBzb3VyY2VQYXRoOiBwYXJhbXMuc291cmNlUGF0aFxuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2hvdWxkUmVnaXN0ZXJGb2xkSGFuZGxlcnMpIHtcbiAgICByZWdpc3RlckZvbGRIYW5kbGVycyh7IGVsOiBwYXJhbXMuZWwgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBNYXJrZG93biB0byBIVE1MLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgSFRNTCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXJrZG93blRvSHRtbChwYXJhbXM6IE1hcmtkb3duVG9IdG1sUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBtYXJrZG93bixcbiAgICBzb3VyY2VQYXRoID0gJydcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudCgpO1xuICBjb21wb25lbnQubG9hZCgpO1xuICBjb25zdCByZW5kZXJEaXYgPSBjcmVhdGVEaXYoKTtcbiAgYXdhaXQgTWFya2Rvd25SZW5kZXJlci5yZW5kZXIoYXBwLCBtYXJrZG93biwgcmVuZGVyRGl2LCBzb3VyY2VQYXRoLCBjb21wb25lbnQpO1xuICBjb25zdCBodG1sID0gcmVuZGVyRGl2LmlubmVySFRNTDtcbiAgY29tcG9uZW50LnVubG9hZCgpO1xuICByZXR1cm4gaHRtbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgbGluayBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQsIHNvIGl0cyBsaW5rcyBhY3QgYXMgdGhleSBkbyBpbiBhIFJlYWRpbmcgdmlldzogY2xpY2ssXG4gKiBtb2QtY2xpY2ssIG1pZGRsZS1jbGljaywgZHJhZywgaG92ZXIgcHJldmlldywgdGhlIGNvbnRleHQgbWVudSwgdGFncywgYW5kIGZvb3Rub3RlIGxpbmtzLCB3aGljaCBzY3JvbGxcbiAqIHRvIHRoZWlyIGZvb3Rub3RlIGFuZCBiYWNrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmVnaXN0ZXJpbmcgbGluayBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTGlua0hhbmRsZXJzKHBhcmFtczogUmVnaXN0ZXJMaW5rSGFuZGxlcnNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBlbCxcbiAgICBzb3VyY2VQYXRoID0gJydcbiAgfSA9IHBhcmFtcztcbiAgTWFya2Rvd25QcmV2aWV3UmVuZGVyZXIucmVnaXN0ZXJEb21FdmVudHMoXG4gICAgZWwsXG4gICAgbmV3IExpbmtEb21FdmVudHNIYW5kbGVycyhcbiAgICAgIG5ldyBGaXhlZFpJbmRleERvbUV2ZW50c0hhbmRsZXJzSW5mbyh7XG4gICAgICAgIGFwcCxcbiAgICAgICAgZWwsXG4gICAgICAgIHBhdGg6IHNvdXJjZVBhdGhcbiAgICAgIH0pXG4gICAgKVxuICApO1xuICAvLyBgcmVnaXN0ZXJEb21FdmVudHNgIGhhbmRsZXMgYSBmb290bm90ZSBsaW5rJ3MgaG92ZXIsIGJ1dCBpdHMgY2xpY2sgb25seSBpbnNpZGUgYSBSZWFkaW5nIHZpZXcuXG4gIHJlZ2lzdGVyRm9vdG5vdGVMaW5rSGFuZGxlcih7IGVsIH0pO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYW4gZXh0ZXJuYWwgbGluay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmRlcmluZyB0aGUgZXh0ZXJuYWwgbGluay5cbiAqIEByZXR1cm5zIFRoZSBIVE1MQW5jaG9yRWxlbWVudCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBleHRlcm5hbCBsaW5rLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyRXh0ZXJuYWxMaW5rKHBhcmFtczogUmVuZGVyRXh0ZXJuYWxMaW5rUGFyYW1zKTogUHJvbWlzZTxIVE1MQW5jaG9yRWxlbWVudD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHVybFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXNwbGF5VGV4dCA9IHBhcmFtcy5kaXNwbGF5VGV4dCA/PyB1cmw7XG4gIGNvbnN0IHdyYXBwZXJFbCA9IGNyZWF0ZVNwYW4oKTtcbiAgYXdhaXQgZnVsbFJlbmRlcih7XG4gICAgYXBwLFxuICAgIGVsOiB3cmFwcGVyRWwsXG4gICAgbWFya2Rvd246IGBbJHtkaXNwbGF5VGV4dH1dKCR7dXJsfSlgXG4gIH0pO1xuICBjb25zdCBhRWwgPSB3cmFwcGVyRWwuZmluZCgnYScpIGFzIEhUTUxBbmNob3JFbGVtZW50O1xuICByZWdpc3RlckxpbmtIYW5kbGVycyh7XG4gICAgYXBwLFxuICAgIGVsOiBhRWxcbiAgfSk7XG4gIHJldHVybiBhRWw7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBpbnRlcm5hbCBsaW5rLlxuICpcbiAqIFdoYXQgY2xpY2tpbmcgdGhlIHJlbmRlcmVkIGxpbmsgZG9lcyBkZXBlbmRzIG9uIHdoYXQgaXQgbmFtZXM6XG4gKlxuICogLSBBIEZJTEUgaXMgb3BlbmVkIGJ5IE9ic2lkaWFuJ3Mgb3duIGxpbmsgaGFuZGxlciDigJQgYW5kLCB3aXRoXG4gKiAgIHtAbGluayBSZW5kZXJJbnRlcm5hbExpbmtQYXJhbXMuc2hvdWxkUmV2ZWFsRmlsZX0sIGFkZGl0aW9uYWxseSByZXZlYWxlZCBpbiB0aGUgZmlsZSBleHBsb3Jlci5cbiAqIC0gQSBGT0xERVIgY2Fubm90IGJlIG9wZW5lZCwgc28gaXRzIEZPTERFUiBOT1RFIGlzIOKAlCB0aGUgbm90ZSB3aG9zZSBwcm9wZXJ0aWVzIGRlc2NyaWJlIHRoZSBmb2xkZXJcbiAqICAgaXRzZWxmLCByZXNvbHZlZCB0aHJvdWdoIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0gKGJ5IGRlZmF1bHQgZnJvbSB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgXG4gKiAgIHBsdWdpbidzIGxpdmUgY29uZmlndXJhdGlvbikuIFRoZSByZXZlYWwgbGFuZHMgb24gdGhhdCBub3RlLCB1bmxlc3MgdGhlIG5vdGUgaXMgaGlkZGVuIGluIHRoZVxuICogICBleHBsb3JlciwgaW4gd2hpY2ggY2FzZSBpdCBsYW5kcyBvbiB0aGUgZm9sZGVyIOKAlCByZXZlYWxpbmcgYSBoaWRkZW4gbm90ZSB3b3VsZCBoaWdobGlnaHQgbm90aGluZy5cbiAqICAgQSBmb2xkZXIgd2l0aCBOTyBmb2xkZXIgbm90ZSByZXZlYWxzIHRoZSBmb2xkZXIgYW5kIG9wZW5zIG5vdGhpbmc6IG5vdGhpbmcgaGVyZSBldmVyIGNyZWF0ZXMgYSBub3RlLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaXMgcmVzb2x2ZWQgYXQgQ0xJQ0sgdGltZSByYXRoZXIgdGhhbiBhdCByZW5kZXIgdGltZSwgZGVsaWJlcmF0ZWx5OiBhIHJlbmRlcmVkIGxpbmsgb3V0bGl2ZXNcbiAqIHRoZSBvcGVyYXRpb24gdGhhdCBwcm9kdWNlZCBpdCwgc28gYSBkZXN0aW5hdGlvbiByZW5hbWVkIGluIGJldHdlZW4gc3RpbGwgcmV2ZWFscyB0aGUgcmlnaHQgaXRlbSwgYW5kIGFcbiAqIGZvbGRlciBub3RlIHdyaXR0ZW4gYWZ0ZXIgdGhlIGxpbmsgYXBwZWFyZWQgaXMgc3RpbGwgZm91bmQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZW5kZXJpbmcgdGhlIGludGVybmFsIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgSFRNTEFuY2hvckVsZW1lbnQgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgaW50ZXJuYWwgbGluay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlckludGVybmFsTGluayhwYXJhbXM6IFJlbmRlckludGVybmFsTGlua1BhcmFtcyk6IFByb21pc2U8SFRNTEFuY2hvckVsZW1lbnQ+IHtcbiAgY29uc3Qge1xuICAgIGFmdGVyUmV2ZWFsLFxuICAgIGFwcCxcbiAgICBmb2xkZXJOb3RlLFxuICAgIHBhdGhPckFic3RyYWN0RmlsZSxcbiAgICBzaG91bGRSZXZlYWxGaWxlID0gZmFsc2VcbiAgfSA9IHBhcmFtcztcblxuICAvLyBBIERPTSBsaXN0ZW5lciBjYW5ub3QgYXdhaXQsIHNvIHRoZSByZXZlYWwsIGFuZCB0aGUgaG9vayBvcmRlcmVkIGFmdGVyIGl0LCBydW4gZGV0YWNoZWQuXG4gIGZ1bmN0aW9uIHJldmVhbChhYnN0cmFjdEZpbGVUb1JldmVhbDogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHJldmVhbEluRmlsZUV4cGxvcmVyKHsgYWJzdHJhY3RGaWxlOiBhYnN0cmFjdEZpbGVUb1JldmVhbCwgYXBwIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJSZXZlYWw/LigpO1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IGFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckFic3RyYWN0RmlsZSk7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gcGFyYW1zLmRpc3BsYXlUZXh0ID8/IHBhdGg7XG4gIGlmIChpc0ZvbGRlcihhYnN0cmFjdEZpbGUpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsKCdhJywgeyB0ZXh0OiBkaXNwbGF5VGV4dCB9LCAoYUVsKSA9PiB7XG4gICAgICBhRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBjb25maWcgPSByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZyh7IGFwcCwgLi4uZm9sZGVyTm90ZSB9KTtcbiAgICAgICAgY29uc3QgZm9sZGVyTm90ZUZpbGUgPSByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgY29uZmlnLCBmb2xkZXI6IGFic3RyYWN0RmlsZSB9KTtcbiAgICAgICAgcmV2ZWFsKGZvbGRlck5vdGVGaWxlICYmICFjb25maWcuaXNIaWRkZW4gPyBmb2xkZXJOb3RlRmlsZSA6IGFic3RyYWN0RmlsZSk7XG4gICAgICAgIGlmIChmb2xkZXJOb3RlRmlsZSkge1xuICAgICAgICAgIC8vIEEgRE9NIGxpc3RlbmVyIGNhbm5vdCBhd2FpdCwgYW5kIHRoZSBvcGVuIGhhcyB0byBvdXRsaXZlIHRoaXMgaGFuZGxlcjogaXQgc2V0dGxlcyBmaXJzdCwgZm9yXG4gICAgICAgICAgLy8gdGhlIGNsaWNrIHRoYXQgbGFuZHMgcmlnaHQgYXMgYW4gb3BlcmF0aW9uIGZpbmlzaGVzIHdyaXRpbmcuXG4gICAgICAgICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gb3BlbkFmdGVyU2V0dGxpbmcoYXBwLCBmb2xkZXJOb3RlRmlsZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZXJFbCA9IGNyZWF0ZVNwYW4oKTtcbiAgYXdhaXQgZnVsbFJlbmRlcih7XG4gICAgYXBwLFxuICAgIGVsOiB3cmFwcGVyRWwsXG4gICAgbWFya2Rvd246IGBbWyR7cGF0aH18JHtkaXNwbGF5VGV4dH1dXWBcbiAgfSk7XG4gIGNvbnN0IGFFbCA9IHdyYXBwZXJFbC5maW5kKCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gIHJlZ2lzdGVyTGlua0hhbmRsZXJzKHtcbiAgICBhcHAsXG4gICAgZWw6IGFFbFxuICB9KTtcbiAgaWYgKHNob3VsZFJldmVhbEZpbGUpIHtcbiAgICBhRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAvLyBMYXllcmVkIE9OIFRPUCBvZiBPYnNpZGlhbidzIG93biBoYW5kbGVyIOKAlCBubyBgcHJldmVudERlZmF1bHRgLCBzbyB0aGUgb3BlbiBpcyB1bnRvdWNoZWQuIEEgcGF0aFxuICAgICAgLy8gdGhhdCByZXNvbHZlcyB0byBub3RoaW5nIGdldHMgbm8gcmV2ZWFsOiBhbiB1bnJlc29sdmVkIGxpbmsgaGFzIG5vdGhpbmcgdG8gcmV2ZWFsLCBhbmQgY2xpY2tpbmdcbiAgICAgIC8vIG9uZSBDUkVBVEVTIHRoZSBub3RlIGl0IG5hbWVzLlxuICAgICAgY29uc3QgZmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICByZXZlYWwoZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGFFbDtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBgY2xpcGJvYXJkYC1zZWN0aW9uIENvcHkgaXRlbSBldmVyeSBsaW5rIGNvbnRleHQgbWVudSBjYXJyaWVzLCBjb3B5aW5nIHRoZSBsaW5rJ3MgRElTUExBWVxuICogdGV4dCDigJQgd2hpY2ggaXMgd2hhdCBPYnNpZGlhbidzIG93biBtZW51IGNvcGllcywgbm90IHRoZSB0YXJnZXQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gbWVudSAtIFRoZSBtZW51IHRvIGFkZCB0aGUgaXRlbSB0by5cbiAqIEBwYXJhbSB0YXJnZXRFbCAtIFRoZSBsaW5rIGVsZW1lbnQgdGhlIG1lbnUgd2FzIG9wZW5lZCBvbi5cbiAqL1xuZnVuY3Rpb24gYWRkQ29weU1lbnVJdGVtKG1lbnU6IE1lbnUsIHRhcmdldEVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICBpdGVtXG4gICAgICAuc2V0U2VjdGlvbignY2xpcGJvYXJkJylcbiAgICAgIC5zZXRUaXRsZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLm1lbnUuY29weSkpXG4gICAgICAuc2V0SWNvbignbHVjaWRlLWNvcHknKVxuICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0YXJnZXRFbC53aW4ubmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGFyZ2V0RWwuZ2V0VGV4dCgpKSk7XG4gICAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgYSBmaWxlIGluIHRoZSBhY3RpdmUgbGVhZiwgb25jZSB0aGUgdmF1bHQgaGFzIHNldHRsZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIG9wZW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpbGUgaXMgb3Blbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlbkFmdGVyU2V0dGxpbmcoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERUxBWV9CRUZPUkVfT1BFTl9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gIGF3YWl0IGFwcC53b3Jrc3BhY2UuZ2V0TGVhZigpLm9wZW5GaWxlKGZpbGUsIHsgYWN0aXZlOiB0cnVlIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS1AsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyw0QkFBNEI7QUFDckM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFB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
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
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';
|
|
34
|
+
import type { ModalParamsBase } from './modal.mjs';
|
|
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>;
|