obsidian-dev-utils 88.7.0 → 89.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/CHANGELOG.md +23 -0
- package/dist/demo-vault-helper/main.js +20 -23
- package/dist/integration-test-plugin/main.js +2218 -1734
- package/dist/lib/cjs/__merged.cjs +57 -35
- package/dist/lib/cjs/__merged.d.cts +12 -10
- package/dist/lib/cjs/abort-controller.cjs +15 -22
- package/dist/lib/cjs/array.cjs +27 -26
- package/dist/lib/cjs/array.d.cts +25 -7
- package/dist/lib/cjs/async-events.cjs +87 -91
- package/dist/lib/cjs/async-events.d.cts +50 -50
- package/dist/lib/cjs/async.cjs +80 -80
- package/dist/lib/cjs/async.d.cts +23 -23
- package/dist/lib/cjs/beeper.cjs +11 -15
- package/dist/lib/cjs/blob.cjs +14 -25
- package/dist/lib/cjs/codemirror/index.cjs +11 -15
- package/dist/lib/cjs/codemirror/state-field-spec.cjs +11 -15
- package/dist/lib/cjs/debug-controller.cjs +11 -15
- package/dist/lib/cjs/debug.cjs +24 -32
- package/dist/lib/cjs/debug.d.cts +1 -1
- package/dist/lib/cjs/disposable.cjs +59 -43
- package/dist/lib/cjs/disposable.d.cts +27 -8
- package/dist/lib/cjs/enum.cjs +11 -15
- package/dist/lib/cjs/error.cjs +28 -33
- package/dist/lib/cjs/function.cjs +30 -34
- package/dist/lib/cjs/function.d.cts +26 -26
- package/dist/lib/cjs/generated-during-build.cjs +12 -16
- package/dist/lib/cjs/html-element.cjs +84 -89
- package/dist/lib/cjs/html-element.d.cts +15 -15
- package/dist/lib/cjs/index.cjs +11 -15
- package/dist/lib/cjs/integration-test-setup.cjs +11 -15
- package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +11 -15
- package/dist/lib/cjs/jest-setup.cjs +11 -15
- package/dist/lib/cjs/library.cjs +11 -15
- package/dist/lib/cjs/object-utils.cjs +120 -117
- package/dist/lib/cjs/object-utils.d.cts +27 -27
- package/dist/lib/cjs/obsidian/@types/dataview/data-model/value.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/expression/field.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/expression/functions.d.cts +4 -4
- package/dist/lib/cjs/obsidian/active-file-provider.cjs +11 -15
- package/dist/lib/cjs/obsidian/app.cjs +11 -15
- package/dist/lib/cjs/obsidian/async-with-notice.cjs +28 -32
- package/dist/lib/cjs/obsidian/async-with-notice.d.cts +2 -2
- package/dist/lib/cjs/obsidian/attachment-path.cjs +20 -24
- package/dist/lib/cjs/obsidian/attachment-path.d.cts +5 -5
- package/dist/lib/cjs/obsidian/backlink.cjs +12 -16
- package/dist/lib/cjs/obsidian/bases-view-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/callout.cjs +27 -26
- package/dist/lib/cjs/obsidian/callout.d.cts +9 -3
- package/dist/lib/cjs/obsidian/canvas.cjs +13 -16
- package/dist/lib/cjs/obsidian/case-insensitive-file-index.cjs +18 -20
- package/dist/lib/cjs/obsidian/code-block-markdown-information.cjs +11 -15
- package/dist/lib/cjs/obsidian/code-block-markdown-information.d.cts +2 -2
- package/dist/lib/cjs/obsidian/code-block-reg-exp.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +18 -16
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +5 -0
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +56 -31
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +42 -8
- package/dist/lib/cjs/obsidian/command-handlers/command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +10 -0
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +26 -30
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +8 -8
- package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +12 -16
- package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +12 -16
- package/dist/lib/cjs/obsidian/command-handlers/global-command-handler.cjs +13 -17
- package/dist/lib/cjs/obsidian/command-handlers/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/community-plugins.cjs +28 -25
- package/dist/lib/cjs/obsidian/community-plugins.d.cts +19 -5
- package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +4 -4
- package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +13 -16
- package/dist/lib/cjs/obsidian/components/async-events-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/component-ex.cjs +26 -28
- package/dist/lib/cjs/obsidian/components/component-ex.d.cts +3 -3
- package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/disposable-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/embed-extensions-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/index.cjs +14 -15
- package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +29 -33
- package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +55 -55
- package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.cjs +297 -0
- package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.d.cts +139 -0
- package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +28 -31
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +26 -30
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +8 -8
- package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/pointer-position-component.cjs +13 -17
- package/dist/lib/cjs/obsidian/components/registry-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +72 -62
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +12 -1
- package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.cjs +16 -20
- package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.d.cts +8 -8
- package/dist/lib/cjs/obsidian/constructors/get-dom-events-handlers-constructor.cjs +14 -18
- package/dist/lib/cjs/obsidian/constructors/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/css-class.cjs +11 -15
- package/dist/lib/cjs/obsidian/data-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/dataview-link.cjs +13 -17
- package/dist/lib/cjs/obsidian/dataview.cjs +35 -41
- package/dist/lib/cjs/obsidian/dataview.d.cts +2 -2
- package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +13 -17
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +22 -26
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +23 -21
- package/dist/lib/cjs/obsidian/editor-extension-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/editor-suggest-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/editor.cjs +17 -19
- package/dist/lib/cjs/obsidian/events.cjs +12 -16
- package/dist/lib/cjs/obsidian/events.d.cts +2 -2
- package/dist/lib/cjs/obsidian/extensions-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/file-change.cjs +76 -80
- package/dist/lib/cjs/obsidian/file-change.d.cts +3 -3
- package/dist/lib/cjs/obsidian/file-manager.cjs +33 -22
- package/dist/lib/cjs/obsidian/file-manager.d.cts +20 -1
- package/dist/lib/cjs/obsidian/file-system.cjs +15 -19
- package/dist/lib/cjs/obsidian/file-system.d.cts +3 -3
- package/dist/lib/cjs/obsidian/frontmatter-link-cache-with-offsets.cjs +11 -15
- package/dist/lib/cjs/obsidian/frontmatter.cjs +15 -19
- package/dist/lib/cjs/obsidian/hover-link-source-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/html-element.cjs +13 -17
- package/dist/lib/cjs/obsidian/html-element.d.cts +2 -2
- package/dist/lib/cjs/obsidian/i18n/custom-type-options.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/default-translations.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/i18n.cjs +13 -16
- package/dist/lib/cjs/obsidian/i18n/i18n.d.cts +7 -0
- package/dist/lib/cjs/obsidian/i18n/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/locales/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/locales/translations-map.cjs +11 -15
- package/dist/lib/cjs/obsidian/index.cjs +14 -15
- package/dist/lib/cjs/obsidian/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/is-in-obsidian.cjs +11 -15
- package/dist/lib/cjs/obsidian/link-update-progress.cjs +11 -15
- package/dist/lib/cjs/obsidian/link.cjs +91 -81
- package/dist/lib/cjs/obsidian/link.d.cts +22 -22
- package/dist/lib/cjs/obsidian/logger.cjs +21 -25
- package/dist/lib/cjs/obsidian/logger.d.cts +5 -5
- package/dist/lib/cjs/obsidian/loop.cjs +14 -18
- package/dist/lib/cjs/obsidian/loop.d.cts +1 -1
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.cjs +12 -16
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +3 -3
- package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +35 -40
- package/dist/lib/cjs/obsidian/markdown-code-block-processor.d.cts +3 -3
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +12 -16
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +3 -3
- package/dist/lib/cjs/obsidian/markdown-view.cjs +11 -15
- package/dist/lib/cjs/obsidian/markdown.cjs +22 -24
- package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/metadata-cache.cjs +16 -20
- package/dist/lib/cjs/obsidian/metadata-cache.d.cts +2 -2
- package/dist/lib/cjs/obsidian/modals/alert.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/confirm.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +28 -32
- package/dist/lib/cjs/obsidian/modals/modal.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/prompt.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/select-item.cjs +16 -20
- package/dist/lib/cjs/obsidian/modals/select-item.d.cts +1 -1
- package/dist/lib/cjs/obsidian/modals/select-option.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.cjs +26 -28
- package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.d.cts +5 -5
- package/dist/lib/cjs/obsidian/notebook-navigator.cjs +155 -0
- package/dist/lib/cjs/obsidian/notebook-navigator.d.cts +132 -0
- package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/obsidian-settings.cjs +11 -15
- package/dist/lib/cjs/obsidian/parse-link.cjs +61 -62
- package/dist/lib/cjs/obsidian/parse-link.d.cts +4 -4
- package/dist/lib/cjs/obsidian/path-settings.cjs +27 -25
- package/dist/lib/cjs/obsidian/pdf.cjs +13 -17
- package/dist/lib/cjs/obsidian/pdf.d.cts +2 -2
- package/dist/lib/cjs/obsidian/plugin/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +11 -15
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +156 -52
- package/dist/lib/cjs/obsidian/plugin/plugin-context.cjs +17 -21
- package/dist/lib/cjs/obsidian/plugin/plugin-context.d.cts +2 -2
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +20 -24
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +11 -9
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +29 -33
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +33 -16
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +11 -1
- package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/popovers/field-popover.cjs +11 -15
- package/dist/lib/cjs/obsidian/popovers/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/popovers/popover-anchor.cjs +14 -18
- package/dist/lib/cjs/obsidian/popovers/popover-anchor.d.cts +2 -2
- package/dist/lib/cjs/obsidian/popovers/popover.cjs +19 -23
- package/dist/lib/cjs/obsidian/queue.cjs +16 -20
- package/dist/lib/cjs/obsidian/queue.d.cts +2 -2
- package/dist/lib/cjs/obsidian/react/app-context.cjs +11 -15
- package/dist/lib/cjs/obsidian/react/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/reference.cjs +11 -15
- package/dist/lib/cjs/obsidian/resource-lock.cjs +157 -78
- package/dist/lib/cjs/obsidian/resource-lock.d.cts +5 -0
- package/dist/lib/cjs/obsidian/resource-url.cjs +12 -16
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/checkbox-component.cjs +18 -22
- package/dist/lib/cjs/obsidian/setting-components/checkbox-component.d.cts +5 -5
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +28 -31
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/date-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/date-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/date-time-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/date-time-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/email-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/email-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/file-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/month-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/month-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +17 -21
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-file-component.cjs +12 -16
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +15 -19
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/number-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/number-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/password-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/password-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.cjs +16 -20
- package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/telephone-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/telephone-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/text-based-component.cjs +16 -20
- package/dist/lib/cjs/obsidian/setting-components/text-based-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/time-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/time-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.cjs +15 -19
- package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +16 -20
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +18 -22
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-range-text-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +16 -19
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.d.cts +4 -4
- package/dist/lib/cjs/obsidian/setting-components/url-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/url-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/validator-component.cjs +45 -49
- package/dist/lib/cjs/obsidian/setting-components/validator-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/value-component-with-change-tracking.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/week-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/week-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-ex.cjs +76 -80
- package/dist/lib/cjs/obsidian/setting-ex.d.cts +42 -42
- package/dist/lib/cjs/obsidian/setting-group-ex.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-group-ex.d.cts +2 -2
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/validation.cjs +11 -15
- package/dist/lib/cjs/obsidian/vault-delete.cjs +23 -20
- package/dist/lib/cjs/obsidian/vault-delete.d.cts +16 -2
- package/dist/lib/cjs/obsidian/vault-transaction.cjs +17 -18
- package/dist/lib/cjs/obsidian/vault.cjs +81 -63
- package/dist/lib/cjs/obsidian/vault.d.cts +32 -11
- package/dist/lib/cjs/obsidian/view-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/workspace.cjs +12 -16
- package/dist/lib/cjs/obsidian-dev-utils-state.cjs +11 -15
- package/dist/lib/cjs/path.cjs +18 -22
- package/dist/lib/cjs/path.d.cts +1 -1
- package/dist/lib/cjs/reg-exp.cjs +38 -35
- package/dist/lib/cjs/reg-exp.d.cts +4 -4
- package/dist/lib/cjs/script-utils/build.cjs +21 -25
- package/dist/lib/cjs/script-utils/build.d.cts +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +24 -28
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +36 -34
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +20 -24
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +13 -17
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +16 -20
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +6 -2
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +32 -36
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/rename-css-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/check-project-types.cjs +13 -17
- package/dist/lib/cjs/script-utils/check-project-types.d.cts +12 -4
- package/dist/lib/cjs/script-utils/cli-utils.cjs +39 -47
- package/dist/lib/cjs/script-utils/cli-utils.d.cts +6 -6
- package/dist/lib/cjs/script-utils/code-generator.cjs +11 -15
- package/dist/lib/cjs/script-utils/commitlint-config.cjs +11 -15
- package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +22 -23
- package/dist/lib/cjs/script-utils/demo-vault.cjs +11 -15
- package/dist/lib/cjs/script-utils/env-toggle.cjs +13 -17
- package/dist/lib/cjs/script-utils/exec.cjs +40 -44
- package/dist/lib/cjs/script-utils/exec.d.cts +4 -4
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +12 -16
- package/dist/lib/cjs/script-utils/formatters/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/fs.cjs +13 -17
- package/dist/lib/cjs/script-utils/git.cjs +11 -15
- package/dist/lib/cjs/script-utils/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/json.cjs +15 -19
- package/dist/lib/cjs/script-utils/json.d.cts +2 -2
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +12 -16
- package/dist/lib/cjs/script-utils/linters/eslint-agnostic-core-boundary.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +402 -16
- package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +27 -31
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +27 -31
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.cjs +21 -25
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.cjs +109 -113
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.cjs +13 -17
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.cjs +21 -25
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +51 -55
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +9 -3
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +25 -27
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +6 -2
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +33 -37
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/rule-tester-helper.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +14 -18
- package/dist/lib/cjs/script-utils/linters/index.cjs +14 -15
- package/dist/lib/cjs/script-utils/linters/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +18 -17
- package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.d.cts +2 -2
- package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.cjs +138 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.d.cts +35 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +20 -23
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +18 -22
- package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +54 -18
- package/dist/lib/cjs/script-utils/nano-staged-config.cjs +11 -15
- package/dist/lib/cjs/script-utils/npm-publish.cjs +11 -15
- package/dist/lib/cjs/script-utils/npm-run.cjs +20 -17
- package/dist/lib/cjs/script-utils/npm-run.d.cts +16 -2
- package/dist/lib/cjs/script-utils/npm.cjs +21 -25
- package/dist/lib/cjs/script-utils/npm.d.cts +11 -11
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +11 -15
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +165 -55
- package/dist/lib/cjs/script-utils/root.cjs +11 -15
- package/dist/lib/cjs/script-utils/test-runners/index.cjs +16 -17
- package/dist/lib/cjs/script-utils/test-runners/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/test-runners/integration-test-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/test-runners/vitest-config.cjs +325 -0
- package/dist/lib/cjs/script-utils/test-runners/vitest-config.d.cts +118 -0
- package/dist/lib/cjs/script-utils/test-runners/vitest.cjs +11 -15
- package/dist/lib/cjs/script-utils/validate-declarations.cjs +11 -15
- package/dist/lib/cjs/script-utils/version.cjs +62 -63
- package/dist/lib/cjs/script-utils/version.d.cts +21 -21
- package/dist/lib/cjs/script-utils/warnings-as-errors.cjs +11 -15
- package/dist/lib/cjs/setup.cjs +11 -15
- package/dist/lib/cjs/setup.d.cts +1 -1
- package/dist/lib/cjs/strict-proxy.cjs +30 -34
- package/dist/lib/cjs/strict-proxy.d.cts +2 -2
- package/dist/lib/cjs/string.cjs +90 -93
- package/dist/lib/cjs/string.d.cts +60 -60
- package/dist/lib/cjs/transformers/date-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/duration-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/group-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/index.cjs +11 -15
- package/dist/lib/cjs/transformers/map-transformer.cjs +12 -16
- package/dist/lib/cjs/transformers/set-transformer.cjs +12 -16
- package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +12 -16
- package/dist/lib/cjs/transformers/typed-transformer.cjs +11 -15
- package/dist/lib/cjs/two-way-map.cjs +11 -15
- package/dist/lib/cjs/type-guards.cjs +16 -20
- package/dist/lib/cjs/type-guards.d.cts +6 -6
- package/dist/lib/cjs/type.cjs +13 -17
- package/dist/lib/cjs/type.d.cts +2 -2
- package/dist/lib/cjs/url.cjs +18 -22
- package/dist/lib/cjs/url.d.cts +4 -4
- package/dist/lib/cjs/value-provider.cjs +15 -19
- package/dist/lib/cjs/value-provider.d.cts +6 -6
- package/dist/lib/cjs/value-wrapper.cjs +11 -15
- package/dist/lib/cjs/vitest-setup.cjs +11 -15
- package/dist/lib/esm/__merged.d.mts +12 -10
- package/dist/lib/esm/__merged.mjs +51 -23
- package/dist/lib/esm/abort-controller.mjs +5 -8
- package/dist/lib/esm/array.d.mts +25 -7
- package/dist/lib/esm/array.mjs +16 -12
- package/dist/lib/esm/async-events.d.mts +50 -50
- package/dist/lib/esm/async-events.mjs +81 -78
- package/dist/lib/esm/async.d.mts +23 -23
- package/dist/lib/esm/async.mjs +70 -66
- package/dist/lib/esm/blob.mjs +4 -11
- package/dist/lib/esm/debug.d.mts +1 -1
- package/dist/lib/esm/debug.mjs +14 -18
- package/dist/lib/esm/disposable.d.mts +27 -8
- package/dist/lib/esm/disposable.mjs +47 -29
- package/dist/lib/esm/error.mjs +18 -19
- package/dist/lib/esm/function.d.mts +26 -26
- package/dist/lib/esm/function.mjs +20 -20
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/html-element.d.mts +15 -15
- package/dist/lib/esm/html-element.mjs +74 -75
- package/dist/lib/esm/object-utils.d.mts +27 -27
- package/dist/lib/esm/object-utils.mjs +109 -102
- package/dist/lib/esm/obsidian/@types/dataview/data-model/value.d.mts +1 -1
- package/dist/lib/esm/obsidian/@types/dataview/expression/field.d.mts +1 -1
- package/dist/lib/esm/obsidian/@types/dataview/expression/functions.d.mts +4 -4
- package/dist/lib/esm/obsidian/app.mjs +1 -1
- package/dist/lib/esm/obsidian/async-with-notice.d.mts +2 -2
- package/dist/lib/esm/obsidian/async-with-notice.mjs +18 -18
- package/dist/lib/esm/obsidian/attachment-path.d.mts +5 -5
- package/dist/lib/esm/obsidian/attachment-path.mjs +10 -10
- package/dist/lib/esm/obsidian/backlink.mjs +2 -2
- package/dist/lib/esm/obsidian/callout.d.mts +9 -3
- package/dist/lib/esm/obsidian/callout.mjs +17 -12
- package/dist/lib/esm/obsidian/canvas.mjs +3 -2
- package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +8 -6
- package/dist/lib/esm/obsidian/code-block-markdown-information.d.mts +2 -2
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +5 -0
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +8 -2
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +42 -8
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +46 -17
- package/dist/lib/esm/obsidian/command-handlers/command-handler.d.mts +10 -0
- package/dist/lib/esm/obsidian/command-handlers/command-handler.mjs +1 -1
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +8 -8
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +16 -16
- package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +2 -2
- package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +2 -2
- package/dist/lib/esm/obsidian/command-handlers/global-command-handler.mjs +3 -3
- package/dist/lib/esm/obsidian/community-plugins.d.mts +19 -5
- package/dist/lib/esm/obsidian/community-plugins.mjs +17 -11
- package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +4 -4
- package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +3 -2
- package/dist/lib/esm/obsidian/components/component-ex.d.mts +3 -3
- package/dist/lib/esm/obsidian/components/component-ex.mjs +16 -14
- package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/components/console-debug-component.mjs +4 -4
- package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/components/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +5 -5
- package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +55 -55
- package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +19 -19
- package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.d.mts +139 -0
- package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.mjs +196 -0
- package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +18 -17
- package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +8 -8
- package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +18 -18
- package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +3 -3
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +12 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +62 -48
- package/dist/lib/esm/obsidian/components/syntax-highlighting-component.d.mts +8 -8
- package/dist/lib/esm/obsidian/components/syntax-highlighting-component.mjs +6 -6
- package/dist/lib/esm/obsidian/constructors/get-dom-events-handlers-constructor.mjs +4 -4
- package/dist/lib/esm/obsidian/data-handler.mjs +1 -1
- package/dist/lib/esm/obsidian/dataview-link.mjs +3 -3
- package/dist/lib/esm/obsidian/dataview.d.mts +2 -2
- package/dist/lib/esm/obsidian/dataview.mjs +25 -27
- package/dist/lib/esm/obsidian/demo-vault-helper.mjs +4 -3
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +12 -12
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +13 -7
- package/dist/lib/esm/obsidian/editor.mjs +7 -5
- package/dist/lib/esm/obsidian/events.d.mts +2 -2
- package/dist/lib/esm/obsidian/events.mjs +2 -2
- package/dist/lib/esm/obsidian/file-change.d.mts +3 -3
- package/dist/lib/esm/obsidian/file-change.mjs +67 -67
- package/dist/lib/esm/obsidian/file-manager.d.mts +20 -1
- package/dist/lib/esm/obsidian/file-manager.mjs +22 -8
- package/dist/lib/esm/obsidian/file-system.d.mts +3 -3
- package/dist/lib/esm/obsidian/file-system.mjs +4 -4
- package/dist/lib/esm/obsidian/frontmatter.mjs +5 -5
- package/dist/lib/esm/obsidian/html-element.d.mts +2 -2
- package/dist/lib/esm/obsidian/html-element.mjs +3 -3
- package/dist/lib/esm/obsidian/i18n/i18n.d.mts +7 -0
- package/dist/lib/esm/obsidian/i18n/i18n.mjs +3 -2
- package/dist/lib/esm/obsidian/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/index.mjs +3 -1
- package/dist/lib/esm/obsidian/link.d.mts +22 -22
- package/dist/lib/esm/obsidian/link.mjs +76 -62
- package/dist/lib/esm/obsidian/logger.d.mts +5 -5
- package/dist/lib/esm/obsidian/logger.mjs +11 -11
- package/dist/lib/esm/obsidian/loop.d.mts +1 -1
- package/dist/lib/esm/obsidian/loop.mjs +4 -4
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +3 -3
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +2 -2
- package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +3 -3
- package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +25 -26
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +3 -3
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +2 -2
- package/dist/lib/esm/obsidian/markdown.mjs +12 -10
- package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/metadata-cache.d.mts +2 -2
- package/dist/lib/esm/obsidian/metadata-cache.mjs +6 -6
- package/dist/lib/esm/obsidian/modals/confirm.mjs +1 -1
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +18 -18
- package/dist/lib/esm/obsidian/modals/select-item.d.mts +1 -1
- package/dist/lib/esm/obsidian/modals/select-item.mjs +6 -6
- package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.d.mts +5 -5
- package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.mjs +16 -14
- package/dist/lib/esm/obsidian/notebook-navigator.d.mts +132 -0
- package/dist/lib/esm/obsidian/notebook-navigator.mjs +49 -0
- package/dist/lib/esm/obsidian/parse-link.d.mts +4 -4
- package/dist/lib/esm/obsidian/parse-link.mjs +51 -48
- package/dist/lib/esm/obsidian/path-settings.mjs +17 -11
- package/dist/lib/esm/obsidian/pdf.d.mts +2 -2
- package/dist/lib/esm/obsidian/pdf.mjs +3 -3
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +156 -52
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +1 -1
- package/dist/lib/esm/obsidian/plugin/plugin-context.d.mts +2 -2
- package/dist/lib/esm/obsidian/plugin/plugin-context.mjs +7 -7
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +11 -9
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +10 -10
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +20 -20
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +11 -1
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +23 -2
- package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +2 -2
- package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +4 -4
- package/dist/lib/esm/obsidian/popovers/popover.mjs +9 -9
- package/dist/lib/esm/obsidian/queue.d.mts +2 -2
- package/dist/lib/esm/obsidian/queue.mjs +6 -6
- package/dist/lib/esm/obsidian/resource-lock.d.mts +5 -0
- package/dist/lib/esm/obsidian/resource-lock.mjs +147 -64
- package/dist/lib/esm/obsidian/resource-url.mjs +2 -2
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +2 -2
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/setting-components/checkbox-component.d.mts +5 -5
- package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +8 -8
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +18 -17
- package/dist/lib/esm/obsidian/setting-components/date-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/date-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/date-time-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/email-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/email-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/month-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/month-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +7 -7
- package/dist/lib/esm/obsidian/setting-components/multiple-email-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +5 -5
- package/dist/lib/esm/obsidian/setting-components/number-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/number-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/password-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/password-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +6 -6
- package/dist/lib/esm/obsidian/setting-components/telephone-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/text-based-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/text-based-component.mjs +6 -6
- package/dist/lib/esm/obsidian/setting-components/time-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/time-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +5 -5
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +6 -6
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +8 -8
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.d.mts +4 -4
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +6 -5
- package/dist/lib/esm/obsidian/setting-components/url-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/url-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/validator-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +35 -35
- package/dist/lib/esm/obsidian/setting-components/week-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/week-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-ex.d.mts +42 -42
- package/dist/lib/esm/obsidian/setting-ex.mjs +66 -66
- package/dist/lib/esm/obsidian/setting-group-ex.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-group-ex.mjs +4 -4
- package/dist/lib/esm/obsidian/vault-delete.d.mts +16 -2
- package/dist/lib/esm/obsidian/vault-delete.mjs +12 -6
- package/dist/lib/esm/obsidian/vault-transaction.mjs +8 -4
- package/dist/lib/esm/obsidian/vault.d.mts +32 -11
- package/dist/lib/esm/obsidian/vault.mjs +67 -47
- package/dist/lib/esm/obsidian/view-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/workspace.mjs +2 -2
- package/dist/lib/esm/path.d.mts +1 -1
- package/dist/lib/esm/path.mjs +7 -7
- package/dist/lib/esm/reg-exp.d.mts +4 -4
- package/dist/lib/esm/reg-exp.mjs +28 -21
- package/dist/lib/esm/script-utils/build.d.mts +1 -1
- package/dist/lib/esm/script-utils/build.mjs +15 -12
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +14 -14
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +26 -20
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +10 -10
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +3 -3
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +6 -6
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +6 -2
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +1 -1
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +20 -20
- package/dist/lib/esm/script-utils/check-project-types.d.mts +12 -4
- package/dist/lib/esm/script-utils/check-project-types.mjs +3 -3
- package/dist/lib/esm/script-utils/cli-utils.d.mts +6 -6
- package/dist/lib/esm/script-utils/cli-utils.mjs +29 -33
- package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +12 -9
- package/dist/lib/esm/script-utils/env-toggle.mjs +3 -3
- package/dist/lib/esm/script-utils/exec.d.mts +4 -4
- package/dist/lib/esm/script-utils/exec.mjs +32 -32
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +2 -2
- package/dist/lib/esm/script-utils/fs.mjs +3 -3
- package/dist/lib/esm/script-utils/json.d.mts +2 -2
- package/dist/lib/esm/script-utils/json.mjs +5 -5
- package/dist/lib/esm/script-utils/linters/cspell.mjs +2 -2
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +392 -2
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +17 -17
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +17 -17
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.mjs +11 -11
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.mjs +99 -99
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.mjs +11 -11
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.d.mts +9 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +41 -41
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +6 -2
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +15 -13
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +23 -23
- package/dist/lib/esm/script-utils/linters/eslint.mjs +4 -4
- package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.d.mts +2 -2
- package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +8 -3
- package/dist/lib/esm/script-utils/linters/markdownlint-ignores.d.mts +35 -0
- package/dist/lib/esm/script-utils/linters/markdownlint-ignores.mjs +33 -0
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +13 -9
- package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +54 -18
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +8 -8
- package/dist/lib/esm/script-utils/npm-run.d.mts +16 -2
- package/dist/lib/esm/script-utils/npm-run.mjs +9 -3
- package/dist/lib/esm/script-utils/npm.d.mts +11 -11
- package/dist/lib/esm/script-utils/npm.mjs +11 -11
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +165 -55
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +1 -1
- package/dist/lib/esm/script-utils/test-runners/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/test-runners/index.mjs +4 -2
- package/dist/lib/esm/script-utils/test-runners/vitest-config.d.mts +118 -0
- package/dist/lib/esm/script-utils/test-runners/vitest-config.mjs +210 -0
- package/dist/lib/esm/script-utils/validate-declarations.mjs +1 -1
- package/dist/lib/esm/script-utils/version.d.mts +21 -21
- package/dist/lib/esm/script-utils/version.mjs +48 -45
- package/dist/lib/esm/setup.d.mts +1 -1
- package/dist/lib/esm/setup.mjs +1 -1
- package/dist/lib/esm/strict-proxy.d.mts +2 -2
- package/dist/lib/esm/strict-proxy.mjs +20 -20
- package/dist/lib/esm/string.d.mts +60 -60
- package/dist/lib/esm/string.mjs +80 -79
- package/dist/lib/esm/transformers/map-transformer.mjs +2 -2
- package/dist/lib/esm/transformers/set-transformer.mjs +2 -2
- package/dist/lib/esm/transformers/two-way-map-transformer.mjs +2 -2
- package/dist/lib/esm/type-guards.d.mts +6 -6
- package/dist/lib/esm/type-guards.mjs +6 -6
- package/dist/lib/esm/type.d.mts +2 -2
- package/dist/lib/esm/type.mjs +3 -3
- package/dist/lib/esm/url.d.mts +4 -4
- package/dist/lib/esm/url.mjs +8 -8
- package/dist/lib/esm/value-provider.d.mts +6 -6
- package/dist/lib/esm/value-provider.mjs +5 -5
- package/dist/templates/scripts/vitest-config.ts +2 -88
- package/obsidian/components/notebook-navigator-menu-event-registrar-component/package.json +6 -0
- package/obsidian/notebook-navigator/package.json +6 -0
- package/package.json +17 -33
- package/script-utils/linters/markdownlint-ignores/package.json +6 -0
- package/script-utils/test-runners/vitest-config/package.json +6 -0
|
@@ -40,16 +40,11 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
40
40
|
globalThisRecord[key] ??= newFuncs[key]?.();
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
function name(obj) {
|
|
44
|
-
return obj;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
43
|
function extractDefault(module) {
|
|
48
44
|
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
49
45
|
}
|
|
50
46
|
|
|
51
|
-
const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
52
|
-
'obsidian',
|
|
47
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
53
48
|
'@codemirror/autocomplete',
|
|
54
49
|
'@codemirror/collab',
|
|
55
50
|
'@codemirror/commands',
|
|
@@ -60,11 +55,12 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
60
55
|
'@codemirror/text',
|
|
61
56
|
'@codemirror/view',
|
|
62
57
|
'@lezer/common',
|
|
58
|
+
'@lezer/highlight',
|
|
63
59
|
'@lezer/lr',
|
|
64
|
-
'
|
|
65
|
-
|
|
60
|
+
'obsidian']
|
|
61
|
+
);
|
|
66
62
|
|
|
67
|
-
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
63
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
68
64
|
'@codemirror/closebrackets',
|
|
69
65
|
'@codemirror/comment',
|
|
70
66
|
'@codemirror/fold',
|
|
@@ -76,11 +72,11 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
76
72
|
'@codemirror/rangeset',
|
|
77
73
|
'@codemirror/rectangular-selection',
|
|
78
74
|
'@codemirror/stream-parser',
|
|
79
|
-
'@codemirror/tooltip']
|
|
80
|
-
|
|
75
|
+
'@codemirror/tooltip']
|
|
76
|
+
);
|
|
81
77
|
|
|
82
78
|
function requirePatched(id) {
|
|
83
|
-
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.
|
|
79
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
84
80
|
return originalRequire?.(id);
|
|
85
81
|
}
|
|
86
82
|
|
|
@@ -89,8 +85,8 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
89
85
|
if (id === 'process' || id === 'node:process') {
|
|
90
86
|
// eslint-disable-next-line no-console -- Valid usage.
|
|
91
87
|
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
92
|
-
|
|
93
|
-
return
|
|
88
|
+
|
|
89
|
+
return process;
|
|
94
90
|
}
|
|
95
91
|
} else {
|
|
96
92
|
const module = originalRequire?.(id);
|
|
@@ -129,6 +125,7 @@ __export(plugin_notice_component_exports, {
|
|
|
129
125
|
});
|
|
130
126
|
module.exports = __toCommonJS(plugin_notice_component_exports);
|
|
131
127
|
var import_obsidian = require('obsidian');
|
|
128
|
+
var import_array = require('../../array.cjs');
|
|
132
129
|
var import_async = require('../../async.cjs');
|
|
133
130
|
var import_object_utils = require('../../object-utils.cjs');
|
|
134
131
|
var import_obsidian_dev_utils_state = require('../../obsidian-dev-utils-state.cjs');
|
|
@@ -180,7 +177,7 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
180
177
|
* Hides the current notice on unload, unless it is the permanent notice (which is meant to outlive the plugin).
|
|
181
178
|
*/
|
|
182
179
|
onunload() {
|
|
183
|
-
for (const cancelPendingTimer of
|
|
180
|
+
for (const cancelPendingTimer of (0, import_array.snapshot)(this.pendingTimerCancellations)) {
|
|
184
181
|
cancelPendingTimer();
|
|
185
182
|
}
|
|
186
183
|
if (this.getPermanentNotice() !== this.notice) {
|
|
@@ -308,8 +305,8 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
308
305
|
(0, import_plugin_context.addPluginCssClasses)(closeButtonEl, import_css_class.CssClass.PluginNoticeCloseButton);
|
|
309
306
|
closeButtonEl.addClasses([import_css_class.CssClass.ClickableIcon, import_css_class.CssClass.ModalHeaderButton]);
|
|
310
307
|
(0, import_obsidian.setIcon)(closeButtonEl, "x");
|
|
311
|
-
closeButtonEl.addEventListener("click", (
|
|
312
|
-
|
|
308
|
+
closeButtonEl.addEventListener("click", ($event) => {
|
|
309
|
+
$event.stopPropagation();
|
|
313
310
|
(0, import_async.invokeAsyncSafely)(async () => {
|
|
314
311
|
let isCancelled = false;
|
|
315
312
|
await onCloseClick?.({
|
|
@@ -340,7 +337,7 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
340
337
|
if (typeof content === "string") {
|
|
341
338
|
fragment.appendText(content);
|
|
342
339
|
} else {
|
|
343
|
-
fragment.
|
|
340
|
+
fragment.append(content);
|
|
344
341
|
}
|
|
345
342
|
if (abortController) {
|
|
346
343
|
const cancelButton = new import_obsidian.ButtonComponent(createDiv());
|
|
@@ -349,7 +346,7 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
349
346
|
cancelButton.buttonEl.addEventListener("click", () => {
|
|
350
347
|
abortController.abort();
|
|
351
348
|
});
|
|
352
|
-
fragment.
|
|
349
|
+
fragment.append(cancelButton.buttonEl);
|
|
353
350
|
}
|
|
354
351
|
return fragment;
|
|
355
352
|
}
|
|
@@ -367,14 +364,14 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
367
364
|
const fragment = createFragment();
|
|
368
365
|
const contentEl = fragment.createDiv();
|
|
369
366
|
(0, import_plugin_context.addPluginCssClasses)(contentEl, import_css_class.CssClass.PluginNoticeContent);
|
|
370
|
-
contentEl.
|
|
371
|
-
contentEl.addEventListener("click", (
|
|
367
|
+
contentEl.append(this.buildPrefixedMessage(message));
|
|
368
|
+
contentEl.addEventListener("click", ($event) => {
|
|
372
369
|
if (requiresExplicitClose) {
|
|
373
|
-
|
|
370
|
+
$event.stopPropagation();
|
|
374
371
|
return;
|
|
375
372
|
}
|
|
376
|
-
if (
|
|
377
|
-
|
|
373
|
+
if ($event.target instanceof Element && $event.target.closest(INTERACTIVE_ELEMENT_SELECTOR)) {
|
|
374
|
+
$event.stopPropagation();
|
|
378
375
|
}
|
|
379
376
|
});
|
|
380
377
|
if (requiresExplicitClose && shouldShowCloseButton) {
|
|
@@ -397,7 +394,7 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
397
394
|
const fragment = createFragment();
|
|
398
395
|
const nameEl = createSpan({ text: this.pluginName });
|
|
399
396
|
(0, import_plugin_context.addPluginCssClasses)(nameEl, import_css_class.CssClass.PluginNoticeName);
|
|
400
|
-
fragment.
|
|
397
|
+
fragment.append(nameEl);
|
|
401
398
|
if (!this._loaded) {
|
|
402
399
|
fragment.appendText(" (unloaded)");
|
|
403
400
|
}
|
|
@@ -405,7 +402,7 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
405
402
|
if (typeof message === "string") {
|
|
406
403
|
fragment.appendText(message);
|
|
407
404
|
} else {
|
|
408
|
-
fragment.
|
|
405
|
+
fragment.append(message);
|
|
409
406
|
}
|
|
410
407
|
return fragment;
|
|
411
408
|
}
|
|
@@ -430,11 +427,11 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
430
427
|
return;
|
|
431
428
|
}
|
|
432
429
|
(0, import_plugin_context.addPluginCssClasses)(notice.containerEl, import_css_class.CssClass.PluginNoticeRequiresExplicitClose);
|
|
433
|
-
notice.containerEl.addEventListener("click", (
|
|
434
|
-
if (
|
|
430
|
+
notice.containerEl.addEventListener("click", ($event) => {
|
|
431
|
+
if ($event.target instanceof Element && $event.target.closest(INTERACTIVE_ELEMENT_SELECTOR)) {
|
|
435
432
|
return;
|
|
436
433
|
}
|
|
437
|
-
|
|
434
|
+
$event.stopPropagation();
|
|
438
435
|
}, { capture: true });
|
|
439
436
|
}
|
|
440
437
|
/**
|
|
@@ -518,8 +515,8 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
518
515
|
const patchComponent = new import_monkey_around_component.MonkeyAroundComponent();
|
|
519
516
|
patchComponent.load();
|
|
520
517
|
patchComponent.registerMethodPatch({
|
|
518
|
+
$object: notice,
|
|
521
519
|
methodName: "hide",
|
|
522
|
-
obj: notice,
|
|
523
520
|
once: true,
|
|
524
521
|
patchHandler: ({ fallback }) => {
|
|
525
522
|
fallback();
|
|
@@ -536,4 +533,4 @@ class PluginNoticeComponent extends import_component_ex.ComponentEx {
|
|
|
536
533
|
0 && (module.exports = {
|
|
537
534
|
PluginNoticeComponent
|
|
538
535
|
});
|
|
539
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgTm90aWNlLFxuICBzZXRJY29uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuXG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJy4uLy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuLi8uLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyByZXNvbHZlVmFsdWUgfSBmcm9tICcuLi8uLi92YWx1ZS1wcm92aWRlci50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBNb25rZXlBcm91bmRDb21wb25lbnQgfSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuY29uc3QgUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZID0gJ3BsdWdpbi1ub3RpY2UtY29tcG9uZW50OnBlcm1hbmVudC1ub3RpY2VzJztcbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gMDtcbmNvbnN0IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuXG4vLyBFbGVtZW50cyBhIHVzZXIgY2xpY2tzIHRvIGFjdCBvbiB0aGVtIHJhdGhlciB0aGFuIHRvIGRpc21pc3MgdGhlIG5vdGljZS4gQSBjbGljayBsYW5kaW5nIG9uIChvclxuLy8gSW5zaWRlKSBvbmUgb2YgdGhlc2UgaXMga2VwdCBmcm9tIGJ1YmJsaW5nIHRvIHRoZSBub3RpY2UsIHNvIHRoZSBub3RpY2Ugc3RheXMgb3Blbi5cbmNvbnN0IElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IgPSAnYSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbGFiZWwsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbcm9sZT1cImJ1dHRvblwiXSwgW3JvbGU9XCJsaW5rXCJdLCBbcm9sZT1cImNoZWNrYm94XCJdLCBbcm9sZT1cInRhYlwiXSwgW3JvbGU9XCJtZW51aXRlbVwiXSc7XG5cbi8qKlxuICogVGhlIGV2ZW50IHBhc3NlZCB0byB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25DbG9zZUNsaWNrfSB3aGVuIHRoZSBub3RpY2Unc1xuICogY2xvc2UgKFgpIGJ1dHRvbiBpcyBjbGlja2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCB7XG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSBjbG9zZSwgbGVhdmluZyB0aGUgbm90aWNlIG9wZW4uXG4gICAqL1xuICBjYW5jZWwoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZSB0byBhIGRlbGF5ZWQgbm90aWNlIGNyZWF0ZWQgYnkge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheX0uIEl0IGlzIGFcbiAqIHtAbGluayBEaXNwb3NhYmxlfSAoc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBgdXNpbmdgKSB0aGF0IGFsc28gbGV0cyB0aGUgY29udGVudCBiZSB1cGRhdGVkIHdoaWxlIHRoZVxuICogbm90aWNlIGlzIHNob3duLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSBub3RpY2UgY29udGVudCwgcmUtYXBwbHlpbmcgdGhlIHBsdWdpbi1uYW1lIHByZWZpeCwgdGhlIGludGVyYWN0aXZlLWNsaWNrIGd1YXJkLCBhbmRcbiAgICogdGhlIENhbmNlbCBidXR0b24uIFVzZWZ1bCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzLiBJZiB0aGUgZGVsYXkgaGFzIG5vdCBlbGFwc2VkIHlldCwgdGhlIG5ldyBjb250ZW50XG4gICAqIGJlY29tZXMgd2hhdCBpcyBzaG93biBvbmNlIGl0IGRvZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIG5ldyBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHNldENvbnRlbnQoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMge1xuICAvKipcbiAgICogV2hlbiBwcm92aWRlZCwgYSBDYW5jZWwgYnV0dG9uIGlzIGFwcGVuZGVkIHRvIHRoZSBub3RpY2U7IGNsaWNraW5nIGl0IGFib3J0cyB0aGlzIGNvbnRyb2xsZXIuIFdoZW5cbiAgICogb21pdHRlZCwgbm8gQ2FuY2VsIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgb2YgdGhlIENhbmNlbCBidXR0b24gc2hvd24gd2hlbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMuYWJvcnRDb250cm9sbGVyfVxuICAgKiBpcyBwcm92aWRlZC4gV2hlbiBvbWl0dGVkLCB0aGUgbG9jYWxpemVkIGBDYW5jZWxgIGxhYmVsIGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBjYW5jZWxCdXR0b25UZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbnRlbnQsIHJlc29sdmVkIGxhemlseSBvbmx5IGlmIHRoZSBkZWxheSBlbGFwc2VzIFx1MjAxNCBzbyBhbiBvcGVyYXRpb24gdGhhdCBmaW5pc2hlc1xuICAgKiBzb29uZXIgbmV2ZXIgYnVpbGRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPjtcblxuICAvKipcbiAgICogSG93IGxvbmcgdGhlIG9wZXJhdGlvbiBtdXN0IHJ1biBiZWZvcmUgdGhlIG5vdGljZSBpcyBzaG93bi4gT3BlcmF0aW9ucyB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXJcbiAgICogc2hvdyBhIG5vdGljZSwgYXZvaWRpbmcgYSBkaXN0cmFjdGluZyBmbGFzaC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDUwMGBcbiAgICovXG4gIHJlYWRvbmx5IGRlbGF5SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugc2hvdWxkIHN0YXkgdW50aWwgaXQgaXMgcmVwbGFjZWQsIHRoZSBwbHVnaW4gaXMgcmVsb2FkZWQsIG9yIHRoZSB1c2VyIGRpc21pc3NlcyBpdC5cbiAgICpcbiAgICogQSBwZXJtYW5lbnQgbm90aWNlIGlzIHNob3duIHdpdGggYW4gaW5maW5pdGUgZHVyYXRpb24gYW5kIGlzIG5vdCBoaWRkZW4gd2hlbiB0aGUgY29tcG9uZW50IHVubG9hZHMsIHNvIGl0IGNhblxuICAgKiBjb21tdW5pY2F0ZSBzdGF0ZSB0aGF0IG91dGxpdmVzIHRoZSBwbHVnaW4gKGUuZy4gYSBjbGVhbnVwIHRoYXQgcmVxdWlyZXMgYSByZWxvYWQpLiBUaGVyZSBpcyBhdCBtb3N0IG9uZSBwZXJtYW5lbnRcbiAgICogbm90aWNlIHBlciBwbHVnaW46IGl0IGlzIGhpZGRlbiBieSB0aGUgbmV4dCB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2V9IGNhbGwgYW5kIGRpc21pc3NlZFxuICAgKiBhdXRvbWF0aWNhbGx5IHRoZSBuZXh0IHRpbWUgdGhlIGNvbXBvbmVudCBsb2FkcyAoaS5lLiB3aGVuIHRoZSBwbHVnaW4gaXMgcmUtZW5hYmxlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzUGVybWFuZW50PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIG9jY3VwaWVzIHRoZSBzaW5nbGUgcGVyLXBsdWdpbiByZXVzYWJsZSBzbG90LlxuICAgKlxuICAgKiBBIHJldXNhYmxlIG5vdGljZSB0YWtlcyB0aGUgc2hhcmVkIHNsb3Q6IHRoZSBuZXh0IHJldXNhYmxlIG5vdGljZSBoaWRlcyBpdCwgYW5kIGl0IGlzIGhpZGRlbiBvbiB1bmxvYWQuXG4gICAqIEEgbm9uLXJldXNhYmxlIChzdGFuZGFsb25lKSBub3RpY2UgaXMgbm90IHBsYWNlZCBpbiB0aGUgc2xvdCBcdTIwMTQgaXQgbmV2ZXIgaGlkZXMsIGFuZCBpcyBuZXZlciBoaWRkZW4gYnksIGFcbiAgICogcmV1c2FibGUgbm90aWNlOyBtdWx0aXBsZSBzdGFuZGFsb25lIG5vdGljZXMgY29leGlzdC4gU3RhbmRhbG9uZSBub3RpY2VzIGFyZSBzdGlsbCBoaWRkZW4gdG9nZXRoZXIgb24gdW5sb2FkLlxuICAgKlxuICAgKiBBIHBlcm1hbmVudCBub3RpY2UgbXVzdCBiZSByZXVzYWJsZSAoe0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLmlzUGVybWFuZW50fSBpbXBsaWVzXG4gICAqIGBpc1JldXNhYmxlYCk7IHBhc3NpbmcgYGlzUmV1c2FibGU6IGZhbHNlYCB0b2dldGhlciB3aXRoIGBpc1Blcm1hbmVudDogdHJ1ZWAgdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzUmV1c2FibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNsb3NlIChYKSBidXR0b24sIGJlZm9yZSB0aGUgbm90aWNlIGlzIGhpZGRlbi4gQ2FsbFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50LmNhbmNlbH0gb24gdGhlIGV2ZW50IHRvIGNhbmNlbCB0aGUgY2xvc2UgYW5kIGtlZXAgdGhlIG5vdGljZVxuICAgKiBvcGVuIFx1MjAxNCBmb3IgZXhhbXBsZSBhZnRlciB5b3VyIG93biBjb25maXJtYXRpb24gZGVjbGluZXMuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIGF3YWl0ZWQgYmVmb3JlIHRoZVxuICAgKiBub3RpY2UgaXMgaGlkZGVuLiBSdW5zIG9ubHkgd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93biAoYm90aFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYXJlIHNldCkuXG4gICAqL1xuICBvbkNsb3NlQ2xpY2s/KHRoaXM6IHZvaWQsIGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpOiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgbm90aWNlIGlzIGhpZGRlbiBcdTIwMTQgd2hldGhlciBieSB0aGUgdXNlciBjbG9zaW5nIGl0LCBieSBhIGxhdGVyIHJldXNhYmxlXG4gICAqIG5vdGljZSByZXBsYWNpbmcgaXQsIGJ5IGl0cyBkdXJhdGlvbiBlbGFwc2luZywgb3Igb24gY29tcG9uZW50IHVubG9hZC4gSXQgcnVucyBhdCBtb3N0IG9uY2UgcGVyXG4gICAqIG5vdGljZS4gVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mb30gYXJndW1lbnQgZGlzdGluZ3Vpc2hlcyBhIHVzZXIgY2xvc2UgKHRoZSBjbG9zZSBidXR0b24pIGZyb21cbiAgICogYSBwcm9ncmFtbWF0aWMgaGlkZS4gQW4gYXN5bmMgY2FsbGJhY2sgaXMgcnVuIGZpcmUtYW5kLWZvcmdldCAoaXRzIHJlamVjdGlvbiBzdXJmYWNlcyB0aHJvdWdoIHRoZVxuICAgKiBhc3luYy1lcnJvciBwaXBlbGluZSkuXG4gICAqL1xuICBvbkhpZGU/KHRoaXM6IHZvaWQsIGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKTogUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciBjbGlja2luZyB0aGUgbm90aWNlIGhpZGVzIGl0LiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCB0aGUgbm90aWNlIGRpc21pc3NlcyBvbiBjbGljayBsaWtlXG4gICAqIGEgbm9ybWFsIE9ic2lkaWFuIG5vdGljZS4gV2hlbiBgZmFsc2VgLCB0aGUgbm90aWNlIGlzIGhhcmQgdG8gY2xvc2U6IGl0IGRvZXMgbm90IGRpc21pc3Mgb24gYW55IHN0cmF5XG4gICAqIGNsaWNrLCBhbmQgaW5zdGVhZCBzaG93cyBhIGNsb3NlIChYKSBidXR0b24gdGhhdCBoaWRlcyBpdCBkaXJlY3RseSAoc2VlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5zaG91bGRTaG93Q2xvc2VCdXR0b259IGFuZFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25DbG9zZUNsaWNrfSkuXG4gICAqXG4gICAqIEEgYHNob3VsZEhpZGVPbkNsaWNrOiBmYWxzZWAgbm90aWNlIGlzIHNob3duIHdpdGggYW4gaW5maW5pdGUgZHVyYXRpb24gYW5kIGlzIHN0YW5kYWxvbmUgKGltcGxpZXNcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLmlzUmV1c2FibGV9IGA9IGZhbHNlYCksIHNvIGEgbGF0ZXIgbm90aWNlIG5ldmVyXG4gICAqIHNpbGVudGx5IHJlcGxhY2VzIGl0OyBwYXNzaW5nIGBpc1JldXNhYmxlOiB0cnVlYCB0b2dldGhlciB3aXRoIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgIHRocm93cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIaWRlT25DbGljaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNsb3NlIChYKSBidXR0b24gaXMgc2hvd24gb24gYSBoYXJkLXRvLWNsb3NlIG5vdGljZVxuICAgKiAoe0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWApLiBXaGVuIGBmYWxzZWAsIG5vIGNsb3NlXG4gICAqIGJ1dHRvbiBpcyByZW5kZXJlZCBhbmQgdGhlIG5vdGljZSBjYW4gb25seSBiZSBoaWRkZW4gcHJvZ3JhbW1hdGljYWxseS4gSWdub3JlZCB1bmxlc3NcbiAgICogYHNob3VsZEhpZGVPbkNsaWNrYCBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHdoeSBhIG5vdGljZSB3YXMgaGlkZGVuLCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlSGlkZUluZm8ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHdhcyBoaWRkZW4gYnkgdGhlIHVzZXIgY2xpY2tpbmcgaXRzIGNsb3NlIChYKSBidXR0b24gc3BlY2lmaWNhbGx5LiBBbHdheXMgaW1wbGllc1xuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm8uaXNVc2VyQWN0aW9ufS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2xvc2VCdXR0b25DbGlja2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSBhIHVzZXIgYWN0aW9uIFx1MjAxNCBjbGlja2luZyB0aGUgY2xvc2UgKFgpIGJ1dHRvbiwgb3IgY2xpY2tpbmcgYVxuICAgKiBkaXNtaXNzaWJsZSBub3RpY2UgdG8gZGlzbWlzcyBpdCBcdTIwMTQgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWF0aWNhbGx5IChhIGxhdGVyIHJldXNhYmxlIG5vdGljZSByZXBsYWNpbmdcbiAgICogaXQsIGFuIGV4cGxpY2l0IGBoaWRlKClgLCB0aGUgZHVyYXRpb24gZWxhcHNpbmcsIG9yIGNvbXBvbmVudCB1bmxvYWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNVc2VyQWN0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMge1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuICBnZXROb3RpY2UodGhpczogdm9pZCk6IE5vdGljZSB8IG51bGw7XG4gIG9uQ2xvc2VDbGljaz8odGhpczogdm9pZCwgZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCk6IFByb21pc2FibGU8dm9pZD47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuICByZWFkb25seSBjYW5jZWxCdXR0b25UZXh0Pzogc3RyaW5nO1xuICByZWFkb25seSBjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBub3RpY2UgdGhpcyBjb250ZW50IGJlbG9uZ3MgdG8sIHVzZWQgYnkgdGhlIGNsb3NlIGJ1dHRvbidzIGhhbmRsZXIuIFRoZSBub3RpY2UgZG9lc1xuICAgKiBub3QgZXhpc3QgeWV0IHdoZW4gdGhlIGNvbnRlbnQgaXMgYnVpbHQsIHNvIGl0IGlzIHJlc29sdmVkIGxhemlseSBhdCBjbGljayB0aW1lLiBSZXF1aXJlZCB3aGVuIGFcbiAgICogY2xvc2UgYnV0dG9uIGlzIHNob3duLlxuICAgKi9cbiAgZ2V0Tm90aWNlPyh0aGlzOiB2b2lkKTogTm90aWNlIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBhZnRlciB0aGUgcGx1Z2luIG5hbWUgcHJlZml4LlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjbG9zZSBidXR0b24gaXMgY2xpY2tlZDsgbWF5IGNhbmNlbCB0aGUgY2xvc2UuIFNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25DbG9zZUNsaWNrfS5cbiAgICovXG4gIG9uQ2xvc2VDbGljaz8odGhpczogdm9pZCwgZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCk6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBzdG9wcyBldmVyeSBjbGljayBmcm9tIGRpc21pc3NpbmcgaXQgYW5kLCB1bmxlc3Mgc3VwcHJlc3NlZCBieVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0sIGFkZHMgYSBjbG9zZSBidXR0b24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBjbG9zZSBidXR0b24gd2hlbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnJlcXVpcmVzRXhwbGljaXRDbG9zZX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMge1xuICByZWFkb25seSBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBudWxsIHwgbnVtYmVyO1xuICByZWFkb25seSBpc1JldXNhYmxlOiBib29sZWFuO1xuICByZWFkb25seSBtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s6ICgodGhpczogdm9pZCwgZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uSGlkZTogKCh0aGlzOiB2b2lkLCBpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgc2hvd2luZyBwbHVnaW4gbm90aWNlcy4gQXV0b21hdGljYWxseSBoaWRlcyB0aGUgcHJldmlvdXMgbm90aWNlIHdoZW4gYSBuZXcgb25lIGlzIHNob3duLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luTm90aWNlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBuYW1lIChzaG93biBhcyBwcmVmaXggaW4gbm90aWNlcykuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcyA9IG5ldyBXZWFrU2V0PE5vdGljZT4oKTtcbiAgcHJpdmF0ZSBub3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdUaW1lckNhbmNlbGxhdGlvbnMgPSBuZXcgU2V0PCgpID0+IHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhbmRhbG9uZU5vdGljZXMgPSBuZXcgU2V0PE5vdGljZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyQ2xpY2tlZE5vdGljZXMgPSBuZXcgV2Vha1NldDxOb3RpY2U+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIG5vdGljZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wbHVnaW5OYW1lID0gcGFyYW1zLnBsdWdpbk5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzc2VzIHRoZSBwZXJtYW5lbnQgbm90aWNlIGxlZnQgb3ZlciBmcm9tIGEgcHJldmlvdXMgbG9hZCAoZS5nLiBhIHByZXZpb3VzIHBsdWdpbiBzZXNzaW9uKSBvbiBsb2FkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICBjb25zdCBwZXJtYW5lbnROb3RpY2UgPSB0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpO1xuICAgIHBlcm1hbmVudE5vdGljZT8uaGlkZSgpO1xuICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IG5vdGljZSBvbiB1bmxvYWQsIHVubGVzcyBpdCBpcyB0aGUgcGVybWFuZW50IG5vdGljZSAod2hpY2ggaXMgbWVhbnQgdG8gb3V0bGl2ZSB0aGUgcGx1Z2luKS5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICAvLyBDYW5jZWwgYW55IGRlbGF5ZWQgbm90aWNlIHdob3NlIHRpbWVyIGhhcyBub3QgZmlyZWQgeWV0LCBzbyBpdCBuZXZlciBhcHBlYXJzIGFmdGVyIHVubG9hZC5cbiAgICBmb3IgKGNvbnN0IGNhbmNlbFBlbmRpbmdUaW1lciBvZiBbLi4udGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zXSkge1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpICE9PSB0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGFuZGFsb25lTm90aWNlIG9mIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMpIHtcbiAgICAgIHN0YW5kYWxvbmVOb3RpY2UuaGlkZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBkaXNwbGF5aW5nIHRoZSBub3RpY2UuXG4gICAqIEByZXR1cm5zIFRoZSBub3RpY2Ugb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHNob3dOb3RpY2UobWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZywgb3B0aW9ucz86IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zKTogTm90aWNlIHtcbiAgICBjb25zdCBpc1Blcm1hbmVudCA9IG9wdGlvbnM/LmlzUGVybWFuZW50ID8/IGZhbHNlO1xuICAgIGNvbnN0IHNob3VsZEhpZGVPbkNsaWNrID0gb3B0aW9ucz8uc2hvdWxkSGlkZU9uQ2xpY2sgPz8gdHJ1ZTtcbiAgICBjb25zdCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPSAhc2hvdWxkSGlkZU9uQ2xpY2s7XG4gICAgY29uc3QgaXNSZXVzYWJsZSA9IG9wdGlvbnM/LmlzUmV1c2FibGUgPz8gIXJlcXVpcmVzRXhwbGljaXRDbG9zZTtcblxuICAgIGlmIChvcHRpb25zPy5pc1JldXNhYmxlID09PSB0cnVlICYmIHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgY2Fubm90IGJlIHJldXNhYmxlLicpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8uaXNSZXVzYWJsZSA9PT0gZmFsc2UgJiYgaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBwZXJtYW5lbnQgbm90aWNlIG11c3QgYmUgcmV1c2FibGUuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA9IGlzUGVybWFuZW50IHx8IHJlcXVpcmVzRXhwbGljaXRDbG9zZSA/IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTIDogbnVsbDtcbiAgICByZXR1cm4gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKHtcbiAgICAgIGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsXG4gICAgICBpc1JldXNhYmxlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIG9uQ2xvc2VDbGljazogb3B0aW9ucz8ub25DbG9zZUNsaWNrLFxuICAgICAgb25IaWRlOiBvcHRpb25zPy5vbkhpZGUsXG4gICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2UsXG4gICAgICBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBpc1Blcm1hbmVudCxcbiAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvbjogb3B0aW9ucz8uc2hvdWxkU2hvd0Nsb3NlQnV0dG9uID8/IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSBkZXNjcmliaW5nIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYnV0IG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBydW4gZm9yIGxvbmdlclxuICAgKiB0aGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzfSBcdTIwMTQgc28gb3BlcmF0aW9uc1xuICAgKiB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXIgZmxhc2ggYSBub3RpY2UuIFRoZSBub3RpY2Ugc3RheXMgdW50aWwgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpc1xuICAgKiBkaXNwb3NlZCAod2hpY2ggYWxzbyBjYW5jZWxzIHRoZSBwZW5kaW5nIHRpbWVyIGlmIGl0IGhhcyBub3QgZmlyZWQgeWV0KSwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aFxuICAgKiBgdXNpbmdgLiBXaGVuIGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGdpdmVuLCBhXG4gICAqIENhbmNlbCBidXR0b24gdGhhdCBhYm9ydHMgaXQgaXMgYXBwZW5kZWQgKGFuZCwgYmVpbmcgaW50ZXJhY3RpdmUsIGRvZXMgbm90IGRpc21pc3MgdGhlIG5vdGljZSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ub3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgKiAgIGFib3J0Q29udHJvbGxlcixcbiAgICogICBjb250ZW50OiAoKSA9PiBidWlsZFByb2dyZXNzRnJhZ21lbnQoKVxuICAgKiB9KTtcbiAgICogYXdhaXQgcnVuT3BlcmF0aW9uKGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlfSB0aGF0IGhpZGVzIHRoZSBub3RpY2UgKG9yIGNhbmNlbHMgdGhlIHBlbmRpbmdcbiAgICogdGltZXIpIHdoZW4gZGlzcG9zZWQgYW5kIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSBpdCBpcyBzaG93bi5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlQWZ0ZXJEZWxheShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSB7XG4gICAgbGV0IHNob3duTm90aWNlOiBOb3RpY2UgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIGxldCB0aW1lcklkID0gMDtcbiAgICBsZXQgY3VycmVudENvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz4gPSBwYXJhbXMuY29udGVudDtcblxuICAgIGNvbnN0IGNhbmNlbFBlbmRpbmdUaW1lciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICB0aGlzLnBlbmRpbmdUaW1lckNhbmNlbGxhdGlvbnMuZGVsZXRlKGNhbmNlbFBlbmRpbmdUaW1lcik7XG4gICAgfTtcblxuICAgIGNvbnN0IGJ1aWxkRGVsYXllZE1lc3NhZ2UgPSAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQgPT5cbiAgICAgIHRoaXMuYnVpbGREZWxheWVkTm90aWNlTWVzc2FnZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcz4oe1xuICAgICAgICBhYm9ydENvbnRyb2xsZXI6IHBhcmFtcy5hYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IHBhcmFtcy5jYW5jZWxCdXR0b25UZXh0LFxuICAgICAgICBjb250ZW50XG4gICAgICB9KSk7XG5cbiAgICB0aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkQ29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShjdXJyZW50Q29udGVudCwge30pO1xuICAgICAgICAvLyBUaGUgaGFuZGxlIG1heSBoYXZlIGJlZW4gZGlzcG9zZWQgd2hpbGUgdGhlIGNvbnRlbnQgd2FzIGJlaW5nIHJlc29sdmVkOyBkb24ndCBzaG93IGEgc3RhbGUgbm90aWNlLlxuICAgICAgICBpZiAoaXNEaXNwb3NlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzaG93bk5vdGljZSA9IHRoaXMuc2hvd05vdGljZVdpdGhEdXJhdGlvbih7XG4gICAgICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgaXNSZXVzYWJsZTogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBidWlsZERlbGF5ZWRNZXNzYWdlKHJlc29sdmVkQ29udGVudCksXG4gICAgICAgICAgb25DbG9zZUNsaWNrOiB1bmRlZmluZWQsXG4gICAgICAgICAgb25IaWRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVxdWlyZXNFeHBsaWNpdENsb3NlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRTaG93Q2xvc2VCdXR0b246IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCBwYXJhbXMuZGVsYXlJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0RFTEFZX0JFRk9SRV9TSE9XX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICB0aGlzLnBlbmRpbmdUaW1lckNhbmNlbGxhdGlvbnMuYWRkKGNhbmNlbFBlbmRpbmdUaW1lcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2V0Q29udGVudDogKGNvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgY3VycmVudENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAvLyBSZS13cmFwIHNvIHRoZSBwcmVmaXgsIGludGVyYWN0aXZlIGd1YXJkLCBhbmQgQ2FuY2VsIGJ1dHRvbiBzdXJ2aXZlIHRoZSBjb250ZW50IHN3YXAuXG4gICAgICAgIHNob3duTm90aWNlPy5zZXRNZXNzYWdlKHRoaXMuYnVpbGROb3RpY2VDb250ZW50KHsgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSB9KSk7XG4gICAgICB9LFxuICAgICAgW1N5bWJvbC5kaXNwb3NlXTogKCk6IHZvaWQgPT4ge1xuICAgICAgICBpc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgICAgIHNob3duTm90aWNlPy5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLm5vdGljZSA9PT0gc2hvd25Ob3RpY2UpIHtcbiAgICAgICAgICB0aGlzLm5vdGljZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjbG9zZSAoWCkgYnV0dG9uIHRvIHRoZSBub3RpY2UgY29udGVudC4gQ2xpY2tpbmcgaXQgZmlyZXNcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zLm9uQ2xvc2VDbGlja30gKHdoaWNoIG1heSBjYW5jZWwgdGhlIGNsb3NlKTsgaWZcbiAgICogbm90IGNhbmNlbGxlZCwgaXQgaGlkZXMgdGhlIG5vdGljZSBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgc3RhbmRhbG9uZS1ub3RpY2UgdHJhY2tpbmcgc2V0LiBUaGUgaGlkZSBpc1xuICAgKiBtYXJrZWQgYXMgYSBjbG9zZS1idXR0b24gY2xpY2sgc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuXG4gICAqIGRpc3Rpbmd1aXNoIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZENsb3NlQnV0dG9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZ2V0Tm90aWNlLCBvbkNsb3NlQ2xpY2sgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjbG9zZUJ1dHRvbkVsID0gY29udGVudEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICBhdHRyOiB7ICdhcmlhLWxhYmVsJzogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm5vdGljZXMuY2xvc2VBcmlhTGFiZWwpIH1cbiAgICB9KTtcbiAgICAvLyBSZXVzZSBPYnNpZGlhbidzIG1vZGFsIGNsb3NlLWJ1dHRvbiBjbGFzc2VzIHNvIHRoaXMgYnV0dG9uIG1hdGNoZXMgdGhlIG5hdGl2ZSBtb2RhbCBjbG9zZSBidXR0b25cbiAgICAvLyAobG9vayBhbmQgaG92ZXIpOyB0aGUgc3R5bGVzaGVldCBvbmx5IHBvc2l0aW9ucyBpdCBpbiB0aGUgbm90aWNlIGNvcm5lci5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNsb3NlQnV0dG9uRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNsb3NlQnV0dG9uKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZENsYXNzZXMoW0Nzc0NsYXNzLkNsaWNrYWJsZUljb24sIENzc0NsYXNzLk1vZGFsSGVhZGVyQnV0dG9uXSk7XG4gICAgc2V0SWNvbihjbG9zZUJ1dHRvbkVsLCAneCcpO1xuICAgIGNsb3NlQnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZ0KSA9PiB7XG4gICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBpc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICBhd2FpdCBvbkNsb3NlQ2xpY2s/Lih7XG4gICAgICAgICAgY2FuY2VsOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gQ2FuIGJlIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdGljZSA9IGVuc3VyZU5vbk51bGxhYmxlKGdldE5vdGljZSgpKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgICBub3RpY2UuaGlkZSgpO1xuICAgICAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmRlbGV0ZShub3RpY2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBtZXNzYWdlIGZvciBhIGRlbGF5ZWQgbm90aWNlOiB0aGUgcmVzb2x2ZWQgY29udGVudCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIENhbmNlbFxuICAgKiBidXR0b24gdGhhdCBhYm9ydHMgdGhlIHByb3ZpZGVkIGNvbnRyb2xsZXIgd2hlbiBjbGlja2VkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IGhvbGRpbmcgdGhlIGNvbnRlbnQgYW5kLCBpZiByZXF1ZXN0ZWQsIGEgQ2FuY2VsIGJ1dHRvbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGREZWxheWVkTm90aWNlTWVzc2FnZShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2VQYXJhbXMpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCB7IGFib3J0Q29udHJvbGxlciwgY2FuY2VsQnV0dG9uVGV4dCwgY29udGVudCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAvLyBgQnV0dG9uQ29tcG9uZW50YCByZXF1aXJlcyBhbiBgSFRNTEVsZW1lbnRgIHBhcmVudCwgc28gYnVpbGQgaXQgb24gYSB0aHJvd2F3YXlcbiAgICAgIC8vIERldGFjaGVkIGVsZW1lbnQgYW5kIG1vdmUgaXRzIGBidXR0b25FbGAgaW50byB0aGUgZnJhZ21lbnQuXG4gICAgICBjb25zdCBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uQ29tcG9uZW50KGNyZWF0ZURpdigpKTtcbiAgICAgIGNhbmNlbEJ1dHRvbi5zZXRCdXR0b25UZXh0KGNhbmNlbEJ1dHRvblRleHQgPz8gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmJ1dHRvbnMuY2FuY2VsKSk7XG4gICAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNhbmNlbEJ1dHRvbi5idXR0b25FbCwgQ3NzQ2xhc3MuQ2FuY2VsQnV0dG9uKTtcbiAgICAgIC8vIFRoZSBjbGljayBpcyB3aXJlZCB2aWEgYGFkZEV2ZW50TGlzdGVuZXJgIHJhdGhlciB0aGFuIGBCdXR0b25Db21wb25lbnQub25DbGlja2Agc28gaXRcbiAgICAgIC8vIEJ1YmJsZXMgdGhyb3VnaCB0aGUgaW50ZXJhY3RpdmUtZWxlbWVudCBndWFyZCAoa2VlcGluZyB0aGUgbm90aWNlIG9wZW4pIGFuZCBzdGF5c1xuICAgICAgLy8gRGlyZWN0bHkgZXhlcmNpc2FibGUgdmlhIGEgZGlzcGF0Y2hlZCBET00gZXZlbnQgaW4gdW5pdCB0ZXN0cy5cbiAgICAgIGNhbmNlbEJ1dHRvbi5idXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9KTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNhbmNlbEJ1dHRvbi5idXR0b25FbCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50IHdyYXBwZWQgaW4gYSBjb250YWluZXIgdGhhdCBrZWVwcyB0aGUgbm90aWNlIG9wZW4gd2hlbiBhbiBpbnRlcmFjdGl2ZVxuICAgKiBlbGVtZW50IGluc2lkZSBpdCBpcyBjbGlja2VkLiBPYnNpZGlhbiBkaXNtaXNzZXMgYSBub3RpY2Ugb24gYW55IGNsaWNrIHRoYXQgYnViYmxlcyB1cCB0byBpdHNcbiAgICogZWxlbWVudDsgdGhlIGNvbnRhaW5lciBpbnRlcmNlcHRzIGNsaWNrcyBvcmlnaW5hdGluZyBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IChhIGxpbmssIGJ1dHRvbixcbiAgICogaW5wdXQsIGV0Yy4pIGFuZCBzdG9wcyB0aGVtIHRoZXJlLCBzbyB0aGUgZWxlbWVudCdzIG93biBoYW5kbGVyIHN0aWxsIHJ1bnMgYnV0IHRoZSBub3RpY2Ugc3RheXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gaG9sZGluZyB0aGUgd3JhcHBlZCwgcHJlZml4ZWQgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm90aWNlQ29udGVudChwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHsgZ2V0Tm90aWNlLCBtZXNzYWdlLCBvbkNsb3NlQ2xpY2ssIHJlcXVpcmVzRXhwbGljaXRDbG9zZSA9IGZhbHNlLCBzaG91bGRTaG93Q2xvc2VCdXR0b24gPSB0cnVlIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGNvbnN0IGNvbnRlbnRFbCA9IGZyYWdtZW50LmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY29udGVudEVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDb250ZW50KTtcbiAgICBjb250ZW50RWwuYXBwZW5kQ2hpbGQodGhpcy5idWlsZFByZWZpeGVkTWVzc2FnZShtZXNzYWdlKSk7XG4gICAgY29udGVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2dCkgPT4ge1xuICAgICAgLy8gQSBoYXJkLXRvLWNsb3NlIG5vdGljZSBtdXN0IG5vdCBkaXNtaXNzIG9uIGFueSBzdHJheSBjbGljazsgb25seSBpdHMgY2xvc2UgYnV0dG9uIG1heSBoaWRlIGl0LlxuICAgICAgaWYgKHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBldnQudGFyZ2V0LmNsb3Nlc3QoSU5URVJBQ1RJVkVfRUxFTUVOVF9TRUxFQ1RPUikpIHtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlcXVpcmVzRXhwbGljaXRDbG9zZSAmJiBzaG91bGRTaG93Q2xvc2VCdXR0b24pIHtcbiAgICAgIHRoaXMuYXBwZW5kQ2xvc2VCdXR0b24obm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zPih7XG4gICAgICAgIGNvbnRlbnRFbCxcbiAgICAgICAgZ2V0Tm90aWNlOiBlbnN1cmVOb25OdWxsYWJsZShnZXROb3RpY2UpLFxuICAgICAgICBvbkNsb3NlQ2xpY2tcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbm90aWNlIGNvbnRlbnQsIHByZWZpeGluZyB0aGUgbWVzc2FnZSB3aXRoIHRoZSBwbHVnaW4gbmFtZSBpbiBhIHN0eWxlZCBlbGVtZW50IHNvIGl0IGlzXG4gICAqIHZpc3VhbGx5IGRpc3Rpbmd1aXNoZWQgZnJvbSB0aGUgbWVzc2FnZSBib2R5LlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gd2l0aCB0aGUgc3R5bGVkIHBsdWdpbiBuYW1lIHByZWZpeCBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQcmVmaXhlZE1lc3NhZ2UobWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBjb25zdCBuYW1lRWwgPSBjcmVhdGVTcGFuKHsgdGV4dDogdGhpcy5wbHVnaW5OYW1lIH0pO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobmFtZUVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VOYW1lKTtcbiAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChuYW1lRWwpO1xuICAgIGlmICghdGhpcy5fbG9hZGVkKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCcgKHVubG9hZGVkKScpO1xuICAgIH1cbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCdcXG4nKTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2UoKTogTm90aWNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpLmdldCh0aGlzLnBsdWdpbk5hbWUpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcm1hbmVudE5vdGljZXMoKTogTWFwPHN0cmluZywgTm90aWNlPiB7XG4gICAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxNYXA8c3RyaW5nLCBOb3RpY2U+PihQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVksIG5ldyBNYXA8c3RyaW5nLCBOb3RpY2U+KCkpLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgbm90aWNlIGhhcmQgdG8gY2xvc2U6IG1hcmtzIGl0cyBvdXRlciBlbGVtZW50IChzbyB0aGUgQ1NTIG5ldXRyYWxpemVzIGl0cyBwYWRkaW5nKSBhbmRcbiAgICogaW5zdGFsbHMgYSBjYXB0dXJlLXBoYXNlIGNsaWNrIGd1YXJkIHRoYXQgc3RvcHMgZXZlcnkgY2xpY2sgZXhjZXB0IG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGFcbiAgICogYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3Mgb3duIGRpc21pc3MgaGFuZGxlciBcdTIwMTQgc28gYW5cbiAgICogaW50ZXJhY3RpdmUgY2hpbGQncyBvd24gaGFuZGxlciBzdGlsbCBydW5zIHdoaWxlIGEgc3RyYXkgY2xpY2sgY2Fubm90IGRpc21pc3MgdGhlIG5vdGljZS5cbiAgICpcbiAgICogQHBhcmFtIG5vdGljZSAtIFRoZSBub3RpY2UgdG8gZ3VhcmQuXG4gICAqIEBwYXJhbSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgLSBXaGV0aGVyIHRoZSBub3RpY2UgcmVxdWlyZXMgZXhwbGljaXQgY2xvc2U7IHdoZW4gYGZhbHNlYCwgbm90aGluZyBpc1xuICAgKiBpbnN0YWxsZWQuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKG5vdGljZTogTm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgb3V0ZXIgYC5ub3RpY2VgIGVsZW1lbnQgKGBjb250YWluZXJFbGApIGNhcnJpZXMgT2JzaWRpYW4ncyBkaXNtaXNzLW9uLWNsaWNrIGhhbmRsZXIgYW5kIHRoZVxuICAgIC8vIFBhZGRpbmcgYSBzdHJheSBjbGljayBjb3VsZCBsYW5kIG9uOyBtYXJrIGl0IHNvIHRoZSBzdHlsZXNoZWV0IGRyb3BzIHRoYXQgcGFkZGluZy5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG5vdGljZS5jb250YWluZXJFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlUmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAvLyBTdG9wIGV2ZXJ5IGNsaWNrIG9uIHRoZSBub3RpY2UgXHUyMDE0IGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IFx1MjAxNCBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3NcbiAgICAvLyBEaXNtaXNzIGhhbmRsZXIuIFJlZ2lzdGVyZWQgaW4gdGhlIGNhcHR1cmUgcGhhc2Ugb24gdGhlIG91dGVybW9zdCBlbGVtZW50IHNvIGl0IGFsd2F5cyBydW5zIGZpcnN0LlxuICAgIC8vIExldHRpbmcgYSBjbGljayByZWFjaCBhbiBpbnRlcmFjdGl2ZSBjaGlsZCAoYSBidXR0b24sIGxpbmssIHRoZSBjbG9zZSBidXR0b24sIGV0Yy4pIGlzIHdoYXQga2VlcHNcbiAgICAvLyBJdHMgb3duIGhhbmRsZXIgd29ya2luZzsgdGhlIGJ1YmJsZS1waGFzZSBndWFyZCBvbiB0aGUgY29udGVudCB3cmFwcGVyIHRoZW4gc3RvcHMgdGhhdCBjbGljayBmcm9tXG4gICAgLy8gQnViYmxpbmcgdXAgdG8gT2JzaWRpYW4ncyBkaXNtaXNzIGhhbmRsZXIsIHNvIHRoZSBub3RpY2Ugc3RpbGwgc3RheXMgb3Blbi5cbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZ0KSA9PiB7XG4gICAgICBpZiAoZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZXZ0LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGEgY2xpY2sgb24gdGhlIG5vdGljZSBzbyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfSBjYW4gcmVwb3J0IGFcbiAgICogdXNlciBkaXNtaXNzYWwuIE9ic2lkaWFuIGhpZGVzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoZSBjbGljaywgc28gYVxuICAgKiBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIG1hcmtzIHRoZSBub3RpY2UgYmVmb3JlIHRoYXQgaGlkZSBydW5zOyB0aGUgbWFyayBpcyBjbGVhcmVkIGFmdGVyIHRoZSBldmVudFxuICAgKiBzbyBhIGxhdGVyIHByb2dyYW1tYXRpYyBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkLiBBIGNsb3NlLWJ1dHRvbiBjbGljayBpcyB0cmFja2VkIHNlcGFyYXRlbHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LmFwcGVuZENsb3NlQnV0dG9ufSkuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIHRyYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcobm90aWNlOiBOb3RpY2UpOiB2b2lkIHtcbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAvLyBPYnNpZGlhbiBkaXNtaXNzZXMgYSBkaXNtaXNzaWJsZSBub3RpY2Ugc3luY2hyb25vdXNseSBkdXJpbmcgdGhpcyBjbGljaywgc28gbWFyayBpdCBub3cgKGJlZm9yZVxuICAgICAgLy8gVGhhdCBoaWRlIHJ1bnMpIGFuZCBjbGVhciBpdCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2sgXHUyMDE0IGFmdGVyIGFueSBzeW5jaHJvbm91cyBkaXNtaXNzLCBidXQgYmVmb3JlIGFcbiAgICAgIC8vIExhdGVyIHByb2dyYW1tYXRpYyBoaWRlLCBzbyB0aGF0IGhpZGUgaXMgbm90IG1pc2F0dHJpYnV0ZWQgYXMgYSB1c2VyIGFjdGlvbi5cbiAgICAgIHRoaXMudXNlckNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVybWFuZW50Tm90aWNlKG5vdGljZTogTm90aWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpO1xuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIG1hcC5zZXQodGhpcy5wbHVnaW5OYW1lLCBub3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuZGVsZXRlKHRoaXMucGx1Z2luTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbm90aWNlIHdpdGggdGhlIGdpdmVuIGR1cmF0aW9uLiBBIHJldXNhYmxlIG5vdGljZSByZXBsYWNlcyB0aGUgY3VycmVudCByZXVzYWJsZSBub3RpY2UgKGFuZFxuICAgKiBpcyBvcHRpb25hbGx5IHJlZ2lzdGVyZWQgYXMgdGhpcyBwbHVnaW4ncyBwZXJtYW5lbnQgbm90aWNlKTsgYSBzdGFuZGFsb25lIG5vdGljZSBpcyB0cmFja2VkXG4gICAqIHNlcGFyYXRlbHksIGxlYXZpbmcgdGhlIHJldXNhYmxlIHNsb3QgdW50b3VjaGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIG5vdGljZS5cbiAgICovXG4gIHByaXZhdGUgc2hvd05vdGljZVdpdGhEdXJhdGlvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMpOiBOb3RpY2Uge1xuICAgIGNvbnN0IHsgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcywgaXNSZXVzYWJsZSwgbWVzc2FnZSwgb25DbG9zZUNsaWNrLCBvbkhpZGUsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSwgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCwgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uIH0gPSBwYXJhbXM7XG4gICAgLy8gT2JzaWRpYW4ncyBgTm90aWNlYCB0cmVhdHMgYW4gb21pdHRlZCBkdXJhdGlvbiBhcyBpdHMgZGVmYXVsdCwgc28gbWFwIHRoZSBgbnVsbGAgXCJubyBleHBsaWNpdFxuICAgIC8vIER1cmF0aW9uXCIgdmFsdWUgdG8gYHVuZGVmaW5lZGAuXG4gICAgY29uc3Qgbm90aWNlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPz8gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaGFzQ2xvc2VCdXR0b24gPSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uO1xuICAgIC8vIFRoZSBjbG9zZSBidXR0b24ncyBjbGljayBoYW5kbGVyIG5lZWRzIHRoZSBgTm90aWNlYCwgd2hpY2ggZG9lcyBub3QgZXhpc3QgdW50aWwgaXQgaXMgYnVpbHQgZnJvbVxuICAgIC8vIFRoaXMgY29udGVudDsgY2FwdHVyZSBpdCBsYXppbHkgdmlhIGEgaG9sZGVyIHJlc29sdmVkIGF0IGNsaWNrIHRpbWUuIFRoZSBnZXR0ZXIgaXMgY3JlYXRlZCBvbmx5XG4gICAgLy8gV2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICBsZXQgYnVpbHROb3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zPih7XG4gICAgICBnZXROb3RpY2U6IGhhc0Nsb3NlQnV0dG9uID8gKCk6IE5vdGljZSB8IG51bGwgPT4gYnVpbHROb3RpY2UgOiB1bmRlZmluZWQsXG4gICAgICBtZXNzYWdlLFxuICAgICAgb25DbG9zZUNsaWNrLFxuICAgICAgcmVxdWlyZXNFeHBsaWNpdENsb3NlLFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uXG4gICAgfSkpO1xuXG4gICAgaWYgKCFpc1JldXNhYmxlKSB7XG4gICAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoY29udGVudCwgbm90aWNlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyk7XG4gICAgICB0aGlzLmluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKGJ1aWx0Tm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UpO1xuICAgICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5hZGQoYnVpbHROb3RpY2UpO1xuICAgICAgcmV0dXJuIGJ1aWx0Tm90aWNlO1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgYnVpbHROb3RpY2UgPSBuZXcgTm90aWNlKGNvbnRlbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgIHRoaXMubm90aWNlID0gYnVpbHROb3RpY2U7XG4gICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICB0aGlzLmluc3RhbGxVc2VyQ2xpY2tUcmFja2luZyhidWlsdE5vdGljZSk7XG4gICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuXG4gICAgaWYgKHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQpIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKGJ1aWx0Tm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBidWlsdE5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBhIG5vdGljZSdzIGBoaWRlYCBzbyB0aGUgZ2l2ZW4gY2FsbGJhY2sgcnVucyB0aGUgZmlyc3QgdGltZSB0aGUgbm90aWNlIGlzIGhpZGRlbiBcdTIwMTQgYnkgdGhlXG4gICAqIHVzZXIsIGJ5IGEgcmVwbGFjaW5nIG5vdGljZSwgYnkgaXRzIGR1cmF0aW9uIGVsYXBzaW5nLCBvciBvbiB1bmxvYWQuIERvZXMgbm90aGluZyB3aGVuIG5vIGNhbGxiYWNrXG4gICAqIGlzIGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB3aG9zZSBgaGlkZWAgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9uSGlkZSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugb24gdGhlIGZpcnN0IGhpZGUsIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgd3JhcHBpbmcuXG4gICAqL1xuICBwcml2YXRlIHdpcmVPbkhpZGUobm90aWNlOiBOb3RpY2UsIG9uSGlkZTogKCh0aGlzOiB2b2lkLCBpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIW9uSGlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSdW4gYG9uSGlkZWAgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIEEgYG9uY2VgIHBhdGNoIG9uIGBoaWRlYCBpbnRlcmNlcHRzIGV4YWN0bHkgb25lXG4gICAgLy8gQ2FsbCB0aGVuIHVuaW5zdGFsbHMgaXRzZWxmICh1bmxvYWRpbmcgdGhpcyBkZWRpY2F0ZWQgY29tcG9uZW50KSwgc28gdGhlcmUgaXMgbm8gbWFudWFsXG4gICAgLy8gU2luZ2xlLWZpcmUgYm9va2tlZXBpbmcgYW5kIG5vIGxpbmdlcmluZyBwYXRjaCBvbiB0aGUgdHJhbnNpZW50IG5vdGljZS4gVGhlIHVzZXItY2xvc2UgZmxhZ3Mgd2VyZVxuICAgIC8vIFNldCBiZWZvcmUgYGhpZGUoKWAgd2FzIGludm9rZWQgKHNlZSBgYXBwZW5kQ2xvc2VCdXR0b25gIC8gYGluc3RhbGxVc2VyQ2xpY2tUcmFja2luZ2ApLCBzbyB0aGV5XG4gICAgLy8gU3RpbGwgaG9sZCB3aGVuIHJlYWQgaGVyZSBhZnRlciBgZmFsbGJhY2soKWAuXG4gICAgY29uc3QgcGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gICAgcGF0Y2hDb21wb25lbnQubG9hZCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgbWV0aG9kTmFtZTogJ2hpZGUnLFxuICAgICAgb2JqOiBub3RpY2UsXG4gICAgICBvbmNlOiB0cnVlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjayB9KSA9PiB7XG4gICAgICAgIGZhbGxiYWNrKCk7XG4gICAgICAgIGNvbnN0IGlzQ2xvc2VCdXR0b25DbGlja2VkID0gdGhpcy5jbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzLmhhcyhub3RpY2UpO1xuICAgICAgICBjb25zdCBpc1VzZXJBY3Rpb24gPSBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCB8fCB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5oYXMobm90aWNlKTtcbiAgICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9uSGlkZSh7IGlzQ2xvc2VCdXR0b25DbGlja2VkLCBpc1VzZXJBY3Rpb24gfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7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
|
|
536
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgTm90aWNlLFxuICBzZXRJY29uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnLi4vLi4vYXN5bmMudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4uLy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uLy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG5jb25zdCBQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVkgPSAncGx1Z2luLW5vdGljZS1jb21wb25lbnQ6cGVybWFuZW50LW5vdGljZXMnO1xuY29uc3QgUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSAwO1xuY29uc3QgREVGQVVMVF9ERUxBWV9CRUZPUkVfU0hPV19JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5cbi8vIEVsZW1lbnRzIGEgdXNlciBjbGlja3MgdG8gYWN0IG9uIHRoZW0gcmF0aGVyIHRoYW4gdG8gZGlzbWlzcyB0aGUgbm90aWNlLiBBIGNsaWNrIGxhbmRpbmcgb24gKG9yXG4vLyBJbnNpZGUpIG9uZSBvZiB0aGVzZSBpcyBrZXB0IGZyb20gYnViYmxpbmcgdG8gdGhlIG5vdGljZSwgc28gdGhlIG5vdGljZSBzdGF5cyBvcGVuLlxuY29uc3QgSU5URVJBQ1RJVkVfRUxFTUVOVF9TRUxFQ1RPUiA9ICdhLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBsYWJlbCwgW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0sIFtyb2xlPVwiYnV0dG9uXCJdLCBbcm9sZT1cImxpbmtcIl0sIFtyb2xlPVwiY2hlY2tib3hcIl0sIFtyb2xlPVwidGFiXCJdLCBbcm9sZT1cIm1lbnVpdGVtXCJdJztcblxuLyoqXG4gKiBUaGUgZXZlbnQgcGFzc2VkIHRvIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9IHdoZW4gdGhlIG5vdGljZSdzXG4gKiBjbG9zZSAoWCkgYnV0dG9uIGlzIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50IHtcbiAgLyoqXG4gICAqIENhbmNlbHMgdGhlIGNsb3NlLCBsZWF2aW5nIHRoZSBub3RpY2Ugb3Blbi5cbiAgICovXG4gIGNhbmNlbCgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgZGVsYXllZCBub3RpY2UgY3JlYXRlZCBieSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS4gSXQgaXMgYVxuICoge0BsaW5rIERpc3Bvc2FibGV9IChzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIGB1c2luZ2ApIHRoYXQgYWxzbyBsZXRzIHRoZSBjb250ZW50IGJlIHVwZGF0ZWQgd2hpbGUgdGhlXG4gKiBub3RpY2UgaXMgc2hvd24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSBleHRlbmRzIERpc3Bvc2FibGUge1xuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIG5vdGljZSBjb250ZW50LCByZS1hcHBseWluZyB0aGUgcGx1Z2luLW5hbWUgcHJlZml4LCB0aGUgaW50ZXJhY3RpdmUtY2xpY2sgZ3VhcmQsIGFuZFxuICAgKiB0aGUgQ2FuY2VsIGJ1dHRvbi4gVXNlZnVsIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MuIElmIHRoZSBkZWxheSBoYXMgbm90IGVsYXBzZWQgeWV0LCB0aGUgbmV3IGNvbnRlbnRcbiAgICogYmVjb21lcyB3aGF0IGlzIHNob3duIG9uY2UgaXQgZG9lcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBUaGUgbmV3IG5vdGljZSBjb250ZW50LlxuICAgKi9cbiAgc2V0Q29udGVudChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBhIENhbmNlbCBidXR0b24gaXMgYXBwZW5kZWQgdG8gdGhlIG5vdGljZTsgY2xpY2tpbmcgaXQgYWJvcnRzIHRoaXMgY29udHJvbGxlci4gV2hlblxuICAgKiBvbWl0dGVkLCBubyBDYW5jZWwgYnV0dG9uIGlzIHNob3duLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBvZiB0aGUgQ2FuY2VsIGJ1dHRvbiBzaG93biB3aGVuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9XG4gICAqIGlzIHByb3ZpZGVkLiBXaGVuIG9taXR0ZWQsIHRoZSBsb2NhbGl6ZWQgYENhbmNlbGAgbGFiZWwgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbEJ1dHRvblRleHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29udGVudCwgcmVzb2x2ZWQgbGF6aWx5IG9ubHkgaWYgdGhlIGRlbGF5IGVsYXBzZXMgXHUyMDE0IHNvIGFuIG9wZXJhdGlvbiB0aGF0IGZpbmlzaGVzXG4gICAqIHNvb25lciBuZXZlciBidWlsZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGUgb3BlcmF0aW9uIG11c3QgcnVuIGJlZm9yZSB0aGUgbm90aWNlIGlzIHNob3duLiBPcGVyYXRpb25zIHRoYXQgZmluaXNoIHNvb25lciBuZXZlclxuICAgKiBzaG93IGEgbm90aWNlLCBhdm9pZGluZyBhIGRpc3RyYWN0aW5nIGZsYXNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBzaG91bGQgc3RheSB1bnRpbCBpdCBpcyByZXBsYWNlZCwgdGhlIHBsdWdpbiBpcyByZWxvYWRlZCwgb3IgdGhlIHVzZXIgZGlzbWlzc2VzIGl0LlxuICAgKlxuICAgKiBBIHBlcm1hbmVudCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgaXMgbm90IGhpZGRlbiB3aGVuIHRoZSBjb21wb25lbnQgdW5sb2Fkcywgc28gaXQgY2FuXG4gICAqIGNvbW11bmljYXRlIHN0YXRlIHRoYXQgb3V0bGl2ZXMgdGhlIHBsdWdpbiAoZS5nLiBhIGNsZWFudXAgdGhhdCByZXF1aXJlcyBhIHJlbG9hZCkuIFRoZXJlIGlzIGF0IG1vc3Qgb25lIHBlcm1hbmVudFxuICAgKiBub3RpY2UgcGVyIHBsdWdpbjogaXQgaXMgaGlkZGVuIGJ5IHRoZSBuZXh0IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0gY2FsbCBhbmQgZGlzbWlzc2VkXG4gICAqIGF1dG9tYXRpY2FsbHkgdGhlIG5leHQgdGltZSB0aGUgY29tcG9uZW50IGxvYWRzIChpLmUuIHdoZW4gdGhlIHBsdWdpbiBpcyByZS1lbmFibGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNQZXJtYW5lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugb2NjdXBpZXMgdGhlIHNpbmdsZSBwZXItcGx1Z2luIHJldXNhYmxlIHNsb3QuXG4gICAqXG4gICAqIEEgcmV1c2FibGUgbm90aWNlIHRha2VzIHRoZSBzaGFyZWQgc2xvdDogdGhlIG5leHQgcmV1c2FibGUgbm90aWNlIGhpZGVzIGl0LCBhbmQgaXQgaXMgaGlkZGVuIG9uIHVubG9hZC5cbiAgICogQSBub24tcmV1c2FibGUgKHN0YW5kYWxvbmUpIG5vdGljZSBpcyBub3QgcGxhY2VkIGluIHRoZSBzbG90IFx1MjAxNCBpdCBuZXZlciBoaWRlcywgYW5kIGlzIG5ldmVyIGhpZGRlbiBieSwgYVxuICAgKiByZXVzYWJsZSBub3RpY2U7IG11bHRpcGxlIHN0YW5kYWxvbmUgbm90aWNlcyBjb2V4aXN0LiBTdGFuZGFsb25lIG5vdGljZXMgYXJlIHN0aWxsIGhpZGRlbiB0b2dldGhlciBvbiB1bmxvYWQuXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBtdXN0IGJlIHJldXNhYmxlICh7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuaXNQZXJtYW5lbnR9IGltcGxpZXNcbiAgICogYGlzUmV1c2FibGVgKTsgcGFzc2luZyBgaXNSZXVzYWJsZTogZmFsc2VgIHRvZ2V0aGVyIHdpdGggYGlzUGVybWFuZW50OiB0cnVlYCB0aHJvd3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZXVzYWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgY2xvc2UgKFgpIGJ1dHRvbiwgYmVmb3JlIHRoZSBub3RpY2UgaXMgaGlkZGVuLiBDYWxsXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQuY2FuY2VsfSBvbiB0aGUgZXZlbnQgdG8gY2FuY2VsIHRoZSBjbG9zZSBhbmQga2VlcCB0aGUgbm90aWNlXG4gICAqIG9wZW4gXHUyMDE0IGZvciBleGFtcGxlIGFmdGVyIHlvdXIgb3duIGNvbmZpcm1hdGlvbiBkZWNsaW5lcy4gQW4gYXN5bmMgY2FsbGJhY2sgaXMgYXdhaXRlZCBiZWZvcmUgdGhlXG4gICAqIG5vdGljZSBpcyBoaWRkZW4uIFJ1bnMgb25seSB3aGVuIGEgY2xvc2UgYnV0dG9uIGlzIHNob3duIChib3RoXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5zaG91bGRIaWRlT25DbGlja30gYD0gZmFsc2VgIGFuZFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSBhcmUgc2V0KS5cbiAgICovXG4gIG9uQ2xvc2VDbGljaz8odGhpczogdm9pZCwgZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCk6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBub3RpY2UgaXMgaGlkZGVuIFx1MjAxNCB3aGV0aGVyIGJ5IHRoZSB1c2VyIGNsb3NpbmcgaXQsIGJ5IGEgbGF0ZXIgcmV1c2FibGVcbiAgICogbm90aWNlIHJlcGxhY2luZyBpdCwgYnkgaXRzIGR1cmF0aW9uIGVsYXBzaW5nLCBvciBvbiBjb21wb25lbnQgdW5sb2FkLiBJdCBydW5zIGF0IG1vc3Qgb25jZSBwZXJcbiAgICogbm90aWNlLiBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUhpZGVJbmZvfSBhcmd1bWVudCBkaXN0aW5ndWlzaGVzIGEgdXNlciBjbG9zZSAodGhlIGNsb3NlIGJ1dHRvbikgZnJvbVxuICAgKiBhIHByb2dyYW1tYXRpYyBoaWRlLiBBbiBhc3luYyBjYWxsYmFjayBpcyBydW4gZmlyZS1hbmQtZm9yZ2V0IChpdHMgcmVqZWN0aW9uIHN1cmZhY2VzIHRocm91Z2ggdGhlXG4gICAqIGFzeW5jLWVycm9yIHBpcGVsaW5lKS5cbiAgICovXG4gIG9uSGlkZT8odGhpczogdm9pZCwgaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pOiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIHRoZSBub3RpY2UgaGlkZXMgaXQuIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSBub3RpY2UgZGlzbWlzc2VzIG9uIGNsaWNrIGxpa2VcbiAgICogYSBub3JtYWwgT2JzaWRpYW4gbm90aWNlLiBXaGVuIGBmYWxzZWAsIHRoZSBub3RpY2UgaXMgaGFyZCB0byBjbG9zZTogaXQgZG9lcyBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXlcbiAgICogY2xpY2ssIGFuZCBpbnN0ZWFkIHNob3dzIGEgY2xvc2UgKFgpIGJ1dHRvbiB0aGF0IGhpZGVzIGl0IGRpcmVjdGx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9KS5cbiAgICpcbiAgICogQSBgc2hvdWxkSGlkZU9uQ2xpY2s6IGZhbHNlYCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgaXMgc3RhbmRhbG9uZSAoaW1wbGllc1xuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuaXNSZXVzYWJsZX0gYD0gZmFsc2VgKSwgc28gYSBsYXRlciBub3RpY2UgbmV2ZXJcbiAgICogc2lsZW50bHkgcmVwbGFjZXMgaXQ7IHBhc3NpbmcgYGlzUmV1c2FibGU6IHRydWVgIHRvZ2V0aGVyIHdpdGggYHNob3VsZEhpZGVPbkNsaWNrOiBmYWxzZWAgdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhpZGVPbkNsaWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2xvc2UgKFgpIGJ1dHRvbiBpcyBzaG93biBvbiBhIGhhcmQtdG8tY2xvc2Ugbm90aWNlXG4gICAqICh7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCkuIFdoZW4gYGZhbHNlYCwgbm8gY2xvc2VcbiAgICogYnV0dG9uIGlzIHJlbmRlcmVkIGFuZCB0aGUgbm90aWNlIGNhbiBvbmx5IGJlIGhpZGRlbiBwcm9ncmFtbWF0aWNhbGx5LiBJZ25vcmVkIHVubGVzc1xuICAgKiBgc2hvdWxkSGlkZU9uQ2xpY2tgIGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgd2h5IGEgbm90aWNlIHdhcyBoaWRkZW4sIHBhc3NlZCB0byB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VIaWRlSW5mbyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSB0aGUgdXNlciBjbGlja2luZyBpdHMgY2xvc2UgKFgpIGJ1dHRvbiBzcGVjaWZpY2FsbHkuIEFsd2F5cyBpbXBsaWVzXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mby5pc1VzZXJBY3Rpb259LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDbG9zZUJ1dHRvbkNsaWNrZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSB3YXMgaGlkZGVuIGJ5IGEgdXNlciBhY3Rpb24gXHUyMDE0IGNsaWNraW5nIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBvciBjbGlja2luZyBhXG4gICAqIGRpc21pc3NpYmxlIG5vdGljZSB0byBkaXNtaXNzIGl0IFx1MjAxNCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tYXRpY2FsbHkgKGEgbGF0ZXIgcmV1c2FibGUgbm90aWNlIHJlcGxhY2luZ1xuICAgKiBpdCwgYW4gZXhwbGljaXQgYGhpZGUoKWAsIHRoZSBkdXJhdGlvbiBlbGFwc2luZywgb3IgY29tcG9uZW50IHVubG9hZCkuXG4gICAqL1xuICByZWFkb25seSBpc1VzZXJBY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG4gIGdldE5vdGljZSh0aGlzOiB2b2lkKTogTm90aWNlIHwgbnVsbDtcbiAgb25DbG9zZUNsaWNrPyh0aGlzOiB2b2lkLCBldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KTogUHJvbWlzYWJsZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2VQYXJhbXMge1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG4gIHJlYWRvbmx5IGNhbmNlbEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIG5vdGljZSB0aGlzIGNvbnRlbnQgYmVsb25ncyB0bywgdXNlZCBieSB0aGUgY2xvc2UgYnV0dG9uJ3MgaGFuZGxlci4gVGhlIG5vdGljZSBkb2VzXG4gICAqIG5vdCBleGlzdCB5ZXQgd2hlbiB0aGUgY29udGVudCBpcyBidWlsdCwgc28gaXQgaXMgcmVzb2x2ZWQgbGF6aWx5IGF0IGNsaWNrIHRpbWUuIFJlcXVpcmVkIHdoZW4gYVxuICAgKiBjbG9zZSBidXR0b24gaXMgc2hvd24uXG4gICAqL1xuICBnZXROb3RpY2U/KHRoaXM6IHZvaWQpOiBOb3RpY2UgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNsb3NlIGJ1dHRvbiBpcyBjbGlja2VkOyBtYXkgY2FuY2VsIHRoZSBjbG9zZS4gU2VlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9LlxuICAgKi9cbiAgb25DbG9zZUNsaWNrPyh0aGlzOiB2b2lkLCBldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KTogUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIGlzIGhhcmQgdG8gY2xvc2U6IHN0b3BzIGV2ZXJ5IGNsaWNrIGZyb20gZGlzbWlzc2luZyBpdCBhbmQsIHVubGVzcyBzdXBwcmVzc2VkIGJ5XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSwgYWRkcyBhIGNsb3NlIGJ1dHRvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNFeHBsaWNpdENsb3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5kZXIgdGhlIGNsb3NlIGJ1dHRvbiB3aGVuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMucmVxdWlyZXNFeHBsaWNpdENsb3NlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTaG93Q2xvc2VCdXR0b24/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZVdpdGhEdXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGR1cmF0aW9uSW5NaWxsaXNlY29uZHM6IG51bGwgfCBudW1iZXI7XG4gIHJlYWRvbmx5IGlzUmV1c2FibGU6IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljazogKCh0aGlzOiB2b2lkLCBldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb25IaWRlOiAoKHRoaXM6IHZvaWQsIGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgcmVxdWlyZXNFeHBsaWNpdENsb3NlOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRTaG93Q2xvc2VCdXR0b246IGJvb2xlYW47XG59XG5cbi8qKlxuICogTWFuYWdlcyBzaG93aW5nIHBsdWdpbiBub3RpY2VzLiBBdXRvbWF0aWNhbGx5IGhpZGVzIHRoZSBwcmV2aW91cyBub3RpY2Ugd2hlbiBhIG5ldyBvbmUgaXMgc2hvd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIG5hbWUgKHNob3duIGFzIHByZWZpeCBpbiBub3RpY2VzKS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIG5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFuZGFsb25lTm90aWNlcyA9IG5ldyBTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDbGlja2VkTm90aWNlcyA9IG5ldyBXZWFrU2V0PE5vdGljZT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIHBlcm1hbmVudCBub3RpY2UgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBsb2FkIChlLmcuIGEgcHJldmlvdXMgcGx1Z2luIHNlc3Npb24pIG9uIGxvYWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHBlcm1hbmVudE5vdGljZSA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlKCk7XG4gICAgcGVybWFuZW50Tm90aWNlPy5oaWRlKCk7XG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGN1cnJlbnQgbm90aWNlIG9uIHVubG9hZCwgdW5sZXNzIGl0IGlzIHRoZSBwZXJtYW5lbnQgbm90aWNlICh3aGljaCBpcyBtZWFudCB0byBvdXRsaXZlIHRoZSBwbHVnaW4pLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIC8vIENhbmNlbCBhbnkgZGVsYXllZCBub3RpY2Ugd2hvc2UgdGltZXIgaGFzIG5vdCBmaXJlZCB5ZXQsIHNvIGl0IG5ldmVyIGFwcGVhcnMgYWZ0ZXIgdW5sb2FkLlxuICAgIGZvciAoY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyIG9mIHNuYXBzaG90KHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucykpIHtcbiAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKSAhPT0gdGhpcy5ub3RpY2UpIHtcbiAgICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhbmRhbG9uZU5vdGljZSBvZiB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzKSB7XG4gICAgICBzdGFuZGFsb25lTm90aWNlLmhpZGUoKTtcbiAgICB9XG4gICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgY29uc3QgaXNQZXJtYW5lbnQgPSBvcHRpb25zPy5pc1Blcm1hbmVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBzaG91bGRIaWRlT25DbGljayA9IG9wdGlvbnM/LnNob3VsZEhpZGVPbkNsaWNrID8/IHRydWU7XG4gICAgY29uc3QgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gIXNob3VsZEhpZGVPbkNsaWNrO1xuICAgIGNvbnN0IGlzUmV1c2FibGUgPSBvcHRpb25zPy5pc1JldXNhYmxlID8/ICFyZXF1aXJlc0V4cGxpY2l0Q2xvc2U7XG5cbiAgICBpZiAob3B0aW9ucz8uaXNSZXVzYWJsZSA9PT0gdHJ1ZSAmJiByZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBub3RpY2UgdGhhdCBkb2VzIG5vdCBoaWRlIG9uIGNsaWNrIGNhbm5vdCBiZSByZXVzYWJsZS4nKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/LmlzUmV1c2FibGUgPT09IGZhbHNlICYmIGlzUGVybWFuZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgcGVybWFuZW50IG5vdGljZSBtdXN0IGJlIHJldXNhYmxlLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPSBpc1Blcm1hbmVudCB8fCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA6IG51bGw7XG4gICAgcmV0dXJuIHRoaXMuc2hvd05vdGljZVdpdGhEdXJhdGlvbih7XG4gICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLFxuICAgICAgaXNSZXVzYWJsZSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBvbkNsb3NlQ2xpY2s6IG9wdGlvbnM/Lm9uQ2xvc2VDbGljayxcbiAgICAgIG9uSGlkZTogb3B0aW9ucz8ub25IaWRlLFxuICAgICAgcmVxdWlyZXNFeHBsaWNpdENsb3NlLFxuICAgICAgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogaXNQZXJtYW5lbnQsXG4gICAgICBzaG91bGRTaG93Q2xvc2VCdXR0b246IG9wdGlvbnM/LnNob3VsZFNob3dDbG9zZUJ1dHRvbiA/PyB0cnVlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBub3RpY2UgZGVzY3JpYmluZyBhIGxvbmctcnVubmluZyBvcGVyYXRpb24sIGJ1dCBvbmx5IG9uY2UgdGhlIG9wZXJhdGlvbiBoYXMgcnVuIGZvciBsb25nZXJcbiAgICogdGhhbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMuZGVsYXlJbk1pbGxpc2Vjb25kc30gXHUyMDE0IHNvIG9wZXJhdGlvbnNcbiAgICogdGhhdCBmaW5pc2ggc29vbmVyIG5ldmVyIGZsYXNoIGEgbm90aWNlLiBUaGUgbm90aWNlIHN0YXlzIHVudGlsIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gaXNcbiAgICogZGlzcG9zZWQgKHdoaWNoIGFsc28gY2FuY2VscyB0aGUgcGVuZGluZyB0aW1lciBpZiBpdCBoYXMgbm90IGZpcmVkIHlldCksIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGhcbiAgICogYHVzaW5nYC4gV2hlbiBhbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBnaXZlbiwgYVxuICAgKiBDYW5jZWwgYnV0dG9uIHRoYXQgYWJvcnRzIGl0IGlzIGFwcGVuZGVkIChhbmQsIGJlaW5nIGludGVyYWN0aXZlLCBkb2VzIG5vdCBkaXNtaXNzIHRoZSBub3RpY2UpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiB1c2luZyBfbm90aWNlID0gcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5KHtcbiAgICogICBhYm9ydENvbnRyb2xsZXIsXG4gICAqICAgY29udGVudDogKCkgPT4gYnVpbGRQcm9ncmVzc0ZyYWdtZW50KClcbiAgICogfSk7XG4gICAqIGF3YWl0IHJ1bk9wZXJhdGlvbihhYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZX0gdGhhdCBoaWRlcyB0aGUgbm90aWNlIChvciBjYW5jZWxzIHRoZSBwZW5kaW5nXG4gICAqIHRpbWVyKSB3aGVuIGRpc3Bvc2VkIGFuZCBsZXRzIHRoZSBjb250ZW50IGJlIHVwZGF0ZWQgd2hpbGUgaXQgaXMgc2hvd24uXG4gICAqL1xuICBwdWJsaWMgc2hvd05vdGljZUFmdGVyRGVsYXkocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2Uge1xuICAgIGxldCBzaG93bk5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICBsZXQgdGltZXJJZCA9IDA7XG4gICAgbGV0IGN1cnJlbnRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+ID0gcGFyYW1zLmNvbnRlbnQ7XG5cbiAgICBjb25zdCBjYW5jZWxQZW5kaW5nVGltZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgdGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zLmRlbGV0ZShjYW5jZWxQZW5kaW5nVGltZXIpO1xuICAgIH07XG5cbiAgICBjb25zdCBidWlsZERlbGF5ZWRNZXNzYWdlID0gKGNvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50ID0+XG4gICAgICB0aGlzLmJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2Uobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2VQYXJhbXM+KHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyLFxuICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiBwYXJhbXMuY2FuY2VsQnV0dG9uVGV4dCxcbiAgICAgICAgY29udGVudFxuICAgICAgfSkpO1xuXG4gICAgdGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZENvbnRlbnQgPSBhd2FpdCByZXNvbHZlVmFsdWUoY3VycmVudENvbnRlbnQsIHt9KTtcbiAgICAgICAgLy8gVGhlIGhhbmRsZSBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkIHdoaWxlIHRoZSBjb250ZW50IHdhcyBiZWluZyByZXNvbHZlZDsgZG9uJ3Qgc2hvdyBhIHN0YWxlIG5vdGljZS5cbiAgICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2hvd25Ob3RpY2UgPSB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgICAgIGR1cmF0aW9uSW5NaWxsaXNlY29uZHM6IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgIGlzUmV1c2FibGU6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShyZXNvbHZlZENvbnRlbnQpLFxuICAgICAgICAgIG9uQ2xvc2VDbGljazogdW5kZWZpbmVkLFxuICAgICAgICAgIG9uSGlkZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZTogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgcGFyYW1zLmRlbGF5SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9ERUxBWV9CRUZPUkVfU0hPV19JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgdGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zLmFkZChjYW5jZWxQZW5kaW5nVGltZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldENvbnRlbnQ6IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgLy8gUmUtd3JhcCBzbyB0aGUgcHJlZml4LCBpbnRlcmFjdGl2ZSBndWFyZCwgYW5kIENhbmNlbCBidXR0b24gc3Vydml2ZSB0aGUgY29udGVudCBzd2FwLlxuICAgICAgICBzaG93bk5vdGljZT8uc2V0TWVzc2FnZSh0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7IG1lc3NhZ2U6IGJ1aWxkRGVsYXllZE1lc3NhZ2UoY29udGVudCkgfSkpO1xuICAgICAgfSxcbiAgICAgIFtTeW1ib2wuZGlzcG9zZV06ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgICAgICBzaG93bk5vdGljZT8uaGlkZSgpO1xuICAgICAgICBpZiAodGhpcy5ub3RpY2UgPT09IHNob3duTm90aWNlKSB7XG4gICAgICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgY2xvc2UgKFgpIGJ1dHRvbiB0byB0aGUgbm90aWNlIGNvbnRlbnQuIENsaWNraW5nIGl0IGZpcmVzXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcy5vbkNsb3NlQ2xpY2t9ICh3aGljaCBtYXkgY2FuY2VsIHRoZSBjbG9zZSk7IGlmXG4gICAqIG5vdCBjYW5jZWxsZWQsIGl0IGhpZGVzIHRoZSBub3RpY2UgYW5kIGRyb3BzIGl0IGZyb20gdGhlIHN0YW5kYWxvbmUtbm90aWNlIHRyYWNraW5nIHNldC4gVGhlIGhpZGUgaXNcbiAgICogbWFya2VkIGFzIGEgY2xvc2UtYnV0dG9uIGNsaWNrIHNvIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkhpZGV9IGNhblxuICAgKiBkaXN0aW5ndWlzaCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBlbmRDbG9zZUJ1dHRvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250ZW50RWwsIGdldE5vdGljZSwgb25DbG9zZUNsaWNrIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgY2xvc2VCdXR0b25FbCA9IGNvbnRlbnRFbC5jcmVhdGVFbCgnYnV0dG9uJywge1xuICAgICAgYXR0cjogeyAnYXJpYS1sYWJlbCc6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5ub3RpY2VzLmNsb3NlQXJpYUxhYmVsKSB9XG4gICAgfSk7XG4gICAgLy8gUmV1c2UgT2JzaWRpYW4ncyBtb2RhbCBjbG9zZS1idXR0b24gY2xhc3NlcyBzbyB0aGlzIGJ1dHRvbiBtYXRjaGVzIHRoZSBuYXRpdmUgbW9kYWwgY2xvc2UgYnV0dG9uXG4gICAgLy8gKGxvb2sgYW5kIGhvdmVyKTsgdGhlIHN0eWxlc2hlZXQgb25seSBwb3NpdGlvbnMgaXQgaW4gdGhlIG5vdGljZSBjb3JuZXIuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjbG9zZUJ1dHRvbkVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDbG9zZUJ1dHRvbik7XG4gICAgY2xvc2VCdXR0b25FbC5hZGRDbGFzc2VzKFtDc3NDbGFzcy5DbGlja2FibGVJY29uLCBDc3NDbGFzcy5Nb2RhbEhlYWRlckJ1dHRvbl0pO1xuICAgIHNldEljb24oY2xvc2VCdXR0b25FbCwgJ3gnKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgaXNDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgb25DbG9zZUNsaWNrPy4oe1xuICAgICAgICAgIGNhbmNlbDogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIENhbiBiZSBjYW5jZWxsZWQgYnkgdGhlIHVzZXIuXG4gICAgICAgIGlmIChpc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub3RpY2UgPSBlbnN1cmVOb25OdWxsYWJsZShnZXROb3RpY2UoKSk7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgICAgbm90aWNlLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBmb3IgYSBkZWxheWVkIG5vdGljZTogdGhlIHJlc29sdmVkIGNvbnRlbnQsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBDYW5jZWxcbiAgICogYnV0dG9uIHRoYXQgYWJvcnRzIHRoZSBwcm92aWRlZCBjb250cm9sbGVyIHdoZW4gY2xpY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSBob2xkaW5nIHRoZSBjb250ZW50IGFuZCwgaWYgcmVxdWVzdGVkLCBhIENhbmNlbCBidXR0b24uXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2UocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgeyBhYm9ydENvbnRyb2xsZXIsIGNhbmNlbEJ1dHRvblRleHQsIGNvbnRlbnQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChjb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIC8vIGBCdXR0b25Db21wb25lbnRgIHJlcXVpcmVzIGFuIGBIVE1MRWxlbWVudGAgcGFyZW50LCBzbyBidWlsZCBpdCBvbiBhIHRocm93YXdheVxuICAgICAgLy8gRGV0YWNoZWQgZWxlbWVudCBhbmQgbW92ZSBpdHMgYGJ1dHRvbkVsYCBpbnRvIHRoZSBmcmFnbWVudC5cbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b25Db21wb25lbnQoY3JlYXRlRGl2KCkpO1xuICAgICAgY2FuY2VsQnV0dG9uLnNldEJ1dHRvblRleHQoY2FuY2VsQnV0dG9uVGV4dCA/PyB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMuYnV0dG9ucy5jYW5jZWwpKTtcbiAgICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY2FuY2VsQnV0dG9uLmJ1dHRvbkVsLCBDc3NDbGFzcy5DYW5jZWxCdXR0b24pO1xuICAgICAgLy8gVGhlIGNsaWNrIGlzIHdpcmVkIHZpYSBgYWRkRXZlbnRMaXN0ZW5lcmAgcmF0aGVyIHRoYW4gYEJ1dHRvbkNvbXBvbmVudC5vbkNsaWNrYCBzbyBpdFxuICAgICAgLy8gQnViYmxlcyB0aHJvdWdoIHRoZSBpbnRlcmFjdGl2ZS1lbGVtZW50IGd1YXJkIChrZWVwaW5nIHRoZSBub3RpY2Ugb3BlbikgYW5kIHN0YXlzXG4gICAgICAvLyBEaXJlY3RseSBleGVyY2lzYWJsZSB2aWEgYSBkaXNwYXRjaGVkIERPTSBldmVudCBpbiB1bml0IHRlc3RzLlxuICAgICAgY2FuY2VsQnV0dG9uLmJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH0pO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGNhbmNlbEJ1dHRvbi5idXR0b25FbCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50IHdyYXBwZWQgaW4gYSBjb250YWluZXIgdGhhdCBrZWVwcyB0aGUgbm90aWNlIG9wZW4gd2hlbiBhbiBpbnRlcmFjdGl2ZVxuICAgKiBlbGVtZW50IGluc2lkZSBpdCBpcyBjbGlja2VkLiBPYnNpZGlhbiBkaXNtaXNzZXMgYSBub3RpY2Ugb24gYW55IGNsaWNrIHRoYXQgYnViYmxlcyB1cCB0byBpdHNcbiAgICogZWxlbWVudDsgdGhlIGNvbnRhaW5lciBpbnRlcmNlcHRzIGNsaWNrcyBvcmlnaW5hdGluZyBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IChhIGxpbmssIGJ1dHRvbixcbiAgICogaW5wdXQsIGV0Yy4pIGFuZCBzdG9wcyB0aGVtIHRoZXJlLCBzbyB0aGUgZWxlbWVudCdzIG93biBoYW5kbGVyIHN0aWxsIHJ1bnMgYnV0IHRoZSBub3RpY2Ugc3RheXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gaG9sZGluZyB0aGUgd3JhcHBlZCwgcHJlZml4ZWQgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm90aWNlQ29udGVudChwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHsgZ2V0Tm90aWNlLCBtZXNzYWdlLCBvbkNsb3NlQ2xpY2ssIHJlcXVpcmVzRXhwbGljaXRDbG9zZSA9IGZhbHNlLCBzaG91bGRTaG93Q2xvc2VCdXR0b24gPSB0cnVlIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGNvbnN0IGNvbnRlbnRFbCA9IGZyYWdtZW50LmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY29udGVudEVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDb250ZW50KTtcbiAgICBjb250ZW50RWwuYXBwZW5kKHRoaXMuYnVpbGRQcmVmaXhlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICAgIGNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgIC8vIEEgaGFyZC10by1jbG9zZSBub3RpY2UgbXVzdCBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXkgY2xpY2s7IG9ubHkgaXRzIGNsb3NlIGJ1dHRvbiBtYXkgaGlkZSBpdC5cbiAgICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uKSB7XG4gICAgICB0aGlzLmFwcGVuZENsb3NlQnV0dG9uKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcz4oe1xuICAgICAgICBjb250ZW50RWwsXG4gICAgICAgIGdldE5vdGljZTogZW5zdXJlTm9uTnVsbGFibGUoZ2V0Tm90aWNlKSxcbiAgICAgICAgb25DbG9zZUNsaWNrXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50LCBwcmVmaXhpbmcgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gYSBzdHlsZWQgZWxlbWVudCBzbyBpdCBpc1xuICAgKiB2aXN1YWxseSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHdpdGggdGhlIHN0eWxlZCBwbHVnaW4gbmFtZSBwcmVmaXggZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgbmFtZUVsID0gY3JlYXRlU3Bhbih7IHRleHQ6IHRoaXMucGx1Z2luTmFtZSB9KTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG5hbWVFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlTmFtZSk7XG4gICAgZnJhZ21lbnQuYXBwZW5kKG5hbWVFbCk7XG4gICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoJyAodW5sb2FkZWQpJyk7XG4gICAgfVxuICAgIGZyYWdtZW50LmFwcGVuZFRleHQoJ1xcbicpO1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2UoKTogTm90aWNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpLmdldCh0aGlzLnBsdWdpbk5hbWUpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcm1hbmVudE5vdGljZXMoKTogTWFwPHN0cmluZywgTm90aWNlPiB7XG4gICAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxNYXA8c3RyaW5nLCBOb3RpY2U+PihQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVksIG5ldyBNYXA8c3RyaW5nLCBOb3RpY2U+KCkpLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgbm90aWNlIGhhcmQgdG8gY2xvc2U6IG1hcmtzIGl0cyBvdXRlciBlbGVtZW50IChzbyB0aGUgQ1NTIG5ldXRyYWxpemVzIGl0cyBwYWRkaW5nKSBhbmRcbiAgICogaW5zdGFsbHMgYSBjYXB0dXJlLXBoYXNlIGNsaWNrIGd1YXJkIHRoYXQgc3RvcHMgZXZlcnkgY2xpY2sgZXhjZXB0IG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGFcbiAgICogYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3Mgb3duIGRpc21pc3MgaGFuZGxlciBcdTIwMTQgc28gYW5cbiAgICogaW50ZXJhY3RpdmUgY2hpbGQncyBvd24gaGFuZGxlciBzdGlsbCBydW5zIHdoaWxlIGEgc3RyYXkgY2xpY2sgY2Fubm90IGRpc21pc3MgdGhlIG5vdGljZS5cbiAgICpcbiAgICogQHBhcmFtIG5vdGljZSAtIFRoZSBub3RpY2UgdG8gZ3VhcmQuXG4gICAqIEBwYXJhbSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgLSBXaGV0aGVyIHRoZSBub3RpY2UgcmVxdWlyZXMgZXhwbGljaXQgY2xvc2U7IHdoZW4gYGZhbHNlYCwgbm90aGluZyBpc1xuICAgKiBpbnN0YWxsZWQuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKG5vdGljZTogTm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgb3V0ZXIgYC5ub3RpY2VgIGVsZW1lbnQgKGBjb250YWluZXJFbGApIGNhcnJpZXMgT2JzaWRpYW4ncyBkaXNtaXNzLW9uLWNsaWNrIGhhbmRsZXIgYW5kIHRoZVxuICAgIC8vIFBhZGRpbmcgYSBzdHJheSBjbGljayBjb3VsZCBsYW5kIG9uOyBtYXJrIGl0IHNvIHRoZSBzdHlsZXNoZWV0IGRyb3BzIHRoYXQgcGFkZGluZy5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG5vdGljZS5jb250YWluZXJFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlUmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAvLyBTdG9wIGV2ZXJ5IGNsaWNrIG9uIHRoZSBub3RpY2UgXHUyMDE0IGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IFx1MjAxNCBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3NcbiAgICAvLyBEaXNtaXNzIGhhbmRsZXIuIFJlZ2lzdGVyZWQgaW4gdGhlIGNhcHR1cmUgcGhhc2Ugb24gdGhlIG91dGVybW9zdCBlbGVtZW50IHNvIGl0IGFsd2F5cyBydW5zIGZpcnN0LlxuICAgIC8vIExldHRpbmcgYSBjbGljayByZWFjaCBhbiBpbnRlcmFjdGl2ZSBjaGlsZCAoYSBidXR0b24sIGxpbmssIHRoZSBjbG9zZSBidXR0b24sIGV0Yy4pIGlzIHdoYXQga2VlcHNcbiAgICAvLyBJdHMgb3duIGhhbmRsZXIgd29ya2luZzsgdGhlIGJ1YmJsZS1waGFzZSBndWFyZCBvbiB0aGUgY29udGVudCB3cmFwcGVyIHRoZW4gc3RvcHMgdGhhdCBjbGljayBmcm9tXG4gICAgLy8gQnViYmxpbmcgdXAgdG8gT2JzaWRpYW4ncyBkaXNtaXNzIGhhbmRsZXIsIHNvIHRoZSBub3RpY2Ugc3RpbGwgc3RheXMgb3Blbi5cbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGEgY2xpY2sgb24gdGhlIG5vdGljZSBzbyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfSBjYW4gcmVwb3J0IGFcbiAgICogdXNlciBkaXNtaXNzYWwuIE9ic2lkaWFuIGhpZGVzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoZSBjbGljaywgc28gYVxuICAgKiBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIG1hcmtzIHRoZSBub3RpY2UgYmVmb3JlIHRoYXQgaGlkZSBydW5zOyB0aGUgbWFyayBpcyBjbGVhcmVkIGFmdGVyIHRoZSBldmVudFxuICAgKiBzbyBhIGxhdGVyIHByb2dyYW1tYXRpYyBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkLiBBIGNsb3NlLWJ1dHRvbiBjbGljayBpcyB0cmFja2VkIHNlcGFyYXRlbHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LmFwcGVuZENsb3NlQnV0dG9ufSkuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIHRyYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcobm90aWNlOiBOb3RpY2UpOiB2b2lkIHtcbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAvLyBPYnNpZGlhbiBkaXNtaXNzZXMgYSBkaXNtaXNzaWJsZSBub3RpY2Ugc3luY2hyb25vdXNseSBkdXJpbmcgdGhpcyBjbGljaywgc28gbWFyayBpdCBub3cgKGJlZm9yZVxuICAgICAgLy8gVGhhdCBoaWRlIHJ1bnMpIGFuZCBjbGVhciBpdCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2sgXHUyMDE0IGFmdGVyIGFueSBzeW5jaHJvbm91cyBkaXNtaXNzLCBidXQgYmVmb3JlIGFcbiAgICAgIC8vIExhdGVyIHByb2dyYW1tYXRpYyBoaWRlLCBzbyB0aGF0IGhpZGUgaXMgbm90IG1pc2F0dHJpYnV0ZWQgYXMgYSB1c2VyIGFjdGlvbi5cbiAgICAgIHRoaXMudXNlckNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVybWFuZW50Tm90aWNlKG5vdGljZTogTm90aWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpO1xuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIG1hcC5zZXQodGhpcy5wbHVnaW5OYW1lLCBub3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuZGVsZXRlKHRoaXMucGx1Z2luTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbm90aWNlIHdpdGggdGhlIGdpdmVuIGR1cmF0aW9uLiBBIHJldXNhYmxlIG5vdGljZSByZXBsYWNlcyB0aGUgY3VycmVudCByZXVzYWJsZSBub3RpY2UgKGFuZFxuICAgKiBpcyBvcHRpb25hbGx5IHJlZ2lzdGVyZWQgYXMgdGhpcyBwbHVnaW4ncyBwZXJtYW5lbnQgbm90aWNlKTsgYSBzdGFuZGFsb25lIG5vdGljZSBpcyB0cmFja2VkXG4gICAqIHNlcGFyYXRlbHksIGxlYXZpbmcgdGhlIHJldXNhYmxlIHNsb3QgdW50b3VjaGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIG5vdGljZS5cbiAgICovXG4gIHByaXZhdGUgc2hvd05vdGljZVdpdGhEdXJhdGlvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMpOiBOb3RpY2Uge1xuICAgIGNvbnN0IHsgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcywgaXNSZXVzYWJsZSwgbWVzc2FnZSwgb25DbG9zZUNsaWNrLCBvbkhpZGUsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSwgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCwgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uIH0gPSBwYXJhbXM7XG4gICAgLy8gT2JzaWRpYW4ncyBgTm90aWNlYCB0cmVhdHMgYW4gb21pdHRlZCBkdXJhdGlvbiBhcyBpdHMgZGVmYXVsdCwgc28gbWFwIHRoZSBgbnVsbGAgXCJubyBleHBsaWNpdFxuICAgIC8vIER1cmF0aW9uXCIgdmFsdWUgdG8gYHVuZGVmaW5lZGAuXG4gICAgY29uc3Qgbm90aWNlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA9IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPz8gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaGFzQ2xvc2VCdXR0b24gPSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uO1xuICAgIC8vIFRoZSBjbG9zZSBidXR0b24ncyBjbGljayBoYW5kbGVyIG5lZWRzIHRoZSBgTm90aWNlYCwgd2hpY2ggZG9lcyBub3QgZXhpc3QgdW50aWwgaXQgaXMgYnVpbHQgZnJvbVxuICAgIC8vIFRoaXMgY29udGVudDsgY2FwdHVyZSBpdCBsYXppbHkgdmlhIGEgaG9sZGVyIHJlc29sdmVkIGF0IGNsaWNrIHRpbWUuIFRoZSBnZXR0ZXIgaXMgY3JlYXRlZCBvbmx5XG4gICAgLy8gV2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICBsZXQgYnVpbHROb3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zPih7XG4gICAgICBnZXROb3RpY2U6IGhhc0Nsb3NlQnV0dG9uID8gKCk6IE5vdGljZSB8IG51bGwgPT4gYnVpbHROb3RpY2UgOiB1bmRlZmluZWQsXG4gICAgICBtZXNzYWdlLFxuICAgICAgb25DbG9zZUNsaWNrLFxuICAgICAgcmVxdWlyZXNFeHBsaWNpdENsb3NlLFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uXG4gICAgfSkpO1xuXG4gICAgaWYgKCFpc1JldXNhYmxlKSB7XG4gICAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoY29udGVudCwgbm90aWNlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyk7XG4gICAgICB0aGlzLmluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKGJ1aWx0Tm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UpO1xuICAgICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5hZGQoYnVpbHROb3RpY2UpO1xuICAgICAgcmV0dXJuIGJ1aWx0Tm90aWNlO1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgYnVpbHROb3RpY2UgPSBuZXcgTm90aWNlKGNvbnRlbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgIHRoaXMubm90aWNlID0gYnVpbHROb3RpY2U7XG4gICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICB0aGlzLmluc3RhbGxVc2VyQ2xpY2tUcmFja2luZyhidWlsdE5vdGljZSk7XG4gICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuXG4gICAgaWYgKHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQpIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKGJ1aWx0Tm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBidWlsdE5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBhIG5vdGljZSdzIGBoaWRlYCBzbyB0aGUgZ2l2ZW4gY2FsbGJhY2sgcnVucyB0aGUgZmlyc3QgdGltZSB0aGUgbm90aWNlIGlzIGhpZGRlbiBcdTIwMTQgYnkgdGhlXG4gICAqIHVzZXIsIGJ5IGEgcmVwbGFjaW5nIG5vdGljZSwgYnkgaXRzIGR1cmF0aW9uIGVsYXBzaW5nLCBvciBvbiB1bmxvYWQuIERvZXMgbm90aGluZyB3aGVuIG5vIGNhbGxiYWNrXG4gICAqIGlzIGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB3aG9zZSBgaGlkZWAgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9uSGlkZSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugb24gdGhlIGZpcnN0IGhpZGUsIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgd3JhcHBpbmcuXG4gICAqL1xuICBwcml2YXRlIHdpcmVPbkhpZGUobm90aWNlOiBOb3RpY2UsIG9uSGlkZTogKCh0aGlzOiB2b2lkLCBpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIW9uSGlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSdW4gYG9uSGlkZWAgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIEEgYG9uY2VgIHBhdGNoIG9uIGBoaWRlYCBpbnRlcmNlcHRzIGV4YWN0bHkgb25lXG4gICAgLy8gQ2FsbCB0aGVuIHVuaW5zdGFsbHMgaXRzZWxmICh1bmxvYWRpbmcgdGhpcyBkZWRpY2F0ZWQgY29tcG9uZW50KSwgc28gdGhlcmUgaXMgbm8gbWFudWFsXG4gICAgLy8gU2luZ2xlLWZpcmUgYm9va2tlZXBpbmcgYW5kIG5vIGxpbmdlcmluZyBwYXRjaCBvbiB0aGUgdHJhbnNpZW50IG5vdGljZS4gVGhlIHVzZXItY2xvc2UgZmxhZ3Mgd2VyZVxuICAgIC8vIFNldCBiZWZvcmUgYGhpZGUoKWAgd2FzIGludm9rZWQgKHNlZSBgYXBwZW5kQ2xvc2VCdXR0b25gIC8gYGluc3RhbGxVc2VyQ2xpY2tUcmFja2luZ2ApLCBzbyB0aGV5XG4gICAgLy8gU3RpbGwgaG9sZCB3aGVuIHJlYWQgaGVyZSBhZnRlciBgZmFsbGJhY2soKWAuXG4gICAgY29uc3QgcGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gICAgcGF0Y2hDb21wb25lbnQubG9hZCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogbm90aWNlLFxuICAgICAgbWV0aG9kTmFtZTogJ2hpZGUnLFxuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2sgfSkgPT4ge1xuICAgICAgICBmYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCA9IHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5oYXMobm90aWNlKTtcbiAgICAgICAgY29uc3QgaXNVc2VyQWN0aW9uID0gaXNDbG9zZUJ1dHRvbkNsaWNrZWQgfHwgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuaGFzKG5vdGljZSk7XG4gICAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBvbkhpZGUoeyBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCwgaXNVc2VyQWN0aW9uIH0pO1xuICAg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
|