@mnaoumov/obsidian-lib 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/dist/lib/cjs/__merged.cjs +54 -64
- package/dist/lib/cjs/__merged.d.cts +5 -3
- package/dist/lib/cjs/active-file-provider.cjs +40 -64
- package/dist/lib/cjs/app.cjs +40 -64
- package/dist/lib/cjs/async-with-notice.cjs +40 -64
- package/dist/lib/cjs/attachment-path.cjs +101 -72
- package/dist/lib/cjs/attachment-path.d.cts +21 -43
- package/dist/lib/cjs/attachment-unit-folder.cjs +40 -64
- package/dist/lib/cjs/attachment-unit-folder.d.cts +8 -9
- package/dist/lib/cjs/backlink-index.cjs +41 -65
- package/dist/lib/cjs/backlink.cjs +40 -64
- package/dist/lib/cjs/bases-view-registrar.cjs +40 -64
- package/dist/lib/cjs/callout.cjs +40 -64
- package/dist/lib/cjs/canvas.cjs +40 -64
- package/dist/lib/cjs/case-insensitive-file-index.cjs +40 -64
- package/dist/lib/cjs/code-block-markdown-information.cjs +40 -64
- package/dist/lib/cjs/code-block-reg-exp.cjs +40 -64
- package/dist/lib/cjs/codemirror/index.cjs +40 -64
- package/dist/lib/cjs/codemirror/state-field-spec.cjs +40 -64
- package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +40 -64
- package/dist/lib/cjs/command-handlers/command-handler-component.cjs +40 -64
- package/dist/lib/cjs/command-handlers/command-handler.cjs +40 -64
- package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +40 -64
- package/dist/lib/cjs/command-handlers/file-command-handler.cjs +40 -64
- package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +40 -64
- package/dist/lib/cjs/command-handlers/global-command-handler.cjs +40 -64
- package/dist/lib/cjs/command-handlers/index.cjs +40 -64
- package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +40 -64
- package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +40 -64
- package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +40 -64
- package/dist/lib/cjs/command-registrar.cjs +40 -64
- package/dist/lib/cjs/community-plugins.cjs +40 -64
- package/dist/lib/cjs/components/abort-signal-component.cjs +40 -64
- package/dist/lib/cjs/components/all-windows-event-component.cjs +40 -64
- package/dist/lib/cjs/components/async-error-handler-component.cjs +40 -64
- package/dist/lib/cjs/components/async-events-component.cjs +40 -64
- package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +40 -64
- package/dist/lib/cjs/components/component-ex.cjs +41 -65
- package/dist/lib/cjs/components/console-debug-component.cjs +40 -64
- package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +40 -64
- package/dist/lib/cjs/components/disposable-component.cjs +40 -64
- package/dist/lib/cjs/components/embed-extensions-component.cjs +40 -64
- package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +40 -64
- package/dist/lib/cjs/components/index.cjs +40 -64
- package/dist/lib/cjs/components/layout-ready-component.cjs +40 -64
- package/dist/lib/cjs/components/menu-event-registrar-component.cjs +40 -64
- package/dist/lib/cjs/components/monkey-around-component.cjs +40 -64
- package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +40 -64
- package/dist/lib/cjs/components/plugin-context-component.cjs +40 -64
- package/dist/lib/cjs/components/plugin-gate-component.cjs +41 -65
- package/dist/lib/cjs/components/plugin-notice-component.cjs +46 -65
- package/dist/lib/cjs/components/plugin-notice-component.d.cts +3 -0
- package/dist/lib/cjs/components/plugin-settings-component.cjs +41 -65
- package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +40 -64
- package/dist/lib/cjs/components/plugin-suggestion-component.cjs +40 -64
- package/dist/lib/cjs/components/pointer-position-component.cjs +40 -64
- package/dist/lib/cjs/components/registry-component.cjs +40 -64
- package/dist/lib/cjs/components/release-notes-component.cjs +42 -65
- package/dist/lib/cjs/components/rename-delete-handler-component.cjs +40 -64
- package/dist/lib/cjs/components/rmdir-guard-component.cjs +40 -64
- package/dist/lib/cjs/components/settings-migration-component.cjs +44 -68
- package/dist/lib/cjs/components/settings-migration-component.d.cts +6 -4
- package/dist/lib/cjs/components/syntax-highlighting-component.cjs +40 -64
- package/dist/lib/cjs/components/templates-language-component.cjs +40 -64
- package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +40 -64
- package/dist/lib/cjs/constructors/index.cjs +40 -64
- package/dist/lib/cjs/css-class.cjs +40 -64
- package/dist/lib/cjs/data-handler.cjs +40 -64
- package/dist/lib/cjs/dataview-link.cjs +40 -64
- package/dist/lib/cjs/dataview.cjs +40 -64
- package/dist/lib/cjs/debug.cjs +40 -64
- package/dist/lib/cjs/demo-vault-helper-settings.cjs +40 -64
- package/dist/lib/cjs/demo-vault-helper.cjs +42 -65
- package/dist/lib/cjs/demo-vault-naming.cjs +40 -64
- package/dist/lib/cjs/desktop-demo-vault-opener.cjs +48 -71
- package/dist/lib/cjs/desktop-trusted-input.cjs +40 -64
- package/dist/lib/cjs/editor-extension-registrar.cjs +40 -64
- package/dist/lib/cjs/editor-suggest-registrar.cjs +40 -64
- package/dist/lib/cjs/editor.cjs +40 -64
- package/dist/lib/cjs/events.cjs +40 -64
- package/dist/lib/cjs/extensions-registrar.cjs +40 -64
- package/dist/lib/cjs/file-change.cjs +40 -64
- package/dist/lib/cjs/file-explorer.cjs +40 -64
- package/dist/lib/cjs/file-manager.cjs +40 -64
- package/dist/lib/cjs/file-system.cjs +45 -64
- package/dist/lib/cjs/file-system.d.cts +7 -0
- package/dist/lib/cjs/folder-note.cjs +40 -64
- package/dist/lib/cjs/frontmatter-formatting.cjs +41 -65
- package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +40 -64
- package/dist/lib/cjs/frontmatter.cjs +40 -64
- package/dist/lib/cjs/generated-during-build.cjs +42 -66
- package/dist/lib/cjs/generated-during-build.d.cts +8 -2
- package/dist/lib/cjs/hover-link-source-registrar.cjs +40 -64
- package/dist/lib/cjs/html-element.cjs +40 -64
- package/dist/lib/cjs/i18n/custom-type-options.cjs +40 -64
- package/dist/lib/cjs/i18n/default-translations.cjs +40 -64
- package/dist/lib/cjs/i18n/i18n.cjs +40 -64
- package/dist/lib/cjs/i18n/index.cjs +40 -64
- package/dist/lib/cjs/i18n/locales/en.cjs +40 -64
- package/dist/lib/cjs/i18n/locales/index.cjs +40 -64
- package/dist/lib/cjs/i18n/locales/translations-map.cjs +40 -64
- package/dist/lib/cjs/index.cjs +40 -64
- package/dist/lib/cjs/is-in-obsidian.cjs +40 -64
- package/dist/lib/cjs/library-styles.cjs +40 -64
- package/dist/lib/cjs/library.cjs +40 -64
- package/dist/lib/cjs/link-name.cjs +40 -64
- package/dist/lib/cjs/link-update-progress.cjs +40 -64
- package/dist/lib/cjs/link.cjs +40 -64
- package/dist/lib/cjs/logger.cjs +40 -64
- package/dist/lib/cjs/loop.cjs +40 -64
- package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +40 -64
- package/dist/lib/cjs/markdown-code-block-processor.cjs +40 -64
- package/dist/lib/cjs/markdown-post-processor-registrar.cjs +40 -64
- package/dist/lib/cjs/markdown-view.cjs +40 -64
- package/dist/lib/cjs/markdown.cjs +40 -64
- package/dist/lib/cjs/menu-event-registrar.cjs +40 -64
- package/dist/lib/cjs/metadata-cache.cjs +64 -70
- package/dist/lib/cjs/metadata-cache.d.cts +8 -19
- package/dist/lib/cjs/mobile-trusted-input.cjs +40 -64
- package/dist/lib/cjs/modals/alert.cjs +40 -64
- package/dist/lib/cjs/modals/confirm.cjs +40 -64
- package/dist/lib/cjs/modals/index.cjs +40 -64
- package/dist/lib/cjs/modals/minimizable-modal.cjs +40 -64
- package/dist/lib/cjs/modals/modal-command-builder.cjs +40 -64
- package/dist/lib/cjs/modals/modal.cjs +40 -64
- package/dist/lib/cjs/modals/prompt.cjs +40 -64
- package/dist/lib/cjs/modals/select-item.cjs +40 -64
- package/dist/lib/cjs/modals/select-option.cjs +40 -64
- package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +40 -64
- package/dist/lib/cjs/note-priority.cjs +41 -65
- package/dist/lib/cjs/notebook-navigator.cjs +40 -64
- package/dist/lib/cjs/obsidian-dev-utils-state.cjs +40 -64
- package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +40 -64
- package/dist/lib/cjs/obsidian-settings.cjs +40 -64
- package/dist/lib/cjs/parse-link.cjs +40 -64
- package/dist/lib/cjs/path-settings.cjs +40 -64
- package/dist/lib/cjs/pdf.cjs +40 -64
- package/dist/lib/cjs/plugin/index.cjs +43 -64
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-api-schema.cjs +171 -0
- package/dist/lib/cjs/plugin/plugin-api-schema.d.cts +59 -0
- package/dist/lib/cjs/plugin/plugin-api.cjs +46 -64
- package/dist/lib/cjs/plugin/plugin-api.d.cts +83 -10
- package/dist/lib/cjs/plugin/plugin-context.cjs +40 -64
- package/dist/lib/cjs/plugin/plugin-event-source.cjs +40 -64
- package/dist/lib/cjs/plugin/plugin-install-state.cjs +40 -64
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +40 -64
- package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +41 -65
- package/dist/lib/cjs/plugin/plugin.cjs +41 -65
- package/dist/lib/cjs/plugin/settings-migration-api.cjs +69 -64
- package/dist/lib/cjs/plugin/settings-migration-api.d.cts +16 -3
- package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +40 -64
- package/dist/lib/cjs/popovers/field-popover.cjs +40 -64
- package/dist/lib/cjs/popovers/index.cjs +40 -64
- package/dist/lib/cjs/popovers/popover-anchor.cjs +40 -64
- package/dist/lib/cjs/popovers/popover.cjs +40 -64
- package/dist/lib/cjs/property-entry.cjs +40 -64
- package/dist/lib/cjs/queue.cjs +40 -64
- package/dist/lib/cjs/react/app-context.cjs +40 -64
- package/dist/lib/cjs/react/index.cjs +40 -64
- package/dist/lib/cjs/reference.cjs +40 -64
- package/dist/lib/cjs/resource-lock.cjs +40 -64
- package/dist/lib/cjs/resource-url.cjs +40 -64
- package/dist/lib/cjs/ribbon-icon-registrar.cjs +40 -64
- package/dist/lib/cjs/setting-components/checkbox-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/date-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/date-time-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/email-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/file-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/index.cjs +40 -64
- package/dist/lib/cjs/setting-components/month-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +41 -65
- package/dist/lib/cjs/setting-components/multiple-email-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/multiple-file-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/multiple-text-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/number-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/password-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +40 -64
- package/dist/lib/cjs/setting-components/telephone-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/text-based-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/time-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/typed-text-component.cjs +41 -65
- package/dist/lib/cjs/setting-components/url-component.cjs +40 -64
- package/dist/lib/cjs/setting-components/validator-component.cjs +41 -65
- package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +40 -64
- package/dist/lib/cjs/setting-components/week-component.cjs +40 -64
- package/dist/lib/cjs/setting-ex.cjs +40 -64
- package/dist/lib/cjs/setting-group-ex.cjs +40 -64
- package/dist/lib/cjs/status-bar-item-registrar.cjs +40 -64
- package/dist/lib/cjs/templater.cjs +40 -64
- package/dist/lib/cjs/transformers/duration-transformer.cjs +40 -64
- package/dist/lib/cjs/transformers/index.cjs +40 -64
- package/dist/lib/cjs/trusted-input.cjs +40 -64
- package/dist/lib/cjs/validation.cjs +40 -64
- package/dist/lib/cjs/vault-delete.cjs +40 -64
- package/dist/lib/cjs/vault-transaction.cjs +40 -64
- package/dist/lib/cjs/vault.cjs +41 -65
- package/dist/lib/cjs/view-registrar.cjs +40 -64
- package/dist/lib/cjs/workspace.cjs +40 -64
- package/dist/lib/esm/__merged.d.mts +5 -3
- package/dist/lib/esm/__merged.mjs +20 -14
- package/dist/lib/esm/active-file-provider.mjs +6 -14
- package/dist/lib/esm/app.mjs +6 -14
- package/dist/lib/esm/async-with-notice.mjs +6 -14
- package/dist/lib/esm/attachment-path.d.mts +21 -43
- package/dist/lib/esm/attachment-path.mjs +70 -22
- package/dist/lib/esm/attachment-unit-folder.d.mts +8 -9
- package/dist/lib/esm/attachment-unit-folder.mjs +6 -14
- package/dist/lib/esm/backlink-index.mjs +6 -14
- package/dist/lib/esm/backlink.mjs +6 -14
- package/dist/lib/esm/bases-view-registrar.mjs +6 -14
- package/dist/lib/esm/callout.mjs +6 -14
- package/dist/lib/esm/canvas.mjs +6 -14
- package/dist/lib/esm/case-insensitive-file-index.mjs +6 -14
- package/dist/lib/esm/code-block-markdown-information.mjs +5 -13
- package/dist/lib/esm/code-block-reg-exp.mjs +6 -14
- package/dist/lib/esm/codemirror/index.mjs +6 -14
- package/dist/lib/esm/codemirror/state-field-spec.mjs +5 -13
- package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +6 -14
- package/dist/lib/esm/command-handlers/command-handler-component.mjs +6 -14
- package/dist/lib/esm/command-handlers/command-handler.mjs +6 -14
- package/dist/lib/esm/command-handlers/editor-command-handler.mjs +6 -14
- package/dist/lib/esm/command-handlers/file-command-handler.mjs +6 -14
- package/dist/lib/esm/command-handlers/folder-command-handler.mjs +6 -14
- package/dist/lib/esm/command-handlers/global-command-handler.mjs +6 -14
- package/dist/lib/esm/command-handlers/index.mjs +6 -14
- package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.mjs +6 -14
- package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +6 -14
- package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +6 -14
- package/dist/lib/esm/command-registrar.mjs +6 -14
- package/dist/lib/esm/community-plugins.mjs +6 -14
- package/dist/lib/esm/components/abort-signal-component.mjs +6 -14
- package/dist/lib/esm/components/all-windows-event-component.mjs +6 -14
- package/dist/lib/esm/components/async-error-handler-component.mjs +6 -14
- package/dist/lib/esm/components/async-events-component.mjs +6 -14
- package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +6 -14
- package/dist/lib/esm/components/component-ex.mjs +6 -14
- package/dist/lib/esm/components/console-debug-component.mjs +6 -14
- package/dist/lib/esm/components/core-plugin-toggle-component.mjs +6 -14
- package/dist/lib/esm/components/disposable-component.mjs +6 -14
- package/dist/lib/esm/components/embed-extensions-component.mjs +6 -14
- package/dist/lib/esm/components/generate-markdown-link-default-params-component.mjs +6 -14
- package/dist/lib/esm/components/index.mjs +6 -14
- package/dist/lib/esm/components/layout-ready-component.mjs +6 -14
- package/dist/lib/esm/components/menu-event-registrar-component.mjs +6 -14
- package/dist/lib/esm/components/monkey-around-component.mjs +6 -14
- package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.mjs +6 -14
- package/dist/lib/esm/components/plugin-context-component.mjs +6 -14
- package/dist/lib/esm/components/plugin-gate-component.mjs +6 -14
- package/dist/lib/esm/components/plugin-notice-component.d.mts +3 -0
- package/dist/lib/esm/components/plugin-notice-component.mjs +12 -15
- package/dist/lib/esm/components/plugin-settings-component.mjs +6 -14
- package/dist/lib/esm/components/plugin-settings-tab-component.mjs +6 -14
- package/dist/lib/esm/components/plugin-suggestion-component.mjs +6 -14
- package/dist/lib/esm/components/pointer-position-component.mjs +6 -14
- package/dist/lib/esm/components/registry-component.mjs +6 -14
- package/dist/lib/esm/components/release-notes-component.mjs +11 -15
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +6 -14
- package/dist/lib/esm/components/rmdir-guard-component.mjs +6 -14
- package/dist/lib/esm/components/settings-migration-component.d.mts +6 -4
- package/dist/lib/esm/components/settings-migration-component.mjs +10 -18
- package/dist/lib/esm/components/syntax-highlighting-component.mjs +6 -14
- package/dist/lib/esm/components/templates-language-component.mjs +6 -14
- package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.mjs +6 -14
- package/dist/lib/esm/constructors/index.mjs +6 -14
- package/dist/lib/esm/css-class.mjs +6 -14
- package/dist/lib/esm/data-handler.mjs +6 -14
- package/dist/lib/esm/dataview-link.mjs +6 -14
- package/dist/lib/esm/dataview.mjs +6 -14
- package/dist/lib/esm/debug.mjs +6 -14
- package/dist/lib/esm/demo-vault-helper-settings.mjs +5 -13
- package/dist/lib/esm/demo-vault-helper.mjs +8 -15
- package/dist/lib/esm/demo-vault-naming.mjs +6 -14
- package/dist/lib/esm/desktop-demo-vault-opener.mjs +17 -21
- package/dist/lib/esm/desktop-trusted-input.mjs +6 -14
- package/dist/lib/esm/editor-extension-registrar.mjs +6 -14
- package/dist/lib/esm/editor-suggest-registrar.mjs +6 -14
- package/dist/lib/esm/editor.mjs +6 -14
- package/dist/lib/esm/events.mjs +6 -14
- package/dist/lib/esm/extensions-registrar.mjs +6 -14
- package/dist/lib/esm/file-change.mjs +6 -14
- package/dist/lib/esm/file-explorer.mjs +6 -14
- package/dist/lib/esm/file-manager.mjs +6 -14
- package/dist/lib/esm/file-system.d.mts +7 -0
- package/dist/lib/esm/file-system.mjs +10 -14
- package/dist/lib/esm/folder-note.mjs +6 -14
- package/dist/lib/esm/frontmatter-formatting.mjs +6 -14
- package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +6 -14
- package/dist/lib/esm/frontmatter.mjs +6 -14
- package/dist/lib/esm/generated-during-build.d.mts +8 -2
- package/dist/lib/esm/generated-during-build.mjs +8 -16
- package/dist/lib/esm/hover-link-source-registrar.mjs +6 -14
- package/dist/lib/esm/html-element.mjs +6 -14
- package/dist/lib/esm/i18n/custom-type-options.mjs +6 -14
- package/dist/lib/esm/i18n/default-translations.mjs +6 -14
- package/dist/lib/esm/i18n/i18n.mjs +6 -14
- package/dist/lib/esm/i18n/index.mjs +6 -14
- package/dist/lib/esm/i18n/locales/en.mjs +6 -14
- package/dist/lib/esm/i18n/locales/index.mjs +6 -14
- package/dist/lib/esm/i18n/locales/translations-map.mjs +6 -14
- package/dist/lib/esm/index.mjs +6 -14
- package/dist/lib/esm/is-in-obsidian.mjs +6 -14
- package/dist/lib/esm/library-styles.mjs +6 -14
- package/dist/lib/esm/library.mjs +6 -14
- package/dist/lib/esm/link-name.mjs +6 -14
- package/dist/lib/esm/link-update-progress.mjs +5 -13
- package/dist/lib/esm/link.mjs +6 -14
- package/dist/lib/esm/logger.mjs +6 -14
- package/dist/lib/esm/loop.mjs +6 -14
- package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +6 -14
- package/dist/lib/esm/markdown-code-block-processor.mjs +6 -14
- package/dist/lib/esm/markdown-post-processor-registrar.mjs +6 -14
- package/dist/lib/esm/markdown-view.mjs +6 -14
- package/dist/lib/esm/markdown.mjs +6 -14
- package/dist/lib/esm/menu-event-registrar.mjs +5 -13
- package/dist/lib/esm/metadata-cache.d.mts +8 -19
- package/dist/lib/esm/metadata-cache.mjs +35 -21
- package/dist/lib/esm/mobile-trusted-input.mjs +6 -14
- package/dist/lib/esm/modals/alert.mjs +6 -14
- package/dist/lib/esm/modals/confirm.mjs +6 -14
- package/dist/lib/esm/modals/index.mjs +6 -14
- package/dist/lib/esm/modals/minimizable-modal.mjs +6 -14
- package/dist/lib/esm/modals/modal-command-builder.mjs +6 -14
- package/dist/lib/esm/modals/modal.mjs +6 -14
- package/dist/lib/esm/modals/prompt.mjs +6 -14
- package/dist/lib/esm/modals/select-item.mjs +6 -14
- package/dist/lib/esm/modals/select-option.mjs +6 -14
- package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +6 -14
- package/dist/lib/esm/note-priority.mjs +6 -14
- package/dist/lib/esm/notebook-navigator.mjs +6 -14
- package/dist/lib/esm/obsidian-dev-utils-state.mjs +6 -14
- package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +6 -14
- package/dist/lib/esm/obsidian-settings.mjs +6 -14
- package/dist/lib/esm/parse-link.mjs +6 -14
- package/dist/lib/esm/path-settings.mjs +6 -14
- package/dist/lib/esm/pdf.mjs +6 -14
- package/dist/lib/esm/plugin/index.d.mts +1 -0
- package/dist/lib/esm/plugin/index.mjs +8 -14
- package/dist/lib/esm/plugin/plugin-api-schema.d.mts +59 -0
- package/dist/lib/esm/plugin/plugin-api-schema.mjs +73 -0
- package/dist/lib/esm/plugin/plugin-api.d.mts +83 -10
- package/dist/lib/esm/plugin/plugin-api.mjs +11 -14
- package/dist/lib/esm/plugin/plugin-context.mjs +6 -14
- package/dist/lib/esm/plugin/plugin-event-source.mjs +6 -14
- package/dist/lib/esm/plugin/plugin-install-state.mjs +6 -14
- package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +6 -14
- package/dist/lib/esm/plugin/plugin-settings-tab.mjs +6 -14
- package/dist/lib/esm/plugin/plugin.mjs +6 -14
- package/dist/lib/esm/plugin/settings-migration-api.d.mts +16 -3
- package/dist/lib/esm/plugin/settings-migration-api.mjs +30 -14
- package/dist/lib/esm/plugin-cli-handler-registrar.mjs +6 -14
- package/dist/lib/esm/popovers/field-popover.mjs +6 -14
- package/dist/lib/esm/popovers/index.mjs +6 -14
- package/dist/lib/esm/popovers/popover-anchor.mjs +6 -14
- package/dist/lib/esm/popovers/popover.mjs +6 -14
- package/dist/lib/esm/property-entry.mjs +6 -14
- package/dist/lib/esm/queue.mjs +6 -14
- package/dist/lib/esm/react/app-context.mjs +6 -14
- package/dist/lib/esm/react/index.mjs +6 -14
- package/dist/lib/esm/reference.mjs +6 -14
- package/dist/lib/esm/resource-lock.mjs +6 -14
- package/dist/lib/esm/resource-url.mjs +6 -14
- package/dist/lib/esm/ribbon-icon-registrar.mjs +6 -14
- package/dist/lib/esm/setting-components/checkbox-component.mjs +6 -14
- package/dist/lib/esm/setting-components/code-highlighter-component.mjs +6 -14
- package/dist/lib/esm/setting-components/date-component.mjs +6 -14
- package/dist/lib/esm/setting-components/date-time-component.mjs +6 -14
- package/dist/lib/esm/setting-components/email-component.mjs +6 -14
- package/dist/lib/esm/setting-components/file-component.mjs +6 -14
- package/dist/lib/esm/setting-components/index.mjs +6 -14
- package/dist/lib/esm/setting-components/month-component.mjs +6 -14
- package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +6 -14
- package/dist/lib/esm/setting-components/multiple-email-component.mjs +6 -14
- package/dist/lib/esm/setting-components/multiple-file-component.mjs +6 -14
- package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -14
- package/dist/lib/esm/setting-components/number-component.mjs +6 -14
- package/dist/lib/esm/setting-components/password-component.mjs +6 -14
- package/dist/lib/esm/setting-components/setting-component-wrapper.mjs +6 -14
- package/dist/lib/esm/setting-components/telephone-component.mjs +6 -14
- package/dist/lib/esm/setting-components/text-based-component.mjs +6 -14
- package/dist/lib/esm/setting-components/time-component.mjs +6 -14
- package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +6 -14
- package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +6 -14
- package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +6 -14
- package/dist/lib/esm/setting-components/typed-range-text-component.mjs +6 -14
- package/dist/lib/esm/setting-components/typed-text-component.mjs +6 -14
- package/dist/lib/esm/setting-components/url-component.mjs +6 -14
- package/dist/lib/esm/setting-components/validator-component.mjs +6 -14
- package/dist/lib/esm/setting-components/value-component-with-change-tracking.mjs +5 -13
- package/dist/lib/esm/setting-components/week-component.mjs +6 -14
- package/dist/lib/esm/setting-ex.mjs +6 -14
- package/dist/lib/esm/setting-group-ex.mjs +6 -14
- package/dist/lib/esm/status-bar-item-registrar.mjs +6 -14
- package/dist/lib/esm/templater.mjs +6 -14
- package/dist/lib/esm/transformers/duration-transformer.mjs +6 -14
- package/dist/lib/esm/transformers/index.mjs +6 -14
- package/dist/lib/esm/trusted-input.mjs +6 -14
- package/dist/lib/esm/validation.mjs +6 -14
- package/dist/lib/esm/vault-delete.mjs +6 -14
- package/dist/lib/esm/vault-transaction.mjs +6 -14
- package/dist/lib/esm/vault.mjs +6 -14
- package/dist/lib/esm/view-registrar.mjs +6 -14
- package/dist/lib/esm/workspace.mjs +6 -14
- package/dist/styles.css +4 -1
- package/package.json +69 -24
- package/plugin/plugin-api-schema/package.json +6 -0
|
@@ -5,40 +5,32 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
5
5
|
|
|
6
6
|
(function () {
|
|
7
7
|
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
-
symbolConstructor.asyncDispose ??= symbolConstructor.for(
|
|
9
|
-
symbolConstructor.dispose ??= symbolConstructor.for(
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
function ensureBrowserProcess() {
|
|
13
13
|
const browserProcess = {
|
|
14
14
|
browser: true,
|
|
15
15
|
cwd() {
|
|
16
|
-
return
|
|
16
|
+
return "/";
|
|
17
17
|
},
|
|
18
18
|
env: {},
|
|
19
|
-
platform:
|
|
19
|
+
platform: "android"
|
|
20
20
|
};
|
|
21
|
-
|
|
22
|
-
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
23
21
|
const existingProcess = globalThis.process;
|
|
24
|
-
|
|
25
22
|
if (!existingProcess) {
|
|
26
|
-
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
27
23
|
globalThis.process = browserProcess;
|
|
28
24
|
return;
|
|
29
25
|
}
|
|
30
|
-
|
|
31
26
|
if (existingProcess.versions?.node) {
|
|
32
27
|
return;
|
|
33
28
|
}
|
|
34
|
-
|
|
35
29
|
const existingProcessRecord = existingProcess;
|
|
36
|
-
|
|
37
30
|
for (const [key, value] of Object.entries(browserProcess)) {
|
|
38
31
|
existingProcessRecord[key] ??= value;
|
|
39
32
|
}
|
|
40
|
-
|
|
41
|
-
existingProcessRecord['browser'] = true;
|
|
33
|
+
existingProcessRecord["browser"] = true;
|
|
42
34
|
}
|
|
43
35
|
|
|
44
36
|
function keepName($unknown) {
|
|
@@ -46,17 +38,13 @@ function keepName($unknown) {
|
|
|
46
38
|
}
|
|
47
39
|
|
|
48
40
|
(function initCjs() {
|
|
49
|
-
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
50
41
|
const globalThisRecord = globalThis;
|
|
51
42
|
ensureDisposeSymbols();
|
|
52
|
-
globalThisRecord[
|
|
53
|
-
globalThisRecord[
|
|
54
|
-
|
|
43
|
+
globalThisRecord["__name"] ??= keepName;
|
|
44
|
+
globalThisRecord["__extractDefault"] ??= extractDefault;
|
|
55
45
|
ensureBrowserProcess();
|
|
56
|
-
|
|
57
|
-
// eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
|
|
58
46
|
function extractDefault(module) {
|
|
59
|
-
return module && module.__esModule &&
|
|
47
|
+
return module && module.__esModule && "default" in module ? module.default : module;
|
|
60
48
|
}
|
|
61
49
|
})();
|
|
62
50
|
})();
|
|
@@ -65,8 +53,6 @@ function keepName($unknown) {
|
|
|
65
53
|
if (!originalRequire || originalRequire.__isPatched) {
|
|
66
54
|
return;
|
|
67
55
|
}
|
|
68
|
-
|
|
69
|
-
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
70
56
|
require = Object.assign(
|
|
71
57
|
(id) => requirePatched(id),
|
|
72
58
|
originalRequire,
|
|
@@ -74,53 +60,45 @@ function keepName($unknown) {
|
|
|
74
60
|
__isPatched: true
|
|
75
61
|
}
|
|
76
62
|
);
|
|
77
|
-
|
|
78
63
|
function extractDefault(module) {
|
|
79
|
-
return module && module.__esModule &&
|
|
64
|
+
return module && module.__esModule && "default" in module ? module.default : module;
|
|
80
65
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
'@codemirror/tooltip']
|
|
111
|
-
);
|
|
112
|
-
|
|
66
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
67
|
+
"@codemirror/autocomplete",
|
|
68
|
+
"@codemirror/collab",
|
|
69
|
+
"@codemirror/commands",
|
|
70
|
+
"@codemirror/language",
|
|
71
|
+
"@codemirror/lint",
|
|
72
|
+
"@codemirror/search",
|
|
73
|
+
"@codemirror/state",
|
|
74
|
+
"@codemirror/text",
|
|
75
|
+
"@codemirror/view",
|
|
76
|
+
"@lezer/common",
|
|
77
|
+
"@lezer/highlight",
|
|
78
|
+
"@lezer/lr",
|
|
79
|
+
"obsidian"
|
|
80
|
+
]);
|
|
81
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
82
|
+
"@codemirror/closebrackets",
|
|
83
|
+
"@codemirror/comment",
|
|
84
|
+
"@codemirror/fold",
|
|
85
|
+
"@codemirror/gutter",
|
|
86
|
+
"@codemirror/highlight",
|
|
87
|
+
"@codemirror/history",
|
|
88
|
+
"@codemirror/matchbrackets",
|
|
89
|
+
"@codemirror/panel",
|
|
90
|
+
"@codemirror/rangeset",
|
|
91
|
+
"@codemirror/rectangular-selection",
|
|
92
|
+
"@codemirror/stream-parser",
|
|
93
|
+
"@codemirror/tooltip"
|
|
94
|
+
]);
|
|
113
95
|
function requirePatched(id) {
|
|
114
96
|
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
115
97
|
return originalRequire?.(id);
|
|
116
98
|
}
|
|
117
|
-
|
|
118
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
119
99
|
if (globalThis.app.isMobile) {
|
|
120
|
-
if (id ===
|
|
121
|
-
// eslint-disable-next-line no-console -- Valid usage.
|
|
100
|
+
if (id === "process" || id === "node:process") {
|
|
122
101
|
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
123
|
-
|
|
124
102
|
return process;
|
|
125
103
|
}
|
|
126
104
|
} else {
|
|
@@ -129,8 +107,6 @@ function keepName($unknown) {
|
|
|
129
107
|
return extractDefault(module);
|
|
130
108
|
}
|
|
131
109
|
}
|
|
132
|
-
|
|
133
|
-
// eslint-disable-next-line no-console -- Valid usage.
|
|
134
110
|
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
135
111
|
return {};
|
|
136
112
|
}
|
|
@@ -189,6 +165,7 @@ __export(file_system_exports, {
|
|
|
189
165
|
isFolder: () => isFolder,
|
|
190
166
|
isMarkdownFile: () => isMarkdownFile,
|
|
191
167
|
isNote: () => isNote,
|
|
168
|
+
isPathOrFile: () => isPathOrFile,
|
|
192
169
|
isTreatedAsAttachment: () => isTreatedAsAttachment,
|
|
193
170
|
trimMarkdownExtension: () => trimMarkdownExtension
|
|
194
171
|
});
|
|
@@ -503,6 +480,9 @@ function isMarkdownFile(pathOrFile) {
|
|
|
503
480
|
function isNote(pathOrFile) {
|
|
504
481
|
return isMarkdownFile(pathOrFile) || isCanvasFile(pathOrFile) || isBaseFile(pathOrFile);
|
|
505
482
|
}
|
|
483
|
+
function isPathOrFile(value) {
|
|
484
|
+
return typeof value === "string" || isFile(value);
|
|
485
|
+
}
|
|
506
486
|
function isTreatedAsAttachment(params) {
|
|
507
487
|
const {
|
|
508
488
|
app,
|
|
@@ -589,7 +569,8 @@ function getResolvedPath(path) {
|
|
|
589
569
|
isFolder,
|
|
590
570
|
isMarkdownFile,
|
|
591
571
|
isNote,
|
|
572
|
+
isPathOrFile,
|
|
592
573
|
isTreatedAsAttachment,
|
|
593
574
|
trimMarkdownExtension
|
|
594
575
|
});
|
|
595
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2ZpbGUtc3lzdGVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB7QGxpbmsgVEFic3RyYWN0RmlsZX0sIHtAbGluayBURmlsZX0sIGFuZCB7QGxpbmsgVEZvbGRlcn0gaW5zdGFuY2VzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBleHRuYW1lLFxuICByZXNvbHZlXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IHRyaW1FbmQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVRGaWxlSW5zdGFuY2UsXG4gIGNyZWF0ZVRGb2xkZXJJbnN0YW5jZSxcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgcGFyZW50Rm9sZGVyUGF0aFxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVQYXRoLFxuICBUQWJzdHJhY3RGaWxlLFxuICBURmlsZSxcbiAgVEZvbGRlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBnZXRDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXggfSBmcm9tICcuL2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC50cyc7XG5pbXBvcnQge1xuICBjaGVja1Byb3BlcnR5RW50cnlNYXRjaGVzLFxuICBpc1Byb3BlcnR5RW50cnlcbn0gZnJvbSAnLi9wcm9wZXJ0eS1lbnRyeS50cyc7XG5cbi8qKlxuICogQSBmaWxlIGV4dGVuc2lvbiBmb3IgYGJhc2VgIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3QgQkFTRV9GSUxFX0VYVEVOU0lPTiA9ICdiYXNlJztcblxuLyoqXG4gKiBBIGZpbGUgZXh0ZW5zaW9uIGZvciBgY2FudmFzYCBmaWxlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IENBTlZBU19GSUxFX0VYVEVOU0lPTiA9ICdjYW52YXMnO1xuXG4vKipcbiAqIEEgZmlsZSBleHRlbnNpb24gZm9yIGBtYXJrZG93bmAgZmlsZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTiA9ICdtZCc7XG5cbi8qKlxuICogQSB0eXBlIG9mIGZpbGUgc3lzdGVtIG9iamVjdC5cbiAqL1xuZXhwb3J0IGVudW0gRmlsZVN5c3RlbVR5cGUge1xuICAvKipcbiAgICogQSBmaWxlLlxuICAgKi9cbiAgRmlsZSA9ICdmaWxlJyxcbiAgLyoqXG4gICAqIEEgZm9sZGVyLlxuICAgKi9cbiAgRm9sZGVyID0gJ2ZvbGRlcidcbn1cbi8qKlxuICogSG93IHtAbGluayBnZXRCYXNlbmFtZX0gYW5kIHtAbGluayBnZXRFeHRlbnNpb259IHNob3VsZCBhbnN3ZXIgZm9yIGEgcGF0aCB0aGF0IHJlc29sdmVzIHRvIG5vdGhpbmcgaW4gdGhlIHZhdWx0LlxuICpcbiAqIE5vdGhpbmcgaW4gdGhlIHZhdWx0IHNheXMgd2hldGhlciBhbiB1bnJlc29sdmVkIGBhbHBoYS5icmF2b2AgbmFtZXMgYSBkb3R0ZWQgZm9sZGVyIG9yIGEgYC5icmF2b2AgZmlsZSwgc28gdGhlIGNhbGxlciBkZWNpZGVzLlxuICovXG5leHBvcnQgZW51bSBNaXNzaW5nUGF0aFRyZWF0bWVudCB7XG4gIC8qKlxuICAgKiBSZWFkIHRoZSBwYXRoIGFzIGEgZmlsZSBwYXRoOiBgYWxwaGEuYnJhdm9gIGlzIGJhc2VuYW1lIGBhbHBoYWAgcGx1cyBleHRlbnNpb24gYGJyYXZvYC5cbiAgICovXG4gIEZpbGUgPSAnZmlsZScsXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBwYXRoIGFzIGEgZm9sZGVyIHBhdGg6IGBhbHBoYS5icmF2b2AgaXMgYmFzZW5hbWUgYGFscGhhLmJyYXZvYCB3aXRoIG5vIGV4dGVuc2lvbi5cbiAgICovXG4gIEZvbGRlciA9ICdmb2xkZXInLFxuICAvKipcbiAgICogVGhyb3cgaW5zdGVhZCBvZiBndWVzc2luZy4gVGhpcyBpcyB0aGUgZGVmYXVsdC5cbiAgICovXG4gIFRocm93ID0gJ3Rocm93J1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkb2VzRXhpc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvZXNFeGlzdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gV2hlbiBgdW5kZWZpbmVkYCBvciBub3Qgc3BlY2lmaWVkLCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0dWFsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCB0byBjaGVjay4gRGVmYXVsdCBpcyBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBGaWxlU3lzdGVtVHlwZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QWJzdHJhY3RGaWxlT3JOdWxsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBYnN0cmFjdEZpbGVPck51bGxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIFdoZW4gYHVuZGVmaW5lZGAgb3Igbm90IHNwZWNpZmllZCwgdGhlIGJlaGF2aW9yIGlzIGRldGVybWluZWQgYnkgdGhlIGFjdHVhbCBmaWxlIHN5c3RlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FzZUluc2Vuc2l0aXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZXRyaWV2ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEFic3RyYWN0RmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QWJzdHJhY3RGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLiBXaGVuIGB1bmRlZmluZWRgIG9yIG5vdCBzcGVjaWZpZWQsIHRoZSBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhY3R1YWwgZmlsZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmV0cmlldmUgdGhlIGFic3RyYWN0IGZpbGUgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCYXNlbmFtZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFzZW5hbWVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBhYnN0cmFjdCBmaWxlIHRvIGdldCB0aGUgYmFzZSBuYW1lIG9mLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xuXG4gIC8qKlxuICAgKiBIb3cgdG8gYW5zd2VyIHdoZW4gdGhlIHBhdGggcmVzb2x2ZXMgdG8gbm90aGluZyBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvd2BcbiAgICovXG4gIHJlYWRvbmx5IHdoZW5NaXNzaW5nVHJlYXRBcz86IE1pc3NpbmdQYXRoVHJlYXRtZW50O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRFeHRlbnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEV4dGVuc2lvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gZ2V0IHRoZSBleHRlbnNpb24gb2YuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG5cbiAgLyoqXG4gICAqIEhvdyB0byBhbnN3ZXIgd2hlbiB0aGUgcGF0aCByZXNvbHZlcyB0byBub3RoaW5nIGluIHRoZSB2YXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYE1pc3NpbmdQYXRoVHJlYXRtZW50LlRocm93YFxuICAgKi9cbiAgcmVhZG9ubHkgd2hlbk1pc3NpbmdUcmVhdEFzPzogTWlzc2luZ1BhdGhUcmVhdG1lbnQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEZpbGVPck51bGx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEZpbGVPck51bGxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIFdoZW4gYHVuZGVmaW5lZGAgb3Igbm90IHNwZWNpZmllZCwgdGhlIGJlaGF2aW9yIGlzIGRldGVybWluZWQgYnkgdGhlIGFjdHVhbCBmaWxlIHN5c3RlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FzZUluc2Vuc2l0aXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLiBXaGVuIGB1bmRlZmluZWRgIG9yIG5vdCBzcGVjaWZpZWQsIHRoZSBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhY3R1YWwgZmlsZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmV0cmlldmUgdGhlIGZpbGUgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gICAqICBJZiBgdHJ1ZWAsIGEgbmV3IGZpbGUgaXMgY3JlYXRlZCBmb3IgdGhlIHByb3ZpZGVkIHBhdGguXG4gICAqICBJZiBgZmFsc2VgLCBhbiBlcnJvciBpcyB0aHJvd24gaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGb2xkZXJPck51bGx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEZvbGRlck9yTnVsbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gV2hlbiBgdW5kZWZpbmVkYCBvciBub3Qgc3BlY2lmaWVkLCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0dWFsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmb2xkZXIgdG8gcmV0cmlldmUgdGhlIGZvbGRlciBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRm9sZGVyOiBudWxsIHwgUGF0aE9yRm9sZGVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGb2xkZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEZvbGRlclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gV2hlbiBgdW5kZWZpbmVkYCBvciBub3Qgc3BlY2lmaWVkLCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0dWFsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmb2xkZXIgaWRlbnRpZmllci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IHRoZSBmb2xkZXIgdG8gbm90IGV4aXN0LlxuICAgKiAgSWYgYHRydWVgLCBhIG5ldyBmb2xkZXIgaXMgY3JlYXRlZCBmb3IgdGhlIHByb3ZpZGVkIHBhdGguXG4gICAqICBJZiBgZmFsc2VgLCBhbiBlcnJvciBpcyB0aHJvd24gaWYgdGhlIGZvbGRlciBpcyBub3QgZm91bmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVOb25FeGlzdGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldE1hcmtkb3duRmlsZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldE1hcmtkb3duRmlsZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byByZWN1cnNpdmVseSBzZWFyY2ggZm9yIG1hcmtkb3duIGZpbGVzIHdpdGhpbiBzdWJmb2xkZXJzLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzUmVjdXJzaXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZm9sZGVyIHRvIHJldHJpZXZlIHRoZSBtYXJrZG93biBmaWxlcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRm9sZGVyOiBQYXRoT3JGb2xkZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzVHJlYXRlZEFzQXR0YWNobWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNUcmVhdGVkQXNBdHRhY2htZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UsIHdoaWNoIGxldHMgYSBgcHJvcGVydHk6YCBlbnRyeSBvZiB7QGxpbmsgYXR0YWNobWVudEV4dGVuc2lvbnN9IHJlYWQgdGhlIGZpbGUncyBmcm9udG1hdHRlciBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZS5cbiAgICogV2l0aG91dCBpdCwgYHByb3BlcnR5OmAgZW50cmllcyBtYXRjaCBub3RoaW5nIGFuZCBvbmx5IHRoZSBleHRlbnNpb24gZW50cmllcyBhcmUgZXZhbHVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwPzogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50cmllcyB0aGF0IG1hcmsgYSBmaWxlIGFzIGFuIGF0dGFjaG1lbnQsIGUuZy4gYFsnLmV4Y2FsaWRyYXcubWQnLCAncHJvcGVydHk6ZXhjYWxpZHJhdy1wbHVnaW4nXWAuXG4gICAqXG4gICAqIEFuIGV4dGVuc2lvbiBlbnRyeSBpcyBub3JtYWxpemVkIGJlZm9yZSBtYXRjaGluZzogc3Vycm91bmRpbmcgd2hpdGVzcGFjZSBpcyB0cmltbWVkLCBhIHNpbmdsZSBsZWFkaW5nIGRvdCBpcyBlbmZvcmNlZCwgYW5kIHRoZSBjb21wYXJpc29uIGlzXG4gICAqIGNhc2UtaW5zZW5zaXRpdmUuIEVtcHR5IGVudHJpZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqIEEgYHByb3BlcnR5Om5hbWVgIGVudHJ5IG1hdGNoZXMgYSBtYXJrZG93biBmaWxlIHdob3NlIGZyb250bWF0dGVyIGhhcyBgbmFtZWAsIGFuZCBgcHJvcGVydHk6bmFtZT12YWx1ZWAgb25lIHdob3NlIGBuYW1lYCByZW5kZXJzIGFzIGB2YWx1ZWAgXHUyMDE0IHRoZVxuICAgKiBzYW1lIHN5bnRheCBub3RlIHByaW9yaXRpZXMgdXNlLiBJdCBpcyBldmFsdWF0ZWQgb25seSB3aGVuIHtAbGluayBhcHB9IGlzIGdpdmVuLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEV4dGVuc2lvbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGNsYXNzaWZ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBBIHBhdGggb3IgYW4gYWJzdHJhY3QgZmlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGF0aE9yQWJzdHJhY3RGaWxlID0gc3RyaW5nIHwgVEFic3RyYWN0RmlsZTtcblxuLyoqXG4gKiBBIHBhdGggb3IgYSBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT3JGaWxlID0gc3RyaW5nIHwgVEZpbGU7XG5cbi8qKlxuICogQSBwYXRoIG9yIGEgZm9sZGVyLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT3JGb2xkZXIgPSBzdHJpbmcgfCBURm9sZGVyO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRDYWNoZWRGcm9udG1hdHRlcn0uXG4gKi9cbmludGVyZmFjZSBHZXRDYWNoZWRGcm9udG1hdHRlclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgd2hvc2UgZnJvbnRtYXR0ZXIgdG8gcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0RmlsZUludGVybmFsfS5cbiAqL1xuaW50ZXJmYWNlIEdldEZpbGVJbnRlcm5hbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gV2hlbiBgdW5kZWZpbmVkYCBvciBub3Qgc3BlY2lmaWVkLCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0dWFsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byByZXRyaWV2ZSB0aGUgYWJzdHJhY3QgZmlsZSBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXJyYXkgb2YgYWJzdHJhY3QgZmlsZXMgdG8gYW4gYXJyYXkgb2YgZmlsZXMuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZXMgLSBUaGUgYWJzdHJhY3QgZmlsZXMgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBmaWxlcy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IG9mIHRoZSBhYnN0cmFjdCBmaWxlcyBhcmUgbm90IGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNBcnJheU9mRmlsZXMoYWJzdHJhY3RGaWxlczogVEFic3RyYWN0RmlsZVtdKTogVEZpbGVbXSB7XG4gIHJldHVybiBhYnN0cmFjdEZpbGVzLm1hcCgoYWJzdHJhY3RGaWxlKSA9PiBhc0ZpbGUoYWJzdHJhY3RGaWxlKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXJyYXkgb2YgYWJzdHJhY3QgZmlsZXMgdG8gYW4gYXJyYXkgb2YgZm9sZGVycy5cbiAqXG4gKiBAcGFyYW0gYWJzdHJhY3RGaWxlcyAtIFRoZSBhYnN0cmFjdCBmaWxlcyB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGFycmF5IG9mIGZvbGRlcnMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFueSBvZiB0aGUgYWJzdHJhY3QgZmlsZXMgYXJlIG5vdCBmb2xkZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNBcnJheU9mRm9sZGVycyhhYnN0cmFjdEZpbGVzOiBUQWJzdHJhY3RGaWxlW10pOiBURm9sZGVyW10ge1xuICByZXR1cm4gYWJzdHJhY3RGaWxlcy5tYXAoKGFic3RyYWN0RmlsZSkgPT4gYXNGb2xkZXIoYWJzdHJhY3RGaWxlKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYWJzdHJhY3QgZmlsZSB0byBhIGZpbGUuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgZmlsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFic3RyYWN0IGZpbGUgaXMgbm90IGEgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzRmlsZShhYnN0cmFjdEZpbGU6IG51bGwgfCBUQWJzdHJhY3RGaWxlKTogVEZpbGUge1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoYXNGaWxlT3JOdWxsKGFic3RyYWN0RmlsZSksICdBYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZpbGUnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhYnN0cmFjdCBmaWxlIHRvIGEgZmlsZSBvciBgbnVsbGAuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBvciBgbnVsbGAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0ZpbGVPck51bGwoYWJzdHJhY3RGaWxlOiBudWxsIHwgVEFic3RyYWN0RmlsZSk6IG51bGwgfCBURmlsZSB7XG4gIGlmIChhYnN0cmFjdEZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoYWJzdHJhY3RGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RGaWxlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYWJzdHJhY3QgZmlsZSB0byBhIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYWJzdHJhY3RGaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzRm9sZGVyKGFic3RyYWN0RmlsZTogbnVsbCB8IFRBYnN0cmFjdEZpbGUpOiBURm9sZGVyIHtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKGFzRm9sZGVyT3JOdWxsKGFic3RyYWN0RmlsZSksICdBYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZvbGRlcicpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFic3RyYWN0IGZpbGUgdG8gYSBmb2xkZXIgb3IgYG51bGxgLlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGZvbGRlciBvciBgbnVsbGAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzRm9sZGVyT3JOdWxsKGFic3RyYWN0RmlsZTogbnVsbCB8IFRBYnN0cmFjdEZpbGUpOiBudWxsIHwgVEZvbGRlciB7XG4gIGlmIChhYnN0cmFjdEZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoYWJzdHJhY3RGaWxlIGluc3RhbmNlb2YgVEZvbGRlcikge1xuICAgIHJldHVybiBhYnN0cmFjdEZpbGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdBYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZvbGRlcicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGF0aCBvciBmaWxlIGhhcyB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbi5cbiAqXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gY2hlY2suXG4gKiBAcGFyYW0gZXh0ZW5zaW9uIC0gVGhlIGV4dGVuc2lvbiB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBvciBmaWxlIGhhcyB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbiwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0V4dGVuc2lvbihwYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yQWJzdHJhY3RGaWxlLCBleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBGb3IgYSBzdHJpbmcgcGF0aCwgY29tcGFyZSB0aGUgcGF0aCdzIG93biBleHRlbnNpb24gaW5zdGVhZCBvZiByZXNvbHZpbmcgdGhlIGZpbGUuXG4gIC8vIFJlc29sdmluZyBhIHN0cmluZyBwYXRoIGlzIE8odmF1bHQpIG9uIGEgbWlzcyBvbiBhIGNhc2UtaW5zZW5zaXRpdmUgZmlsZXN5c3RlbS5cbiAgLy8gVGhhdCBtaXNzIGlzIHRoZSBob3QgcGF0aCBkdXJpbmcgZGVsZXRpb24gY2FzY2FkZXMuXG4gIC8vIE9ic2lkaWFuIGxvd2VyY2FzZXMgYSBmaWxlJ3MgY2Fub25pY2FsIGV4dGVuc2lvbiwgc28gY29tcGFyZSBjYXNlLWluc2Vuc2l0aXZlbHkuXG4gIHJldHVybiBpc0ZpbGUocGF0aE9yRmlsZSkgPyBwYXRoT3JGaWxlLmV4dGVuc2lvbiA9PT0gZXh0ZW5zaW9uIDogdHlwZW9mIHBhdGhPckZpbGUgPT09ICdzdHJpbmcnICYmIGV4dG5hbWUocGF0aE9yRmlsZSkuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSA9PT0gZXh0ZW5zaW9uO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGF0aCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggZXhpc3RzLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvZXNFeGlzdChwYXJhbXM6IERvZXNFeGlzdFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGgsXG4gICAgdHlwZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBhYnN0cmFjdEZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEFic3RyYWN0RmlsZU9yTnVsbFBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGaWxlOiBwYXRoXG4gIH0pKTtcbiAgcmV0dXJuIGFic3RyYWN0RmlsZSAhPT0gbnVsbCAmJiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IGdldEZpbGVTeXN0ZW1UeXBlKGFic3RyYWN0RmlsZSkgPT09IHR5cGUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgVEFic3RyYWN0RmlsZSBvYmplY3QgZm9yIHRoZSBnaXZlbiBwYXRoIG9yIGFic3RyYWN0IGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmV0cmlldmFsLlxuICogQHJldHVybnMgVGhlIGFic3RyYWN0IGZpbGUuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFic3RyYWN0RmlsZShwYXJhbXM6IEdldEFic3RyYWN0RmlsZVBhcmFtcyk6IFRBYnN0cmFjdEZpbGUge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKFxuICAgIGdldEFic3RyYWN0RmlsZU9yTnVsbChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0QWJzdHJhY3RGaWxlT3JOdWxsUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIHBhdGhPckZpbGVcbiAgICB9KSksXG4gICAgYEFic3RyYWN0IGZpbGUgbm90IGZvdW5kOiAke3BhdGhPckZpbGUgYXMgc3RyaW5nfWBcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYWJzdHJhY3QgZmlsZSBvciBgbnVsbGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhdGggb3IgYWJzdHJhY3QgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgYWJzdHJhY3QgZmlsZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGBudWxsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFic3RyYWN0RmlsZU9yTnVsbChwYXJhbXM6IEdldEFic3RyYWN0RmlsZU9yTnVsbFBhcmFtcyk6IG51bGwgfCBUQWJzdHJhY3RGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChwYXRoT3JGaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoaXNBYnN0cmFjdEZpbGUocGF0aE9yRmlsZSkpIHtcbiAgICBpZiAoaXNGaWxlKHBhdGhPckZpbGUpKSB7XG4gICAgICByZXR1cm4gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgocGF0aE9yRmlsZS5wYXRoKSA/PyBwYXRoT3JGaWxlO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gVEFic3RyYWN0RmlsZSBpcyBhbHdheXMgVEZpbGUgb3IgVEZvbGRlciBpbiBPYnNpZGlhbjsgZGVmZW5zaXZlIGZhbGxiYWNrLiAqL1xuICAgIHJldHVybiBpc0ZvbGRlcihwYXRoT3JGaWxlKSA/IChhcHAudmF1bHQuZ2V0Rm9sZGVyQnlQYXRoKHBhdGhPckZpbGUucGF0aCkgPz8gcGF0aE9yRmlsZSkgOiAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoT3JGaWxlLnBhdGgpID8/IHBhdGhPckZpbGUpO1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cblxuICBjb25zdCBmaWxlID0gZ2V0RmlsZUludGVybmFsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlSW50ZXJuYWxQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aDogcGF0aE9yRmlsZVxuICB9KSk7XG5cbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IGdldFJlc29sdmVkUGF0aChwYXRoT3JGaWxlKTtcblxuICByZXR1cm4gcmVzb2x2ZWRQYXRoID09PSBwYXRoT3JGaWxlXG4gICAgPyBudWxsXG4gICAgOiBnZXRGaWxlSW50ZXJuYWwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVJbnRlcm5hbFBhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgICBwYXRoOiByZXNvbHZlZFBhdGhcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSBuYW1lIG9mIHRoZSBnaXZlbiBgcGF0aE9yRmlsZWA6IGEgZmlsZSdzIG5hbWUgd2l0aG91dCBpdHMgZXh0ZW5zaW9uLCBhIGZvbGRlcidzIGZ1bGwgbmFtZS5cbiAqXG4gKiBVbmxpa2UgYGJhc2VuYW1lYCBmcm9tIGBwYXRoLnRzYCwgd2hpY2ggaXMgYSBwdXJlIHN0cmluZyBmdW5jdGlvbiwgdGhpcyByZXNvbHZlcyB0aGUgYXJndW1lbnQgYWdhaW5zdCB0aGUgdmF1bHQgZmlyc3QuIFRoYXQgaXMgd2hhdCBsZXRzIGEgZm9sZGVyIHdob3NlIG5hbWVcbiAqIGNvbnRhaW5zIGEgZG90IGFuc3dlciB3aXRoIGl0cyB3aG9sZSBuYW1lIGluc3RlYWQgb2YgYSBib2d1cyBleHRlbnNpb24gc3BsaXQsIGFuZCBpdCBpcyB3aHkgYSBjYWxsZXIgaGFuZGxpbmcgYm90aCBraW5kcyBubyBsb25nZXIgaGFzIHRvIGJyYW5jaCBvblxuICoge0BsaW5rIGlzRmlsZX0gaXRzZWxmIFx1MjAxNCBhIGZvbGRlciBoYXMgbm8gYGJhc2VuYW1lYCBvZiBpdHMgb3duLlxuICpcbiAqIEEgcGF0aCB0aGF0IHJlc29sdmVzIHRvIG5vdGhpbmcgaGFzIG5vIGFuc3dlciB0byBsb29rIHVwLCBzbyB7QGxpbmsgR2V0QmFzZW5hbWVQYXJhbXMud2hlbk1pc3NpbmdUcmVhdEFzfSBkZWNpZGVzIHdoYXQgaGFwcGVucy4gSXQgZGVmYXVsdHMgdG9cbiAqIHtAbGluayBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvd30gcmF0aGVyIHRoYW4gdG8gYSBndWVzczogYGFscGhhLmJyYXZvYCBtYXkgbmFtZSBhIGRvdHRlZCBmb2xkZXIgb3IgYSBgLmJyYXZvYCBmaWxlLCBhbmQgbm90aGluZyBpbiB0aGUgdmF1bHQgc2F5c1xuICogd2hpY2gsIHNvIGEgc2lsZW50bHkgd3JvbmcgYW5zd2VyIGlzIHdvcnNlIHRoYW4gYW4gZXJyb3IuIFBhc3Mge0BsaW5rIE1pc3NpbmdQYXRoVHJlYXRtZW50LkZpbGV9IGZvciB0aGUgYGNoZWNrRXh0ZW5zaW9uYCByZWFkaW5nIG9mIGEgYmFyZSBzdHJpbmcsIG9yXG4gKiB7QGxpbmsgTWlzc2luZ1BhdGhUcmVhdG1lbnQuRm9sZGVyfSBmb3IgdGhlIG90aGVyIG9uZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgYmFzZSBuYW1lIG9mIHRoZSBgcGF0aE9yRmlsZWAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwYXRoIHJlc29sdmVzIHRvIG5vdGhpbmcgYW5kIGB3aGVuTWlzc2luZ1RyZWF0QXNgIGlzIHtAbGluayBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvd30gKHRoZSBkZWZhdWx0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VuYW1lKHBhcmFtczogR2V0QmFzZW5hbWVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGUsXG4gICAgd2hlbk1pc3NpbmdUcmVhdEFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgYWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZVxuICB9KTtcblxuICBpZiAoaXNGaWxlKGFic3RyYWN0RmlsZSkpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RGaWxlLmJhc2VuYW1lO1xuICB9XG5cbiAgaWYgKGlzRm9sZGVyKGFic3RyYWN0RmlsZSkpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RGaWxlLm5hbWU7XG4gIH1cblxuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuXG4gIGNvbnN0IHRyZWF0bWVudCA9IHdoZW5NaXNzaW5nVHJlYXRBcyA/PyBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvdztcblxuICBpZiAodHJlYXRtZW50ID09PSBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvdykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQWJzdHJhY3QgZmlsZSBub3QgZm91bmQ6ICR7cGF0aH1gKTtcbiAgfVxuXG4gIHJldHVybiB0cmVhdG1lbnQgPT09IE1pc3NpbmdQYXRoVHJlYXRtZW50LkZvbGRlciA/IGJhc2VuYW1lKHBhdGgpIDogYmFzZW5hbWUocGF0aCwgZXh0bmFtZShwYXRoKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBnaXZlbiBgcGF0aE9yRmlsZWA6IGEgZmlsZSdzIGV4dGVuc2lvbiB3aXRob3V0IHRoZSBsZWFkaW5nIGRvdCwgYW5kIGFuIGVtcHR5IHN0cmluZyBmb3IgYSBmb2xkZXIuXG4gKlxuICogVW5saWtlIGBleHRuYW1lYCBmcm9tIGBwYXRoLnRzYCwgd2hpY2ggaXMgYSBwdXJlIHN0cmluZyBmdW5jdGlvbiwgdGhpcyByZXNvbHZlcyB0aGUgYXJndW1lbnQgYWdhaW5zdCB0aGUgdmF1bHQgZmlyc3QsIHNvIGEgZm9sZGVyIHdob3NlIG5hbWUgY29udGFpbnMgYSBkb3RcbiAqIGFuc3dlcnMgd2l0aCBhbiBlbXB0eSBzdHJpbmcgcmF0aGVyIHRoYW4gYSBib2d1cyBleHRlbnNpb24uIEEgZm9sZGVyIGhhcyBubyBgZXh0ZW5zaW9uYCBvZiBpdHMgb3duLCB3aGljaCBpcyB3aHkgYSBjYWxsZXIgaGFuZGxpbmcgYm90aCBraW5kcyB3b3VsZFxuICogb3RoZXJ3aXNlIGJyYW5jaCBvbiB7QGxpbmsgaXNGaWxlfSBpdHNlbGYuXG4gKlxuICogQSBwYXRoIHRoYXQgcmVzb2x2ZXMgdG8gbm90aGluZyBoYXMgbm8gYW5zd2VyIHRvIGxvb2sgdXAsIHNvIHtAbGluayBHZXRFeHRlbnNpb25QYXJhbXMud2hlbk1pc3NpbmdUcmVhdEFzfSBkZWNpZGVzIHdoYXQgaGFwcGVucy4gSXQgZGVmYXVsdHMgdG9cbiAqIHtAbGluayBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvd30gcmF0aGVyIHRoYW4gdG8gYSBndWVzczogYGFscGhhLmJyYXZvYCBtYXkgbmFtZSBhIGRvdHRlZCBmb2xkZXIgb3IgYSBgLmJyYXZvYCBmaWxlLCBhbmQgbm90aGluZyBpbiB0aGUgdmF1bHQgc2F5c1xuICogd2hpY2gsIHNvIGEgc2lsZW50bHkgd3JvbmcgYW5zd2VyIGlzIHdvcnNlIHRoYW4gYW4gZXJyb3IuIFBhc3Mge0BsaW5rIE1pc3NpbmdQYXRoVHJlYXRtZW50LkZpbGV9IGZvciB0aGUgYGNoZWNrRXh0ZW5zaW9uYCByZWFkaW5nIG9mIGEgYmFyZSBzdHJpbmcsIG9yXG4gKiB7QGxpbmsgTWlzc2luZ1BhdGhUcmVhdG1lbnQuRm9sZGVyfSBmb3IgdGhlIG90aGVyIG9uZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgZXh0ZW5zaW9uIG9mIHRoZSBgcGF0aE9yRmlsZWAsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBpdCBoYXMgbm9uZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHBhdGggcmVzb2x2ZXMgdG8gbm90aGluZyBhbmQgYHdoZW5NaXNzaW5nVHJlYXRBc2AgaXMge0BsaW5rIE1pc3NpbmdQYXRoVHJlYXRtZW50LlRocm93fSAodGhlIGRlZmF1bHQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKHBhcmFtczogR2V0RXh0ZW5zaW9uUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHdoZW5NaXNzaW5nVHJlYXRBc1xuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGVcbiAgfSk7XG5cbiAgaWYgKGlzRmlsZShhYnN0cmFjdEZpbGUpKSB7XG4gICAgcmV0dXJuIGFic3RyYWN0RmlsZS5leHRlbnNpb247XG4gIH1cblxuICBpZiAoaXNGb2xkZXIoYWJzdHJhY3RGaWxlKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG5cbiAgY29uc3QgdHJlYXRtZW50ID0gd2hlbk1pc3NpbmdUcmVhdEFzID8/IE1pc3NpbmdQYXRoVHJlYXRtZW50LlRocm93O1xuXG4gIGlmICh0cmVhdG1lbnQgPT09IE1pc3NpbmdQYXRoVHJlYXRtZW50LlRocm93KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBYnN0cmFjdCBmaWxlIG5vdCBmb3VuZDogJHtwYXRofWApO1xuICB9XG5cbiAgLy8gT2JzaWRpYW4gbG93ZXJjYXNlcyBhIGZpbGUncyBjYW5vbmljYWwgZXh0ZW5zaW9uLCBzbyBhIHBhdGggcmVhZCBhcyBhIGZpbGUgaGFzIHRvIGFuc3dlciBpbiB0aGUgc2FtZSBjYXNlLlxuICByZXR1cm4gdHJlYXRtZW50ID09PSBNaXNzaW5nUGF0aFRyZWF0bWVudC5Gb2xkZXIgPyAnJyA6IGV4dG5hbWUocGF0aCkuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBmaWxlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXRoIG9yIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmV0cmlldmFsLlxuICogQHJldHVybnMgVGhlIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgcGF0aCBvciBmaWxlLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlKHBhcmFtczogR2V0RmlsZVBhcmFtcyk6IFRGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZ1xuICB9ID0gcGFyYW1zO1xuICBsZXQgZmlsZSA9IGdldEZpbGVPck51bGwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVPck51bGxQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRmlsZVxuICB9KSk7XG4gIGlmICghZmlsZSkge1xuICAgIGlmIChzaG91bGRJbmNsdWRlTm9uRXhpc3RpbmcpIHtcbiAgICAgIGZpbGUgPSBjcmVhdGVURmlsZUluc3RhbmNlKGFwcCwgcGF0aE9yRmlsZSBhcyBzdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3BhdGhPckZpbGUgYXMgc3RyaW5nfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWxlO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGZpbGUgb3IgYG51bGxgIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXRoIG9yIGZpbGUuXG4gKiBJZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYWxyZWFkeSBhIGZpbGUsIGl0IGlzIHJldHVybmVkIGFzIGlzLlxuICogT3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgYXBwJ3MgdmF1bHQgdG8gcmV0cmlldmUgdGhlIGZpbGUgYnkgaXRzIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmV0cmlldmFsLlxuICogQHJldHVybnMgVGhlIGZpbGUgaWYgZm91bmQsIG90aGVyd2lzZSBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlT3JOdWxsKHBhcmFtczogR2V0RmlsZU9yTnVsbFBhcmFtcyk6IG51bGwgfCBURmlsZSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRBYnN0cmFjdEZpbGVPck51bGxQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRmlsZVxuICB9KSk7XG4gIHJldHVybiBpc0ZpbGUoZmlsZSkgPyBmaWxlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIG9mIGEgZmlsZSBzeXN0ZW0gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBnZXQgdGhlIHR5cGUgb2YuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgYWJzdHJhY3QgZmlsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFic3RyYWN0IGZpbGUgaXMgbm90IGEgZmlsZSBvciBhIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVTeXN0ZW1UeXBlKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSk6IEZpbGVTeXN0ZW1UeXBlIHtcbiAgaWYgKGlzRmlsZShhYnN0cmFjdEZpbGUpKSB7XG4gICAgcmV0dXJuIEZpbGVTeXN0ZW1UeXBlLkZpbGU7XG4gIH1cbiAgaWYgKGlzRm9sZGVyKGFic3RyYWN0RmlsZSkpIHtcbiAgICByZXR1cm4gRmlsZVN5c3RlbVR5cGUuRm9sZGVyO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlIG9yIGEgZm9sZGVyJyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgZm9sZGVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcHAgYW5kIHBhdGhPckZvbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgcmV0cmlldmVkIGZvbGRlci5cbiAqIEB0aHJvd3MgSWYgdGhlIGZvbGRlciBpcyBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXIocGFyYW1zOiBHZXRGb2xkZXJQYXJhbXMpOiBURm9sZGVyIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGb2xkZXIsXG4gICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nXG4gIH0gPSBwYXJhbXM7XG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZvbGRlck9yTnVsbFBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGb2xkZXJcbiAgfSkpO1xuICBpZiAoIWZvbGRlcikge1xuICAgIGlmIChzaG91bGRJbmNsdWRlTm9uRXhpc3RpbmcpIHtcbiAgICAgIGZvbGRlciA9IGNyZWF0ZVRGb2xkZXJJbnN0YW5jZShhcHAsIHBhdGhPckZvbGRlciBhcyBzdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvbGRlciBub3QgZm91bmQ6ICR7cGF0aE9yRm9sZGVyIGFzIHN0cmluZ31gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZm9sZGVyO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGZvbGRlciBvciBgbnVsbGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhdGggb3IgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHJldHJpZXZhbC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgaWYgZm91bmQsIG90aGVyd2lzZSBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXJPck51bGwocGFyYW1zOiBHZXRGb2xkZXJPck51bGxQYXJhbXMpOiBudWxsIHwgVEZvbGRlciB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRm9sZGVyXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZvbGRlciA9IGdldEFic3RyYWN0RmlsZU9yTnVsbChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0QWJzdHJhY3RGaWxlT3JOdWxsUGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGhPckZpbGU6IHBhdGhPckZvbGRlclxuICB9KSk7XG4gIHJldHVybiBpc0ZvbGRlcihmb2xkZXIpID8gZm9sZGVyIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgZmlsZXMgcmVwcmVzZW50aW5nIHRoZSBtYXJrZG93biBmaWxlcyB3aXRoaW4gYSBzcGVjaWZpZWQgZm9sZGVyIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmV0cmlldmFsLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZmlsZXMgcmVwcmVzZW50aW5nIHRoZSBtYXJrZG93biBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtkb3duRmlsZXMocGFyYW1zOiBHZXRNYXJrZG93bkZpbGVzUGFyYW1zKTogVEZpbGVbXSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNSZWN1cnNpdmUsXG4gICAgcGF0aE9yRm9sZGVyXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZvbGRlciA9IGdldEZvbGRlcih7XG4gICAgYXBwLFxuICAgIHBhdGhPckZvbGRlclxuICB9KTtcblxuICBsZXQgbWFya2Rvd25GaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gIGlmIChpc1JlY3Vyc2l2ZSkge1xuICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihmb2xkZXIsIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgIGlmIChpc01hcmtkb3duRmlsZShhYnN0cmFjdEZpbGUpICYmIGFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICAgIG1hcmtkb3duRmlsZXMucHVzaChhYnN0cmFjdEZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG1hcmtkb3duRmlsZXMgPSBmb2xkZXIuY2hpbGRyZW4uZmlsdGVyKChmaWxlKSA9PiBpc01hcmtkb3duRmlsZShmaWxlKSkgYXMgVEZpbGVbXTtcbiAgfVxuXG4gIG1hcmtkb3duRmlsZXMgPSBtYXJrZG93bkZpbGVzLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpO1xuICByZXR1cm4gbWFya2Rvd25GaWxlcztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZpbGUgZm9yIHRoZSBnaXZlbiBwYXRoIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byByZXRyaWV2ZSBvciBjcmVhdGUuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSByZXByZXNlbnRpbmcgdGhlIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlRmlsZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZU9yTnVsbCh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGU6IHBhdGhcbiAgfSk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBjb25zdCBmb2xkZXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChwYXRoKTtcbiAgYXdhaXQgZ2V0T3JDcmVhdGVGb2xkZXIoYXBwLCBmb2xkZXJQYXRoKTtcblxuICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmb2xkZXIgZm9yIHRoZSBnaXZlbiBwYXRoIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIHJldHJpZXZlIG9yIGNyZWF0ZS5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgcmVwcmVzZW50aW5nIHRoZSBmb2xkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZUZvbGRlcihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxURm9sZGVyPiB7XG4gIGNvbnN0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZvbGRlcjogcGF0aFxuICB9KTtcbiAgcmV0dXJuIGZvbGRlciA/PyAoYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZ2l2ZW4gYHBhdGhPckZpbGVgLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBhYnN0cmFjdCBmaWxlLlxuICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGBwYXRoT3JGaWxlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSk6IHN0cmluZyB7XG4gIGlmIChpc0Fic3RyYWN0RmlsZShwYXRoT3JGaWxlKSkge1xuICAgIHJldHVybiBwYXRoT3JGaWxlLnBhdGg7XG4gIH1cblxuICBjb25zdCBmaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZVxuICB9KTtcbiAgcmV0dXJuIGZpbGUgPyBmaWxlLnBhdGggOiBnZXRSZXNvbHZlZFBhdGgocGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGFuIGluc3RhbmNlIG9mIGFic3RyYWN0IGZpbGUuXG4gKlxuICogQHBhcmFtIGZpbGUgLSBUaGUgZmlsZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaXMgYW4gaW5zdGFuY2Ugb2YgYWJzdHJhY3QgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJzdHJhY3RGaWxlKGZpbGU6IHVua25vd24pOiBmaWxlIGlzIFRBYnN0cmFjdEZpbGUge1xuICByZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogICBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBiYXNlIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBpcyBhIGJhc2UgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmFzZUZpbGUocGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckFic3RyYWN0RmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tFeHRlbnNpb24ocGF0aE9yRmlsZSwgQkFTRV9GSUxFX0VYVEVOU0lPTik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgY2FudmFzIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBpcyBhIGNhbnZhcyBmaWxlIG9yIG5vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yQWJzdHJhY3RGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGVja0V4dGVuc2lvbihwYXRoT3JGaWxlLCBDQU5WQVNfRklMRV9FWFRFTlNJT04pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhbiBpbnN0YW5jZSBvZiBmaWxlLlxuICpcbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIGFuIGluc3RhbmNlIG9mIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpbGUoZmlsZTogdW5rbm93bik6IGZpbGUgaXMgVEZpbGUge1xuICByZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRGaWxlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBmaWxlIGlzIGEgZm9sZGVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRm9sZGVyKGZpbGU6IHVua25vd24pOiBmaWxlIGlzIFRGb2xkZXIge1xuICByZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRGb2xkZXI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgTWFya2Rvd24gZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgTWFya2Rvd24gZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFya2Rvd25GaWxlKHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrRXh0ZW5zaW9uKHBhdGhPckZpbGUsIE1BUktET1dOX0ZJTEVfRVhURU5TSU9OKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBub3RlLlxuICpcbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBub3RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb3RlKHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzTWFya2Rvd25GaWxlKHBhdGhPckZpbGUpIHx8IGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlKSB8fCBpc0Jhc2VGaWxlKHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBhdHRhY2htZW50IGJlY2F1c2Ugb2YgaXRzIGV4dGVuc2lvbi5cbiAqXG4gKiBTb21lIHBsdWdpbnMgc3RvcmUgdGhlaXIgZGF0YSBpbiBmaWxlcyB0aGF0IGFyZSBtYXJrZG93biBvbiBkaXNrIGJ1dCBhcmUgbm90IHByb3NlIFx1MjAxNCBFeGNhbGlkcmF3LCBmb3IgZXhhbXBsZSwgc2F2ZXMgZWFjaCBkcmF3aW5nIGFzIGBza2V0Y2guZXhjYWxpZHJhdy5tZGAuXG4gKiBPYnNpZGlhbiByZXBvcnRzIHN1Y2ggYSBmaWxlJ3MgZXh0ZW5zaW9uIGFzIGBtZGAsIHNvIGEgY2FsbGVyIHRoYXQgd2FudHMgdG8gdGVsbCBhIGRyYXdpbmcgYXBhcnQgZnJvbSBhIG5vdGUgaGFzIHRvIG1hdGNoIHRoZSBmdWxsIG11bHRpLXBhcnQgZXh0ZW5zaW9uXG4gKiAoYC5leGNhbGlkcmF3Lm1kYCkgYWdhaW5zdCB0aGUgZmlsZSBuYW1lLiBXaGljaCBleHRlbnNpb25zIGNvdW50IGlzIHRoZSBjYWxsZXIncyBjb25maWd1cmF0aW9uLCBub3QgdGhpcyBsaWJyYXJ5J3MgXHUyMDE0IG9ubHkgdGhlIG1hdGNoaW5nIHJ1bGUgaXMgc2hhcmVkLlxuICpcbiAqIEEgZHJhd2luZyBjYW4gYWxzbyBiZSByZWNvZ25pemVkIGJ5IGl0cyBmcm9udG1hdHRlciwgdGhlIHdheSBFeGNhbGlkcmF3IGl0c2VsZiByZWNvZ25pemVzIG9uZSAoYGV4Y2FsaWRyYXctcGx1Z2luOiBwYXJzZWRgKSwgdGhyb3VnaCBhXG4gKiBgcHJvcGVydHk6bmFtZVs9dmFsdWVdYCBlbnRyeS4gVGhhdCBhbnN3ZXIgY29tZXMgZnJvbSB0aGUgbWV0YWRhdGEgY2FjaGUsIHdoaWNoIGNhbiBiZSBjb2xkIGF0IHN0YXJ0dXAgb3IgcmlnaHQgYWZ0ZXIgdGhlIGZpbGUgaXMgY3JlYXRlZCwgc28gYW5cbiAqIHVuY2FjaGVkIGZpbGUgYW5zd2VycyBcIm5vIG1hdGNoXCIgYW5kIGlzIHRyZWF0ZWQgYXMgYSBub3RlLiBUaGF0IGlzIHRoZSBjb25zZXJ2YXRpdmUgc2lkZSBmb3IgZXZlcnkgY3VycmVudCBjYWxsZXI6IGEgbm90ZSBpcyBub3QgbW92ZWQgYXMgYW5cbiAqIGF0dGFjaG1lbnQsIGFuZCBpdCBzcGFyZXMgaXRzIGZvbGRlciBmcm9tIGEgZGVsZXRlIHN3ZWVwLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNsYXNzaWZ5IGFuZCB0aGUgY29uZmlndXJlZCBhdHRhY2htZW50IGV4dGVuc2lvbnMuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuIGF0dGFjaG1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyZWF0ZWRBc0F0dGFjaG1lbnQocGFyYW1zOiBJc1RyZWF0ZWRBc0F0dGFjaG1lbnRQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhdHRhY2htZW50RXh0ZW5zaW9ucyxcbiAgICBwYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChwYXRoT3JGaWxlID09PSBudWxsIHx8IGlzRm9sZGVyKHBhdGhPckZpbGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbG93ZXJDYXNlTmFtZSA9IGdldE5hbWUocGF0aE9yRmlsZSkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGF0dGFjaG1lbnRFeHRlbnNpb25zLnNvbWUoKGV4dGVuc2lvbikgPT4ge1xuICAgIGNvbnN0IHRyaW1tZWRFbnRyeSA9IGV4dGVuc2lvbi50cmltKCk7XG4gICAgaWYgKGlzUHJvcGVydHlFbnRyeSh0cmltbWVkRW50cnkpKSB7XG4gICAgICByZXR1cm4gISFhcHAgJiYgaXNNYXJrZG93bkZpbGUocGF0aE9yRmlsZSkgJiYgY2hlY2tQcm9wZXJ0eUVudHJ5TWF0Y2hlcyh7XG4gICAgICAgIGVudHJ5OiB0cmltbWVkRW50cnksXG4gICAgICAgIGZyb250bWF0dGVyOiBnZXRDYWNoZWRGcm9udG1hdHRlcih7IGFwcCwgcGF0aE9yRmlsZSB9KVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRW5mb3JjaW5nIGEgc2luZ2xlIGxlYWRpbmcgZG90IGlzIHdoYXQga2VlcHMgdGhlIG1hdGNoIG9uIGFuIGV4dGVuc2lvbiBib3VuZGFyeS5cbiAgICAvLyBBIGJhcmUgYHJhdy5tZGAgd291bGQgb3RoZXJ3aXNlIG1hdGNoIGBza2V0Y2guZXhjYWxpZHJhdy5tZGAsIHdoaWNoIGlzIG5ldmVyIHdoYXQgYSBjYWxsZXIgbWVhbnMuXG4gICAgY29uc3Qgbm9ybWFsaXplZEV4dGVuc2lvbiA9IGV4dGVuc2lvbi50cmltKCkucmVwbGFjZSgvXlxcLisvLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZEV4dGVuc2lvbiAhPT0gJycgJiYgbG93ZXJDYXNlTmFtZS5lbmRzV2l0aChgLiR7bm9ybWFsaXplZEV4dGVuc2lvbn1gKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVHJpbXMgdGhlIG1hcmtkb3duIGV4dGVuc2lvbiBmcm9tIHRoZSBmaWxlIHBhdGggaWYgdGhlIGZpbGUgaXMgYSBtYXJrZG93biBmaWxlLlxuICogSWYgdGhlIGZpbGUgaXMgbm90IGEgbWFya2Rvd24gZmlsZSwgdGhlIG9yaWdpbmFsIGZpbGUgcGF0aCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIHRyaW0gdGhlIG1hcmtkb3duIGV4dGVuc2lvbiBmcm9tLlxuICogQHJldHVybnMgVGhlIGZpbGUgcGF0aCB3aXRoIHRoZSBtYXJrZG93biBleHRlbnNpb24gdHJpbW1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1NYXJrZG93bkV4dGVuc2lvbihmaWxlOiBUQWJzdHJhY3RGaWxlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzTWFya2Rvd25GaWxlKGZpbGUpXG4gICAgPyB0cmltRW5kKHtcbiAgICAgICRzdHJpbmc6IGZpbGUucGF0aCxcbiAgICAgIHN1ZmZpeDogYC4ke01BUktET1dOX0ZJTEVfRVhURU5TSU9OfWBcbiAgICB9KVxuICAgIDogZmlsZS5wYXRoO1xufVxuXG5mdW5jdGlvbiBnZXRDYWNoZWRGcm9udG1hdHRlcihwYXJhbXM6IEdldENhY2hlZEZyb250bWF0dGVyUGFyYW1zKTogbnVsbCB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwocGFyYW1zKTtcbiAgcmV0dXJuIGlzRmlsZShmaWxlKSA/IHBhcmFtcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk/LmZyb250bWF0dGVyID8/IG51bGwgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRGaWxlSW50ZXJuYWwocGFyYW1zOiBHZXRGaWxlSW50ZXJuYWxQYXJhbXMpOiBudWxsIHwgVEFic3RyYWN0RmlsZSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgcGF0aFxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBpc0Nhc2VJbnNlbnNpdGl2ZSB9ID0gcGFyYW1zO1xuICBpc0Nhc2VJbnNlbnNpdGl2ZSA/Pz0gZ2V0RGF0YUFkYXB0ZXJFeChhcHApLmluc2Vuc2l0aXZlO1xuICBpZiAoaXNDYXNlSW5zZW5zaXRpdmUpIHtcbiAgICBjb25zdCBjYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXggPSBnZXRDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXgoYXBwKTtcbiAgICByZXR1cm4gY2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4ID8gY2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4LmdldChwYXRoKSA6IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGhJbnNlbnNpdGl2ZShwYXRoKTtcbiAgfVxuXG4gIHJldHVybiBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXROYW1lKHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSk6IHN0cmluZyB7XG4gIHJldHVybiBpc0Fic3RyYWN0RmlsZShwYXRoT3JGaWxlKSA/IHBhdGhPckZpbGUubmFtZSA6IGJhc2VuYW1lKHBhdGhPckZpbGUpO1xufVxuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZFBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgocmVzb2x2ZSgnLycsIHBhdGgpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLDBCQUE0QztBQUM1QyxrQkFJTztBQUNQLG9CQUF3QjtBQUN4Qix5QkFBa0M7QUFDbEMsNkJBS087QUFDUCxzQkFNTztBQUVQLHlDQUE0QztBQUM1Qyw0QkFHTztBQUtBLE1BQU0sc0JBQXNCO0FBSzVCLE1BQU0sd0JBQXdCO0FBSzlCLE1BQU0sMEJBQTBCO0FBS2hDLElBQUssaUJBQUwsa0JBQUtBLG9CQUFMO0FBSUwsRUFBQUEsZ0JBQUEsVUFBTztBQUlQLEVBQUFBLGdCQUFBLFlBQVM7QUFSQyxTQUFBQTtBQUFBLEdBQUE7QUFlTCxJQUFLLHVCQUFMLGtCQUFLQywwQkFBTDtBQUlMLEVBQUFBLHNCQUFBLFVBQU87QUFJUCxFQUFBQSxzQkFBQSxZQUFTO0FBSVQsRUFBQUEsc0JBQUEsV0FB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
|
|
576
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2ZpbGUtc3lzdGVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB7QGxpbmsgVEFic3RyYWN0RmlsZX0sIHtAbGluayBURmlsZX0sIGFuZCB7QGxpbmsgVEZvbGRlcn0gaW5zdGFuY2VzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBleHRuYW1lLFxuICByZXNvbHZlXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IHRyaW1FbmQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVRGaWxlSW5zdGFuY2UsXG4gIGNyZWF0ZVRGb2xkZXJJbnN0YW5jZSxcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgcGFyZW50Rm9sZGVyUGF0aFxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVQYXRoLFxuICBUQWJzdHJhY3RGaWxlLFxuICBURmlsZSxcbiAgVEZvbGRlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBnZXRDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXggfSBmcm9tICcuL2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC50cyc7XG5pbXBvcnQge1xuICBjaGVja1Byb3BlcnR5RW50cnlNYXRjaGVzLFxuICBpc1Byb3BlcnR5RW50cnlcbn0gZnJvbSAnLi9wcm9wZXJ0eS1lbnRyeS50cyc7XG5cbi8qKlxuICogQSBmaWxlIGV4dGVuc2lvbiBmb3IgYGJhc2VgIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3QgQkFTRV9GSUxFX0VYVEVOU0lPTiA9ICdiYXNlJztcblxuLyoqXG4gKiBBIGZpbGUgZXh0ZW5zaW9uIGZvciBgY2FudmFzYCBmaWxlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IENBTlZBU19GSUxFX0VYVEVOU0lPTiA9ICdjYW52YXMnO1xuXG4vKipcbiAqIEEgZmlsZSBleHRlbnNpb24gZm9yIGBtYXJrZG93bmAgZmlsZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTiA9ICdtZCc7XG5cbi8qKlxuICogQSB0eXBlIG9mIGZpbGUgc3lzdGVtIG9iamVjdC5cbiAqL1xuZXhwb3J0IGVudW0gRmlsZVN5c3RlbVR5cGUge1xuICAvKipcbiAgICogQSBmaWxlLlxuICAgKi9cbiAgRmlsZSA9ICdmaWxlJyxcbiAgLyoqXG4gICAqIEEgZm9sZGVyLlxuICAgKi9cbiAgRm9sZGVyID0gJ2ZvbGRlcidcbn1cbi8qKlxuICogSG93IHtAbGluayBnZXRCYXNlbmFtZX0gYW5kIHtAbGluayBnZXRFeHRlbnNpb259IHNob3VsZCBhbnN3ZXIgZm9yIGEgcGF0aCB0aGF0IHJlc29sdmVzIHRvIG5vdGhpbmcgaW4gdGhlIHZhdWx0LlxuICpcbiAqIE5vdGhpbmcgaW4gdGhlIHZhdWx0IHNheXMgd2hldGhlciBhbiB1bnJlc29sdmVkIGBhbHBoYS5icmF2b2AgbmFtZXMgYSBkb3R0ZWQgZm9sZGVyIG9yIGEgYC5icmF2b2AgZmlsZSwgc28gdGhlIGNhbGxlciBkZWNpZGVzLlxuICovXG5leHBvcnQgZW51bSBNaXNzaW5nUGF0aFRyZWF0bWVudCB7XG4gIC8qKlxuICAgKiBSZWFkIHRoZSBwYXRoIGFzIGEgZmlsZSBwYXRoOiBgYWxwaGEuYnJhdm9gIGlzIGJhc2VuYW1lIGBhbHBoYWAgcGx1cyBleHRlbnNpb24gYGJyYXZvYC5cbiAgICovXG4gIEZpbGUgPSAnZmlsZScsXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBwYXRoIGFzIGEgZm9sZGVyIHBhdGg6IGBhbHBoYS5icmF2b2AgaXMgYmFzZW5hbWUgYGFscGhhLmJyYXZvYCB3aXRoIG5vIGV4dGVuc2lvbi5cbiAgICovXG4gIEZvbGRlciA9ICdmb2xkZXInLFxuICAvKipcbiAgICogVGhyb3cgaW5zdGVhZCBvZiBndWVzc2luZy4gVGhpcyBpcyB0aGUgZGVmYXVsdC5cbiAgICovXG4gIFRocm93ID0gJ3Rocm93J1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkb2VzRXhpc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvZXNFeGlzdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gV2hlbiBgdW5kZWZpbmVkYCBvciBub3Qgc3BlY2lmaWVkLCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0dWFsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCB0byBjaGVjay4gRGVmYXVsdCBpcyBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBGaWxlU3lzdGVtVHlwZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QWJzdHJhY3RGaWxlT3JOdWxsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBYnN0cmFjdEZpbGVPck51bGxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIFdoZW4gYHVuZGVmaW5lZGAgb3Igbm90IHNwZWNpZmllZCwgdGhlIGJlaGF2aW9yIGlzIGRldGVybWluZWQgYnkgdGhlIGFjdHVhbCBmaWxlIHN5c3RlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FzZUluc2Vuc2l0aXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZXRyaWV2ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEFic3RyYWN0RmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QWJzdHJhY3RGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLiBXaGVuIGB1bmRlZmluZWRgIG9yIG5vdCBzcGVjaWZpZWQsIHRoZSBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhY3R1YWwgZmlsZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmV0cmlldmUgdGhlIGFic3RyYWN0IGZpbGUgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCYXNlbmFtZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFzZW5hbWVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBhYnN0cmFjdCBmaWxlIHRvIGdldCB0aGUgYmFzZSBuYW1lIG9mLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xuXG4gIC8qKlxuICAgKiBIb3cgdG8gYW5zd2VyIHdoZW4gdGhlIHBhdGggcmVzb2x2ZXMgdG8gbm90aGluZyBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvd2BcbiAgICovXG4gIHJlYWRvbmx5IHdoZW5NaXNzaW5nVHJlYXRBcz86IE1pc3NpbmdQYXRoVHJlYXRtZW50O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRFeHRlbnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEV4dGVuc2lvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gZ2V0IHRoZSBleHRlbnNpb24gb2YuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG5cbiAgLyoqXG4gICAqIEhvdyB0byBhbnN3ZXIgd2hlbiB0aGUgcGF0aCByZXNvbHZlcyB0byBub3RoaW5nIGluIHRoZSB2YXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYE1pc3NpbmdQYXRoVHJlYXRtZW50LlRocm93YFxuICAgKi9cbiAgcmVhZG9ubHkgd2hlbk1pc3NpbmdUcmVhdEFzPzogTWlzc2luZ1BhdGhUcmVhdG1lbnQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEZpbGVPck51bGx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEZpbGVPck51bGxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIFdoZW4gYHVuZGVmaW5lZGAgb3Igbm90IHNwZWNpZmllZCwgdGhlIGJlaGF2aW9yIGlzIGRldGVybWluZWQgYnkgdGhlIGFjdHVhbCBmaWxlIHN5c3RlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FzZUluc2Vuc2l0aXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLiBXaGVuIGB1bmRlZmluZWRgIG9yIG5vdCBzcGVjaWZpZWQsIHRoZSBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhY3R1YWwgZmlsZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmV0cmlldmUgdGhlIGZpbGUgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gICAqICBJZiBgdHJ1ZWAsIGEgbmV3IGZpbGUgaXMgY3JlYXRlZCBmb3IgdGhlIHByb3ZpZGVkIHBhdGguXG4gICAqICBJZiBgZmFsc2VgLCBhbiBlcnJvciBpcyB0aHJvd24gaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGb2xkZXJPck51bGx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEZvbGRlck9yTnVsbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gV2hlbiBgdW5kZWZpbmVkYCBvciBub3Qgc3BlY2lmaWVkLCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0dWFsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmb2xkZXIgdG8gcmV0cmlldmUgdGhlIGZvbGRlciBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRm9sZGVyOiBudWxsIHwgUGF0aE9yRm9sZGVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGb2xkZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEZvbGRlclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gV2hlbiBgdW5kZWZpbmVkYCBvciBub3Qgc3BlY2lmaWVkLCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0dWFsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmb2xkZXIgaWRlbnRpZmllci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IHRoZSBmb2xkZXIgdG8gbm90IGV4aXN0LlxuICAgKiAgSWYgYHRydWVgLCBhIG5ldyBmb2xkZXIgaXMgY3JlYXRlZCBmb3IgdGhlIHByb3ZpZGVkIHBhdGguXG4gICAqICBJZiBgZmFsc2VgLCBhbiBlcnJvciBpcyB0aHJvd24gaWYgdGhlIGZvbGRlciBpcyBub3QgZm91bmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVOb25FeGlzdGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldE1hcmtkb3duRmlsZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldE1hcmtkb3duRmlsZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byByZWN1cnNpdmVseSBzZWFyY2ggZm9yIG1hcmtkb3duIGZpbGVzIHdpdGhpbiBzdWJmb2xkZXJzLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzUmVjdXJzaXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZm9sZGVyIHRvIHJldHJpZXZlIHRoZSBtYXJrZG93biBmaWxlcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRm9sZGVyOiBQYXRoT3JGb2xkZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzVHJlYXRlZEFzQXR0YWNobWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNUcmVhdGVkQXNBdHRhY2htZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UsIHdoaWNoIGxldHMgYSBgcHJvcGVydHk6YCBlbnRyeSBvZiB7QGxpbmsgYXR0YWNobWVudEV4dGVuc2lvbnN9IHJlYWQgdGhlIGZpbGUncyBmcm9udG1hdHRlciBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZS5cbiAgICogV2l0aG91dCBpdCwgYHByb3BlcnR5OmAgZW50cmllcyBtYXRjaCBub3RoaW5nIGFuZCBvbmx5IHRoZSBleHRlbnNpb24gZW50cmllcyBhcmUgZXZhbHVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwPzogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50cmllcyB0aGF0IG1hcmsgYSBmaWxlIGFzIGFuIGF0dGFjaG1lbnQsIGUuZy4gYFsnLmV4Y2FsaWRyYXcubWQnLCAncHJvcGVydHk6ZXhjYWxpZHJhdy1wbHVnaW4nXWAuXG4gICAqXG4gICAqIEFuIGV4dGVuc2lvbiBlbnRyeSBpcyBub3JtYWxpemVkIGJlZm9yZSBtYXRjaGluZzogc3Vycm91bmRpbmcgd2hpdGVzcGFjZSBpcyB0cmltbWVkLCBhIHNpbmdsZSBsZWFkaW5nIGRvdCBpcyBlbmZvcmNlZCwgYW5kIHRoZSBjb21wYXJpc29uIGlzXG4gICAqIGNhc2UtaW5zZW5zaXRpdmUuIEVtcHR5IGVudHJpZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqIEEgYHByb3BlcnR5Om5hbWVgIGVudHJ5IG1hdGNoZXMgYSBtYXJrZG93biBmaWxlIHdob3NlIGZyb250bWF0dGVyIGhhcyBgbmFtZWAsIGFuZCBgcHJvcGVydHk6bmFtZT12YWx1ZWAgb25lIHdob3NlIGBuYW1lYCByZW5kZXJzIGFzIGB2YWx1ZWAgXHUyMDE0IHRoZVxuICAgKiBzYW1lIHN5bnRheCBub3RlIHByaW9yaXRpZXMgdXNlLiBJdCBpcyBldmFsdWF0ZWQgb25seSB3aGVuIHtAbGluayBhcHB9IGlzIGdpdmVuLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEV4dGVuc2lvbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGNsYXNzaWZ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBBIHBhdGggb3IgYW4gYWJzdHJhY3QgZmlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGF0aE9yQWJzdHJhY3RGaWxlID0gc3RyaW5nIHwgVEFic3RyYWN0RmlsZTtcblxuLyoqXG4gKiBBIHBhdGggb3IgYSBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT3JGaWxlID0gc3RyaW5nIHwgVEZpbGU7XG5cbi8qKlxuICogQSBwYXRoIG9yIGEgZm9sZGVyLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT3JGb2xkZXIgPSBzdHJpbmcgfCBURm9sZGVyO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRDYWNoZWRGcm9udG1hdHRlcn0uXG4gKi9cbmludGVyZmFjZSBHZXRDYWNoZWRGcm9udG1hdHRlclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgd2hvc2UgZnJvbnRtYXR0ZXIgdG8gcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0RmlsZUludGVybmFsfS5cbiAqL1xuaW50ZXJmYWNlIEdldEZpbGVJbnRlcm5hbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gV2hlbiBgdW5kZWZpbmVkYCBvciBub3Qgc3BlY2lmaWVkLCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWN0dWFsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byByZXRyaWV2ZSB0aGUgYWJzdHJhY3QgZmlsZSBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXJyYXkgb2YgYWJzdHJhY3QgZmlsZXMgdG8gYW4gYXJyYXkgb2YgZmlsZXMuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZXMgLSBUaGUgYWJzdHJhY3QgZmlsZXMgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBmaWxlcy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IG9mIHRoZSBhYnN0cmFjdCBmaWxlcyBhcmUgbm90IGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNBcnJheU9mRmlsZXMoYWJzdHJhY3RGaWxlczogVEFic3RyYWN0RmlsZVtdKTogVEZpbGVbXSB7XG4gIHJldHVybiBhYnN0cmFjdEZpbGVzLm1hcCgoYWJzdHJhY3RGaWxlKSA9PiBhc0ZpbGUoYWJzdHJhY3RGaWxlKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXJyYXkgb2YgYWJzdHJhY3QgZmlsZXMgdG8gYW4gYXJyYXkgb2YgZm9sZGVycy5cbiAqXG4gKiBAcGFyYW0gYWJzdHJhY3RGaWxlcyAtIFRoZSBhYnN0cmFjdCBmaWxlcyB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGFycmF5IG9mIGZvbGRlcnMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFueSBvZiB0aGUgYWJzdHJhY3QgZmlsZXMgYXJlIG5vdCBmb2xkZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNBcnJheU9mRm9sZGVycyhhYnN0cmFjdEZpbGVzOiBUQWJzdHJhY3RGaWxlW10pOiBURm9sZGVyW10ge1xuICByZXR1cm4gYWJzdHJhY3RGaWxlcy5tYXAoKGFic3RyYWN0RmlsZSkgPT4gYXNGb2xkZXIoYWJzdHJhY3RGaWxlKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYWJzdHJhY3QgZmlsZSB0byBhIGZpbGUuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgZmlsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFic3RyYWN0IGZpbGUgaXMgbm90IGEgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzRmlsZShhYnN0cmFjdEZpbGU6IG51bGwgfCBUQWJzdHJhY3RGaWxlKTogVEZpbGUge1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoYXNGaWxlT3JOdWxsKGFic3RyYWN0RmlsZSksICdBYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZpbGUnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhYnN0cmFjdCBmaWxlIHRvIGEgZmlsZSBvciBgbnVsbGAuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBvciBgbnVsbGAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0ZpbGVPck51bGwoYWJzdHJhY3RGaWxlOiBudWxsIHwgVEFic3RyYWN0RmlsZSk6IG51bGwgfCBURmlsZSB7XG4gIGlmIChhYnN0cmFjdEZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoYWJzdHJhY3RGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RGaWxlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYWJzdHJhY3QgZmlsZSB0byBhIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYWJzdHJhY3RGaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzRm9sZGVyKGFic3RyYWN0RmlsZTogbnVsbCB8IFRBYnN0cmFjdEZpbGUpOiBURm9sZGVyIHtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKGFzRm9sZGVyT3JOdWxsKGFic3RyYWN0RmlsZSksICdBYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZvbGRlcicpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFic3RyYWN0IGZpbGUgdG8gYSBmb2xkZXIgb3IgYG51bGxgLlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGZvbGRlciBvciBgbnVsbGAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzRm9sZGVyT3JOdWxsKGFic3RyYWN0RmlsZTogbnVsbCB8IFRBYnN0cmFjdEZpbGUpOiBudWxsIHwgVEZvbGRlciB7XG4gIGlmIChhYnN0cmFjdEZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoYWJzdHJhY3RGaWxlIGluc3RhbmNlb2YgVEZvbGRlcikge1xuICAgIHJldHVybiBhYnN0cmFjdEZpbGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdBYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZvbGRlcicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGF0aCBvciBmaWxlIGhhcyB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbi5cbiAqXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gY2hlY2suXG4gKiBAcGFyYW0gZXh0ZW5zaW9uIC0gVGhlIGV4dGVuc2lvbiB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBvciBmaWxlIGhhcyB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbiwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0V4dGVuc2lvbihwYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yQWJzdHJhY3RGaWxlLCBleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBGb3IgYSBzdHJpbmcgcGF0aCwgY29tcGFyZSB0aGUgcGF0aCdzIG93biBleHRlbnNpb24gaW5zdGVhZCBvZiByZXNvbHZpbmcgdGhlIGZpbGUuXG4gIC8vIFJlc29sdmluZyBhIHN0cmluZyBwYXRoIGlzIE8odmF1bHQpIG9uIGEgbWlzcyBvbiBhIGNhc2UtaW5zZW5zaXRpdmUgZmlsZXN5c3RlbS5cbiAgLy8gVGhhdCBtaXNzIGlzIHRoZSBob3QgcGF0aCBkdXJpbmcgZGVsZXRpb24gY2FzY2FkZXMuXG4gIC8vIE9ic2lkaWFuIGxvd2VyY2FzZXMgYSBmaWxlJ3MgY2Fub25pY2FsIGV4dGVuc2lvbiwgc28gY29tcGFyZSBjYXNlLWluc2Vuc2l0aXZlbHkuXG4gIHJldHVybiBpc0ZpbGUocGF0aE9yRmlsZSkgPyBwYXRoT3JGaWxlLmV4dGVuc2lvbiA9PT0gZXh0ZW5zaW9uIDogdHlwZW9mIHBhdGhPckZpbGUgPT09ICdzdHJpbmcnICYmIGV4dG5hbWUocGF0aE9yRmlsZSkuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSA9PT0gZXh0ZW5zaW9uO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGF0aCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggZXhpc3RzLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvZXNFeGlzdChwYXJhbXM6IERvZXNFeGlzdFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGgsXG4gICAgdHlwZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBhYnN0cmFjdEZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEFic3RyYWN0RmlsZU9yTnVsbFBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGaWxlOiBwYXRoXG4gIH0pKTtcbiAgcmV0dXJuIGFic3RyYWN0RmlsZSAhPT0gbnVsbCAmJiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IGdldEZpbGVTeXN0ZW1UeXBlKGFic3RyYWN0RmlsZSkgPT09IHR5cGUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgVEFic3RyYWN0RmlsZSBvYmplY3QgZm9yIHRoZSBnaXZlbiBwYXRoIG9yIGFic3RyYWN0IGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmV0cmlldmFsLlxuICogQHJldHVybnMgVGhlIGFic3RyYWN0IGZpbGUuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFic3RyYWN0RmlsZShwYXJhbXM6IEdldEFic3RyYWN0RmlsZVBhcmFtcyk6IFRBYnN0cmFjdEZpbGUge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKFxuICAgIGdldEFic3RyYWN0RmlsZU9yTnVsbChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0QWJzdHJhY3RGaWxlT3JOdWxsUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIHBhdGhPckZpbGVcbiAgICB9KSksXG4gICAgYEFic3RyYWN0IGZpbGUgbm90IGZvdW5kOiAke3BhdGhPckZpbGUgYXMgc3RyaW5nfWBcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYWJzdHJhY3QgZmlsZSBvciBgbnVsbGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhdGggb3IgYWJzdHJhY3QgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgYWJzdHJhY3QgZmlsZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGBudWxsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFic3RyYWN0RmlsZU9yTnVsbChwYXJhbXM6IEdldEFic3RyYWN0RmlsZU9yTnVsbFBhcmFtcyk6IG51bGwgfCBUQWJzdHJhY3RGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChwYXRoT3JGaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoaXNBYnN0cmFjdEZpbGUocGF0aE9yRmlsZSkpIHtcbiAgICBpZiAoaXNGaWxlKHBhdGhPckZpbGUpKSB7XG4gICAgICByZXR1cm4gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgocGF0aE9yRmlsZS5wYXRoKSA/PyBwYXRoT3JGaWxlO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gVEFic3RyYWN0RmlsZSBpcyBhbHdheXMgVEZpbGUgb3IgVEZvbGRlciBpbiBPYnNpZGlhbjsgZGVmZW5zaXZlIGZhbGxiYWNrLiAqL1xuICAgIHJldHVybiBpc0ZvbGRlcihwYXRoT3JGaWxlKSA/IChhcHAudmF1bHQuZ2V0Rm9sZGVyQnlQYXRoKHBhdGhPckZpbGUucGF0aCkgPz8gcGF0aE9yRmlsZSkgOiAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoT3JGaWxlLnBhdGgpID8/IHBhdGhPckZpbGUpO1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cblxuICBjb25zdCBmaWxlID0gZ2V0RmlsZUludGVybmFsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlSW50ZXJuYWxQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aDogcGF0aE9yRmlsZVxuICB9KSk7XG5cbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IGdldFJlc29sdmVkUGF0aChwYXRoT3JGaWxlKTtcblxuICByZXR1cm4gcmVzb2x2ZWRQYXRoID09PSBwYXRoT3JGaWxlXG4gICAgPyBudWxsXG4gICAgOiBnZXRGaWxlSW50ZXJuYWwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVJbnRlcm5hbFBhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgICBwYXRoOiByZXNvbHZlZFBhdGhcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSBuYW1lIG9mIHRoZSBnaXZlbiBgcGF0aE9yRmlsZWA6IGEgZmlsZSdzIG5hbWUgd2l0aG91dCBpdHMgZXh0ZW5zaW9uLCBhIGZvbGRlcidzIGZ1bGwgbmFtZS5cbiAqXG4gKiBVbmxpa2UgYGJhc2VuYW1lYCBmcm9tIGBwYXRoLnRzYCwgd2hpY2ggaXMgYSBwdXJlIHN0cmluZyBmdW5jdGlvbiwgdGhpcyByZXNvbHZlcyB0aGUgYXJndW1lbnQgYWdhaW5zdCB0aGUgdmF1bHQgZmlyc3QuIFRoYXQgaXMgd2hhdCBsZXRzIGEgZm9sZGVyIHdob3NlIG5hbWVcbiAqIGNvbnRhaW5zIGEgZG90IGFuc3dlciB3aXRoIGl0cyB3aG9sZSBuYW1lIGluc3RlYWQgb2YgYSBib2d1cyBleHRlbnNpb24gc3BsaXQsIGFuZCBpdCBpcyB3aHkgYSBjYWxsZXIgaGFuZGxpbmcgYm90aCBraW5kcyBubyBsb25nZXIgaGFzIHRvIGJyYW5jaCBvblxuICoge0BsaW5rIGlzRmlsZX0gaXRzZWxmIFx1MjAxNCBhIGZvbGRlciBoYXMgbm8gYGJhc2VuYW1lYCBvZiBpdHMgb3duLlxuICpcbiAqIEEgcGF0aCB0aGF0IHJlc29sdmVzIHRvIG5vdGhpbmcgaGFzIG5vIGFuc3dlciB0byBsb29rIHVwLCBzbyB7QGxpbmsgR2V0QmFzZW5hbWVQYXJhbXMud2hlbk1pc3NpbmdUcmVhdEFzfSBkZWNpZGVzIHdoYXQgaGFwcGVucy4gSXQgZGVmYXVsdHMgdG9cbiAqIHtAbGluayBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvd30gcmF0aGVyIHRoYW4gdG8gYSBndWVzczogYGFscGhhLmJyYXZvYCBtYXkgbmFtZSBhIGRvdHRlZCBmb2xkZXIgb3IgYSBgLmJyYXZvYCBmaWxlLCBhbmQgbm90aGluZyBpbiB0aGUgdmF1bHQgc2F5c1xuICogd2hpY2gsIHNvIGEgc2lsZW50bHkgd3JvbmcgYW5zd2VyIGlzIHdvcnNlIHRoYW4gYW4gZXJyb3IuIFBhc3Mge0BsaW5rIE1pc3NpbmdQYXRoVHJlYXRtZW50LkZpbGV9IGZvciB0aGUgYGNoZWNrRXh0ZW5zaW9uYCByZWFkaW5nIG9mIGEgYmFyZSBzdHJpbmcsIG9yXG4gKiB7QGxpbmsgTWlzc2luZ1BhdGhUcmVhdG1lbnQuRm9sZGVyfSBmb3IgdGhlIG90aGVyIG9uZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgYmFzZSBuYW1lIG9mIHRoZSBgcGF0aE9yRmlsZWAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwYXRoIHJlc29sdmVzIHRvIG5vdGhpbmcgYW5kIGB3aGVuTWlzc2luZ1RyZWF0QXNgIGlzIHtAbGluayBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvd30gKHRoZSBkZWZhdWx0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VuYW1lKHBhcmFtczogR2V0QmFzZW5hbWVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGUsXG4gICAgd2hlbk1pc3NpbmdUcmVhdEFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgYWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZVxuICB9KTtcblxuICBpZiAoaXNGaWxlKGFic3RyYWN0RmlsZSkpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RGaWxlLmJhc2VuYW1lO1xuICB9XG5cbiAgaWYgKGlzRm9sZGVyKGFic3RyYWN0RmlsZSkpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RGaWxlLm5hbWU7XG4gIH1cblxuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuXG4gIGNvbnN0IHRyZWF0bWVudCA9IHdoZW5NaXNzaW5nVHJlYXRBcyA/PyBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvdztcblxuICBpZiAodHJlYXRtZW50ID09PSBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvdykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQWJzdHJhY3QgZmlsZSBub3QgZm91bmQ6ICR7cGF0aH1gKTtcbiAgfVxuXG4gIHJldHVybiB0cmVhdG1lbnQgPT09IE1pc3NpbmdQYXRoVHJlYXRtZW50LkZvbGRlciA/IGJhc2VuYW1lKHBhdGgpIDogYmFzZW5hbWUocGF0aCwgZXh0bmFtZShwYXRoKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBnaXZlbiBgcGF0aE9yRmlsZWA6IGEgZmlsZSdzIGV4dGVuc2lvbiB3aXRob3V0IHRoZSBsZWFkaW5nIGRvdCwgYW5kIGFuIGVtcHR5IHN0cmluZyBmb3IgYSBmb2xkZXIuXG4gKlxuICogVW5saWtlIGBleHRuYW1lYCBmcm9tIGBwYXRoLnRzYCwgd2hpY2ggaXMgYSBwdXJlIHN0cmluZyBmdW5jdGlvbiwgdGhpcyByZXNvbHZlcyB0aGUgYXJndW1lbnQgYWdhaW5zdCB0aGUgdmF1bHQgZmlyc3QsIHNvIGEgZm9sZGVyIHdob3NlIG5hbWUgY29udGFpbnMgYSBkb3RcbiAqIGFuc3dlcnMgd2l0aCBhbiBlbXB0eSBzdHJpbmcgcmF0aGVyIHRoYW4gYSBib2d1cyBleHRlbnNpb24uIEEgZm9sZGVyIGhhcyBubyBgZXh0ZW5zaW9uYCBvZiBpdHMgb3duLCB3aGljaCBpcyB3aHkgYSBjYWxsZXIgaGFuZGxpbmcgYm90aCBraW5kcyB3b3VsZFxuICogb3RoZXJ3aXNlIGJyYW5jaCBvbiB7QGxpbmsgaXNGaWxlfSBpdHNlbGYuXG4gKlxuICogQSBwYXRoIHRoYXQgcmVzb2x2ZXMgdG8gbm90aGluZyBoYXMgbm8gYW5zd2VyIHRvIGxvb2sgdXAsIHNvIHtAbGluayBHZXRFeHRlbnNpb25QYXJhbXMud2hlbk1pc3NpbmdUcmVhdEFzfSBkZWNpZGVzIHdoYXQgaGFwcGVucy4gSXQgZGVmYXVsdHMgdG9cbiAqIHtAbGluayBNaXNzaW5nUGF0aFRyZWF0bWVudC5UaHJvd30gcmF0aGVyIHRoYW4gdG8gYSBndWVzczogYGFscGhhLmJyYXZvYCBtYXkgbmFtZSBhIGRvdHRlZCBmb2xkZXIgb3IgYSBgLmJyYXZvYCBmaWxlLCBhbmQgbm90aGluZyBpbiB0aGUgdmF1bHQgc2F5c1xuICogd2hpY2gsIHNvIGEgc2lsZW50bHkgd3JvbmcgYW5zd2VyIGlzIHdvcnNlIHRoYW4gYW4gZXJyb3IuIFBhc3Mge0BsaW5rIE1pc3NpbmdQYXRoVHJlYXRtZW50LkZpbGV9IGZvciB0aGUgYGNoZWNrRXh0ZW5zaW9uYCByZWFkaW5nIG9mIGEgYmFyZSBzdHJpbmcsIG9yXG4gKiB7QGxpbmsgTWlzc2luZ1BhdGhUcmVhdG1lbnQuRm9sZGVyfSBmb3IgdGhlIG90aGVyIG9uZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgZXh0ZW5zaW9uIG9mIHRoZSBgcGF0aE9yRmlsZWAsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBpdCBoYXMgbm9uZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHBhdGggcmVzb2x2ZXMgdG8gbm90aGluZyBhbmQgYHdoZW5NaXNzaW5nVHJlYXRBc2AgaXMge0BsaW5rIE1pc3NpbmdQYXRoVHJlYXRtZW50LlRocm93fSAodGhlIGRlZmF1bHQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKHBhcmFtczogR2V0RXh0ZW5zaW9uUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHdoZW5NaXNzaW5nVHJlYXRBc1xuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGVcbiAgfSk7XG5cbiAgaWYgKGlzRmlsZShhYnN0cmFjdEZpbGUpKSB7XG4gICAgcmV0dXJuIGFic3RyYWN0RmlsZS5leHRlbnNpb247XG4gIH1cblxuICBpZiAoaXNGb2xkZXIoYWJzdHJhY3RGaWxlKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG5cbiAgY29uc3QgdHJlYXRtZW50ID0gd2hlbk1pc3NpbmdUcmVhdEFzID8/IE1pc3NpbmdQYXRoVHJlYXRtZW50LlRocm93O1xuXG4gIGlmICh0cmVhdG1lbnQgPT09IE1pc3NpbmdQYXRoVHJlYXRtZW50LlRocm93KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBYnN0cmFjdCBmaWxlIG5vdCBmb3VuZDogJHtwYXRofWApO1xuICB9XG5cbiAgLy8gT2JzaWRpYW4gbG93ZXJjYXNlcyBhIGZpbGUncyBjYW5vbmljYWwgZXh0ZW5zaW9uLCBzbyBhIHBhdGggcmVhZCBhcyBhIGZpbGUgaGFzIHRvIGFuc3dlciBpbiB0aGUgc2FtZSBjYXNlLlxuICByZXR1cm4gdHJlYXRtZW50ID09PSBNaXNzaW5nUGF0aFRyZWF0bWVudC5Gb2xkZXIgPyAnJyA6IGV4dG5hbWUocGF0aCkuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBmaWxlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXRoIG9yIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmV0cmlldmFsLlxuICogQHJldHVybnMgVGhlIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgcGF0aCBvciBmaWxlLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlKHBhcmFtczogR2V0RmlsZVBhcmFtcyk6IFRGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZ1xuICB9ID0gcGFyYW1zO1xuICBsZXQgZmlsZSA9IGdldEZpbGVPck51bGwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVPck51bGxQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRmlsZVxuICB9KSk7XG4gIGlmICghZmlsZSkge1xuICAgIGlmIChzaG91bGRJbmNsdWRlTm9uRXhpc3RpbmcpIHtcbiAgICAgIGZpbGUgPSBjcmVhdGVURmlsZUluc3RhbmNlKGFwcCwgcGF0aE9yRmlsZSBhcyBzdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3BhdGhPckZpbGUgYXMgc3RyaW5nfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWxlO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGZpbGUgb3IgYG51bGxgIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXRoIG9yIGZpbGUuXG4gKiBJZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYWxyZWFkeSBhIGZpbGUsIGl0IGlzIHJldHVybmVkIGFzIGlzLlxuICogT3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgYXBwJ3MgdmF1bHQgdG8gcmV0cmlldmUgdGhlIGZpbGUgYnkgaXRzIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmV0cmlldmFsLlxuICogQHJldHVybnMgVGhlIGZpbGUgaWYgZm91bmQsIG90aGVyd2lzZSBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlT3JOdWxsKHBhcmFtczogR2V0RmlsZU9yTnVsbFBhcmFtcyk6IG51bGwgfCBURmlsZSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRBYnN0cmFjdEZpbGVPck51bGxQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRmlsZVxuICB9KSk7XG4gIHJldHVybiBpc0ZpbGUoZmlsZSkgPyBmaWxlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIG9mIGEgZmlsZSBzeXN0ZW0gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBnZXQgdGhlIHR5cGUgb2YuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgYWJzdHJhY3QgZmlsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFic3RyYWN0IGZpbGUgaXMgbm90IGEgZmlsZSBvciBhIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVTeXN0ZW1UeXBlKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSk6IEZpbGVTeXN0ZW1UeXBlIHtcbiAgaWYgKGlzRmlsZShhYnN0cmFjdEZpbGUpKSB7XG4gICAgcmV0dXJuIEZpbGVTeXN0ZW1UeXBlLkZpbGU7XG4gIH1cbiAgaWYgKGlzRm9sZGVyKGFic3RyYWN0RmlsZSkpIHtcbiAgICByZXR1cm4gRmlsZVN5c3RlbVR5cGUuRm9sZGVyO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlIG9yIGEgZm9sZGVyJyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgZm9sZGVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcHAgYW5kIHBhdGhPckZvbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgcmV0cmlldmVkIGZvbGRlci5cbiAqIEB0aHJvd3MgSWYgdGhlIGZvbGRlciBpcyBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXIocGFyYW1zOiBHZXRGb2xkZXJQYXJhbXMpOiBURm9sZGVyIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGb2xkZXIsXG4gICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nXG4gIH0gPSBwYXJhbXM7XG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZvbGRlck9yTnVsbFBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGb2xkZXJcbiAgfSkpO1xuICBpZiAoIWZvbGRlcikge1xuICAgIGlmIChzaG91bGRJbmNsdWRlTm9uRXhpc3RpbmcpIHtcbiAgICAgIGZvbGRlciA9IGNyZWF0ZVRGb2xkZXJJbnN0YW5jZShhcHAsIHBhdGhPckZvbGRlciBhcyBzdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvbGRlciBub3QgZm91bmQ6ICR7cGF0aE9yRm9sZGVyIGFzIHN0cmluZ31gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZm9sZGVyO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGZvbGRlciBvciBgbnVsbGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhdGggb3IgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHJldHJpZXZhbC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgaWYgZm91bmQsIG90aGVyd2lzZSBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXJPck51bGwocGFyYW1zOiBHZXRGb2xkZXJPck51bGxQYXJhbXMpOiBudWxsIHwgVEZvbGRlciB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRm9sZGVyXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZvbGRlciA9IGdldEFic3RyYWN0RmlsZU9yTnVsbChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0QWJzdHJhY3RGaWxlT3JOdWxsUGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGhPckZpbGU6IHBhdGhPckZvbGRlclxuICB9KSk7XG4gIHJldHVybiBpc0ZvbGRlcihmb2xkZXIpID8gZm9sZGVyIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgZmlsZXMgcmVwcmVzZW50aW5nIHRoZSBtYXJrZG93biBmaWxlcyB3aXRoaW4gYSBzcGVjaWZpZWQgZm9sZGVyIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmV0cmlldmFsLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZmlsZXMgcmVwcmVzZW50aW5nIHRoZSBtYXJrZG93biBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtkb3duRmlsZXMocGFyYW1zOiBHZXRNYXJrZG93bkZpbGVzUGFyYW1zKTogVEZpbGVbXSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNSZWN1cnNpdmUsXG4gICAgcGF0aE9yRm9sZGVyXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZvbGRlciA9IGdldEZvbGRlcih7XG4gICAgYXBwLFxuICAgIHBhdGhPckZvbGRlclxuICB9KTtcblxuICBsZXQgbWFya2Rvd25GaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gIGlmIChpc1JlY3Vyc2l2ZSkge1xuICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihmb2xkZXIsIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgIGlmIChpc01hcmtkb3duRmlsZShhYnN0cmFjdEZpbGUpICYmIGFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICAgIG1hcmtkb3duRmlsZXMucHVzaChhYnN0cmFjdEZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG1hcmtkb3duRmlsZXMgPSBmb2xkZXIuY2hpbGRyZW4uZmlsdGVyKChmaWxlKSA9PiBpc01hcmtkb3duRmlsZShmaWxlKSkgYXMgVEZpbGVbXTtcbiAgfVxuXG4gIG1hcmtkb3duRmlsZXMgPSBtYXJrZG93bkZpbGVzLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpO1xuICByZXR1cm4gbWFya2Rvd25GaWxlcztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZpbGUgZm9yIHRoZSBnaXZlbiBwYXRoIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byByZXRyaWV2ZSBvciBjcmVhdGUuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSByZXByZXNlbnRpbmcgdGhlIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlRmlsZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZU9yTnVsbCh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGU6IHBhdGhcbiAgfSk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBjb25zdCBmb2xkZXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChwYXRoKTtcbiAgYXdhaXQgZ2V0T3JDcmVhdGVGb2xkZXIoYXBwLCBmb2xkZXJQYXRoKTtcblxuICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmb2xkZXIgZm9yIHRoZSBnaXZlbiBwYXRoIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIHJldHJpZXZlIG9yIGNyZWF0ZS5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgcmVwcmVzZW50aW5nIHRoZSBmb2xkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZUZvbGRlcihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxURm9sZGVyPiB7XG4gIGNvbnN0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZvbGRlcjogcGF0aFxuICB9KTtcbiAgcmV0dXJuIGZvbGRlciA/PyAoYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZ2l2ZW4gYHBhdGhPckZpbGVgLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBhYnN0cmFjdCBmaWxlLlxuICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGBwYXRoT3JGaWxlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSk6IHN0cmluZyB7XG4gIGlmIChpc0Fic3RyYWN0RmlsZShwYXRoT3JGaWxlKSkge1xuICAgIHJldHVybiBwYXRoT3JGaWxlLnBhdGg7XG4gIH1cblxuICBjb25zdCBmaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZVxuICB9KTtcbiAgcmV0dXJuIGZpbGUgPyBmaWxlLnBhdGggOiBnZXRSZXNvbHZlZFBhdGgocGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGFuIGluc3RhbmNlIG9mIGFic3RyYWN0IGZpbGUuXG4gKlxuICogQHBhcmFtIGZpbGUgLSBUaGUgZmlsZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaXMgYW4gaW5zdGFuY2Ugb2YgYWJzdHJhY3QgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJzdHJhY3RGaWxlKGZpbGU6IHVua25vd24pOiBmaWxlIGlzIFRBYnN0cmFjdEZpbGUge1xuICByZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogICBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBiYXNlIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBpcyBhIGJhc2UgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmFzZUZpbGUocGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckFic3RyYWN0RmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tFeHRlbnNpb24ocGF0aE9yRmlsZSwgQkFTRV9GSUxFX0VYVEVOU0lPTik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgY2FudmFzIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBpcyBhIGNhbnZhcyBmaWxlIG9yIG5vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yQWJzdHJhY3RGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGVja0V4dGVuc2lvbihwYXRoT3JGaWxlLCBDQU5WQVNfRklMRV9FWFRFTlNJT04pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhbiBpbnN0YW5jZSBvZiBmaWxlLlxuICpcbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIGFuIGluc3RhbmNlIG9mIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpbGUoZmlsZTogdW5rbm93bik6IGZpbGUgaXMgVEZpbGUge1xuICByZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRGaWxlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBmaWxlIGlzIGEgZm9sZGVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRm9sZGVyKGZpbGU6IHVua25vd24pOiBmaWxlIGlzIFRGb2xkZXIge1xuICByZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRGb2xkZXI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgTWFya2Rvd24gZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgTWFya2Rvd24gZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFya2Rvd25GaWxlKHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrRXh0ZW5zaW9uKHBhdGhPckZpbGUsIE1BUktET1dOX0ZJTEVfRVhURU5TSU9OKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBub3RlLlxuICpcbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBub3RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb3RlKHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzTWFya2Rvd25GaWxlKHBhdGhPckZpbGUpIHx8IGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlKSB8fCBpc0Jhc2VGaWxlKHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBwYXRoIG9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyBvciBhbiBpbnN0YW5jZSBvZiBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXRoT3JGaWxlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGF0aE9yRmlsZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IGlzRmlsZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuIGF0dGFjaG1lbnQgYmVjYXVzZSBvZiBpdHMgZXh0ZW5zaW9uLlxuICpcbiAqIFNvbWUgcGx1Z2lucyBzdG9yZSB0aGVpciBkYXRhIGluIGZpbGVzIHRoYXQgYXJlIG1hcmtkb3duIG9uIGRpc2sgYnV0IGFyZSBub3QgcHJvc2UgXHUyMDE0IEV4Y2FsaWRyYXcsIGZvciBleGFtcGxlLCBzYXZlcyBlYWNoIGRyYXdpbmcgYXMgYHNrZXRjaC5leGNhbGlkcmF3Lm1kYC5cbiAqIE9ic2lkaWFuIHJlcG9ydHMgc3VjaCBhIGZpbGUncyBleHRlbnNpb24gYXMgYG1kYCwgc28gYSBjYWxsZXIgdGhhdCB3YW50cyB0byB0ZWxsIGEgZHJhd2luZyBhcGFydCBmcm9tIGEgbm90ZSBoYXMgdG8gbWF0Y2ggdGhlIGZ1bGwgbXVsdGktcGFydCBleHRlbnNpb25cbiAqIChgLmV4Y2FsaWRyYXcubWRgKSBhZ2FpbnN0IHRoZSBmaWxlIG5hbWUuIFdoaWNoIGV4dGVuc2lvbnMgY291bnQgaXMgdGhlIGNhbGxlcidzIGNvbmZpZ3VyYXRpb24sIG5vdCB0aGlzIGxpYnJhcnkncyBcdTIwMTQgb25seSB0aGUgbWF0Y2hpbmcgcnVsZSBpcyBzaGFyZWQuXG4gKlxuICogQSBkcmF3aW5nIGNhbiBhbHNvIGJlIHJlY29nbml6ZWQgYnkgaXRzIGZyb250bWF0dGVyLCB0aGUgd2F5IEV4Y2FsaWRyYXcgaXRzZWxmIHJlY29nbml6ZXMgb25lIChgZXhjYWxpZHJhdy1wbHVnaW46IHBhcnNlZGApLCB0aHJvdWdoIGFcbiAqIGBwcm9wZXJ0eTpuYW1lWz12YWx1ZV1gIGVudHJ5LiBUaGF0IGFuc3dlciBjb21lcyBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZSwgd2hpY2ggY2FuIGJlIGNvbGQgYXQgc3RhcnR1cCBvciByaWdodCBhZnRlciB0aGUgZmlsZSBpcyBjcmVhdGVkLCBzbyBhblxuICogdW5jYWNoZWQgZmlsZSBhbnN3ZXJzIFwibm8gbWF0Y2hcIiBhbmQgaXMgdHJlYXRlZCBhcyBhIG5vdGUuIFRoYXQgaXMgdGhlIGNvbnNlcnZhdGl2ZSBzaWRlIGZvciBldmVyeSBjdXJyZW50IGNhbGxlcjogYSBub3RlIGlzIG5vdCBtb3ZlZCBhcyBhblxuICogYXR0YWNobWVudCwgYW5kIGl0IHNwYXJlcyBpdHMgZm9sZGVyIGZyb20gYSBkZWxldGUgc3dlZXAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2xhc3NpZnkgYW5kIHRoZSBjb25maWd1cmVkIGF0dGFjaG1lbnQgZXh0ZW5zaW9ucy5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gYXR0YWNobWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJlYXRlZEFzQXR0YWNobWVudChwYXJhbXM6IElzVHJlYXRlZEFzQXR0YWNobWVudFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGF0dGFjaG1lbnRFeHRlbnNpb25zLFxuICAgIHBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKHBhdGhPckZpbGUgPT09IG51bGwgfHwgaXNGb2xkZXIocGF0aE9yRmlsZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBsb3dlckNhc2VOYW1lID0gZ2V0TmFtZShwYXRoT3JGaWxlKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gYXR0YWNobWVudEV4dGVuc2lvbnMuc29tZSgoZXh0ZW5zaW9uKSA9PiB7XG4gICAgY29uc3QgdHJpbW1lZEVudHJ5ID0gZXh0ZW5zaW9uLnRyaW0oKTtcbiAgICBpZiAoaXNQcm9wZXJ0eUVudHJ5KHRyaW1tZWRFbnRyeSkpIHtcbiAgICAgIHJldHVybiAhIWFwcCAmJiBpc01hcmtkb3duRmlsZShwYXRoT3JGaWxlKSAmJiBjaGVja1Byb3BlcnR5RW50cnlNYXRjaGVzKHtcbiAgICAgICAgZW50cnk6IHRyaW1tZWRFbnRyeSxcbiAgICAgICAgZnJvbnRtYXR0ZXI6IGdldENhY2hlZEZyb250bWF0dGVyKHsgYXBwLCBwYXRoT3JGaWxlIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFbmZvcmNpbmcgYSBzaW5nbGUgbGVhZGluZyBkb3QgaXMgd2hhdCBrZWVwcyB0aGUgbWF0Y2ggb24gYW4gZXh0ZW5zaW9uIGJvdW5kYXJ5LlxuICAgIC8vIEEgYmFyZSBgcmF3Lm1kYCB3b3VsZCBvdGhlcndpc2UgbWF0Y2ggYHNrZXRjaC5leGNhbGlkcmF3Lm1kYCwgd2hpY2ggaXMgbmV2ZXIgd2hhdCBhIGNhbGxlciBtZWFucy5cbiAgICBjb25zdCBub3JtYWxpemVkRXh0ZW5zaW9uID0gZXh0ZW5zaW9uLnRyaW0oKS5yZXBsYWNlKC9eXFwuKy8sICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBub3JtYWxpemVkRXh0ZW5zaW9uICE9PSAnJyAmJiBsb3dlckNhc2VOYW1lLmVuZHNXaXRoKGAuJHtub3JtYWxpemVkRXh0ZW5zaW9ufWApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUcmltcyB0aGUgbWFya2Rvd24gZXh0ZW5zaW9uIGZyb20gdGhlIGZpbGUgcGF0aCBpZiB0aGUgZmlsZSBpcyBhIG1hcmtkb3duIGZpbGUuXG4gKiBJZiB0aGUgZmlsZSBpcyBub3QgYSBtYXJrZG93biBmaWxlLCB0aGUgb3JpZ2luYWwgZmlsZSBwYXRoIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gdHJpbSB0aGUgbWFya2Rvd24gZXh0ZW5zaW9uIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBwYXRoIHdpdGggdGhlIG1hcmtkb3duIGV4dGVuc2lvbiB0cmltbWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbU1hcmtkb3duRXh0ZW5zaW9uKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiBzdHJpbmcge1xuICByZXR1cm4gaXNNYXJrZG93bkZpbGUoZmlsZSlcbiAgICA/IHRyaW1FbmQoe1xuICAgICAgJHN0cmluZzogZmlsZS5wYXRoLFxuICAgICAgc3VmZml4OiBgLiR7TUFSS0RPV05fRklMRV9FWFRFTlNJT059YFxuICAgIH0pXG4gICAgOiBmaWxlLnBhdGg7XG59XG5cbmZ1bmN0aW9uIGdldENhY2hlZEZyb250bWF0dGVyKHBhcmFtczogR2V0Q2FjaGVkRnJvbnRtYXR0ZXJQYXJhbXMpOiBudWxsIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgZmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbChwYXJhbXMpO1xuICByZXR1cm4gaXNGaWxlKGZpbGUpID8gcGFyYW1zLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKT8uZnJvbnRtYXR0ZXIgPz8gbnVsbCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGVJbnRlcm5hbChwYXJhbXM6IEdldEZpbGVJbnRlcm5hbFBhcmFtcyk6IG51bGwgfCBUQWJzdHJhY3RGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwYXRoXG4gIH0gPSBwYXJhbXM7XG4gIGxldCB7IGlzQ2FzZUluc2Vuc2l0aXZlIH0gPSBwYXJhbXM7XG4gIGlzQ2FzZUluc2Vuc2l0aXZlID8/PSBnZXREYXRhQWRhcHRlckV4KGFwcCkuaW5zZW5zaXRpdmU7XG4gIGlmIChpc0Nhc2VJbnNlbnNpdGl2ZSkge1xuICAgIGNvbnN0IGNhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleCA9IGdldENhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleChhcHApO1xuICAgIHJldHVybiBjYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXggPyBjYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXguZ2V0KHBhdGgpIDogYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aEluc2Vuc2l0aXZlKHBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgocGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldE5hbWUocGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzQWJzdHJhY3RGaWxlKHBhdGhPckZpbGUpID8gcGF0aE9yRmlsZS5uYW1lIDogYmFzZW5hbWUocGF0aE9yRmlsZSk7XG59XG5cbmZ1bmN0aW9uIGdldFJlc29sdmVkUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbm9ybWFsaXplUGF0aChyZXNvbHZlKCcvJywgcGF0aCkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQSwwQkFBNEM7QUFDNUMsa0JBSU87QUFDUCxvQkFBd0I7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T0FBTztBQUMzRjtBQUVBLFNBQVMsZ0JBQWdCLFFBQXFEO0FBQzVFLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLE1BQUksRUFBRSxrQkFBa0IsSUFBSTtBQUM1Qiw0QkFBc0IseUNBQWlCLEdBQUcsRUFBRTtBQUM1QyxNQUFJLG1CQUFtQjtBQUNyQixVQUFNLCtCQUEyQixnRUFBNEIsR0FBRztBQUNoRSxXQUFPLDJCQUEyQix5QkFBeUIsSUFBSSxJQUFJLElBQUksSUFBSSxNQUFNLGlDQUFpQyxJQUFJO0FBQUEsRUFDeEg7QUFFQSxTQUFPLElBQUksTUFBTSxzQkFBc0IsSUFBSTtBQUM3QztBQUVBLFNBQVMsUUFBUSxZQUF3QztBQUN2RCxTQUFPLGVBQWUsVUFBVSxJQUFJLFdBQVcsV0FBTyxzQkFBUyxVQUFVO0FBQzNFO0FBRUEsU0FBUyxnQkFBZ0IsTUFBc0I7QUFDN0MsYUFBTyxtQ0FBYyxxQkFBUSxLQUFLLElBQUksQ0FBQztBQUN6QzsiLAogICJuYW1lcyI6IFsiRmlsZVN5c3RlbVR5cGUiLCAiTWlzc2luZ1BhdGhUcmVhdG1lbnQiXQp9Cg==
|
|
@@ -528,6 +528,13 @@ export declare function isMarkdownFile(pathOrFile: null | PathOrAbstractFile): b
|
|
|
528
528
|
* @returns A boolean indicating whether the file is a note.
|
|
529
529
|
*/
|
|
530
530
|
export declare function isNote(pathOrFile: null | PathOrAbstractFile): boolean;
|
|
531
|
+
/**
|
|
532
|
+
* Checks if the given value is a path or a file.
|
|
533
|
+
*
|
|
534
|
+
* @param value - The value to check.
|
|
535
|
+
* @returns A boolean indicating whether the value is a string or an instance of file.
|
|
536
|
+
*/
|
|
537
|
+
export declare function isPathOrFile(value: unknown): value is PathOrFile;
|
|
531
538
|
/**
|
|
532
539
|
* Checks if the given file should be treated as an attachment because of its extension.
|
|
533
540
|
*
|