@mnaoumov/obsidian-lib 10.12.0 → 11.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/components/worker-component/package.json +6 -0
- package/components/worker-pool-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +409 -292
- package/dist/lib/cjs/__merged.d.cts +17 -8
- package/dist/lib/cjs/anchored-suggest.cjs +1 -1
- package/dist/lib/cjs/app.cjs +2 -2
- package/dist/lib/cjs/async-with-notice.cjs +4 -4
- package/dist/lib/cjs/attachment-path.cjs +9 -9
- package/dist/lib/cjs/attachment-path.d.cts +3 -3
- package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
- package/dist/lib/cjs/backlink-index.cjs +5 -5
- package/dist/lib/cjs/backlink.cjs +7 -7
- package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
- package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
- package/dist/lib/cjs/bug-report.cjs +3 -3
- package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
- package/dist/lib/cjs/bulk-operation.cjs +2 -2
- package/dist/lib/cjs/callout.cjs +6 -6
- package/dist/lib/cjs/canvas.cjs +11 -9
- package/dist/lib/cjs/canvas.d.cts +13 -0
- package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
- package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
- package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
- package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
- package/dist/lib/cjs/codemirror/index.cjs +7 -7
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
- package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
- package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
- package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
- package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
- package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
- package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
- package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
- package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
- package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
- package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/index.cjs +15 -15
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +6 -6
- package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
- package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
- package/dist/lib/cjs/community-plugins.cjs +3 -3
- package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
- package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +3 -3
- package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
- package/dist/lib/cjs/components/async-events-component.cjs +1 -1
- package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
- package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
- package/dist/lib/cjs/components/component-ex.cjs +21 -11
- package/dist/lib/cjs/components/component-ex.d.cts +11 -0
- package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
- package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
- package/dist/lib/cjs/components/disposable-component.cjs +2 -2
- package/dist/lib/cjs/components/embed-extensions-component.cjs +1 -1
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +8 -8
- package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
- package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
- package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
- package/dist/lib/cjs/components/index.cjs +46 -40
- package/dist/lib/cjs/components/index.d.cts +2 -0
- package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
- package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
- package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
- package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
- package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
- package/dist/lib/cjs/components/plugin-gate-component.cjs +68 -28
- package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
- package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
- package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
- package/dist/lib/cjs/components/plugin-settings-component.cjs +113 -17
- package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
- package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
- package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
- package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
- package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
- package/dist/lib/cjs/components/registry-component.cjs +2 -2
- package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
- package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
- package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
- package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
- package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
- package/dist/lib/cjs/components/shared-component-pool-component.cjs +6 -6
- package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
- package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
- package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
- package/dist/lib/cjs/components/worker-component.cjs +363 -0
- package/dist/lib/cjs/components/worker-component.d.cts +156 -0
- package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
- package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.cjs +7 -7
- package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
- package/dist/lib/cjs/constructors/index.cjs +1 -1
- package/dist/lib/cjs/data-handler.cjs +111 -4
- package/dist/lib/cjs/data-handler.d.cts +92 -1
- package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
- package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
- package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
- package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
- package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
- package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
- package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
- package/dist/lib/cjs/data-stores/index.cjs +6 -6
- package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
- package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
- package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
- package/dist/lib/cjs/dataview-link.cjs +2 -2
- package/dist/lib/cjs/dataview.cjs +27 -7
- package/dist/lib/cjs/dataview.d.cts +14 -0
- package/dist/lib/cjs/debug.cjs +3 -3
- package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
- package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
- package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
- package/dist/lib/cjs/desktop-git-runner.cjs +2 -2
- package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
- package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
- package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
- package/dist/lib/cjs/disposable.cjs +150 -0
- package/dist/lib/cjs/disposable.d.cts +39 -0
- package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
- package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
- package/dist/lib/cjs/editor-suggest.cjs +1 -1
- package/dist/lib/cjs/editor.cjs +6 -6
- package/dist/lib/cjs/events.cjs +2 -2
- package/dist/lib/cjs/extensions-registrar.cjs +1 -1
- package/dist/lib/cjs/feature-request.cjs +1 -1
- package/dist/lib/cjs/file-change.cjs +10 -10
- package/dist/lib/cjs/file-explorer.cjs +2 -2
- package/dist/lib/cjs/file-manager.cjs +5 -5
- package/dist/lib/cjs/file-system.cjs +10 -10
- package/dist/lib/cjs/folder-note.cjs +4 -4
- package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
- package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
- package/dist/lib/cjs/frontmatter.cjs +5 -5
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/hotkey.cjs +1 -1
- package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
- package/dist/lib/cjs/html-element.cjs +2 -2
- package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
- package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
- package/dist/lib/cjs/i18n/i18n.cjs +7 -7
- package/dist/lib/cjs/i18n/index.cjs +4 -4
- package/dist/lib/cjs/i18n/locales/en.cjs +5 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +4 -0
- package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
- package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +4 -0
- package/dist/lib/cjs/index.cjs +145 -127
- package/dist/lib/cjs/index.d.cts +6 -0
- package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
- package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/library-styles.cjs +3 -3
- package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
- package/dist/lib/cjs/link.cjs +76 -56
- package/dist/lib/cjs/link.d.cts +20 -14
- package/dist/lib/cjs/logger.cjs +4 -4
- package/dist/lib/cjs/loop.cjs +10 -16
- package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
- package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
- package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
- package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
- package/dist/lib/cjs/markdown-view.cjs +3 -3
- package/dist/lib/cjs/markdown.cjs +12 -12
- package/dist/lib/cjs/metadata-cache.cjs +23 -23
- package/dist/lib/cjs/metadata-cache.d.cts +5 -4
- package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
- package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
- package/dist/lib/cjs/mobile-app-info.cjs +1 -1
- package/dist/lib/cjs/modals/alert.cjs +4 -4
- package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
- package/dist/lib/cjs/modals/confirm.cjs +4 -4
- package/dist/lib/cjs/modals/copy-text-manually.cjs +4 -4
- package/dist/lib/cjs/modals/index.cjs +12 -12
- package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
- package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
- package/dist/lib/cjs/modals/modal.cjs +3 -3
- package/dist/lib/cjs/modals/prompt.cjs +10 -10
- package/dist/lib/cjs/modals/prompt.d.cts +1 -1
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +5 -5
- package/dist/lib/cjs/modals/select-item.cjs +6 -6
- package/dist/lib/cjs/modals/select-option.cjs +3 -3
- package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
- package/dist/lib/cjs/note-priority.cjs +2 -2
- package/dist/lib/cjs/notebook-navigator.cjs +12 -2
- package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
- package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
- package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian-settings.cjs +1 -1
- package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
- package/dist/lib/cjs/parse-link.cjs +14 -14
- package/dist/lib/cjs/path-compatibility.cjs +368 -0
- package/dist/lib/cjs/path-compatibility.d.cts +263 -0
- package/dist/lib/cjs/path-settings.cjs +3 -3
- package/dist/lib/cjs/pdf.cjs +2 -2
- package/dist/lib/cjs/plugin/index.cjs +16 -13
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-api.cjs +8 -8
- package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
- package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
- package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
- package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
- package/dist/lib/cjs/plugin/plugin-install-state.cjs +4 -4
- package/dist/lib/cjs/plugin/plugin-instance.cjs +14 -12
- package/dist/lib/cjs/plugin/plugin-instance.d.cts +7 -0
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
- package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
- package/dist/lib/cjs/plugin/plugin.cjs +118 -34
- package/dist/lib/cjs/plugin/plugin.d.cts +28 -5
- package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
- package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
- package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
- package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
- package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
- package/dist/lib/cjs/popovers/index.cjs +3 -3
- package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
- package/dist/lib/cjs/popovers/popover.cjs +5 -5
- package/dist/lib/cjs/queue.cjs +8 -8
- package/dist/lib/cjs/react/app-context.cjs +3 -3
- package/dist/lib/cjs/react/index.cjs +1 -1
- package/dist/lib/cjs/reference-definition.cjs +1 -1
- package/dist/lib/cjs/reference.cjs +3 -3
- package/dist/lib/cjs/release-asset.cjs +5 -5
- package/dist/lib/cjs/rendered-markdown.cjs +4 -4
- package/dist/lib/cjs/request-url.cjs +4 -4
- package/dist/lib/cjs/resource-lock.cjs +46 -42
- package/dist/lib/cjs/resource-lock.d.cts +8 -7
- package/dist/lib/cjs/resource-url.cjs +3 -3
- package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
- package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
- package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
- package/dist/lib/cjs/setting-components/index.cjs +30 -30
- package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
- package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
- package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
- package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
- package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
- package/dist/lib/cjs/setting-ex.cjs +26 -26
- package/dist/lib/cjs/setting-group-ex.cjs +2 -2
- package/dist/lib/cjs/settings-recovery.cjs +217 -0
- package/dist/lib/cjs/settings-recovery.d.cts +178 -0
- package/dist/lib/cjs/settings-tabs.cjs +5 -5
- package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
- package/dist/lib/cjs/templater.cjs +14 -4
- package/dist/lib/cjs/templater.d.cts +6 -0
- package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
- package/dist/lib/cjs/transformers/index.cjs +1 -1
- package/dist/lib/cjs/trusted-input.cjs +1 -1
- package/dist/lib/cjs/validation.cjs +4 -4
- package/dist/lib/cjs/vault-delete.cjs +6 -6
- package/dist/lib/cjs/vault-transaction.cjs +5 -5
- package/dist/lib/cjs/vault.cjs +12 -12
- package/dist/lib/cjs/view-registrar.cjs +1 -1
- package/dist/lib/cjs/virtual-file.cjs +16 -14
- package/dist/lib/cjs/virtual-file.d.cts +2 -1
- package/dist/lib/cjs/wasm.cjs +119 -0
- package/dist/lib/cjs/wasm.d.cts +54 -0
- package/dist/lib/cjs/worker-protocol.cjs +209 -0
- package/dist/lib/cjs/worker-protocol.d.cts +282 -0
- package/dist/lib/cjs/workspace.cjs +1 -1
- package/dist/lib/esm/__merged.d.mts +17 -8
- package/dist/lib/esm/__merged.mjs +133 -3
- package/dist/lib/esm/app.mjs +2 -2
- package/dist/lib/esm/attachment-path.d.mts +3 -3
- package/dist/lib/esm/attachment-path.mjs +2 -2
- package/dist/lib/esm/backlink-index.mjs +2 -2
- package/dist/lib/esm/canvas.d.mts +13 -0
- package/dist/lib/esm/canvas.mjs +6 -5
- package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
- package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
- package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
- package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
- package/dist/lib/esm/components/component-ex.d.mts +11 -0
- package/dist/lib/esm/components/component-ex.mjs +19 -6
- package/dist/lib/esm/components/disposable-component.mjs +1 -1
- package/dist/lib/esm/components/index.d.mts +2 -0
- package/dist/lib/esm/components/index.mjs +5 -1
- package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
- package/dist/lib/esm/components/plugin-gate-component.mjs +57 -14
- package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
- package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
- package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
- package/dist/lib/esm/components/plugin-settings-component.mjs +99 -3
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
- package/dist/lib/esm/components/worker-component.d.mts +156 -0
- package/dist/lib/esm/components/worker-component.mjs +279 -0
- package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
- package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
- package/dist/lib/esm/components/workspace-layout-state-component.mjs +1 -1
- package/dist/lib/esm/data-handler.d.mts +92 -1
- package/dist/lib/esm/data-handler.mjs +112 -3
- package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
- package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
- package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
- package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
- package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
- package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
- package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
- package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
- package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
- package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
- package/dist/lib/esm/dataview.d.mts +14 -0
- package/dist/lib/esm/dataview.mjs +19 -1
- package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
- package/dist/lib/esm/demo-vault-helper.mjs +29 -1
- package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
- package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
- package/dist/lib/esm/disposable.d.mts +39 -0
- package/dist/lib/esm/disposable.mjs +64 -0
- package/dist/lib/esm/file-system.mjs +2 -2
- package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +4 -0
- package/dist/lib/esm/i18n/locales/en.mjs +5 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +4 -0
- package/dist/lib/esm/index.d.mts +6 -0
- package/dist/lib/esm/index.mjs +13 -1
- package/dist/lib/esm/link.d.mts +20 -14
- package/dist/lib/esm/link.mjs +57 -38
- package/dist/lib/esm/loop.mjs +2 -8
- package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
- package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
- package/dist/lib/esm/metadata-cache.d.mts +5 -4
- package/dist/lib/esm/metadata-cache.mjs +6 -6
- package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
- package/dist/lib/esm/misplaced-attachment.mjs +212 -0
- package/dist/lib/esm/modals/prompt.d.mts +1 -1
- package/dist/lib/esm/modals/prompt.mjs +1 -1
- package/dist/lib/esm/notebook-navigator.d.mts +6 -0
- package/dist/lib/esm/notebook-navigator.mjs +11 -2
- package/dist/lib/esm/parse-link.mjs +4 -4
- package/dist/lib/esm/path-compatibility.d.mts +263 -0
- package/dist/lib/esm/path-compatibility.mjs +277 -0
- package/dist/lib/esm/plugin/index.d.mts +1 -0
- package/dist/lib/esm/plugin/index.mjs +4 -2
- package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
- package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
- package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
- package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
- package/dist/lib/esm/plugin/plugin-instance.d.mts +7 -0
- package/dist/lib/esm/plugin/plugin-instance.mjs +2 -1
- package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
- package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
- package/dist/lib/esm/plugin/plugin.d.mts +28 -5
- package/dist/lib/esm/plugin/plugin.mjs +103 -9
- package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
- package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
- package/dist/lib/esm/release-asset.mjs +1 -1
- package/dist/lib/esm/resource-lock.d.mts +8 -7
- package/dist/lib/esm/resource-lock.mjs +31 -26
- package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
- package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
- package/dist/lib/esm/settings-recovery.d.mts +178 -0
- package/dist/lib/esm/settings-recovery.mjs +125 -0
- package/dist/lib/esm/settings-tabs.mjs +2 -2
- package/dist/lib/esm/templater.d.mts +6 -0
- package/dist/lib/esm/templater.mjs +11 -2
- package/dist/lib/esm/vault.mjs +1 -1
- package/dist/lib/esm/virtual-file.d.mts +2 -1
- package/dist/lib/esm/virtual-file.mjs +7 -5
- package/dist/lib/esm/wasm.d.mts +54 -0
- package/dist/lib/esm/wasm.mjs +30 -0
- package/dist/lib/esm/worker-protocol.d.mts +282 -0
- package/dist/lib/esm/worker-protocol.mjs +113 -0
- package/package.json +9 -8
- package/plugin/third-party-plugin/package.json +6 -0
|
@@ -117,11 +117,14 @@ __export(shared_data_store_exports, {
|
|
|
117
117
|
SharedDataStore: () => SharedDataStore
|
|
118
118
|
});
|
|
119
119
|
module.exports = __toCommonJS(shared_data_store_exports);
|
|
120
|
-
var import_type_guards = require(
|
|
121
|
-
var import_data_store_locations = require(
|
|
122
|
-
var import_data_store_replica = require(
|
|
123
|
-
var import_data_store_transport = require(
|
|
120
|
+
var import_type_guards = require("@mnaoumov/typescript-lib/type-guards");
|
|
121
|
+
var import_data_store_locations = require("./data-store-locations.cjs");
|
|
122
|
+
var import_data_store_replica = require("./data-store-replica.cjs");
|
|
123
|
+
var import_data_store_transport = require("./data-store-transport.cjs");
|
|
124
124
|
const DEFAULT_ACTIVE_DEVICE_MILLISECONDS = 2592e6;
|
|
125
|
+
const OPEN_SEGMENT_BYTES = 65536;
|
|
126
|
+
const ACKNOWLEDGEMENT_REFRESH_MILLISECONDS = 864e5;
|
|
127
|
+
const ACKNOWLEDGEMENT_REFRESHES_PER_RETIREMENT = 4;
|
|
125
128
|
const OWNER_PATH_INDEX = -2;
|
|
126
129
|
const VECTOR_ENTRY_LENGTH = 2;
|
|
127
130
|
const DEVICE_PATH_PARTS = 2;
|
|
@@ -156,6 +159,7 @@ class SharedDataStore {
|
|
|
156
159
|
knownTransportRoots = /* @__PURE__ */ new Set();
|
|
157
160
|
localRecords = /* @__PURE__ */ new Map();
|
|
158
161
|
locations;
|
|
162
|
+
ownSegments = /* @__PURE__ */ new Map();
|
|
159
163
|
replica;
|
|
160
164
|
time = 0;
|
|
161
165
|
vector = /* @__PURE__ */ new Map();
|
|
@@ -279,7 +283,7 @@ class SharedDataStore {
|
|
|
279
283
|
await this.setMany([[key, value]]);
|
|
280
284
|
}
|
|
281
285
|
/**
|
|
282
|
-
* Publishes a batch of register writes, split into bounded
|
|
286
|
+
* Publishes a batch of register writes, appended to this device's open journal segment and split into bounded ones.
|
|
283
287
|
* Segments are individually durable; a failed batch can have a published prefix and can be retried safely.
|
|
284
288
|
*
|
|
285
289
|
* @param entries - Register writes or set additions.
|
|
@@ -383,19 +387,22 @@ class SharedDataStore {
|
|
|
383
387
|
}
|
|
384
388
|
for (const operation of operations) {
|
|
385
389
|
if (!this.transport.fits([operation])) {
|
|
386
|
-
await this.transport.write(
|
|
390
|
+
await this.transport.write(this.segmentPath(operation.sequence), [operation]);
|
|
387
391
|
}
|
|
388
392
|
}
|
|
389
|
-
let
|
|
393
|
+
let segment = this.openSegment();
|
|
390
394
|
for (const operation of operations) {
|
|
391
|
-
if (
|
|
392
|
-
|
|
393
|
-
|
|
395
|
+
if (segment && this.transport.fits([...segment.operations, ...segment.added, operation])) {
|
|
396
|
+
segment.added.push(operation);
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
if (segment && segment.added.length > 0) {
|
|
400
|
+
await this.publish(segment);
|
|
394
401
|
}
|
|
395
|
-
|
|
402
|
+
segment = { added: [operation], operations: [], path: this.segmentPath(operation.sequence) };
|
|
396
403
|
}
|
|
397
|
-
if (
|
|
398
|
-
await this.publish(
|
|
404
|
+
if (segment && segment.added.length > 0) {
|
|
405
|
+
await this.publish(segment);
|
|
399
406
|
}
|
|
400
407
|
await this.persist();
|
|
401
408
|
});
|
|
@@ -481,6 +488,7 @@ class SharedDataStore {
|
|
|
481
488
|
}
|
|
482
489
|
const operations = [];
|
|
483
490
|
const segments = files.filter((file) => /\/log-\d+\.(?:md|json)$/.test(file));
|
|
491
|
+
const ownSegments = [];
|
|
484
492
|
for (const path of segments) {
|
|
485
493
|
const segment = await transport.read(path);
|
|
486
494
|
if (segment === void 0) {
|
|
@@ -493,8 +501,14 @@ class SharedDataStore {
|
|
|
493
501
|
if (segment.some((operation) => operation.device !== owner)) {
|
|
494
502
|
throw new Error("Journal segment has a different writer");
|
|
495
503
|
}
|
|
504
|
+
const [firstOperation] = segment;
|
|
505
|
+
if (owner === this.device && firstOperation) {
|
|
506
|
+
ownSegments.push([firstOperation.sequence, { operations: segment, path }]);
|
|
507
|
+
}
|
|
496
508
|
operations.push(...segment);
|
|
497
509
|
}
|
|
510
|
+
ownSegments.sort(([first], [second]) => first - second);
|
|
511
|
+
this.ownSegments.set(transport.root, ownSegments.map(([, segment]) => segment));
|
|
498
512
|
operations.sort((first, second) => first.device.localeCompare(second.device) || first.sequence - second.sequence);
|
|
499
513
|
for (const operation of operations) {
|
|
500
514
|
if (operation.sequence === (this.vector.get(operation.device) ?? 0) + 1) {
|
|
@@ -510,6 +524,23 @@ class SharedDataStore {
|
|
|
510
524
|
this.counter = Math.max(this.counter, counter);
|
|
511
525
|
}
|
|
512
526
|
}
|
|
527
|
+
/**
|
|
528
|
+
* Picks the segment the next operation may extend: this device's newest one in the active transport, when it ends
|
|
529
|
+
* exactly at the device's last sequence and is still small enough that rewriting it stays cheap.
|
|
530
|
+
*
|
|
531
|
+
* @returns The open segment, or `null` when the next operation starts a new file.
|
|
532
|
+
*/
|
|
533
|
+
openSegment() {
|
|
534
|
+
const newest = this.ownSegments.get(this.transport.root)?.at(-1);
|
|
535
|
+
if (!newest) {
|
|
536
|
+
return null;
|
|
537
|
+
}
|
|
538
|
+
const last = newest.operations.at(-1);
|
|
539
|
+
return last?.sequence !== this.vector.get(this.device) || this.transport.measure(newest.operations) >= this.openSegmentBytes() ? null : { added: [], operations: newest.operations, path: newest.path };
|
|
540
|
+
}
|
|
541
|
+
openSegmentBytes() {
|
|
542
|
+
return Math.min(OPEN_SEGMENT_BYTES, this.transport.maxFileBytes);
|
|
543
|
+
}
|
|
513
544
|
async persist() {
|
|
514
545
|
const checkpoint = this.checkpoint();
|
|
515
546
|
const records = /* @__PURE__ */ new Map();
|
|
@@ -529,15 +560,38 @@ class SharedDataStore {
|
|
|
529
560
|
await this.params.local.set("shared-unpublished-v1", false);
|
|
530
561
|
this.hasUnpublishedChanges = false;
|
|
531
562
|
}
|
|
532
|
-
await this.
|
|
563
|
+
await this.publishAcknowledgement();
|
|
533
564
|
}
|
|
534
|
-
async publish(
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
for (const operation of operations) {
|
|
565
|
+
async publish(segment) {
|
|
566
|
+
await this.transport.writeAppendOnly(segment.path, [...segment.operations, ...segment.added]);
|
|
567
|
+
for (const operation of segment.added) {
|
|
538
568
|
this.apply(operation);
|
|
539
569
|
}
|
|
540
570
|
}
|
|
571
|
+
/**
|
|
572
|
+
* Rewrites `have` only when another device's acknowledged sequence moved, or the stored copy is due a refresh.
|
|
573
|
+
* Other devices read only their own entry from it, so this device's own sequence never forces a write.
|
|
574
|
+
*
|
|
575
|
+
* @returns A promise that resolves once the acknowledgement is current.
|
|
576
|
+
*/
|
|
577
|
+
async publishAcknowledgement() {
|
|
578
|
+
const path = `${this.deviceRoot()}/have${this.transport.extension}`;
|
|
579
|
+
const acknowledged = JSON.stringify(otherDevices([...this.vector], this.device));
|
|
580
|
+
let stored;
|
|
581
|
+
try {
|
|
582
|
+
stored = await this.transport.read(path);
|
|
583
|
+
} catch {
|
|
584
|
+
stored = void 0;
|
|
585
|
+
}
|
|
586
|
+
const refreshMilliseconds = Math.min(ACKNOWLEDGEMENT_REFRESH_MILLISECONDS, this.activeDeviceMilliseconds / ACKNOWLEDGEMENT_REFRESHES_PER_RETIREMENT);
|
|
587
|
+
if (isObject(stored) && stored["format"] === 1 && isVector(stored["vector"]) && typeof stored["time"] === "number" && JSON.stringify(otherDevices(stored["vector"], this.device)) === acknowledged && Date.now() - stored["time"] < refreshMilliseconds) {
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
await this.transport.write(path, { format: 1, time: Date.now(), vector: [...this.vector] });
|
|
591
|
+
}
|
|
592
|
+
segmentPath(firstSequence) {
|
|
593
|
+
return `${this.deviceRoot()}/log-${String(firstSequence)}${this.transport.extension}`;
|
|
594
|
+
}
|
|
541
595
|
}
|
|
542
596
|
function isObject(value) {
|
|
543
597
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -547,8 +601,11 @@ function isVector(value) {
|
|
|
547
601
|
(entry) => Array.isArray(entry) && entry.length === VECTOR_ENTRY_LENGTH && typeof entry[0] === "string" && /^[\w-]+$/.test(entry[0]) && Number.isSafeInteger(entry[1]) && Number(entry[1]) >= 0
|
|
548
602
|
);
|
|
549
603
|
}
|
|
604
|
+
function otherDevices(vector, device) {
|
|
605
|
+
return vector.filter(([entryDevice]) => entryDevice !== device).sort(([first], [second]) => first.localeCompare(second));
|
|
606
|
+
}
|
|
550
607
|
// Annotate the CommonJS export names for ESM import in node:
|
|
551
608
|
0 && (module.exports = {
|
|
552
609
|
SharedDataStore
|
|
553
610
|
});
|
|
554
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9zaGFyZWQtZGF0YS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBNZXJnZWFibGUgcGx1Z2luIGRhdGEsIHRyYW5zcG9ydGVkIGFzIHNpbmdsZS13cml0ZXIgam91cm5hbCBzZWdtZW50cyBhbmQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFTdG9yZUxvY2F0aW9uIH0gZnJvbSAnLi9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGFTdG9yZU1lcmdlS2luZCxcbiAgRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQgeyBEYXRhU3RvcmVMb2NhdGlvbnMgfSBmcm9tICcuL2RhdGEtc3RvcmUtbG9jYXRpb25zLnRzJztcbmltcG9ydCB7XG4gIERhdGFTdG9yZVJlcGxpY2EsXG4gIGlzRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG5jb25zdCBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTID0gMl81OTJfMDAwXzAwMDtcblxuY29uc3QgT1dORVJfUEFUSF9JTkRFWCA9IC0yO1xuXG5jb25zdCBWRUNUT1JfRU5UUllfTEVOR1RIID0gMjtcbmNvbnN0IERFVklDRV9QQVRIX1BBUlRTID0gMjtcbmNvbnN0IERFVklDRV9JRF9SRUdfRVhQID0gL15bXFx3LV0rJC87XG5jb25zdCBSRUNPUkRfUFJFRklYID0gJ3NoYXJlZC1yZWNvcmQtdjE6JztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgc2hhcmVkIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMge1xuICAvKipcbiAgICogRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwsIG1lYXN1cmVkIGZyb20gaXRzIGxhc3QgYWNrbm93bGVkZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjU5MjAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZURldmljZU1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIuXG4gICAqL1xuICByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGZvbGRlci4gSGlkZGVuIHNlZ21lbnRzIGFyZSBhbGxvd2VkOyBjYWxsZXJzIG11c3QgYXJyYW5nZSB0aGVpciBzeW5jaHJvbml6YXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnUGx1Z2luIGRhdGEnYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogTmV3IGRvY3VtZW50IGVuY29kaW5nIGF0IHRoZSBwZXJtYW5lbnQgZGlzY292ZXJ5IGFuY2hvci5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xuICAvKipcbiAgICogRW5hYmxlcyB2YXVsdCB0cmFuc3BvcnQuIERpc2FibGVkIHN0b3JlcyBtYWtlIG5vIGFkYXB0ZXIgY2FsbHMsIGluY2x1ZGluZyBkdXJpbmcgY29tcGFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc1N5bmNFbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEltbXV0YWJsZSBtZXJnZSBydWxlOyBjaGFuZ2luZyBpdCByZXF1aXJlcyBhIG5ldyBzdG9yZSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgLyoqXG4gICAqIERlZGljYXRlZCBsb2NhbCBzdG9yZSBzY29wZWQgdG8gVEhJUyB2YXVsdCwgcGx1Z2luIGFuZCBzaGFyZWQtc3RvcmUgc2NoZW1hLiBUaGUgY2FsbGVyIG93bnMgaXRzIGNvbm5lY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBsb2NhbDogTG9jYWxEYXRhU3RvcmU7XG4gIC8qKlxuICAgKiBNYXhpbXVtIFVURi04IGJ5dGVzIHBlciBmaWxlLCB3cmFwcGVyIGluY2x1ZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZpbGVCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gYSByZWNvbnN0cnVjdGVkIHNuYXBzaG90IGJlZm9yZSBKU09OIHBhcnNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2NDAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNuYXBzaG90Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgaWQgaW5jbHVkaW5nIHRoZSBjb25zdW1lcidzIHNjaGVtYSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hhbmdlIHtcbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbHVlOiBKc29uVmFsdWU7XG59XG5cbmludGVyZmFjZSBDaGVja3BvaW50IHtcbiAgcmVhZG9ubHkgY291bnRlcjogbnVtYmVyO1xuICByZWFkb25seSBmb3JtYXQ6IDE7XG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW107XG4gIHJlYWRvbmx5IHRpbWU6IG51bWJlcjtcbiAgcmVhZG9ubHkgdmVjdG9yOiBWZXJzaW9uVmVjdG9yO1xufVxuXG50eXBlIFZlcnNpb25WZWN0b3IgPSBbc3RyaW5nLCBudW1iZXJdW107XG5cbi8qKlxuICogQSBkZXZpY2UtbG9jYWwgcXVlcnkgcmVwbGljYSBiYWNrZWQgYnkgdmF1bHQgZmlsZXMuIENhbGwgYHN5bmNocm9uaXplYCBhZnRlciB0cmFuc3BvcnQgY2hhbmdlcyBvciBwZXJpb2RpY2FsbHkuXG4gKiBObyB0aW1lciBvciBldmVudCBoYW5kbGVyIG91dGxpdmVzIHRoZSBjb25zdW1lcjogdGhlIGNvbnN1bWVyIHNjaGVkdWxlcyBzeW5jaHJvbml6YXRpb24gYW5kIG93bnMgdW5sb2FkaW5nLlxuICovXG5leHBvcnQgY2xhc3MgU2hhcmVkRGF0YVN0b3JlIHtcbiAgLyoqXG4gIENvbmZpZ3VyZWQgYW5kIHJlbWVtYmVyZWQgcmVhZGVyIHJvb3RzLCBpbmNsdWRpbmcgcmV0YWluZWQgbWlncmF0aW9uIHNvdXJjZXMgd2hpbGUgZGlzYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFVuaXF1ZSByb290cyBzdWl0YWJsZSBmb3IgbWV0YWRhdGEgZXhjbHVzaW9uIHdpdGhvdXQgYWRhcHRlciBhY2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYW5zcG9ydFJvb3RzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLnRoaXMua25vd25UcmFuc3BvcnRSb290cywgLi4udGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cy5tYXAoKHRyYW5zcG9ydCkgPT4gdHJhbnNwb3J0LnJvb3QpXSldO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVEZXZpY2VNaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBoYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1N5bmNFbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duVHJhbnNwb3J0Um9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFJlY29yZHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uczogRGF0YVN0b3JlTG9jYXRpb25zO1xuICBwcml2YXRlIHJlcGxpY2E6IERhdGFTdG9yZVJlcGxpY2E7XG4gIHByaXZhdGUgdGltZSA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2ZWN0b3IgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHByaXZhdGUgZ2V0IHRyYW5zcG9ydCgpOiBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmxvY2F0aW9ucy50cmFuc3BvcnRzLmF0KC0xKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMsIHByb3RlY3RlZCByZWFkb25seSBkZXZpY2U6IHN0cmluZykge1xuICAgIHRoaXMubG9jYXRpb25zID0gbmV3IERhdGFTdG9yZUxvY2F0aW9ucyhwYXJhbXMpO1xuICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IHBhcmFtcy5pc1N5bmNFbmFibGVkID8/IHRydWU7XG4gICAgdGhpcy5yZXBsaWNhID0gbmV3IERhdGFTdG9yZVJlcGxpY2EocGFyYW1zLmtpbmQpO1xuICAgIHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzID0gcGFyYW1zLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB8fCB0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RldmljZSByZXRpcmVtZW50IGludGVydmFsIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW5kIHN5bmNocm9uaXplcyBhIHN0b3JlLCByZXN0b3JpbmcgaXRzIGRldmljZSBpZGVudGl0eSBleGNsdXNpdmVseSBmcm9tIEluZGV4ZWREQi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBlcnNpc3RlbmNlLCB0cmFuc3BvcnQgYW5kIG1lcmdlIHBvbGljeS5cbiAgICogQHJldHVybnMgQSBzeW5jaHJvbml6ZWQgcXVlcnkgcmVwbGljYS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3BlbihwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMpOiBQcm9taXNlPFNoYXJlZERhdGFTdG9yZT4ge1xuICAgIGNvbnN0IGRldmljZSA9IGF3YWl0IHBhcmFtcy5sb2NhbC5nZXRPckNyZWF0ZSgnc2hhcmVkLWRldmljZS12MScsIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpKTtcbiAgICBpZiAodHlwZW9mIGRldmljZSAhPT0gJ3N0cmluZycgfHwgIURFVklDRV9JRF9SRUdfRVhQLnRlc3QoZGV2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvY2FsIGRhdGEtc3RvcmUgaWRlbnRpdHknKTtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgU2hhcmVkRGF0YVN0b3JlKHBhcmFtcywgZGV2aWNlKTtcbiAgICBhd2FpdCBzdG9yZS5zeW5jaHJvbml6ZSgpO1xuICAgIHJldHVybiBzdG9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBjb21wbGV0ZSBjaHVua2VkIHNuYXBzaG90IGFuZCB0cmltcyBvbmx5IHRoaXMgZGV2aWNlJ3MgYWNrbm93bGVkZ2VkIGpvdXJuYWwgc2VnbWVudHMuXG4gICAqIFJldGlyZWQgZGV2aWNlcyByZWpvaW4gYnkgbWVyZ2luZyBzbmFwc2hvdHM7IHRvbWJzdG9uZXMgcmVtYWluIGluIHNuYXBzaG90cyB0byBwcmV2ZW50IHJlc3VycmVjdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjb21wYWN0aW9uIGZpbmlzaGVzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgICBjb25zdCBiYXNlID0gYCR7dGhpcy5kZXZpY2VSb290KCl9L3NuYXBzaG90LSR7d2luZG93LmNyeXB0by5yYW5kb21VVUlEKCl9LW1hbmlmZXN0YDtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlLCBwYXlsb2FkOiB0aGlzLmNoZWNrcG9pbnQoKSB9KTtcbiAgICAgIGNvbnN0IGFja25vd2xlZGdlbWVudHMgPSBhd2FpdCB0aGlzLmFja25vd2xlZGdlbWVudHMoZmlsZXMpO1xuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctYCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRpb25zID0gYXdhaXQgdGhpcy50cmFuc3BvcnQucmVhZChwYXRoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wZXJhdGlvbnMpIHx8ICFvcGVyYXRpb25zLmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3QgPSBNYXRoLm1heCguLi5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24uc2VxdWVuY2UpKTtcbiAgICAgICAgaWYgKGFja25vd2xlZGdlbWVudHMuZXZlcnkoKHZlY3RvcikgPT4gKHZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDApID49IGxhc3QpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQucmVtb3ZlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgY29tcGxldGUgbmV3IHNuYXBzaG90IGNvdmVycyBldmVyeSBlYXJsaWVyIHNuYXBzaG90IGZyb20gdGhpcyB3cml0ZXIuXG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtYCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvZ25pemVzIHRyYW5zcG9ydCBmaWxlcywgcm9vdHMsIGFuZCBhbmNlc3RvciBmb2xkZXIgb3BlcmF0aW9ucyBmb3IgY29uc3VtZXIgZXZlbnQgZmlsdGVycy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIG9yIGZvbGRlciBwYXRoLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwYXRoIGludGVyc2VjdHMgYW4gYWN0aXZlIG9yIHJldGFpbmVkIHRyYW5zcG9ydCByb290LlxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zVHJhbnNwb3J0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnRSb290cy5zb21lKChyb290KSA9PiBwYXRoID09PSByb290IHx8IHBhdGguc3RhcnRzV2l0aChgJHtyb290fS9gKSB8fCByb290LnN0YXJ0c1dpdGgoYCR7cGF0aH0vYCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSByZWdpc3RlciBvciByZW1vdmVzIHRoZSBjdXJyZW50bHkgb2JzZXJ2ZWQgYWRkaXRpb25zIG9mIGEgc2V0IG1lbWJlci5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci4gTWluL21heCByZWdpc3RlcnMgZGVsaWJlcmF0ZWx5IGNhbm5vdCBiZSBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jaGFuZ2UoW3sgZGVsZXRlZDogdHJ1ZSwga2V5LCB2YWx1ZTogbnVsbCB9XSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHJldHVybnMgRGV0YWNoZWQga2V5L3ZhbHVlIHBhaXJzIGluIGRldGVybWluaXN0aWMgb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZW50cmllcygpOiBbc3RyaW5nLCB1bmtub3duXVtdIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmVudHJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlZ2lzdGVyIG9yIHNldCBtZW1iZXJzaGlwIGZyb20gdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQSBkZXRhY2hlZCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQgb3IgZGVsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9jYXRlcyBvbmx5IHRoaXMgcGx1Z2luL3N0b3JlIHN1YnRyZWU7IGtlZXAgb3BlbmluZyB3aXRoIHRoZSBvcmlnaW5hbCBhbmNob3IgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIGxvY2F0aW9uIC0gTmV3IGZvbGRlciBhbmQgZG9jdW1lbnQgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBoaXN0b3J5IGhhcyBiZWVuIGNvcGllZCBhbmQgdmVyaWZpZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVsb2NhdGUobG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuYWJsZSBkYXRhLXN0b3JlIHN5bmNocm9uaXphdGlvbiBiZWZvcmUgcmVsb2NhdGlvbicpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5sb2NhdGlvbnMucmVsb2NhdGUobG9jYXRpb24pO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgb25lIHJlZ2lzdGVyIHZhbHVlLCBvciBhZGRzIGEgbWVtYmVyIHRvIGFuIG9ic2VydmVkLXJlbW92ZSBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5IG9yIHNldCBtZW1iZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZSAodXNlIGB0cnVlYCBmb3IgYSBzZXQpLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogSnNvblZhbHVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXRNYW55KFtba2V5LCB2YWx1ZV1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBiYXRjaCBvZiByZWdpc3RlciB3cml0ZXMsIHNwbGl0IGludG8gYm91bmRlZCBpbW11dGFibGUgc2VnbWVudHMuXG4gICAqIFNlZ21lbnRzIGFyZSBpbmRpdmlkdWFsbHkgZHVyYWJsZTsgYSBmYWlsZWQgYmF0Y2ggY2FuIGhhdmUgYSBwdWJsaXNoZWQgcHJlZml4IGFuZCBjYW4gYmUgcmV0cmllZCBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyaWVzIC0gUmVnaXN0ZXIgd3JpdGVzIG9yIHNldCBhZGRpdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGpvdXJuYWwgcHVibGljYXRpb24gYW5kIGxvY2FsIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRNYW55KGVudHJpZXM6IHJlYWRvbmx5IChyZWFkb25seSBbc3RyaW5nLCBKc29uVmFsdWVdKVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jaGFuZ2UoZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgZGVsZXRlZDogZmFsc2UsIGtleSwgdmFsdWUgfSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRyYW5zcG9ydCB3aXRob3V0IGNoYW5naW5nIGlkZW50aXR5IG9yIGNhdXNhbCBzdGF0ZS4gUGVyc2lzdCB0aGUgcHJlZmVyZW5jZSBpbiBjb25zdW1lciBzZXR0aW5ncy5cbiAgICogRW5hYmxpbmcgcHVibGlzaGVzIGEgY29tcGxldGUgY2hlY2twb2ludCBzbyBvZmZsaW5lIHNlcXVlbmNlcyBjYW5ub3QgbGVhdmUgZ2Fwcy5cbiAgICpcbiAgICogQHBhcmFtIGlzRW5hYmxlZCAtIFdoZXRoZXIgdG8gdXNlIHZhdWx0IHRyYW5zcG9ydCBmb3Igc3Vic2VxdWVudCBjYWxscyBvbiB0aGlzIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBzeW5jaHJvbml6YXRpb24gd2hlbiBlbmFibGluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRTeW5jRW5hYmxlZChpc0VuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IGlzRW5hYmxlZDtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2VzIGNvbXBsZXRlIHNuYXBzaG90cyBhbmQgY29udGlndW91cyBqb3VybmFsIGhpc3RvcnksIHRoZW4gcHVibGlzaGVzIGl0cyBkdXJhYmxlIGFja25vd2xlZGdlbWVudC5cbiAgICogUGFydGlhbCBkZWxpdmVyaWVzIHJlbWFpbiBwZW5kaW5nOyBhIGxhdGVyIGNhbGwgcmV0cmllcyB0aGVtLiBObyBhY2tub3dsZWRnZW1lbnQgc2tpcHMgYSBtaXNzaW5nIHNlcXVlbmNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgbG9jYWwgY2hlY2twb2ludCBhbmQgYWNrbm93bGVkZ2VtZW50IGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW5jaHJvbml6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFja25vd2xlZGdlbWVudHMoZmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+W10+IHtcbiAgICBjb25zdCBhY2tub3dsZWRnZW1lbnRzID0gW25ldyBNYXAodGhpcy52ZWN0b3IpXTtcbiAgICBjb25zdCBkZXZpY2VzUHJlZml4ID0gYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gO1xuICAgIGNvbnN0IGRldmljZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGRldmljZXNQcmVmaXgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gT25seSBhIGZvbGRlciB1bmRlciBgZGV2aWNlcy9gIGlzIGEgZGV2aWNlOyBhIHN0cmF5IGZpbGUgdGhlcmUgKHN1Y2ggYXMgbWFjT1MgYC5EU19TdG9yZWApIG9yIGEgZm9sZGVyIHdob3NlXG4gICAgICAvLyBuYW1lIGlzIG5vdCBhIHZhbGlkIGRldmljZSBpZCBpcyBub3Qgb25lLCBhbmQgY291bnRpbmcgaXQgd291bGQgYmxvY2sgZXZlcnkgdHJpbSBiZWhpbmQgYW4gYWNrbm93bGVkZ2VtZW50XG4gICAgICAvLyB0aGF0IG5ldmVyIGFycml2ZXMuXG4gICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc2xpY2UoZGV2aWNlc1ByZWZpeC5sZW5ndGgpLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBkZXZpY2UgPSBwYXJ0c1swXTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gREVWSUNFX1BBVEhfUEFSVFMgJiYgZGV2aWNlICE9PSB1bmRlZmluZWQgJiYgREVWSUNFX0lEX1JFR19FWFAudGVzdChkZXZpY2UpKSB7XG4gICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICAgIGlmIChkZXZpY2UgPT09IHRoaXMuZGV2aWNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaGF2ZSA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWQoYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy8ke2RldmljZX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKCFpc09iamVjdChoYXZlKSB8fCAhaXNWZWN0b3IoaGF2ZVsndmVjdG9yJ10pIHx8IHR5cGVvZiBoYXZlWyd0aW1lJ10gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKCkpO1xuICAgICAgfSBlbHNlIGlmIChEYXRlLm5vdygpIC0gaGF2ZVsndGltZSddIDw9IHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKGhhdmVbJ3ZlY3RvciddKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhY2tub3dsZWRnZW1lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseShvcGVyYXRpb246IERhdGFTdG9yZU9wZXJhdGlvbik6IHZvaWQge1xuICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIHRoaXMudmVjdG9yLnNldChvcGVyYXRpb24uZGV2aWNlLCBvcGVyYXRpb24uc2VxdWVuY2UpO1xuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKG9wZXJhdGlvbi50aW1lLCBvcGVyYXRpb24uY291bnRlcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoYW5nZShjaGFuZ2VzOiByZWFkb25seSBDaGFuZ2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3QgY2FuZGlkYXRlID0gbmV3IERhdGFTdG9yZVJlcGxpY2EodGhpcy5wYXJhbXMua2luZCk7XG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB0aGlzLnJlcGxpY2EuZXhwb3J0KCkpIHtcbiAgICAgICAgY2FuZGlkYXRlLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBsZXQgc2VxdWVuY2UgPSB0aGlzLnZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDA7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuY291bnRlciA9IG5vdyA+IHRoaXMudGltZSA/IDAgOiB0aGlzLmNvdW50ZXIgKyAxO1xuICAgICAgICB0aGlzLnRpbWUgPSBNYXRoLm1heChub3csIHRoaXMudGltZSk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uID0ge1xuICAgICAgICAgIC4uLmNoYW5nZSxcbiAgICAgICAgICBjb3VudGVyOiB0aGlzLmNvdW50ZXIsXG4gICAgICAgICAgZGV2aWNlOiB0aGlzLmRldmljZSxcbiAgICAgICAgICBzZXF1ZW5jZTogKytzZXF1ZW5jZSxcbiAgICAgICAgICB0YWdzOiBjYW5kaWRhdGUub2JzZXJ2ZWRUYWdzKGNoYW5nZS5rZXkpLFxuICAgICAgICAgIHRpbWU6IHRoaXMudGltZVxuICAgICAgICB9O1xuICAgICAgICBjYW5kaWRhdGUuYXBwbHkob3BlcmF0aW9uKTtcbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIGV2ZXJ5IHNpbmdsZSBvcGVyYXRpb24gYmVmb3JlIHB1Ymxpc2hpbmcgYW55IHByZWZpeCBvZiBhIGJhdGNoLlxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoW29wZXJhdGlvbl0pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy0ke1N0cmluZyhvcGVyYXRpb24uc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIFtvcGVyYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGJhdGNoOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoWy4uLmJhdGNoLCBvcGVyYXRpb25dKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHVibGlzaChiYXRjaCk7XG4gICAgICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBiYXRjaC5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCB0aGlzLnB1Ymxpc2goYmF0Y2gpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrcG9pbnQoKTogQ2hlY2twb2ludCB7XG4gICAgcmV0dXJuIHsgY291bnRlcjogdGhpcy5jb3VudGVyLCBmb3JtYXQ6IDEsIGtpbmQ6IHRoaXMucGFyYW1zLmtpbmQsIG9wZXJhdGlvbnM6IHRoaXMucmVwbGljYS5leHBvcnQoKSwgdGltZTogdGhpcy50aW1lLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfTtcbiAgfVxuXG4gIHByaXZhdGUgZGV2aWNlUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9kZXZpY2VzLyR7dGhpcy5kZXZpY2V9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZExvY2FsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVwbGljYSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHRoaXMucGFyYW1zLmtpbmQpO1xuICAgIHRoaXMudmVjdG9yLmNsZWFyKCk7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgIHRoaXMubG9jYWxSZWNvcmRzLmNsZWFyKCk7XG4gICAgdGhpcy5rbm93blRyYW5zcG9ydFJvb3RzLmNsZWFyKCk7XG4gICAgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZW50cmllcygpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlY29yZHMpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3NoYXJlZC1jaGVja3BvaW50LXYxJzoge1xuICAgICAgICAgIHRoaXMubWVyZ2VDaGVja3BvaW50KHZhbHVlKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC10cmFuc3BvcnQtcm9vdHMtdjEnOiB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBgLyR7dGhpcy5wYXJhbXMucGx1Z2luSWR9LyR7dGhpcy5wYXJhbXMuc3RvcmVJZH1gO1xuICAgICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb290ICE9PSAnc3RyaW5nJyB8fCAhcm9vdC5lbmRzV2l0aChzdWZmaXgpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgcmVtZW1iZXJlZCBwYXRocyB3aXRob3V0IHJlYWRpbmcgdGhlIGFkYXB0ZXIgb3IgYWN0aXZhdGluZyBhIHdyaXRlci5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQoeyAuLi50aGlzLnBhcmFtcywgZm9sZGVyOiByb290LnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKSB9KTtcbiAgICAgICAgICAgIHRoaXMua25vd25UcmFuc3BvcnRSb290cy5hZGQodHJhbnNwb3J0LnJvb3QpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC11bnB1Ymxpc2hlZC12MSc6IHtcbiAgICAgICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHZhbHVlID09PSB0cnVlO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChSRUNPUkRfUFJFRklYKSkge1xuICAgICAgICAgICAgdGhpcy5yZXBsaWNhLmFwcGx5KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxSZWNvcmRzLnNldChrZXksIGVuc3VyZU5vbk51bGxhYmxlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDaGVja3BvaW50KHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZVsnZm9ybWF0J10gIT09IDEgfHwgdmFsdWVbJ2tpbmQnXSAhPT0gdGhpcy5wYXJhbXMua2luZFxuICAgICAgfHwgIUFycmF5LmlzQXJyYXkodmFsdWVbJ29wZXJhdGlvbnMnXSkgfHwgIXZhbHVlWydvcGVyYXRpb25zJ10uZXZlcnkoaXNEYXRhU3RvcmVPcGVyYXRpb24pXG4gICAgICB8fCAhaXNWZWN0b3IodmFsdWVbJ3ZlY3RvciddKSB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWVbJ3RpbWUnXSkgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlWydjb3VudGVyJ10pXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YS1zdG9yZSBjaGVja3BvaW50IG9yIGluY29tcGF0aWJsZSBtZXJnZSBydWxlJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIHZhbHVlWydvcGVyYXRpb25zJ10pIHtcbiAgICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtkZXZpY2UsIHNlcXVlbmNlXSBvZiB2YWx1ZVsndmVjdG9yJ10pIHtcbiAgICAgIHRoaXMudmVjdG9yLnNldChkZXZpY2UsIE1hdGgubWF4KHNlcXVlbmNlLCB0aGlzLnZlY3Rvci5nZXQoZGV2aWNlKSA/PyAwKSk7XG4gICAgfVxuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKE51bWJlcih2YWx1ZVsndGltZSddKSwgTnVtYmVyKHZhbHVlWydjb3VudGVyJ10pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VGaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvY2F0aW9ucy5yZWZyZXNoKCk7XG4gICAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cykge1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZVRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VUcmFuc3BvcnQodHJhbnNwb3J0OiBEYXRhU3RvcmVUcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRyYW5zcG9ydC5saXN0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChgJHt0cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgbWFuaWZlc3RzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvc25hcHNob3QtW1xcdy1dKy1tYW5pZmVzdFxcLig/Om1kfGpzb24pJC8udGVzdChmaWxlKSk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIG1hbmlmZXN0cykge1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cmFuc3BvcnQucmVhZFNuYXBzaG90KHBhdGgpO1xuICAgICAgaWYgKHNuYXBzaG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tZXJnZUNoZWNrcG9pbnQoc25hcHNob3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvbG9nLVxcZCtcXC4oPzptZHxqc29uKSQvLnRlc3QoZmlsZSkpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBzZWdtZW50cykge1xuICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IHRyYW5zcG9ydC5yZWFkKHBhdGgpO1xuICAgICAgaWYgKHNlZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzZWdtZW50KSB8fCAhc2VnbWVudC5ldmVyeShpc0RhdGFTdG9yZU9wZXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgam91cm5hbCBzZWdtZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBvd25lciA9IHBhdGguc3BsaXQoJy8nKS5hdChPV05FUl9QQVRIX0lOREVYKTtcbiAgICAgIGlmIChzZWdtZW50LnNvbWUoKG9wZXJhdGlvbikgPT4gb3BlcmF0aW9uLmRldmljZSAhPT0gb3duZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSm91cm5hbCBzZWdtZW50IGhhcyBhIGRpZmZlcmVudCB3cml0ZXInKTtcbiAgICAgIH1cbiAgICAgIG9wZXJhdGlvbnMucHVzaCguLi5zZWdtZW50KTtcbiAgICB9XG4gICAgb3BlcmF0aW9ucy5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5kZXZpY2UubG9jYWxlQ29tcGFyZShzZWNvbmQuZGV2aWNlKSB8fCBmaXJzdC5zZXF1ZW5jZSAtIHNlY29uZC5zZXF1ZW5jZSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wZXJhdGlvbi5zZXF1ZW5jZSA9PT0gKHRoaXMudmVjdG9yLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKSArIDEpIHtcbiAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZUNsb2NrKHRpbWU6IG51bWJlciwgY291bnRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRpbWUgPiB0aGlzLnRpbWUpIHtcbiAgICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgIH0gZWxzZSBpZiAodGltZSA9PT0gdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBNYXRoLm1heCh0aGlzLmNvdW50ZXIsIGNvdW50ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyc2lzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjaGVja3BvaW50ID0gdGhpcy5jaGVja3BvaW50KCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgY2hlY2twb2ludC5vcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMucGFyYW1zLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0JyA/IGAke29wZXJhdGlvbi5kZXZpY2V9OiR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9YCA6IG9wZXJhdGlvbi5rZXk7XG4gICAgICByZWNvcmRzLnNldChgJHtSRUNPUkRfUFJFRklYfSR7aWRlbnRpdHl9YCwgb3BlcmF0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFsuLi5yZWNvcmRzXS5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdGhpcy5sb2NhbFJlY29yZHMuZ2V0KGtleSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgY29uc3QgcmVtb3ZlZEtleXMgPSBbLi4udGhpcy5sb2NhbFJlY29yZHMua2V5cygpXS5maWx0ZXIoKGtleSkgPT4gIXJlY29yZHMuaGFzKGtleSkpO1xuICAgIGVudHJpZXMucHVzaChbJ3NoYXJlZC1jaGVja3BvaW50LXYxJywgeyAuLi5jaGVja3BvaW50LCBvcGVyYXRpb25zOiBbXSB9XSwgWydzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlc10sIFsnc2hhcmVkLXRyYW5zcG9ydC1yb290cy12MScsIHRoaXMudHJhbnNwb3J0Um9vdHNdKTtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5jb21taXQoeyBlbnRyaWVzLCByZW1vdmVkS2V5cyB9KTtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlOiBgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0tbWFuaWZlc3RgLCBwYXlsb2FkOiBjaGVja3BvaW50IH0pO1xuICAgICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuc2V0KCdzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCBmYWxzZSk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZShgJHt0aGlzLmRldmljZVJvb3QoKX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIHsgZm9ybWF0OiAxLCB0aW1lOiBEYXRlLm5vdygpLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1Ymxpc2gob3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaXJzdCA9IGVuc3VyZU5vbk51bGxhYmxlKG9wZXJhdGlvbnNbMF0pO1xuICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlSW1tdXRhYmxlKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctJHtTdHJpbmcoZmlyc3Quc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIG9wZXJhdGlvbnMpO1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNWZWN0b3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWZXJzaW9uVmVjdG9yIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChlbnRyeTogdW5rbm93bikgPT5cbiAgICBBcnJheS5pc0FycmF5KGVudHJ5KSAmJiBlbnRyeS5sZW5ndGggPT09IFZFQ1RPUl9FTlRSWV9MRU5HVEhcbiAgICAmJiB0eXBlb2YgZW50cnlbMF0gPT09ICdzdHJpbmcnICYmIC9eW1xcdy1dKyQvLnRlc3QoZW50cnlbMF0pICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKGVudHJ5WzFdKSAmJiBOdW1iZXIoZW50cnlbMV0pID49IDBcbiAgKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBLHlCQUFrQztBQVNsQyxrQ0FBbUM7QUFDbkMsZ0NBR087QUFDUCxrQ0FBbUM7QUFFbkMsTUFBTSxxQ0FBcUM7QUFFM0MsTUFBTSxtQkFBbUI7QUFFekIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxnQkFBZ0I7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
|
|
611
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9zaGFyZWQtZGF0YS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogTWVyZ2VhYmxlIHBsdWdpbiBkYXRhLCB0cmFuc3BvcnRlZCBhcyBzaW5nbGUtd3JpdGVyIGpvdXJuYWwgc2VnbWVudHMgYW5kIGNodW5rZWQgc25hcHNob3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGF0YUFkYXB0ZXIgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhU3RvcmVMb2NhdGlvbiB9IGZyb20gJy4vZGF0YS1zdG9yZS1sb2NhdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBEYXRhU3RvcmVNZXJnZUtpbmQsXG4gIERhdGFTdG9yZU9wZXJhdGlvblxufSBmcm9tICcuL2RhdGEtc3RvcmUtcmVwbGljYS50cyc7XG5pbXBvcnQgdHlwZSB7IExvY2FsRGF0YVN0b3JlIH0gZnJvbSAnLi9sb2NhbC1kYXRhLXN0b3JlLnRzJztcblxuaW1wb3J0IHsgRGF0YVN0b3JlTG9jYXRpb25zIH0gZnJvbSAnLi9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyc7XG5pbXBvcnQge1xuICBEYXRhU3RvcmVSZXBsaWNhLFxuICBpc0RhdGFTdG9yZU9wZXJhdGlvblxufSBmcm9tICcuL2RhdGEtc3RvcmUtcmVwbGljYS50cyc7XG5pbXBvcnQgeyBEYXRhU3RvcmVUcmFuc3BvcnQgfSBmcm9tICcuL2RhdGEtc3RvcmUtdHJhbnNwb3J0LnRzJztcblxuY29uc3QgREVGQVVMVF9BQ1RJVkVfREVWSUNFX01JTExJU0VDT05EUyA9IDJfNTkyXzAwMF8wMDA7XG5cbi8qKlxuICogQSBzZWdtZW50IHRoaXMgbGFyZ2UgaXMgc2VhbGVkOiB0aGUgbmV4dCBiYXRjaCBvcGVucyBhIG5ldyBmaWxlLCBzbyBlYWNoIHJld3JpdGUgb2YgdGhlIG9wZW4gb25lIHN0YXlzIHNtYWxsLlxuICovXG5jb25zdCBPUEVOX1NFR01FTlRfQllURVMgPSA2NV81MzY7XG5cbi8qKlxuICogQW4gdW5jaGFuZ2VkIGFja25vd2xlZGdlbWVudCBpcyBzdGlsbCByZXdyaXR0ZW4gdGhpcyBvZnRlbiwgc28gb3RoZXIgZGV2aWNlcyBrZWVwIHNlZWluZyB0aGlzIG9uZSBhcyBhY3RpdmUuXG4gKi9cbmNvbnN0IEFDS05PV0xFREdFTUVOVF9SRUZSRVNIX01JTExJU0VDT05EUyA9IDg2XzQwMF8wMDA7XG5jb25zdCBBQ0tOT1dMRURHRU1FTlRfUkVGUkVTSEVTX1BFUl9SRVRJUkVNRU5UID0gNDtcblxuY29uc3QgT1dORVJfUEFUSF9JTkRFWCA9IC0yO1xuXG5jb25zdCBWRUNUT1JfRU5UUllfTEVOR1RIID0gMjtcbmNvbnN0IERFVklDRV9QQVRIX1BBUlRTID0gMjtcbmNvbnN0IERFVklDRV9JRF9SRUdfRVhQID0gL15bXFx3LV0rJC87XG5jb25zdCBSRUNPUkRfUFJFRklYID0gJ3NoYXJlZC1yZWNvcmQtdjE6JztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgc2hhcmVkIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMge1xuICAvKipcbiAgICogRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwsIG1lYXN1cmVkIGZyb20gaXRzIGxhc3QgYWNrbm93bGVkZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjU5MjAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZURldmljZU1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIuXG4gICAqL1xuICByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGZvbGRlci4gSGlkZGVuIHNlZ21lbnRzIGFyZSBhbGxvd2VkOyBjYWxsZXJzIG11c3QgYXJyYW5nZSB0aGVpciBzeW5jaHJvbml6YXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnUGx1Z2luIGRhdGEnYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogTmV3IGRvY3VtZW50IGVuY29kaW5nIGF0IHRoZSBwZXJtYW5lbnQgZGlzY292ZXJ5IGFuY2hvci5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xuICAvKipcbiAgICogRW5hYmxlcyB2YXVsdCB0cmFuc3BvcnQuIERpc2FibGVkIHN0b3JlcyBtYWtlIG5vIGFkYXB0ZXIgY2FsbHMsIGluY2x1ZGluZyBkdXJpbmcgY29tcGFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc1N5bmNFbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEltbXV0YWJsZSBtZXJnZSBydWxlOyBjaGFuZ2luZyBpdCByZXF1aXJlcyBhIG5ldyBzdG9yZSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgLyoqXG4gICAqIERlZGljYXRlZCBsb2NhbCBzdG9yZSBzY29wZWQgdG8gVEhJUyB2YXVsdCwgcGx1Z2luIGFuZCBzaGFyZWQtc3RvcmUgc2NoZW1hLiBUaGUgY2FsbGVyIG93bnMgaXRzIGNvbm5lY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBsb2NhbDogTG9jYWxEYXRhU3RvcmU7XG4gIC8qKlxuICAgKiBNYXhpbXVtIFVURi04IGJ5dGVzIHBlciBmaWxlLCB3cmFwcGVyIGluY2x1ZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZpbGVCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gYSByZWNvbnN0cnVjdGVkIHNuYXBzaG90IGJlZm9yZSBKU09OIHBhcnNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2NDAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNuYXBzaG90Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgaWQgaW5jbHVkaW5nIHRoZSBjb25zdW1lcidzIHNjaGVtYSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hhbmdlIHtcbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbHVlOiBKc29uVmFsdWU7XG59XG5cbmludGVyZmFjZSBDaGVja3BvaW50IHtcbiAgcmVhZG9ubHkgY291bnRlcjogbnVtYmVyO1xuICByZWFkb25seSBmb3JtYXQ6IDE7XG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW107XG4gIHJlYWRvbmx5IHRpbWU6IG51bWJlcjtcbiAgcmVhZG9ubHkgdmVjdG9yOiBWZXJzaW9uVmVjdG9yO1xufVxuXG5pbnRlcmZhY2UgSm91cm5hbFNlZ21lbnQgZXh0ZW5kcyBKb3VybmFsU2VnbWVudEZpbGUge1xuICByZWFkb25seSBhZGRlZDogRGF0YVN0b3JlT3BlcmF0aW9uW107XG59XG5cbmludGVyZmFjZSBKb3VybmFsU2VnbWVudEZpbGUge1xuICByZWFkb25seSBvcGVyYXRpb25zOiByZWFkb25seSBEYXRhU3RvcmVPcGVyYXRpb25bXTtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG50eXBlIFZlcnNpb25WZWN0b3IgPSBbc3RyaW5nLCBudW1iZXJdW107XG5cbi8qKlxuICogQSBkZXZpY2UtbG9jYWwgcXVlcnkgcmVwbGljYSBiYWNrZWQgYnkgdmF1bHQgZmlsZXMuIENhbGwgYHN5bmNocm9uaXplYCBhZnRlciB0cmFuc3BvcnQgY2hhbmdlcyBvciBwZXJpb2RpY2FsbHkuXG4gKiBObyB0aW1lciBvciBldmVudCBoYW5kbGVyIG91dGxpdmVzIHRoZSBjb25zdW1lcjogdGhlIGNvbnN1bWVyIHNjaGVkdWxlcyBzeW5jaHJvbml6YXRpb24gYW5kIG93bnMgdW5sb2FkaW5nLlxuICovXG5leHBvcnQgY2xhc3MgU2hhcmVkRGF0YVN0b3JlIHtcbiAgLyoqXG4gIENvbmZpZ3VyZWQgYW5kIHJlbWVtYmVyZWQgcmVhZGVyIHJvb3RzLCBpbmNsdWRpbmcgcmV0YWluZWQgbWlncmF0aW9uIHNvdXJjZXMgd2hpbGUgZGlzYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFVuaXF1ZSByb290cyBzdWl0YWJsZSBmb3IgbWV0YWRhdGEgZXhjbHVzaW9uIHdpdGhvdXQgYWRhcHRlciBhY2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYW5zcG9ydFJvb3RzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLnRoaXMua25vd25UcmFuc3BvcnRSb290cywgLi4udGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cy5tYXAoKHRyYW5zcG9ydCkgPT4gdHJhbnNwb3J0LnJvb3QpXSldO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVEZXZpY2VNaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBoYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1N5bmNFbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duVHJhbnNwb3J0Um9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFJlY29yZHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uczogRGF0YVN0b3JlTG9jYXRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IG93blNlZ21lbnRzID0gbmV3IE1hcDxzdHJpbmcsIEpvdXJuYWxTZWdtZW50RmlsZVtdPigpO1xuICBwcml2YXRlIHJlcGxpY2E6IERhdGFTdG9yZVJlcGxpY2E7XG4gIHByaXZhdGUgdGltZSA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2ZWN0b3IgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHByaXZhdGUgZ2V0IHRyYW5zcG9ydCgpOiBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmxvY2F0aW9ucy50cmFuc3BvcnRzLmF0KC0xKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMsIHByb3RlY3RlZCByZWFkb25seSBkZXZpY2U6IHN0cmluZykge1xuICAgIHRoaXMubG9jYXRpb25zID0gbmV3IERhdGFTdG9yZUxvY2F0aW9ucyhwYXJhbXMpO1xuICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IHBhcmFtcy5pc1N5bmNFbmFibGVkID8/IHRydWU7XG4gICAgdGhpcy5yZXBsaWNhID0gbmV3IERhdGFTdG9yZVJlcGxpY2EocGFyYW1zLmtpbmQpO1xuICAgIHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzID0gcGFyYW1zLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB8fCB0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RldmljZSByZXRpcmVtZW50IGludGVydmFsIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW5kIHN5bmNocm9uaXplcyBhIHN0b3JlLCByZXN0b3JpbmcgaXRzIGRldmljZSBpZGVudGl0eSBleGNsdXNpdmVseSBmcm9tIEluZGV4ZWREQi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBlcnNpc3RlbmNlLCB0cmFuc3BvcnQgYW5kIG1lcmdlIHBvbGljeS5cbiAgICogQHJldHVybnMgQSBzeW5jaHJvbml6ZWQgcXVlcnkgcmVwbGljYS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3BlbihwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMpOiBQcm9taXNlPFNoYXJlZERhdGFTdG9yZT4ge1xuICAgIGNvbnN0IGRldmljZSA9IGF3YWl0IHBhcmFtcy5sb2NhbC5nZXRPckNyZWF0ZSgnc2hhcmVkLWRldmljZS12MScsIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpKTtcbiAgICBpZiAodHlwZW9mIGRldmljZSAhPT0gJ3N0cmluZycgfHwgIURFVklDRV9JRF9SRUdfRVhQLnRlc3QoZGV2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvY2FsIGRhdGEtc3RvcmUgaWRlbnRpdHknKTtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgU2hhcmVkRGF0YVN0b3JlKHBhcmFtcywgZGV2aWNlKTtcbiAgICBhd2FpdCBzdG9yZS5zeW5jaHJvbml6ZSgpO1xuICAgIHJldHVybiBzdG9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBjb21wbGV0ZSBjaHVua2VkIHNuYXBzaG90IGFuZCB0cmltcyBvbmx5IHRoaXMgZGV2aWNlJ3MgYWNrbm93bGVkZ2VkIGpvdXJuYWwgc2VnbWVudHMuXG4gICAqIFJldGlyZWQgZGV2aWNlcyByZWpvaW4gYnkgbWVyZ2luZyBzbmFwc2hvdHM7IHRvbWJzdG9uZXMgcmVtYWluIGluIHNuYXBzaG90cyB0byBwcmV2ZW50IHJlc3VycmVjdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjb21wYWN0aW9uIGZpbmlzaGVzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgICBjb25zdCBiYXNlID0gYCR7dGhpcy5kZXZpY2VSb290KCl9L3NuYXBzaG90LSR7d2luZG93LmNyeXB0by5yYW5kb21VVUlEKCl9LW1hbmlmZXN0YDtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlLCBwYXlsb2FkOiB0aGlzLmNoZWNrcG9pbnQoKSB9KTtcbiAgICAgIGNvbnN0IGFja25vd2xlZGdlbWVudHMgPSBhd2FpdCB0aGlzLmFja25vd2xlZGdlbWVudHMoZmlsZXMpO1xuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctYCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRpb25zID0gYXdhaXQgdGhpcy50cmFuc3BvcnQucmVhZChwYXRoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wZXJhdGlvbnMpIHx8ICFvcGVyYXRpb25zLmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3QgPSBNYXRoLm1heCguLi5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24uc2VxdWVuY2UpKTtcbiAgICAgICAgaWYgKGFja25vd2xlZGdlbWVudHMuZXZlcnkoKHZlY3RvcikgPT4gKHZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDApID49IGxhc3QpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQucmVtb3ZlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgY29tcGxldGUgbmV3IHNuYXBzaG90IGNvdmVycyBldmVyeSBlYXJsaWVyIHNuYXBzaG90IGZyb20gdGhpcyB3cml0ZXIuXG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtYCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvZ25pemVzIHRyYW5zcG9ydCBmaWxlcywgcm9vdHMsIGFuZCBhbmNlc3RvciBmb2xkZXIgb3BlcmF0aW9ucyBmb3IgY29uc3VtZXIgZXZlbnQgZmlsdGVycy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIG9yIGZvbGRlciBwYXRoLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwYXRoIGludGVyc2VjdHMgYW4gYWN0aXZlIG9yIHJldGFpbmVkIHRyYW5zcG9ydCByb290LlxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zVHJhbnNwb3J0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnRSb290cy5zb21lKChyb290KSA9PiBwYXRoID09PSByb290IHx8IHBhdGguc3RhcnRzV2l0aChgJHtyb290fS9gKSB8fCByb290LnN0YXJ0c1dpdGgoYCR7cGF0aH0vYCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSByZWdpc3RlciBvciByZW1vdmVzIHRoZSBjdXJyZW50bHkgb2JzZXJ2ZWQgYWRkaXRpb25zIG9mIGEgc2V0IG1lbWJlci5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci4gTWluL21heCByZWdpc3RlcnMgZGVsaWJlcmF0ZWx5IGNhbm5vdCBiZSBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jaGFuZ2UoW3sgZGVsZXRlZDogdHJ1ZSwga2V5LCB2YWx1ZTogbnVsbCB9XSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHJldHVybnMgRGV0YWNoZWQga2V5L3ZhbHVlIHBhaXJzIGluIGRldGVybWluaXN0aWMgb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZW50cmllcygpOiBbc3RyaW5nLCB1bmtub3duXVtdIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmVudHJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlZ2lzdGVyIG9yIHNldCBtZW1iZXJzaGlwIGZyb20gdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQSBkZXRhY2hlZCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQgb3IgZGVsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9jYXRlcyBvbmx5IHRoaXMgcGx1Z2luL3N0b3JlIHN1YnRyZWU7IGtlZXAgb3BlbmluZyB3aXRoIHRoZSBvcmlnaW5hbCBhbmNob3IgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIGxvY2F0aW9uIC0gTmV3IGZvbGRlciBhbmQgZG9jdW1lbnQgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBoaXN0b3J5IGhhcyBiZWVuIGNvcGllZCBhbmQgdmVyaWZpZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVsb2NhdGUobG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuYWJsZSBkYXRhLXN0b3JlIHN5bmNocm9uaXphdGlvbiBiZWZvcmUgcmVsb2NhdGlvbicpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5sb2NhdGlvbnMucmVsb2NhdGUobG9jYXRpb24pO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgb25lIHJlZ2lzdGVyIHZhbHVlLCBvciBhZGRzIGEgbWVtYmVyIHRvIGFuIG9ic2VydmVkLXJlbW92ZSBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5IG9yIHNldCBtZW1iZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZSAodXNlIGB0cnVlYCBmb3IgYSBzZXQpLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogSnNvblZhbHVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXRNYW55KFtba2V5LCB2YWx1ZV1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBiYXRjaCBvZiByZWdpc3RlciB3cml0ZXMsIGFwcGVuZGVkIHRvIHRoaXMgZGV2aWNlJ3Mgb3BlbiBqb3VybmFsIHNlZ21lbnQgYW5kIHNwbGl0IGludG8gYm91bmRlZCBvbmVzLlxuICAgKiBTZWdtZW50cyBhcmUgaW5kaXZpZHVhbGx5IGR1cmFibGU7IGEgZmFpbGVkIGJhdGNoIGNhbiBoYXZlIGEgcHVibGlzaGVkIHByZWZpeCBhbmQgY2FuIGJlIHJldHJpZWQgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gZW50cmllcyAtIFJlZ2lzdGVyIHdyaXRlcyBvciBzZXQgYWRkaXRpb25zLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0TWFueShlbnRyaWVzOiByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgSnNvblZhbHVlXSlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2hhbmdlKGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IGRlbGV0ZWQ6IGZhbHNlLCBrZXksIHZhbHVlIH0pKSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0cmFuc3BvcnQgd2l0aG91dCBjaGFuZ2luZyBpZGVudGl0eSBvciBjYXVzYWwgc3RhdGUuIFBlcnNpc3QgdGhlIHByZWZlcmVuY2UgaW4gY29uc3VtZXIgc2V0dGluZ3MuXG4gICAqIEVuYWJsaW5nIHB1Ymxpc2hlcyBhIGNvbXBsZXRlIGNoZWNrcG9pbnQgc28gb2ZmbGluZSBzZXF1ZW5jZXMgY2Fubm90IGxlYXZlIGdhcHMuXG4gICAqXG4gICAqIEBwYXJhbSBpc0VuYWJsZWQgLSBXaGV0aGVyIHRvIHVzZSB2YXVsdCB0cmFuc3BvcnQgZm9yIHN1YnNlcXVlbnQgY2FsbHMgb24gdGhpcyBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgc3luY2hyb25pemF0aW9uIHdoZW4gZW5hYmxpbmcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0U3luY0VuYWJsZWQoaXNFbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICB0aGlzLmlzU3luY0VuYWJsZWQgPSBpc0VuYWJsZWQ7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlcyBjb21wbGV0ZSBzbmFwc2hvdHMgYW5kIGNvbnRpZ3VvdXMgam91cm5hbCBoaXN0b3J5LCB0aGVuIHB1Ymxpc2hlcyBpdHMgZHVyYWJsZSBhY2tub3dsZWRnZW1lbnQuXG4gICAqIFBhcnRpYWwgZGVsaXZlcmllcyByZW1haW4gcGVuZGluZzsgYSBsYXRlciBjYWxsIHJldHJpZXMgdGhlbS4gTm8gYWNrbm93bGVkZ2VtZW50IHNraXBzIGEgbWlzc2luZyBzZXF1ZW5jZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGxvY2FsIGNoZWNrcG9pbnQgYW5kIGFja25vd2xlZGdlbWVudCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3luY2hyb25pemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhY2tub3dsZWRnZW1lbnRzKGZpbGVzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgbnVtYmVyPltdPiB7XG4gICAgY29uc3QgYWNrbm93bGVkZ2VtZW50cyA9IFtuZXcgTWFwKHRoaXMudmVjdG9yKV07XG4gICAgY29uc3QgZGV2aWNlc1ByZWZpeCA9IGAke3RoaXMudHJhbnNwb3J0LnJvb3R9L2RldmljZXMvYDtcbiAgICBjb25zdCBkZXZpY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGZpbGVzKSB7XG4gICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChkZXZpY2VzUHJlZml4KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgYSBmb2xkZXIgdW5kZXIgYGRldmljZXMvYCBpcyBhIGRldmljZTsgYSBzdHJheSBmaWxlIHRoZXJlIChzdWNoIGFzIG1hY09TIGAuRFNfU3RvcmVgKSBvciBhIGZvbGRlciB3aG9zZVxuICAgICAgLy8gbmFtZSBpcyBub3QgYSB2YWxpZCBkZXZpY2UgaWQgaXMgbm90IG9uZSwgYW5kIGNvdW50aW5nIGl0IHdvdWxkIGJsb2NrIGV2ZXJ5IHRyaW0gYmVoaW5kIGFuIGFja25vd2xlZGdlbWVudFxuICAgICAgLy8gdGhhdCBuZXZlciBhcnJpdmVzLlxuICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNsaWNlKGRldmljZXNQcmVmaXgubGVuZ3RoKS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgZGV2aWNlID0gcGFydHNbMF07XG4gICAgICBpZiAocGFydHMubGVuZ3RoID49IERFVklDRV9QQVRIX1BBUlRTICYmIGRldmljZSAhPT0gdW5kZWZpbmVkICYmIERFVklDRV9JRF9SRUdfRVhQLnRlc3QoZGV2aWNlKSkge1xuICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgICBpZiAoZGV2aWNlID09PSB0aGlzLmRldmljZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhdmUgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZWFkKGAke3RoaXMudHJhbnNwb3J0LnJvb3R9L2RldmljZXMvJHtkZXZpY2V9L2hhdmUke3RoaXMudHJhbnNwb3J0LmV4dGVuc2lvbn1gKTtcbiAgICAgIGlmICghaXNPYmplY3QoaGF2ZSkgfHwgIWlzVmVjdG9yKGhhdmVbJ3ZlY3RvciddKSB8fCB0eXBlb2YgaGF2ZVsndGltZSddICE9PSAnbnVtYmVyJykge1xuICAgICAgICBhY2tub3dsZWRnZW1lbnRzLnB1c2gobmV3IE1hcCgpKTtcbiAgICAgIH0gZWxzZSBpZiAoRGF0ZS5ub3coKSAtIGhhdmVbJ3RpbWUnXSA8PSB0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcykge1xuICAgICAgICBhY2tub3dsZWRnZW1lbnRzLnB1c2gobmV3IE1hcChoYXZlWyd2ZWN0b3InXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWNrbm93bGVkZ2VtZW50cztcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHkob3BlcmF0aW9uOiBEYXRhU3RvcmVPcGVyYXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnJlcGxpY2EuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB0aGlzLnZlY3Rvci5zZXQob3BlcmF0aW9uLmRldmljZSwgb3BlcmF0aW9uLnNlcXVlbmNlKTtcbiAgICB0aGlzLm9ic2VydmVDbG9jayhvcGVyYXRpb24udGltZSwgb3BlcmF0aW9uLmNvdW50ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2UoY2hhbmdlczogcmVhZG9ubHkgQ2hhbmdlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10gPSBbXTtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHRoaXMucGFyYW1zLmtpbmQpO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgdGhpcy5yZXBsaWNhLmV4cG9ydCgpKSB7XG4gICAgICAgIGNhbmRpZGF0ZS5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgICAgbGV0IHNlcXVlbmNlID0gdGhpcy52ZWN0b3IuZ2V0KHRoaXMuZGV2aWNlKSA/PyAwO1xuICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgY2hhbmdlcykge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLmNvdW50ZXIgPSBub3cgPiB0aGlzLnRpbWUgPyAwIDogdGhpcy5jb3VudGVyICsgMTtcbiAgICAgICAgdGhpcy50aW1lID0gTWF0aC5tYXgobm93LCB0aGlzLnRpbWUpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb246IERhdGFTdG9yZU9wZXJhdGlvbiA9IHtcbiAgICAgICAgICAuLi5jaGFuZ2UsXG4gICAgICAgICAgY291bnRlcjogdGhpcy5jb3VudGVyLFxuICAgICAgICAgIGRldmljZTogdGhpcy5kZXZpY2UsXG4gICAgICAgICAgc2VxdWVuY2U6ICsrc2VxdWVuY2UsXG4gICAgICAgICAgdGFnczogY2FuZGlkYXRlLm9ic2VydmVkVGFncyhjaGFuZ2Uua2V5KSxcbiAgICAgICAgICB0aW1lOiB0aGlzLnRpbWVcbiAgICAgICAgfTtcbiAgICAgICAgY2FuZGlkYXRlLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICAgIHRoaXMuYXBwbHkob3BlcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBWYWxpZGF0ZSBldmVyeSBzaW5nbGUgb3BlcmF0aW9uIGJlZm9yZSBwdWJsaXNoaW5nIGFueSBwcmVmaXggb2YgYSBiYXRjaC5cbiAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRyYW5zcG9ydC5maXRzKFtvcGVyYXRpb25dKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlKHRoaXMuc2VnbWVudFBhdGgob3BlcmF0aW9uLnNlcXVlbmNlKSwgW29wZXJhdGlvbl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBHcm93IHRoaXMgZGV2aWNlJ3Mgb3BlbiBzZWdtZW50IHJhdGhlciB0aGFuIGNyZWF0ZSBhIGZpbGUgcGVyIGJhdGNoOyBhIHNlYWxlZCBvciBtaXNzaW5nIG9uZSBzdGFydHMgYSBuZXcgZmlsZS5cbiAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5vcGVuU2VnbWVudCgpO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoc2VnbWVudCAmJiB0aGlzLnRyYW5zcG9ydC5maXRzKFsuLi5zZWdtZW50Lm9wZXJhdGlvbnMsIC4uLnNlZ21lbnQuYWRkZWQsIG9wZXJhdGlvbl0pKSB7XG4gICAgICAgICAgc2VnbWVudC5hZGRlZC5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQgJiYgc2VnbWVudC5hZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoKHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNlZ21lbnQgPSB7IGFkZGVkOiBbb3BlcmF0aW9uXSwgb3BlcmF0aW9uczogW10sIHBhdGg6IHRoaXMuc2VnbWVudFBhdGgob3BlcmF0aW9uLnNlcXVlbmNlKSB9O1xuICAgICAgfVxuICAgICAgaWYgKHNlZ21lbnQgJiYgc2VnbWVudC5hZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHVibGlzaChzZWdtZW50KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja3BvaW50KCk6IENoZWNrcG9pbnQge1xuICAgIHJldHVybiB7IGNvdW50ZXI6IHRoaXMuY291bnRlciwgZm9ybWF0OiAxLCBraW5kOiB0aGlzLnBhcmFtcy5raW5kLCBvcGVyYXRpb25zOiB0aGlzLnJlcGxpY2EuZXhwb3J0KCksIHRpbWU6IHRoaXMudGltZSwgdmVjdG9yOiBbLi4udGhpcy52ZWN0b3JdIH07XG4gIH1cblxuICBwcml2YXRlIGRldmljZVJvb3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy8ke3RoaXMuZGV2aWNlfWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRMb2NhbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcGxpY2EgPSBuZXcgRGF0YVN0b3JlUmVwbGljYSh0aGlzLnBhcmFtcy5raW5kKTtcbiAgICB0aGlzLnZlY3Rvci5jbGVhcigpO1xuICAgIHRoaXMudGltZSA9IDA7XG4gICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICB0aGlzLmxvY2FsUmVjb3Jkcy5jbGVhcigpO1xuICAgIHRoaXMua25vd25UcmFuc3BvcnRSb290cy5jbGVhcigpO1xuICAgIHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmVudHJpZXMoKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByZWNvcmRzKSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICdzaGFyZWQtY2hlY2twb2ludC12MSc6IHtcbiAgICAgICAgICB0aGlzLm1lcmdlQ2hlY2twb2ludCh2YWx1ZSk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzaGFyZWQtdHJhbnNwb3J0LXJvb3RzLXYxJzoge1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbG9jYWwgZGF0YS1zdG9yZSB0cmFuc3BvcnQgcm9vdHMnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gYC8ke3RoaXMucGFyYW1zLnBsdWdpbklkfS8ke3RoaXMucGFyYW1zLnN0b3JlSWR9YDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm9vdCAhPT0gJ3N0cmluZycgfHwgIXJvb3QuZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbG9jYWwgZGF0YS1zdG9yZSB0cmFuc3BvcnQgcm9vdHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIHJlbWVtYmVyZWQgcGF0aHMgd2l0aG91dCByZWFkaW5nIHRoZSBhZGFwdGVyIG9yIGFjdGl2YXRpbmcgYSB3cml0ZXIuXG4gICAgICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgRGF0YVN0b3JlVHJhbnNwb3J0KHsgLi4udGhpcy5wYXJhbXMsIGZvbGRlcjogcm9vdC5zbGljZSgwLCAtc3VmZml4Lmxlbmd0aCkgfSk7XG4gICAgICAgICAgICB0aGlzLmtub3duVHJhbnNwb3J0Um9vdHMuYWRkKHRyYW5zcG9ydC5yb290KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzaGFyZWQtdW5wdWJsaXNoZWQtdjEnOiB7XG4gICAgICAgICAgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSB2YWx1ZSA9PT0gdHJ1ZTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoUkVDT1JEX1BSRUZJWCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwbGljYS5hcHBseSh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmxvY2FsUmVjb3Jkcy5zZXQoa2V5LCBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ2hlY2twb2ludCh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICFpc09iamVjdCh2YWx1ZSkgfHwgdmFsdWVbJ2Zvcm1hdCddICE9PSAxIHx8IHZhbHVlWydraW5kJ10gIT09IHRoaXMucGFyYW1zLmtpbmRcbiAgICAgIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlWydvcGVyYXRpb25zJ10pIHx8ICF2YWx1ZVsnb3BlcmF0aW9ucyddLmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKVxuICAgICAgfHwgIWlzVmVjdG9yKHZhbHVlWyd2ZWN0b3InXSkgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlWyd0aW1lJ10pIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZVsnY291bnRlciddKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgY2hlY2twb2ludCBvciBpbmNvbXBhdGlibGUgbWVyZ2UgcnVsZScpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB2YWx1ZVsnb3BlcmF0aW9ucyddKSB7XG4gICAgICB0aGlzLnJlcGxpY2EuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZGV2aWNlLCBzZXF1ZW5jZV0gb2YgdmFsdWVbJ3ZlY3RvciddKSB7XG4gICAgICB0aGlzLnZlY3Rvci5zZXQoZGV2aWNlLCBNYXRoLm1heChzZXF1ZW5jZSwgdGhpcy52ZWN0b3IuZ2V0KGRldmljZSkgPz8gMCkpO1xuICAgIH1cbiAgICB0aGlzLm9ic2VydmVDbG9jayhOdW1iZXIodmFsdWVbJ3RpbWUnXSksIE51bWJlcih2YWx1ZVsnY291bnRlciddKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1lcmdlRmlsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5sb2NhdGlvbnMucmVmcmVzaCgpO1xuICAgIGZvciAoY29uc3QgdHJhbnNwb3J0IG9mIHRoaXMubG9jYXRpb25zLnRyYW5zcG9ydHMpIHtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1lcmdlVHJhbnNwb3J0KHRyYW5zcG9ydDogRGF0YVN0b3JlVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsRmlsZXMgPSBhd2FpdCB0cmFuc3BvcnQubGlzdCgpO1xuICAgIGNvbnN0IGZpbGVzID0gYWxsRmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7dHJhbnNwb3J0LnJvb3R9L2RldmljZXMvYCkpO1xuICAgIGNvbnN0IG1hbmlmZXN0cyA9IGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gL1xcL3NuYXBzaG90LVtcXHctXSstbWFuaWZlc3RcXC4oPzptZHxqc29uKSQvLnRlc3QoZmlsZSkpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBtYW5pZmVzdHMpIHtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdHJhbnNwb3J0LnJlYWRTbmFwc2hvdChwYXRoKTtcbiAgICAgIGlmIChzbmFwc2hvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubWVyZ2VDaGVja3BvaW50KHNuYXBzaG90KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzZWdtZW50cyA9IGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gL1xcL2xvZy1cXGQrXFwuKD86bWR8anNvbikkLy50ZXN0KGZpbGUpKTtcbiAgICBjb25zdCBvd25TZWdtZW50czogW251bWJlciwgSm91cm5hbFNlZ21lbnRGaWxlXVtdID0gW107XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHNlZ21lbnRzKSB7XG4gICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgdHJhbnNwb3J0LnJlYWQocGF0aCk7XG4gICAgICBpZiAoc2VnbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNlZ21lbnQpIHx8ICFzZWdtZW50LmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YS1zdG9yZSBqb3VybmFsIHNlZ21lbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG93bmVyID0gcGF0aC5zcGxpdCgnLycpLmF0KE9XTkVSX1BBVEhfSU5ERVgpO1xuICAgICAgaWYgKHNlZ21lbnQuc29tZSgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24uZGV2aWNlICE9PSBvd25lcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdKb3VybmFsIHNlZ21lbnQgaGFzIGEgZGlmZmVyZW50IHdyaXRlcicpO1xuICAgICAgfVxuICAgICAgY29uc3QgW2ZpcnN0T3BlcmF0aW9uXSA9IHNlZ21lbnQ7XG4gICAgICBpZiAob3duZXIgPT09IHRoaXMuZGV2aWNlICYmIGZpcnN0T3BlcmF0aW9uKSB7XG4gICAgICAgIG93blNlZ21lbnRzLnB1c2goW2ZpcnN0T3BlcmF0aW9uLnNlcXVlbmNlLCB7IG9wZXJhdGlvbnM6IHNlZ21lbnQsIHBhdGggfV0pO1xuICAgICAgfVxuICAgICAgb3BlcmF0aW9ucy5wdXNoKC4uLnNlZ21lbnQpO1xuICAgIH1cbiAgICBvd25TZWdtZW50cy5zb3J0KChbZmlyc3RdLCBbc2Vjb25kXSkgPT4gZmlyc3QgLSBzZWNvbmQpO1xuICAgIHRoaXMub3duU2VnbWVudHMuc2V0KHRyYW5zcG9ydC5yb290LCBvd25TZWdtZW50cy5tYXAoKFssIHNlZ21lbnRdKSA9PiBzZWdtZW50KSk7XG4gICAgb3BlcmF0aW9ucy5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5kZXZpY2UubG9jYWxlQ29tcGFyZShzZWNvbmQuZGV2aWNlKSB8fCBmaXJzdC5zZXF1ZW5jZSAtIHNlY29uZC5zZXF1ZW5jZSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wZXJhdGlvbi5zZXF1ZW5jZSA9PT0gKHRoaXMudmVjdG9yLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKSArIDEpIHtcbiAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZUNsb2NrKHRpbWU6IG51bWJlciwgY291bnRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRpbWUgPiB0aGlzLnRpbWUpIHtcbiAgICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgIH0gZWxzZSBpZiAodGltZSA9PT0gdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBNYXRoLm1heCh0aGlzLmNvdW50ZXIsIGNvdW50ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgc2VnbWVudCB0aGUgbmV4dCBvcGVyYXRpb24gbWF5IGV4dGVuZDogdGhpcyBkZXZpY2UncyBuZXdlc3Qgb25lIGluIHRoZSBhY3RpdmUgdHJhbnNwb3J0LCB3aGVuIGl0IGVuZHNcbiAgICogZXhhY3RseSBhdCB0aGUgZGV2aWNlJ3MgbGFzdCBzZXF1ZW5jZSBhbmQgaXMgc3RpbGwgc21hbGwgZW5vdWdoIHRoYXQgcmV3cml0aW5nIGl0IHN0YXlzIGNoZWFwLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgb3BlbiBzZWdtZW50LCBvciBgbnVsbGAgd2hlbiB0aGUgbmV4dCBvcGVyYXRpb24gc3RhcnRzIGEgbmV3IGZpbGUuXG4gICAqL1xuICBwcml2YXRlIG9wZW5TZWdtZW50KCk6IEpvdXJuYWxTZWdtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgbmV3ZXN0ID0gdGhpcy5vd25TZWdtZW50cy5nZXQodGhpcy50cmFuc3BvcnQucm9vdCk/LmF0KC0xKTtcbiAgICBpZiAoIW5ld2VzdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSBuZXdlc3Qub3BlcmF0aW9ucy5hdCgtMSk7XG4gICAgcmV0dXJuIGxhc3Q/LnNlcXVlbmNlICE9PSB0aGlzLnZlY3Rvci5nZXQodGhpcy5kZXZpY2UpIHx8IHRoaXMudHJhbnNwb3J0Lm1lYXN1cmUobmV3ZXN0Lm9wZXJhdGlvbnMpID49IHRoaXMub3BlblNlZ21lbnRCeXRlcygpID8gbnVsbCA6IHsgYWRkZWQ6IFtdLCBvcGVyYXRpb25zOiBuZXdlc3Qub3BlcmF0aW9ucywgcGF0aDogbmV3ZXN0LnBhdGggfTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlblNlZ21lbnRCeXRlcygpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbihPUEVOX1NFR01FTlRfQllURVMsIHRoaXMudHJhbnNwb3J0Lm1heEZpbGVCeXRlcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcnNpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hlY2twb2ludCA9IHRoaXMuY2hlY2twb2ludCgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIGNoZWNrcG9pbnQub3BlcmF0aW9ucykge1xuICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLnBhcmFtcy5raW5kID09PSAnb2JzZXJ2ZWQtcmVtb3ZlLXNldCcgPyBgJHtvcGVyYXRpb24uZGV2aWNlfToke1N0cmluZyhvcGVyYXRpb24uc2VxdWVuY2UpfWAgOiBvcGVyYXRpb24ua2V5O1xuICAgICAgcmVjb3Jkcy5zZXQoYCR7UkVDT1JEX1BSRUZJWH0ke2lkZW50aXR5fWAsIG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbLi4ucmVjb3Jkc10uZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHRoaXMubG9jYWxSZWNvcmRzLmdldChrZXkpICE9PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIGNvbnN0IHJlbW92ZWRLZXlzID0gWy4uLnRoaXMubG9jYWxSZWNvcmRzLmtleXMoKV0uZmlsdGVyKChrZXkpID0+ICFyZWNvcmRzLmhhcyhrZXkpKTtcbiAgICBlbnRyaWVzLnB1c2goWydzaGFyZWQtY2hlY2twb2ludC12MScsIHsgLi4uY2hlY2twb2ludCwgb3BlcmF0aW9uczogW10gfV0sIFsnc2hhcmVkLXVucHVibGlzaGVkLXYxJywgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXNdLCBbJ3NoYXJlZC10cmFuc3BvcnQtcm9vdHMtdjEnLCB0aGlzLnRyYW5zcG9ydFJvb3RzXSk7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuY29tbWl0KHsgZW50cmllcywgcmVtb3ZlZEtleXMgfSk7XG4gICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZVNuYXBzaG90KHsgYmFzZTogYCR7dGhpcy5kZXZpY2VSb290KCl9L3NuYXBzaG90LSR7d2luZG93LmNyeXB0by5yYW5kb21VVUlEKCl9LW1hbmlmZXN0YCwgcGF5bG9hZDogY2hlY2twb2ludCB9KTtcbiAgICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLnNldCgnc2hhcmVkLXVucHVibGlzaGVkLXYxJywgZmFsc2UpO1xuICAgICAgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5wdWJsaXNoQWNrbm93bGVkZ2VtZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1Ymxpc2goc2VnbWVudDogSm91cm5hbFNlZ21lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZUFwcGVuZE9ubHkoc2VnbWVudC5wYXRoLCBbLi4uc2VnbWVudC5vcGVyYXRpb25zLCAuLi5zZWdtZW50LmFkZGVkXSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygc2VnbWVudC5hZGRlZCkge1xuICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXdyaXRlcyBgaGF2ZWAgb25seSB3aGVuIGFub3RoZXIgZGV2aWNlJ3MgYWNrbm93bGVkZ2VkIHNlcXVlbmNlIG1vdmVkLCBvciB0aGUgc3RvcmVkIGNvcHkgaXMgZHVlIGEgcmVmcmVzaC5cbiAgICogT3RoZXIgZGV2aWNlcyByZWFkIG9ubHkgdGhlaXIgb3duIGVudHJ5IGZyb20gaXQsIHNvIHRoaXMgZGV2aWNlJ3Mgb3duIHNlcXVlbmNlIG5ldmVyIGZvcmNlcyBhIHdyaXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBhY2tub3dsZWRnZW1lbnQgaXMgY3VycmVudC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHVibGlzaEFja25vd2xlZGdlbWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXRoID0gYCR7dGhpcy5kZXZpY2VSb290KCl9L2hhdmUke3RoaXMudHJhbnNwb3J0LmV4dGVuc2lvbn1gO1xuICAgIGNvbnN0IGFja25vd2xlZGdlZCA9IEpTT04uc3RyaW5naWZ5KG90aGVyRGV2aWNlcyhbLi4udGhpcy52ZWN0b3JdLCB0aGlzLmRldmljZSkpO1xuICAgIGxldCBzdG9yZWQ6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHN0b3JlZCA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWQocGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzdG9yZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZnJlc2hNaWxsaXNlY29uZHMgPSBNYXRoLm1pbihBQ0tOT1dMRURHRU1FTlRfUkVGUkVTSF9NSUxMSVNFQ09ORFMsIHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzIC8gQUNLTk9XTEVER0VNRU5UX1JFRlJFU0hFU19QRVJfUkVUSVJFTUVOVCk7XG4gICAgaWYgKFxuICAgICAgaXNPYmplY3Qoc3RvcmVkKSAmJiBzdG9yZWRbJ2Zvcm1hdCddID09PSAxICYmIGlzVmVjdG9yKHN0b3JlZFsndmVjdG9yJ10pICYmIHR5cGVvZiBzdG9yZWRbJ3RpbWUnXSA9PT0gJ251bWJlcidcbiAgICAgICYmIEpTT04uc3RyaW5naWZ5KG90aGVyRGV2aWNlcyhzdG9yZWRbJ3ZlY3RvciddLCB0aGlzLmRldmljZSkpID09PSBhY2tub3dsZWRnZWRcbiAgICAgICYmIERhdGUubm93KCkgLSBzdG9yZWRbJ3RpbWUnXSA8IHJlZnJlc2hNaWxsaXNlY29uZHNcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUocGF0aCwgeyBmb3JtYXQ6IDEsIHRpbWU6IERhdGUubm93KCksIHZlY3RvcjogWy4uLnRoaXMudmVjdG9yXSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2VnbWVudFBhdGgoZmlyc3RTZXF1ZW5jZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy0ke1N0cmluZyhmaXJzdFNlcXVlbmNlKX0ke3RoaXMudHJhbnNwb3J0LmV4dGVuc2lvbn1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzVmVjdG9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVmVyc2lvblZlY3RvciB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoZW50cnk6IHVua25vd24pID0+XG4gICAgQXJyYXkuaXNBcnJheShlbnRyeSkgJiYgZW50cnkubGVuZ3RoID09PSBWRUNUT1JfRU5UUllfTEVOR1RIXG4gICAgJiYgdHlwZW9mIGVudHJ5WzBdID09PSAnc3RyaW5nJyAmJiAvXltcXHctXSskLy50ZXN0KGVudHJ5WzBdKSAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcihlbnRyeVsxXSkgJiYgTnVtYmVyKGVudHJ5WzFdKSA+PSAwXG4gICk7XG59XG5cbmZ1bmN0aW9uIG90aGVyRGV2aWNlcyh2ZWN0b3I6IFZlcnNpb25WZWN0b3IsIGRldmljZTogc3RyaW5nKTogVmVyc2lvblZlY3RvciB7XG4gIHJldHVybiB2ZWN0b3IuZmlsdGVyKChbZW50cnlEZXZpY2VdKSA9PiBlbnRyeURldmljZSAhPT0gZGV2aWNlKS5zb3J0KChbZmlyc3RdLCBbc2Vjb25kXSkgPT4gZmlyc3QubG9jYWxlQ29tcGFyZShzZWNvbmQpKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLHlCQUFrQztBQVNsQyxrQ0FBbUM7QUFDbkMsZ0NBR087QUFDUCxrQ0FBbUM7QUFFbkMsTUFBTSxxQ0FBcUM7QUFLM0MsTUFBTSxxQkFBcUI7QUFLM0IsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSwyQ0FBMkM7QUFFakQsTUFBTSxtQkFBbUI7QUFFekIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxnQkFBZ0I7QUE4RmYsTUFBTSxnQkFBZ0I7QUFBQSxFQTJCbkIsWUFBK0IsUUFBc0QsUUFBZ0I7QUFBdEU7QUFBc0Q7QUFDM0YsU0FBSyxZQUFZLElBQUksK0NB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
|
|
@@ -90,6 +90,7 @@ export declare class SharedDataStore {
|
|
|
90
90
|
private readonly knownTransportRoots;
|
|
91
91
|
private readonly localRecords;
|
|
92
92
|
private readonly locations;
|
|
93
|
+
private readonly ownSegments;
|
|
93
94
|
private replica;
|
|
94
95
|
private time;
|
|
95
96
|
private readonly vector;
|
|
@@ -152,7 +153,7 @@ export declare class SharedDataStore {
|
|
|
152
153
|
*/
|
|
153
154
|
set(key: string, value: JsonValue): Promise<void>;
|
|
154
155
|
/**
|
|
155
|
-
* Publishes a batch of register writes, split into bounded
|
|
156
|
+
* Publishes a batch of register writes, appended to this device's open journal segment and split into bounded ones.
|
|
156
157
|
* Segments are individually durable; a failed batch can have a published prefix and can be retried safely.
|
|
157
158
|
*
|
|
158
159
|
* @param entries - Register writes or set additions.
|
|
@@ -184,6 +185,22 @@ export declare class SharedDataStore {
|
|
|
184
185
|
private mergeFiles;
|
|
185
186
|
private mergeTransport;
|
|
186
187
|
private observeClock;
|
|
188
|
+
/**
|
|
189
|
+
* Picks the segment the next operation may extend: this device's newest one in the active transport, when it ends
|
|
190
|
+
* exactly at the device's last sequence and is still small enough that rewriting it stays cheap.
|
|
191
|
+
*
|
|
192
|
+
* @returns The open segment, or `null` when the next operation starts a new file.
|
|
193
|
+
*/
|
|
194
|
+
private openSegment;
|
|
195
|
+
private openSegmentBytes;
|
|
187
196
|
private persist;
|
|
188
197
|
private publish;
|
|
198
|
+
/**
|
|
199
|
+
* Rewrites `have` only when another device's acknowledged sequence moved, or the stored copy is due a refresh.
|
|
200
|
+
* Other devices read only their own entry from it, so this device's own sequence never forces a write.
|
|
201
|
+
*
|
|
202
|
+
* @returns A promise that resolves once the acknowledgement is current.
|
|
203
|
+
*/
|
|
204
|
+
private publishAcknowledgement;
|
|
205
|
+
private segmentPath;
|
|
189
206
|
}
|
|
@@ -118,8 +118,8 @@ __export(dataview_link_exports, {
|
|
|
118
118
|
makeLinkWithPath: () => makeLinkWithPath
|
|
119
119
|
});
|
|
120
120
|
module.exports = __toCommonJS(dataview_link_exports);
|
|
121
|
-
var import_path = require(
|
|
122
|
-
var import_file_system = require(
|
|
121
|
+
var import_path = require("@mnaoumov/typescript-lib/path");
|
|
122
|
+
var import_file_system = require("./file-system.cjs");
|
|
123
123
|
function fixTitle(params) {
|
|
124
124
|
const {
|
|
125
125
|
dv,
|