obsidian-dev-utils 91.0.1 → 92.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/demo-vault-helper/main.js +65 -2
- package/dist/integration-test-plugin/main.js +171 -102
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +49 -1
- package/dist/lib/cjs/obsidian/demo-vault-helper.d.cts +7 -2
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +22 -1
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +14 -0
- package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +185 -4
- package/dist/lib/cjs/script-utils/demo-vault-coverage.d.cts +106 -1
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/demo-vault-helper.d.mts +7 -2
- package/dist/lib/esm/obsidian/demo-vault-helper.mjs +53 -2
- package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +14 -0
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +22 -1
- package/dist/lib/esm/script-utils/demo-vault-coverage.d.mts +106 -1
- package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +186 -4
- package/package.json +2 -2
|
@@ -21,7 +21,7 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
21
21
|
globalThis.process = browserProcess;
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
|
-
const LIBRARY_VERSION = "
|
|
24
|
+
const LIBRARY_VERSION = "92.0.0";
|
|
25
25
|
const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-dev-utils-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-dev-utils.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-dev-utils-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-dev-utils.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice .obsidian-dev-utils.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.popover {\n max-width: min(420px, 90vw);\n min-width: 320px;\n padding: var(--size-4-2) var(--size-4-3);\n position: absolute;\n z-index: var(--layer-menu);\n}\n.obsidian-dev-utils.popover .setting-item {\n align-items: center;\n border-top: none;\n gap: var(--size-4-2);\n padding: var(--size-2-1) 0;\n}\n.obsidian-dev-utils.popover .setting-item-info {\n margin-right: 0;\n}\n.obsidian-dev-utils.popover .setting-item-control {\n flex-grow: 1;\n justify-content: flex-end;\n}\n.obsidian-dev-utils.popover input[type=text] {\n width: 100%;\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/popover.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACxGJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;AChCF;EACE;;;ACCJ;EAIE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AC9BF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-dev-utils-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20A%20popover%20is%20anchored%20at%20a%20point%20and%20appended%20to%20the%20document%20body,%20outside%20any%20plugin-scoped%5Cn//%20container,%20so%20it%20is%20positioned%20absolutely%20at%20the%20top%20level.%20It%20borrows%20Obsidian's%20%60.menu%60%20look,%5Cn//%20which%20already%20carries%20the%20popup%20background,%20border%20and%20shadow%20%E2%80%94%20only%20layout%20is%20set%20here.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20&.popover%20%7B%5Cn%20%20%20%20//%20Deliberately%20not%20%60calc(100vw%20-%2016px)%60:%20the%20SCSS%20compiler%20strips%20the%20%60calc(%60%20wrapper%20inside%5Cn%20%20%20%20//%20%60min()%60,%20which%20yields%20invalid%20CSS.%20A%20viewport%20percentage%20keeps%20a%20narrow%20window's%20popover%20on%5Cn%20%20%20%20//%20screen.%5Cn%20%20%20%20max-width:%20min(420px,%2090vw);%5Cn%20%20%20%20min-width:%20320px;%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20z-index:%20var(--layer-menu);%5Cn%5Cn%20%20%20%20//%20Setting%20rows%20are%20built%20for%20a%20full-width%20settings%20tab;%20compact%20them%20for%20a%20popover.%5Cn%20%20%20%20.setting-item%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20border-top:%20none;%5Cn%20%20%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20%20%20padding:%20var(--size-2-1)%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-info%20%7B%5Cn%20%20%20%20%20%20margin-right:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-control%20%7B%5Cn%20%20%20%20%20%20flex-grow:%201;%5Cn%20%20%20%20%20%20justify-content:%20flex-end;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20input%5Btype='text'%5D%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
26
26
|
export {
|
|
27
27
|
LIBRARY_STYLES,
|
|
@@ -18,6 +18,9 @@
|
|
|
18
18
|
* It also creates CodeScript Toolkit's invocable-scripts folder if it is missing, so every demo vault
|
|
19
19
|
* has the same layout even when the vault ships no invocable scripts — the vaults themselves commit no
|
|
20
20
|
* empty folder for it.
|
|
21
|
+
*
|
|
22
|
+
* Finally it raises the sandbox notice explaining that the opened vault is a throwaway copy, so a user
|
|
23
|
+
* who writes their own notes in it is never surprised by them being absent from the next copy.
|
|
21
24
|
*/
|
|
22
25
|
import type { App } from 'obsidian';
|
|
23
26
|
/**
|
|
@@ -36,9 +39,11 @@ export interface BootstrapDemoVaultParams {
|
|
|
36
39
|
* reload. If CodeScript Toolkit is already enabled but the settings just changed, it is reloaded
|
|
37
40
|
* (disabled then enabled) so it re-reads `data.json`; when the settings were already in place, nothing is
|
|
38
41
|
* reloaded (so a routine vault re-open does not re-run CodeScript Toolkit's startup). CodeScript Toolkit
|
|
39
|
-
* then runs the vault's `startup.ts`.
|
|
42
|
+
* then runs the vault's `startup.ts`. Finally it raises the sandbox notice describing the opened vault
|
|
43
|
+
* as a throwaway copy.
|
|
40
44
|
*
|
|
41
45
|
* @param params - The {@link BootstrapDemoVaultParams}.
|
|
42
|
-
* @returns A {@link Promise} that resolves once CodeScript Toolkit is installed, configured, and enabled
|
|
46
|
+
* @returns A {@link Promise} that resolves once CodeScript Toolkit is installed, configured, and enabled
|
|
47
|
+
* and the sandbox notice has been shown.
|
|
43
48
|
*/
|
|
44
49
|
export declare function bootstrapDemoVault(params: BootstrapDemoVaultParams): Promise<void>;
|
|
@@ -21,7 +21,12 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
21
21
|
globalThis.process = browserProcess;
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
|
-
import {
|
|
24
|
+
import { Notice } from "obsidian";
|
|
25
|
+
import {
|
|
26
|
+
basename,
|
|
27
|
+
join
|
|
28
|
+
} from "../path.mjs";
|
|
29
|
+
import { ensureNonNullable } from "../type-guards.mjs";
|
|
25
30
|
import {
|
|
26
31
|
configureCommunityPlugin,
|
|
27
32
|
ConfigureCommunityPluginResult,
|
|
@@ -32,13 +37,19 @@ import {
|
|
|
32
37
|
const CODE_SCRIPT_TOOLKIT_PLUGIN_ID = "fix-require-modules";
|
|
33
38
|
const CODE_SCRIPT_TOOLKIT_MODULES_ROOT = "_assets/CodeScriptToolkit";
|
|
34
39
|
const CODE_SCRIPT_TOOLKIT_SETTINGS = {
|
|
40
|
+
defaultCodeButtonConfig: "---\nsourceVisibility: collapsed\n---",
|
|
35
41
|
invocableScriptsFolder: "Invocables",
|
|
36
42
|
modulesRoot: CODE_SCRIPT_TOOLKIT_MODULES_ROOT,
|
|
37
43
|
shouldHandleProtocolUrls: true,
|
|
38
44
|
startupScriptPath: "startup.ts"
|
|
39
45
|
};
|
|
46
|
+
const DEMO_VAULT_HELPER_PLUGIN_ID = "demo-vault-helper";
|
|
47
|
+
const PLUGINS_FOLDER_NAME = "plugins";
|
|
48
|
+
const OPEN_DEMO_VAULT_COMMAND_NAME = "Open demo vault";
|
|
49
|
+
const SANDBOX_NOTICE_DURATION_IN_MILLISECONDS = 0;
|
|
40
50
|
async function bootstrapDemoVault(params) {
|
|
41
51
|
const { app } = params;
|
|
52
|
+
const demoedPluginId = await getDemoedPluginId(app);
|
|
42
53
|
await installCommunityPlugin({ app, pluginId: CODE_SCRIPT_TOOLKIT_PLUGIN_ID });
|
|
43
54
|
const result = await configureCommunityPlugin({
|
|
44
55
|
app,
|
|
@@ -52,6 +63,26 @@ async function bootstrapDemoVault(params) {
|
|
|
52
63
|
await disableCommunityPlugin({ app, pluginId: CODE_SCRIPT_TOOLKIT_PLUGIN_ID });
|
|
53
64
|
await enableCommunityPlugin({ app, pluginId: CODE_SCRIPT_TOOLKIT_PLUGIN_ID });
|
|
54
65
|
}
|
|
66
|
+
showSandboxNotice(app, demoedPluginId);
|
|
67
|
+
}
|
|
68
|
+
function buildSandboxNoticeFragment(pluginName, basePath) {
|
|
69
|
+
return createFragment((fragment) => {
|
|
70
|
+
if (pluginName === null) {
|
|
71
|
+
fragment.appendText("This is a demo vault.");
|
|
72
|
+
} else {
|
|
73
|
+
fragment.appendText("This is a demo vault for ");
|
|
74
|
+
fragment.createEl("b", { text: pluginName });
|
|
75
|
+
fragment.appendText(".");
|
|
76
|
+
}
|
|
77
|
+
fragment.appendText(" It is a temporary sandbox");
|
|
78
|
+
if (basePath !== null) {
|
|
79
|
+
fragment.appendText(" at ");
|
|
80
|
+
fragment.createEl("code", { text: basePath });
|
|
81
|
+
}
|
|
82
|
+
fragment.appendText(", cleaned up automatically about a day after you last use it \u2014 copy anything you want to keep into your own vault. Running ");
|
|
83
|
+
fragment.createEl("b", { text: pluginName === null ? OPEN_DEMO_VAULT_COMMAND_NAME : `${pluginName}: ${OPEN_DEMO_VAULT_COMMAND_NAME}` });
|
|
84
|
+
fragment.appendText(" again creates a new copy with the latest plugin version, so your notes will not appear in it.");
|
|
85
|
+
});
|
|
55
86
|
}
|
|
56
87
|
async function ensureInvocableScriptsFolder(app) {
|
|
57
88
|
const invocableScriptsFolderPath = join(CODE_SCRIPT_TOOLKIT_MODULES_ROOT, CODE_SCRIPT_TOOLKIT_SETTINGS.invocableScriptsFolder);
|
|
@@ -59,7 +90,27 @@ async function ensureInvocableScriptsFolder(app) {
|
|
|
59
90
|
await app.vault.adapter.mkdir(invocableScriptsFolderPath);
|
|
60
91
|
}
|
|
61
92
|
}
|
|
93
|
+
async function getDemoedPluginId(app) {
|
|
94
|
+
const pluginsFolderPath = join(app.vault.configDir, PLUGINS_FOLDER_NAME);
|
|
95
|
+
if (!await app.vault.adapter.exists(pluginsFolderPath)) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const listedFiles = await app.vault.adapter.list(pluginsFolderPath);
|
|
99
|
+
const demoedPluginIds = listedFiles.folders.map((folderPath) => basename(folderPath)).filter((pluginId) => pluginId !== DEMO_VAULT_HELPER_PLUGIN_ID);
|
|
100
|
+
return demoedPluginIds.length === 1 ? ensureNonNullable(demoedPluginIds[0]) : null;
|
|
101
|
+
}
|
|
102
|
+
function getVaultBasePath(app) {
|
|
103
|
+
return isBasePathAdapter(app.vault.adapter) ? app.vault.adapter.getBasePath() : null;
|
|
104
|
+
}
|
|
105
|
+
function isBasePathAdapter(adapter) {
|
|
106
|
+
return typeof Reflect.get(adapter, "getBasePath") === "function";
|
|
107
|
+
}
|
|
108
|
+
function showSandboxNotice(app, demoedPluginId) {
|
|
109
|
+
const pluginName = demoedPluginId === null ? null : app.plugins.manifests[demoedPluginId]?.name ?? demoedPluginId;
|
|
110
|
+
const fragment = buildSandboxNoticeFragment(pluginName, getVaultBasePath(app));
|
|
111
|
+
new Notice(fragment, SANDBOX_NOTICE_DURATION_IN_MILLISECONDS);
|
|
112
|
+
}
|
|
62
113
|
export {
|
|
63
114
|
bootstrapDemoVault
|
|
64
115
|
};
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2RlbW8tdmF1bHQtaGVscGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQm9vdHN0cmFwcyBhIGRlbW8gdmF1bHQgYnkgaW5zdGFsbGluZywgY29uZmlndXJpbmcsIGFuZCBlbmFibGluZyBDb2RlU2NyaXB0IFRvb2xraXQuXG4gKlxuICogQSBwbHVnaW4ncyBkZW1vIHZhdWx0IHNob3djYXNlcyB0aGUgcGx1Z2luIHRocm91Z2ggbm90ZXMgd2hvc2UgYGNvZGUtYnV0dG9uYHMgcnVuIFR5cGVTY3JpcHQgdmlhXG4gKiBDb2RlU2NyaXB0IFRvb2xraXQuIEEgZGVtbyB2YXVsdCB0aGF0IGRvZXMgbm90IGl0c2VsZiBzaGlwIENvZGVTY3JpcHQgVG9vbGtpdCB0aGVyZWZvcmUgbmVlZHMgaXRcbiAqIGluc3RhbGxlZCwgY29uZmlndXJlZCwgYW5kIGVuYWJsZWQgYmVmb3JlIHRob3NlIGJ1dHRvbnMgd29yay4ge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdH0gZG9lcyBleGFjdGx5XG4gKiB0aGF0IHdpdGggbm8gY29tbWl0dGVkIENvZGVTY3JpcHQgVG9vbGtpdCBjb25maWcgYW5kIG5vIG1hbnVhbCBzZXR1cCwgc28gaXQgY2FuIGJlIGRyaXZlbiBmcm9tIGEgdGlueVxuICogY29tbWl0dGVkIGJvb3RzdHJhcCBwbHVnaW4gKGBkZW1vLXZhdWx0LWhlbHBlcmApIHRoYXQgaXMgaW5qZWN0ZWQgaW50byBldmVyeSBkZW1vIHZhdWx0IGF0IHJlbGVhc2VcbiAqIHRpbWUuXG4gKlxuICogSXQgd3JpdGVzIENvZGVTY3JpcHQgVG9vbGtpdCdzIHNldHRpbmdzIEJFRk9SRSBlbmFibGluZyBpdCwgc28gdGhlIHBsdWdpbiBsb2FkcyBhbHJlYWR5IGNvbmZpZ3VyZWQgXHUyMDE0XG4gKiBubyByZWxvYWQuIENvZGVTY3JpcHQgVG9vbGtpdCB0aGVuIHJ1bnMgdGhlIHZhdWx0J3MgYHN0YXJ0dXAudHNgICh2aWEgaXRzIGBzdGFydHVwU2NyaXB0UGF0aGBcbiAqIHNldHRpbmcpLCB3aGljaCBpcyB3aGVyZSBlYWNoIHZhdWx0IG9wZW5zIGl0cyBzdGFydCBub3RlIGFuZCBkb2VzIGFueSBwbHVnaW4tc3BlY2lmaWMgc2V0dXAuXG4gKlxuICogSXQgYWxzbyBjcmVhdGVzIENvZGVTY3JpcHQgVG9vbGtpdCdzIGludm9jYWJsZS1zY3JpcHRzIGZvbGRlciBpZiBpdCBpcyBtaXNzaW5nLCBzbyBldmVyeSBkZW1vIHZhdWx0XG4gKiBoYXMgdGhlIHNhbWUgbGF5b3V0IGV2ZW4gd2hlbiB0aGUgdmF1bHQgc2hpcHMgbm8gaW52b2NhYmxlIHNjcmlwdHMgXHUyMDE0IHRoZSB2YXVsdHMgdGhlbXNlbHZlcyBjb21taXQgbm9cbiAqIGVtcHR5IGZvbGRlciBmb3IgaXQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIGNvbmZpZ3VyZUNvbW11bml0eVBsdWdpbixcbiAgQ29uZmlndXJlQ29tbXVuaXR5UGx1Z2luUmVzdWx0LFxuICBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luLFxuICBlbmFibGVDb21tdW5pdHlQbHVnaW4sXG4gIGluc3RhbGxDb21tdW5pdHlQbHVnaW5cbn0gZnJvbSAnLi9jb21tdW5pdHktcGx1Z2lucy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwRGVtb1ZhdWx0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcbn1cblxuLyoqXG4gKiBDb2RlU2NyaXB0IFRvb2xraXQncyBzZXR0aW5ncywgd3JpdHRlbiBpbnRvIGl0cyBgZGF0YS5qc29uYCBiZWZvcmUgaXQgaXMgZW5hYmxlZC5cbiAqL1xuaW50ZXJmYWNlIENvZGVTY3JpcHRUb29sa2l0U2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIGZvbGRlciAodW5kZXIge0BsaW5rIENvZGVTY3JpcHRUb29sa2l0U2V0dGluZ3MubW9kdWxlc1Jvb3R9KSBob2xkaW5nIGludm9jYWJsZSBzY3JpcHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW52b2NhYmxlU2NyaXB0c0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQtcmVsYXRpdmUgZm9sZGVyIHRoYXQgYHJlcXVpcmUoJy9cdTIwMjYnKWAgcmVzb2x2ZXMgbW9kdWxlIHBhdGhzIGFnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBtb2R1bGVzUm9vdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIENvZGVTY3JpcHQgVG9vbGtpdCBoYW5kbGVzIGBvYnNpZGlhbjovL2AgcHJvdG9jb2wgVVJMcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhhbmRsZVByb3RvY29sVXJsczogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggKHVuZGVyIHtAbGluayBDb2RlU2NyaXB0VG9vbGtpdFNldHRpbmdzLm1vZHVsZXNSb290fSkgb2YgdGhlIHNjcmlwdCBydW4gb24gbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0dXBTY3JpcHRQYXRoOiBzdHJpbmc7XG59XG5cbmNvbnN0IENPREVfU0NSSVBUX1RPT0xLSVRfUExVR0lOX0lEID0gJ2ZpeC1yZXF1aXJlLW1vZHVsZXMnO1xuY29uc3QgQ09ERV9TQ1JJUFRfVE9PTEtJVF9NT0RVTEVTX1JPT1QgPSAnX2Fzc2V0cy9Db2RlU2NyaXB0VG9vbGtpdCc7XG5jb25zdCBDT0RFX1NDUklQVF9UT09MS0lUX1NFVFRJTkdTOiBDb2RlU2NyaXB0VG9vbGtpdFNldHRpbmdzID0ge1xuICBpbnZvY2FibGVTY3JpcHRzRm9sZGVyOiAnSW52b2NhYmxlcycsXG4gIG1vZHVsZXNSb290OiBDT0RFX1NDUklQVF9UT09MS0lUX01PRFVMRVNfUk9PVCxcbiAgc2hvdWxkSGFuZGxlUHJvdG9jb2xVcmxzOiB0cnVlLFxuICBzdGFydHVwU2NyaXB0UGF0aDogJ3N0YXJ0dXAudHMnXG59O1xuXG4vKipcbiAqIEJvb3RzdHJhcHMgYSBkZW1vIHZhdWx0IHNvIGl0cyBub3RlcycgYGNvZGUtYnV0dG9uYHMgd29yayB3aXRoIG5vIG1hbnVhbCBzZXR1cDogaW5zdGFsbHMgQ29kZVNjcmlwdFxuICogVG9vbGtpdCBmcm9tIHRoZSBjb21tdW5pdHkgc3RvcmUgKGlmIGl0IGlzIG5vdCBhbHJlYWR5IGluc3RhbGxlZCksIHdyaXRlcyBpdHMgc2V0dGluZ3MsIHRoZW4gZW5hYmxlc1xuICogaXQgXHUyMDE0IHdyaXRpbmcgdGhlIHNldHRpbmdzIEJFRk9SRSBlbmFibGluZyBzbyBhIGZyZXNoIGVuYWJsZSBsb2FkcyBpdCBhbHJlYWR5IGNvbmZpZ3VyZWQsIHdpdGggbm9cbiAqIHJlbG9hZC4gSWYgQ29kZVNjcmlwdCBUb29sa2l0IGlzIGFscmVhZHkgZW5hYmxlZCBidXQgdGhlIHNldHRpbmdzIGp1c3QgY2hhbmdlZCwgaXQgaXMgcmVsb2FkZWRcbiAqIChkaXNhYmxlZCB0aGVuIGVuYWJsZWQpIHNvIGl0IHJlLXJlYWRzIGBkYXRhLmpzb25gOyB3aGVuIHRoZSBzZXR0aW5ncyB3ZXJlIGFscmVhZHkgaW4gcGxhY2UsIG5vdGhpbmcgaXNcbiAqIHJlbG9hZGVkIChzbyBhIHJvdXRpbmUgdmF1bHQgcmUtb3BlbiBkb2VzIG5vdCByZS1ydW4gQ29kZVNjcmlwdCBUb29sa2l0J3Mgc3RhcnR1cCkuIENvZGVTY3JpcHQgVG9vbGtpdFxuICogdGhlbiBydW5zIHRoZSB2YXVsdCdzIGBzdGFydHVwLnRzYC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCb290c3RyYXBEZW1vVmF1bHRQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIENvZGVTY3JpcHQgVG9vbGtpdCBpcyBpbnN0YWxsZWQsIGNvbmZpZ3VyZWQsIGFuZCBlbmFibGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwRGVtb1ZhdWx0KHBhcmFtczogQm9vdHN0cmFwRGVtb1ZhdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGF3YWl0IGluc3RhbGxDb21tdW5pdHlQbHVnaW4oeyBhcHAsIHBsdWdpbklkOiBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2luKHtcbiAgICBhcHAsXG4gICAgcGx1Z2luSWQ6IENPREVfU0NSSVBUX1RPT0xLSVRfUExVR0lOX0lELFxuICAgIHNldHRpbmdzOiBDT0RFX1NDUklQVF9UT09MS0lUX1NFVFRJTkdTXG4gIH0pO1xuICBhd2FpdCBlbnN1cmVJbnZvY2FibGVTY3JpcHRzRm9sZGVyKGFwcCk7XG5cbiAgaWYgKCFhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMoQ09ERV9TQ1JJUFRfVE9PTEtJVF9QTFVHSU5fSUQpKSB7XG4gICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHsgYXBwLCBwbHVnaW5JZDogQ09ERV9TQ1JJUFRfVE9PTEtJVF9QTFVHSU5fSUQgfSk7XG4gIH0gZWxzZSBpZiAocmVzdWx0ID09PSBDb25maWd1cmVDb21tdW5pdHlQbHVnaW5SZXN1bHQuU3VjY2Vzcykge1xuICAgIC8vIEFscmVhZHkgZW5hYmxlZCB3aXRoIHN0YWxlIHNldHRpbmdzIFx1MjAxNCByZWxvYWQgc28gQ29kZVNjcmlwdCBUb29sa2l0IHJlLXJlYWRzIHRoZSBmcmVzaGx5IHdyaXR0ZW4gZGF0YS5qc29uLlxuICAgIGF3YWl0IGRpc2FibGVDb21tdW5pdHlQbHVnaW4oeyBhcHAsIHBsdWdpbklkOiBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCB9KTtcbiAgICBhd2FpdCBlbmFibGVDb21tdW5pdHlQbHVnaW4oeyBhcHAsIHBsdWdpbklkOiBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCB9KTtcbiAgfVxufVxuXG4vLyBDcmVhdGVzIENvZGVTY3JpcHQgVG9vbGtpdCdzIGludm9jYWJsZS1zY3JpcHRzIGZvbGRlciAodW5kZXIgYG1vZHVsZXNSb290YCkgaWYgaXQgaXMgbWlzc2luZy5cbi8vIEV2ZXJ5IGRlbW8gdmF1bHQgdGhlbiBoYXMgdGhlIHNhbWUgQ29kZVNjcmlwdCBUb29sa2l0IGxheW91dCBldmVuIHdoZW4gaXQgc2hpcHMgbm8gaW52b2NhYmxlIHNjcmlwdHMuXG4vLyBUaGUgY29tbWl0dGVkIHZhdWx0IHRoZXJlZm9yZSBjYXJyaWVzIG5vIG90aGVyd2lzZS1lbXB0eSBwbGFjZWhvbGRlciBmb2xkZXIuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVJbnZvY2FibGVTY3JpcHRzRm9sZGVyKGFwcDogQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGludm9jYWJsZVNjcmlwdHNGb2xkZXJQYXRoID0gam9pbihDT0RFX1NDUklQVF9UT09MS0lUX01PRFVMRVNfUk9PVCwgQ09ERV9TQ1JJUFRfVE9PTEtJVF9TRVRUSU5HUy5pbnZvY2FibGVTY3JpcHRzRm9sZGVyKTtcbiAgaWYgKCFhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5leGlzdHMoaW52b2NhYmxlU2NyaXB0c0ZvbGRlclBhdGgpKSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoaW52b2NhYmxlU2NyaXB0c0ZvbGRlclBhdGgpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSxTQUFTLFlBQVk7QUFDckI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFxQ1AsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxtQ0FBbUM7QUFDekMsTUFBTSwrQkFBMEQ7QUFBQSxFQUM5RCx3QkFBd0I7QUFBQSxFQUN4QixhQUFhO0FBQUEsRUFDYiwwQkFBMEI7QUFBQSxFQUMxQixtQkFBbUI7QUFDckI7QUFjQSxlQUFzQixtQkFBbUIsUUFBaUQ7QUFDeEYsUUFBTSxFQUFFLElBQUksSUFBSTtBQUNoQixRQUFNLHVCQUF1QixFQUFFLEtBQUssVUFBVSw4QkFBOEIsQ0FBQztBQUM3RSxRQUFNLFNBQVMsTUFBTSx5QkFBeUI7QUFBQSxJQUM1QztBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLEVBQ1osQ0FBQztBQUNELFFBQU0sNkJBQTZCLEdBQUc7QUFFdEMsTUFBSSxDQUFDLElBQUksUUFBUSxlQUFlLElBQUksNkJBQTZCLEdBQUc7QUFDbEUsVUFBTSxzQkFBc0IsRUFBRSxLQUFLLFVBQVUsOEJBQThCLENBQUM7QUFBQSxFQUM5RSxXQUFXLFdBQVcsK0JBQStCLFNBQVM7QUFFNUQsVUFBTSx1QkFBdUIsRUFBRSxLQUFLLFVBQVUsOEJBQThCLENBQUM7QUFDN0UsVUFBTSxzQkFBc0IsRUFBRSxLQUFLLFVBQVUsOEJBQThCLENBQUM7QUFBQSxFQUM5RTtBQUNGO0FBS0EsZUFBZSw2QkFBNkIsS0FBeUI7QUFDbkUsUUFBTSw2QkFBNkIsS0FBSyxrQ0FBa0MsNkJBQTZCLHNCQUFzQjtBQUM3SCxNQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sUUFBUSxPQUFPLDBCQUEwQixHQUFHO0FBQy9ELFVBQU0sSUFBSSxNQUFNLFFBQVEsTUFBTSwwQkFBMEI7QUFBQSxFQUMxRDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2RlbW8tdmF1bHQtaGVscGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQm9vdHN0cmFwcyBhIGRlbW8gdmF1bHQgYnkgaW5zdGFsbGluZywgY29uZmlndXJpbmcsIGFuZCBlbmFibGluZyBDb2RlU2NyaXB0IFRvb2xraXQuXG4gKlxuICogQSBwbHVnaW4ncyBkZW1vIHZhdWx0IHNob3djYXNlcyB0aGUgcGx1Z2luIHRocm91Z2ggbm90ZXMgd2hvc2UgYGNvZGUtYnV0dG9uYHMgcnVuIFR5cGVTY3JpcHQgdmlhXG4gKiBDb2RlU2NyaXB0IFRvb2xraXQuIEEgZGVtbyB2YXVsdCB0aGF0IGRvZXMgbm90IGl0c2VsZiBzaGlwIENvZGVTY3JpcHQgVG9vbGtpdCB0aGVyZWZvcmUgbmVlZHMgaXRcbiAqIGluc3RhbGxlZCwgY29uZmlndXJlZCwgYW5kIGVuYWJsZWQgYmVmb3JlIHRob3NlIGJ1dHRvbnMgd29yay4ge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdH0gZG9lcyBleGFjdGx5XG4gKiB0aGF0IHdpdGggbm8gY29tbWl0dGVkIENvZGVTY3JpcHQgVG9vbGtpdCBjb25maWcgYW5kIG5vIG1hbnVhbCBzZXR1cCwgc28gaXQgY2FuIGJlIGRyaXZlbiBmcm9tIGEgdGlueVxuICogY29tbWl0dGVkIGJvb3RzdHJhcCBwbHVnaW4gKGBkZW1vLXZhdWx0LWhlbHBlcmApIHRoYXQgaXMgaW5qZWN0ZWQgaW50byBldmVyeSBkZW1vIHZhdWx0IGF0IHJlbGVhc2VcbiAqIHRpbWUuXG4gKlxuICogSXQgd3JpdGVzIENvZGVTY3JpcHQgVG9vbGtpdCdzIHNldHRpbmdzIEJFRk9SRSBlbmFibGluZyBpdCwgc28gdGhlIHBsdWdpbiBsb2FkcyBhbHJlYWR5IGNvbmZpZ3VyZWQgXHUyMDE0XG4gKiBubyByZWxvYWQuIENvZGVTY3JpcHQgVG9vbGtpdCB0aGVuIHJ1bnMgdGhlIHZhdWx0J3MgYHN0YXJ0dXAudHNgICh2aWEgaXRzIGBzdGFydHVwU2NyaXB0UGF0aGBcbiAqIHNldHRpbmcpLCB3aGljaCBpcyB3aGVyZSBlYWNoIHZhdWx0IG9wZW5zIGl0cyBzdGFydCBub3RlIGFuZCBkb2VzIGFueSBwbHVnaW4tc3BlY2lmaWMgc2V0dXAuXG4gKlxuICogSXQgYWxzbyBjcmVhdGVzIENvZGVTY3JpcHQgVG9vbGtpdCdzIGludm9jYWJsZS1zY3JpcHRzIGZvbGRlciBpZiBpdCBpcyBtaXNzaW5nLCBzbyBldmVyeSBkZW1vIHZhdWx0XG4gKiBoYXMgdGhlIHNhbWUgbGF5b3V0IGV2ZW4gd2hlbiB0aGUgdmF1bHQgc2hpcHMgbm8gaW52b2NhYmxlIHNjcmlwdHMgXHUyMDE0IHRoZSB2YXVsdHMgdGhlbXNlbHZlcyBjb21taXQgbm9cbiAqIGVtcHR5IGZvbGRlciBmb3IgaXQuXG4gKlxuICogRmluYWxseSBpdCByYWlzZXMgdGhlIHNhbmRib3ggbm90aWNlIGV4cGxhaW5pbmcgdGhhdCB0aGUgb3BlbmVkIHZhdWx0IGlzIGEgdGhyb3dhd2F5IGNvcHksIHNvIGEgdXNlclxuICogd2hvIHdyaXRlcyB0aGVpciBvd24gbm90ZXMgaW4gaXQgaXMgbmV2ZXIgc3VycHJpc2VkIGJ5IHRoZW0gYmVpbmcgYWJzZW50IGZyb20gdGhlIG5leHQgY29weS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgRGF0YUFkYXB0ZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBqb2luXG59IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBjb25maWd1cmVDb21tdW5pdHlQbHVnaW4sXG4gIENvbmZpZ3VyZUNvbW11bml0eVBsdWdpblJlc3VsdCxcbiAgZGlzYWJsZUNvbW11bml0eVBsdWdpbixcbiAgZW5hYmxlQ29tbXVuaXR5UGx1Z2luLFxuICBpbnN0YWxsQ29tbXVuaXR5UGx1Z2luXG59IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBib290c3RyYXBEZW1vVmF1bHR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcERlbW9WYXVsdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIHRoZSBkZXNrdG9wIHZhdWx0IGFkYXB0ZXIgdGhhdCBrbm93cyB0aGUgdmF1bHQncyBhYnNvbHV0ZSBwYXRoLlxuICovXG5pbnRlcmZhY2UgQmFzZVBhdGhBZGFwdGVyIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIGdldEJhc2VQYXRoKCk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2RlU2NyaXB0IFRvb2xraXQncyBzZXR0aW5ncywgd3JpdHRlbiBpbnRvIGl0cyBgZGF0YS5qc29uYCBiZWZvcmUgaXQgaXMgZW5hYmxlZC5cbiAqL1xuaW50ZXJmYWNlIENvZGVTY3JpcHRUb29sa2l0U2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIFlBTUwgZnJvbnRtYXR0ZXIgbWVyZ2VkIGludG8gZXZlcnkgYGNvZGUtYnV0dG9uYCBibG9jaydzIG93biBjb25maWcsIHVzZWQgaGVyZSB0byB0dXJuIHRoZVxuICAgKiBzb3VyY2Ugdmlld2VyIG9uIGZvciBldmVyeSBidXR0b24gaW4gZXZlcnkgZGVtbyB2YXVsdCB3aXRob3V0IGVkaXRpbmcgYSBzaW5nbGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRDb2RlQnV0dG9uQ29uZmlnOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgKHVuZGVyIHtAbGluayBDb2RlU2NyaXB0VG9vbGtpdFNldHRpbmdzLm1vZHVsZXNSb290fSkgaG9sZGluZyBpbnZvY2FibGUgc2NyaXB0cy5cbiAgICovXG4gIHJlYWRvbmx5IGludm9jYWJsZVNjcmlwdHNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIGZvbGRlciB0aGF0IGByZXF1aXJlKCcvXHUyMDI2JylgIHJlc29sdmVzIG1vZHVsZSBwYXRocyBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlc1Jvb3Q6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBDb2RlU2NyaXB0IFRvb2xraXQgaGFuZGxlcyBgb2JzaWRpYW46Ly9gIHByb3RvY29sIFVSTHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVQcm90b2NvbFVybHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoICh1bmRlciB7QGxpbmsgQ29kZVNjcmlwdFRvb2xraXRTZXR0aW5ncy5tb2R1bGVzUm9vdH0pIG9mIHRoZSBzY3JpcHQgcnVuIG9uIGxvYWQuXG4gICAqL1xuICByZWFkb25seSBzdGFydHVwU2NyaXB0UGF0aDogc3RyaW5nO1xufVxuXG5jb25zdCBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCA9ICdmaXgtcmVxdWlyZS1tb2R1bGVzJztcbmNvbnN0IENPREVfU0NSSVBUX1RPT0xLSVRfTU9EVUxFU19ST09UID0gJ19hc3NldHMvQ29kZVNjcmlwdFRvb2xraXQnO1xuY29uc3QgQ09ERV9TQ1JJUFRfVE9PTEtJVF9TRVRUSU5HUzogQ29kZVNjcmlwdFRvb2xraXRTZXR0aW5ncyA9IHtcbiAgZGVmYXVsdENvZGVCdXR0b25Db25maWc6ICctLS1cXG5zb3VyY2VWaXNpYmlsaXR5OiBjb2xsYXBzZWRcXG4tLS0nLFxuICBpbnZvY2FibGVTY3JpcHRzRm9sZGVyOiAnSW52b2NhYmxlcycsXG4gIG1vZHVsZXNSb290OiBDT0RFX1NDUklQVF9UT09MS0lUX01PRFVMRVNfUk9PVCxcbiAgc2hvdWxkSGFuZGxlUHJvdG9jb2xVcmxzOiB0cnVlLFxuICBzdGFydHVwU2NyaXB0UGF0aDogJ3N0YXJ0dXAudHMnXG59O1xuXG5jb25zdCBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSUQgPSAnZGVtby12YXVsdC1oZWxwZXInO1xuY29uc3QgUExVR0lOU19GT0xERVJfTkFNRSA9ICdwbHVnaW5zJztcbmNvbnN0IE9QRU5fREVNT19WQVVMVF9DT01NQU5EX05BTUUgPSAnT3BlbiBkZW1vIHZhdWx0Jztcbi8vIGAwYCBhc2tzIE9ic2lkaWFuIHRvIGtlZXAgdGhlIG5vdGljZSB1cCB1bnRpbCB0aGUgdXNlciBjbGlja3MgaXQgXHUyMDE0IHRoZSBzYW1lIHRyZWF0bWVudCBPYnNpZGlhbiBnaXZlc1xuLy8gSXRzIG93biBzYW5kYm94LXZhdWx0IG5vdGljZSwgYW5kIHdoYXQgdGhlIGRlbW8tdmF1bHQgbm90aWNlIGlzIG1vZGVsbGVkIG9uLlxuY29uc3QgU0FOREJPWF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gMDtcblxuLyoqXG4gKiBCb290c3RyYXBzIGEgZGVtbyB2YXVsdCBzbyBpdHMgbm90ZXMnIGBjb2RlLWJ1dHRvbmBzIHdvcmsgd2l0aCBubyBtYW51YWwgc2V0dXA6IGluc3RhbGxzIENvZGVTY3JpcHRcbiAqIFRvb2xraXQgZnJvbSB0aGUgY29tbXVuaXR5IHN0b3JlIChpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQpLCB3cml0ZXMgaXRzIHNldHRpbmdzLCB0aGVuIGVuYWJsZXNcbiAqIGl0IFx1MjAxNCB3cml0aW5nIHRoZSBzZXR0aW5ncyBCRUZPUkUgZW5hYmxpbmcgc28gYSBmcmVzaCBlbmFibGUgbG9hZHMgaXQgYWxyZWFkeSBjb25maWd1cmVkLCB3aXRoIG5vXG4gKiByZWxvYWQuIElmIENvZGVTY3JpcHQgVG9vbGtpdCBpcyBhbHJlYWR5IGVuYWJsZWQgYnV0IHRoZSBzZXR0aW5ncyBqdXN0IGNoYW5nZWQsIGl0IGlzIHJlbG9hZGVkXG4gKiAoZGlzYWJsZWQgdGhlbiBlbmFibGVkKSBzbyBpdCByZS1yZWFkcyBgZGF0YS5qc29uYDsgd2hlbiB0aGUgc2V0dGluZ3Mgd2VyZSBhbHJlYWR5IGluIHBsYWNlLCBub3RoaW5nIGlzXG4gKiByZWxvYWRlZCAoc28gYSByb3V0aW5lIHZhdWx0IHJlLW9wZW4gZG9lcyBub3QgcmUtcnVuIENvZGVTY3JpcHQgVG9vbGtpdCdzIHN0YXJ0dXApLiBDb2RlU2NyaXB0IFRvb2xraXRcbiAqIHRoZW4gcnVucyB0aGUgdmF1bHQncyBgc3RhcnR1cC50c2AuIEZpbmFsbHkgaXQgcmFpc2VzIHRoZSBzYW5kYm94IG5vdGljZSBkZXNjcmliaW5nIHRoZSBvcGVuZWQgdmF1bHRcbiAqIGFzIGEgdGhyb3dhd2F5IGNvcHkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQm9vdHN0cmFwRGVtb1ZhdWx0UGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBDb2RlU2NyaXB0IFRvb2xraXQgaXMgaW5zdGFsbGVkLCBjb25maWd1cmVkLCBhbmQgZW5hYmxlZFxuICogYW5kIHRoZSBzYW5kYm94IG5vdGljZSBoYXMgYmVlbiBzaG93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcERlbW9WYXVsdChwYXJhbXM6IEJvb3RzdHJhcERlbW9WYXVsdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICAvLyBSZXNvbHZlZCBCRUZPUkUgQ29kZVNjcmlwdCBUb29sa2l0IGlzIGluc3RhbGxlZC4gQXQgcmVsZWFzZSB0aW1lIHRoZSB2YXVsdCBjYXJyaWVzIGV4YWN0bHkgdHdvXG4gIC8vIFBsdWdpbiBmb2xkZXJzIFx1MjAxNCB0aGlzIGhlbHBlciBhbmQgdGhlIHBsdWdpbiBiZWluZyBkZW1vbnN0cmF0ZWQgXHUyMDE0IHNvIGRyb3BwaW5nIHRoZSBoZWxwZXIgbGVhdmVzIHRoZVxuICAvLyBEZW1vbnN0cmF0ZWQgb25lLiBSZWFkaW5nIHRoZSBmb2xkZXIgbGF0ZXIgd291bGQgYWxzbyBzZWUgQ29kZVNjcmlwdCBUb29sa2l0IGFuZCBhbnl0aGluZyBhIGRlbW9cbiAgLy8gTm90ZSdzIHByZXJlcXVpc2l0ZXMgaW5zdGFsbGVkLCBsZWF2aW5nIG5vIHdheSB0byB0ZWxsIHdoaWNoIHBsdWdpbiB0aGUgdmF1bHQgaXMgZm9yLlxuICBjb25zdCBkZW1vZWRQbHVnaW5JZCA9IGF3YWl0IGdldERlbW9lZFBsdWdpbklkKGFwcCk7XG4gIGF3YWl0IGluc3RhbGxDb21tdW5pdHlQbHVnaW4oeyBhcHAsIHBsdWdpbklkOiBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29uZmlndXJlQ29tbXVuaXR5UGx1Z2luKHtcbiAgICBhcHAsXG4gICAgcGx1Z2luSWQ6IENPREVfU0NSSVBUX1RPT0xLSVRfUExVR0lOX0lELFxuICAgIHNldHRpbmdzOiBDT0RFX1NDUklQVF9UT09MS0lUX1NFVFRJTkdTXG4gIH0pO1xuICBhd2FpdCBlbnN1cmVJbnZvY2FibGVTY3JpcHRzRm9sZGVyKGFwcCk7XG5cbiAgaWYgKCFhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMoQ09ERV9TQ1JJUFRfVE9PTEtJVF9QTFVHSU5fSUQpKSB7XG4gICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHsgYXBwLCBwbHVnaW5JZDogQ09ERV9TQ1JJUFRfVE9PTEtJVF9QTFVHSU5fSUQgfSk7XG4gIH0gZWxzZSBpZiAocmVzdWx0ID09PSBDb25maWd1cmVDb21tdW5pdHlQbHVnaW5SZXN1bHQuU3VjY2Vzcykge1xuICAgIC8vIEFscmVhZHkgZW5hYmxlZCB3aXRoIHN0YWxlIHNldHRpbmdzIFx1MjAxNCByZWxvYWQgc28gQ29kZVNjcmlwdCBUb29sa2l0IHJlLXJlYWRzIHRoZSBmcmVzaGx5IHdyaXR0ZW4gZGF0YS5qc29uLlxuICAgIGF3YWl0IGRpc2FibGVDb21tdW5pdHlQbHVnaW4oeyBhcHAsIHBsdWdpbklkOiBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCB9KTtcbiAgICBhd2FpdCBlbmFibGVDb21tdW5pdHlQbHVnaW4oeyBhcHAsIHBsdWdpbklkOiBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCB9KTtcbiAgfVxuXG4gIHNob3dTYW5kYm94Tm90aWNlKGFwcCwgZGVtb2VkUGx1Z2luSWQpO1xufVxuXG4vLyBCdWlsZHMgdGhlIHNhbmRib3ggbm90aWNlIGNvbnRlbnQ6IHdoYXQgdGhpcyB2YXVsdCBpcywgd2hlcmUgaXQgbGl2ZXMsIGhvdyBsb25nIGl0IGxpdmVzLCBhbmQgd2h5XG4vLyBSZS1ydW5uaW5nIHRoZSBjb21tYW5kIHByb2R1Y2VzIGEgdmF1bHQgd2l0aG91dCB0aGUgbm90ZXMganVzdCB3cml0dGVuIGhlcmUuXG4vL1xuLy8gRXZlcnkgY2xhaW0gaGFzIHRvIHN0YXkgdHJ1ZSBvZiB0aGUgb3BlbmVyIChgZGVza3RvcC1kZW1vLXZhdWx0LW9wZW5lci50c2ApOiBpdCBleHRyYWN0cyBhIEZSRVNIIGNvcHlcbi8vIEludG8gaXRzIG93biBmb2xkZXIgb24gZXZlcnkgb3BlbiwgYW5kIGRlbGV0ZXMgZXh0cmFjdGVkIGZvbGRlcnMgb2xkZXIgdGhhbiBhIGRheSBvbiBlYWNoIGxhdGVyIG9wZW4uXG4vLyBTbyB0aGUgdmF1bHQgaXMgYSB0ZW1wb3Jhcnkgc2FuZGJveCBcdTIwMTQgaXQgbXVzdCBuZXZlciBiZSBkZXNjcmliZWQgYXMgYSBwbGFjZSB3b3JrIGNhbiBiZSBsZWZ0LlxuZnVuY3Rpb24gYnVpbGRTYW5kYm94Tm90aWNlRnJhZ21lbnQocGx1Z2luTmFtZTogbnVsbCB8IHN0cmluZywgYmFzZVBhdGg6IG51bGwgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50KChmcmFnbWVudCkgPT4ge1xuICAgIGlmIChwbHVnaW5OYW1lID09PSBudWxsKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCdUaGlzIGlzIGEgZGVtbyB2YXVsdC4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnVGhpcyBpcyBhIGRlbW8gdmF1bHQgZm9yICcpO1xuICAgICAgZnJhZ21lbnQuY3JlYXRlRWwoJ2InLCB7IHRleHQ6IHBsdWdpbk5hbWUgfSk7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCcuJyk7XG4gICAgfVxuXG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnIEl0IGlzIGEgdGVtcG9yYXJ5IHNhbmRib3gnKTtcbiAgICBpZiAoYmFzZVBhdGggIT09IG51bGwpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoJyBhdCAnKTtcbiAgICAgIGZyYWdtZW50LmNyZWF0ZUVsKCdjb2RlJywgeyB0ZXh0OiBiYXNlUGF0aCB9KTtcbiAgICB9XG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnLCBjbGVhbmVkIHVwIGF1dG9tYXRpY2FsbHkgYWJvdXQgYSBkYXkgYWZ0ZXIgeW91IGxhc3QgdXNlIGl0IFx1MjAxNCBjb3B5IGFueXRoaW5nIHlvdSB3YW50IHRvIGtlZXAgaW50byB5b3VyIG93biB2YXVsdC4gUnVubmluZyAnKTtcbiAgICBmcmFnbWVudC5jcmVhdGVFbCgnYicsIHsgdGV4dDogcGx1Z2luTmFtZSA9PT0gbnVsbCA/IE9QRU5fREVNT19WQVVMVF9DT01NQU5EX05BTUUgOiBgJHtwbHVnaW5OYW1lfTogJHtPUEVOX0RFTU9fVkFVTFRfQ09NTUFORF9OQU1FfWAgfSk7XG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnIGFnYWluIGNyZWF0ZXMgYSBuZXcgY29weSB3aXRoIHRoZSBsYXRlc3QgcGx1Z2luIHZlcnNpb24sIHNvIHlvdXIgbm90ZXMgd2lsbCBub3QgYXBwZWFyIGluIGl0LicpO1xuICB9KTtcbn1cblxuLy8gQ3JlYXRlcyBDb2RlU2NyaXB0IFRvb2xraXQncyBpbnZvY2FibGUtc2NyaXB0cyBmb2xkZXIgKHVuZGVyIGBtb2R1bGVzUm9vdGApIGlmIGl0IGlzIG1pc3NpbmcuXG4vLyBFdmVyeSBkZW1vIHZhdWx0IHRoZW4gaGFzIHRoZSBzYW1lIENvZGVTY3JpcHQgVG9vbGtpdCBsYXlvdXQgZXZlbiB3aGVuIGl0IHNoaXBzIG5vIGludm9jYWJsZSBzY3JpcHRzLlxuLy8gVGhlIGNvbW1pdHRlZCB2YXVsdCB0aGVyZWZvcmUgY2FycmllcyBubyBvdGhlcndpc2UtZW1wdHkgcGxhY2Vob2xkZXIgZm9sZGVyLlxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlSW52b2NhYmxlU2NyaXB0c0ZvbGRlcihhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpbnZvY2FibGVTY3JpcHRzRm9sZGVyUGF0aCA9IGpvaW4oQ09ERV9TQ1JJUFRfVE9PTEtJVF9NT0RVTEVTX1JPT1QsIENPREVfU0NSSVBUX1RPT0xLSVRfU0VUVElOR1MuaW52b2NhYmxlU2NyaXB0c0ZvbGRlcik7XG4gIGlmICghYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGludm9jYWJsZVNjcmlwdHNGb2xkZXJQYXRoKSkge1xuICAgIGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGludm9jYWJsZVNjcmlwdHNGb2xkZXJQYXRoKTtcbiAgfVxufVxuXG4vLyBJZGVudGlmaWVzIHRoZSBwbHVnaW4gdGhlIHZhdWx0IGRlbW9uc3RyYXRlcyBhcyB0aGUgb25seSBpbnN0YWxsZWQgcGx1Z2luIHRoYXQgaXMgbm90IHRoaXMgaGVscGVyLlxuLy8gQ2FsbCBpdCBCRUZPUkUgYW55dGhpbmcgZWxzZSBpcyBpbnN0YWxsZWQgKHNlZSBgYm9vdHN0cmFwRGVtb1ZhdWx0YCkuIEFueSBvdGhlciBjb3VudCBcdTIwMTQgYSB2YXVsdFxuLy8gT3BlbmVkIGFmdGVyIHRoZSBwbHVnaW4gZm9sZGVyIHdhcyBoYW5kLWVkaXRlZCwgb3Igb25lIHRoYXQgc2hpcHMgbm90aGluZyBidXQgdGhlIGhlbHBlciBcdTIwMTQgaXNcbi8vIEFtYmlndW91cywgYW5kIGFuIGFtYmlndW91cyBhbnN3ZXIgYmVjb21lcyBnZW5lcmljIG5vdGljZSB3b3JkaW5nIHJhdGhlciB0aGFuIGEgd3JvbmcgcGx1Z2luIG5hbWUuXG5hc3luYyBmdW5jdGlvbiBnZXREZW1vZWRQbHVnaW5JZChhcHA6IEFwcCk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCBwbHVnaW5zRm9sZGVyUGF0aCA9IGpvaW4oYXBwLnZhdWx0LmNvbmZpZ0RpciwgUExVR0lOU19GT0xERVJfTkFNRSk7XG4gIGlmICghYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBsdWdpbnNGb2xkZXJQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbGlzdGVkRmlsZXMgPSBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5saXN0KHBsdWdpbnNGb2xkZXJQYXRoKTtcbiAgY29uc3QgZGVtb2VkUGx1Z2luSWRzID0gbGlzdGVkRmlsZXMuZm9sZGVyc1xuICAgIC5tYXAoKGZvbGRlclBhdGgpID0+IGJhc2VuYW1lKGZvbGRlclBhdGgpKVxuICAgIC5maWx0ZXIoKHBsdWdpbklkKSA9PiBwbHVnaW5JZCAhPT0gREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEKTtcbiAgcmV0dXJuIGRlbW9lZFBsdWdpbklkcy5sZW5ndGggPT09IDEgPyBlbnN1cmVOb25OdWxsYWJsZShkZW1vZWRQbHVnaW5JZHNbMF0pIDogbnVsbDtcbn1cblxuLy8gUmVzb2x2ZXMgdGhlIHZhdWx0J3MgYWJzb2x1dGUgcGF0aCBmb3IgdGhlIG5vdGljZS4gT25seSB0aGUgZGVza3RvcCBhZGFwdGVyIGtub3dzIGl0OiBgRGF0YUFkYXB0ZXJgXG4vLyBEb2VzIG5vdCBkZWNsYXJlIGBnZXRCYXNlUGF0aGAsIGFuZCBgRmlsZVN5c3RlbUFkYXB0ZXJgIGlzIGEgZGVza3RvcC1vbmx5IGNsYXNzIHRoYXQgaXMgbm90IGd1YXJhbnRlZWRcbi8vIFRvIGV4aXN0IGVsc2V3aGVyZSBcdTIwMTQgc28gYGluc3RhbmNlb2ZgIHdvdWxkIHRocm93IHJhdGhlciB0aGFuIGFuc3dlci4gSXQgaXMgcmVhY2hlZCBpbnN0ZWFkIHRocm91Z2ggYVxuLy8gTmFycm93IGhhbmQtZGVjbGFyZWQgc2hhcGUgcGx1cyBhIHJ1bnRpbWUgY2hlY2sgKHNlZSBMOSkuIEFuIGFkYXB0ZXIgd2l0aG91dCBpdCB5aWVsZHMgbm8gcGF0aCwgYW5kXG4vLyBUaGUgbm90aWNlIHRoZW4gb21pdHMgdGhlIHNlbnRlbmNlIG5hbWluZyBpdCByYXRoZXIgdGhhbiByZW5kZXJpbmcgYHVuZGVmaW5lZGAuXG5mdW5jdGlvbiBnZXRWYXVsdEJhc2VQYXRoKGFwcDogQXBwKTogbnVsbCB8IHN0cmluZyB7XG4gIHJldHVybiBpc0Jhc2VQYXRoQWRhcHRlcihhcHAudmF1bHQuYWRhcHRlcikgPyBhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNCYXNlUGF0aEFkYXB0ZXIoYWRhcHRlcjogRGF0YUFkYXB0ZXIpOiBhZGFwdGVyIGlzIEJhc2VQYXRoQWRhcHRlciAmIERhdGFBZGFwdGVyIHtcbiAgcmV0dXJuIHR5cGVvZiBSZWZsZWN0LmdldChhZGFwdGVyLCAnZ2V0QmFzZVBhdGgnKSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLy8gVGVsbHMgdGhlIHVzZXIgdGhpcyB2YXVsdCBpcyBhIHNhbmRib3gsIHVzaW5nIE9ic2lkaWFuJ3Mgb3duIHNhbmRib3gtdmF1bHQgdHJlYXRtZW50OiBhbiBpbmZpbml0ZVxuLy8gRHVyYXRpb24sIGRpc21pc3NlZCBieSBjbGlja2luZyBpdC4gUmFpc2VkIGxhc3QsIHNvIGl0IGlzIHRoZSBuZXdlc3Qgbm90aWNlIG9uIHNjcmVlbiBvbmNlXG4vLyBDb2RlU2NyaXB0IFRvb2xraXQncyBzdGFydHVwIHNjcmlwdCBoYXMgZG9uZSBpdHMgb3duIHdvcmsuXG5mdW5jdGlvbiBzaG93U2FuZGJveE5vdGljZShhcHA6IEFwcCwgZGVtb2VkUGx1Z2luSWQ6IG51bGwgfCBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcGx1Z2luTmFtZSA9IGRlbW9lZFBsdWdpbklkID09PSBudWxsID8gbnVsbCA6IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1tkZW1vZWRQbHVnaW5JZF0/Lm5hbWUgPz8gZGVtb2VkUGx1Z2luSWQ7XG4gIGNvbnN0IGZyYWdtZW50ID0gYnVpbGRTYW5kYm94Tm90aWNlRnJhZ21lbnQocGx1Z2luTmFtZSwgZ2V0VmF1bHRCYXNlUGF0aChhcHApKTtcbiAgbmV3IE5vdGljZShmcmFnbWVudCwgU0FOREJPWF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLFNBQVMsY0FBYztBQUV2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBcURQLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sbUNBQW1DO0FBQ3pDLE1BQU0sK0JBQTBEO0FBQUEsRUFDOUQseUJBQXlCO0FBQUEsRUFDekIsd0JBQXdCO0FBQUEsRUFDeEIsYUFBYTtBQUFBLEVBQ2IsMEJBQTBCO0FBQUEsRUFDMUIsbUJBQW1CO0FBQ3JCO0FBRUEsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSwrQkFBK0I7QUFHckMsTUFBTSwwQ0FBMEM7QUFnQmhELGVBQXNCLG1CQUFtQixRQUFpRDtBQUN4RixRQUFNLEVBQUUsSUFBSSxJQUFJO0FBS2hCLFFBQU0saUJBQWlCLE1BQU0sa0JBQWtCLEdBQUc7QUFDbEQsUUFBTSx1QkFBdUIsRUFBRSxLQUFLLFVBQVUsOEJBQThCLENBQUM7QUFDN0UsUUFBTSxTQUFTLE1BQU0seUJBQXlCO0FBQUEsSUFDNUM7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWLFVBQVU7QUFBQSxFQUNaLENB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
|
|
@@ -41,6 +41,10 @@
|
|
|
41
41
|
*
|
|
42
42
|
* The wrapped modal can still be closed normally; the floating bar is cleaned up automatically when
|
|
43
43
|
* the modal closes (even if it is closed while minimized).
|
|
44
|
+
*
|
|
45
|
+
* Clicking the dimmed background behind the modal **minimizes** it rather than closing it, so a stray
|
|
46
|
+
* click past the dialog no longer cancels the operation the modal is running — pass
|
|
47
|
+
* `{ shouldMinimizeOnClickOutside: false }` to keep Obsidian's native close-on-background-click.
|
|
44
48
|
*/
|
|
45
49
|
import { Modal } from 'obsidian';
|
|
46
50
|
import { MonkeyAroundComponent } from '../components/monkey-around-component.mjs';
|
|
@@ -48,6 +52,14 @@ import { MonkeyAroundComponent } from '../components/monkey-around-component.mjs
|
|
|
48
52
|
* Options for constructing a {@link MinimizableModal}.
|
|
49
53
|
*/
|
|
50
54
|
export interface MinimizableModalConstructorOptions {
|
|
55
|
+
/**
|
|
56
|
+
* Whether clicking the dimmed background behind the modal minimizes it instead of closing it.
|
|
57
|
+
* Obsidian's native behavior is to close, which cancels whatever operation the modal is running;
|
|
58
|
+
* minimizing keeps that operation alive so the user can peek at the involved notes and come back.
|
|
59
|
+
*
|
|
60
|
+
* @default `true`
|
|
61
|
+
*/
|
|
62
|
+
readonly shouldMinimizeOnClickOutside?: boolean;
|
|
51
63
|
/**
|
|
52
64
|
* Whether the minimized bar shows a Cancel button that closes the wrapped modal. Closing lets the
|
|
53
65
|
* wrapped modal's own `onClose` define what "cancel" means (e.g. releasing a held lock).
|
|
@@ -86,6 +98,7 @@ export declare class MinimizableModal<TModal extends Modal> {
|
|
|
86
98
|
private minimizedBarEl;
|
|
87
99
|
private peekLockComponent;
|
|
88
100
|
private peekLockEntry;
|
|
101
|
+
private readonly shouldMinimizeOnClickOutside;
|
|
89
102
|
private readonly shouldShowCancelButton;
|
|
90
103
|
/**
|
|
91
104
|
* Wraps the given modal, adding a minimize button and wiring up cleanup on close.
|
|
@@ -110,6 +123,7 @@ export declare class MinimizableModal<TModal extends Modal> {
|
|
|
110
123
|
private enablePeekLock;
|
|
111
124
|
private flashBar;
|
|
112
125
|
private handleClose;
|
|
126
|
+
private handleContainerClick;
|
|
113
127
|
private patchOnClose;
|
|
114
128
|
private removeMinimizedBar;
|
|
115
129
|
}
|
|
@@ -125,6 +125,7 @@ class MinimizableModal {
|
|
|
125
125
|
minimizedBarEl = null;
|
|
126
126
|
peekLockComponent = null;
|
|
127
127
|
peekLockEntry = null;
|
|
128
|
+
shouldMinimizeOnClickOutside;
|
|
128
129
|
shouldShowCancelButton;
|
|
129
130
|
/**
|
|
130
131
|
* Wraps the given modal, adding a minimize button and wiring up cleanup on close.
|
|
@@ -134,9 +135,15 @@ class MinimizableModal {
|
|
|
134
135
|
*/
|
|
135
136
|
constructor(modal, options = {}) {
|
|
136
137
|
this.modal = modal;
|
|
138
|
+
this.shouldMinimizeOnClickOutside = options.shouldMinimizeOnClickOutside ?? true;
|
|
137
139
|
this.shouldShowCancelButton = options.shouldShowCancelButton ?? true;
|
|
138
140
|
addPluginCssClasses(modal.containerEl, [CssClass.MinimizableModal]);
|
|
139
141
|
this.minimizeButtonEl = this.createMinimizeButton();
|
|
142
|
+
if (this.shouldMinimizeOnClickOutside) {
|
|
143
|
+
modal.containerEl.addEventListener("click", ($event) => {
|
|
144
|
+
this.handleContainerClick($event);
|
|
145
|
+
}, { capture: true });
|
|
146
|
+
}
|
|
140
147
|
this.closePatchComponent.load();
|
|
141
148
|
this.patchOnClose(modal);
|
|
142
149
|
}
|
|
@@ -235,6 +242,20 @@ class MinimizableModal {
|
|
|
235
242
|
this.removeMinimizedBar();
|
|
236
243
|
this.isMinimizedValue = false;
|
|
237
244
|
}
|
|
245
|
+
handleContainerClick($event) {
|
|
246
|
+
if (this.isMinimizedValue) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if ($event.composedPath().includes(this.modal.modalEl)) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if ($event.target === this.modal.containerEl) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
$event.preventDefault();
|
|
256
|
+
$event.stopImmediatePropagation();
|
|
257
|
+
this.minimize();
|
|
258
|
+
}
|
|
238
259
|
patchOnClose(modal) {
|
|
239
260
|
this.closePatchComponent.registerMethodPatch({
|
|
240
261
|
$object: modal,
|
|
@@ -311,4 +332,4 @@ function suppressWhilePeekLocked($event) {
|
|
|
311
332
|
export {
|
|
312
333
|
MinimizableModal
|
|
313
334
|
};
|
|
314
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIFx1MjAxNCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiAoYW5kLCBieSBkZWZhdWx0LCBhIENhbmNlbCBidXR0b24gdGhhdCBjbG9zZXMgdGhlIHdyYXBwZWRcbiAqIG1vZGFsIFx1MjAxNCBwYXNzIGB7IHNob3VsZFNob3dDYW5jZWxCdXR0b246IGZhbHNlIH1gIHRvIGhpZGUgaXQpLCBzbyB0aGUgdXNlciBjYW4gcGVlayBhdCB0aGVcbiAqIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvbiBpbnZvbHZlcyBcdTIwMTQgYnV0IHRoZSBtb2RhbCBpcyBOT1QgZGlzbWlzc2VkLCBzbyBpdHMgYmxvY2tpbmcgY29udHJhY3QgbXVzdCBiZSBwcmVzZXJ2ZWQuXG4gKlxuICogVG8ga2VlcCB0aGF0IGNvbnRyYWN0IHdoaWxlIG1pbmltaXplZCwgdGhlIHdyYXBwZXIgcHV0cyB0aGUgYXBwIGludG8gYSAqKnBlZWstb25seSBsb2NrKio6IHRoZSB1c2VyXG4gKiBtYXkgbW91c2UtY2xpY2sgYW5kIHNjcm9sbCB0byBpbnNwZWN0IGNvbnRlbnQsIGJ1dCBjYW5ub3Qgc3RhcnQgYW55dGhpbmcgbmV3LiBXaGlsZSBhbnkgbW9kYWwgaXNcbiAqIG1pbmltaXplZCB0aGUgd3JhcHBlcjpcbiAqIC0gYmxvY2tzIHRoZSBrZXlib2FyZCAodHlwaW5nLCBob3RrZXlzLCB0aGUgY29tbWFuZC1wYWxldHRlIHNob3J0Y3V0KSxcbiAqIC0gYmxvY2tzIHRoZSByaWdodC1jbGljayBjb250ZXh0IG1lbnUsIGFuZFxuICogLSBibG9ja3Mgb3BlbmluZyBhbnkgb3RoZXIgbW9kYWwgKGEgcmUtZmlyZWQgY29tbWFuZCwgdGhlIGNvbW1hbmQgcGFsZXR0ZSwgc2V0dGluZ3MsIFx1MjAyNikuXG4gKlxuICogQSBibG9ja2VkIGF0dGVtcHQgZmxhc2hlcyB0aGUgZmxvYXRpbmcgYmFyIGFuZCBiZWVwcyBzbyB0aGUgdXNlciBzZWVzIChhbmQgaGVhcnMpIHdoeSBub3RoaW5nXG4gKiBoYXBwZW5lZC4gUmVzdG9yaW5nIChvciB0aGUgbW9kYWwgY2xvc2luZykgbGlmdHMgdGhlIGxvY2suIFRoaXMgcHJldmVudHMsIGZvciBleGFtcGxlLCBtaW5pbWl6aW5nIGFcbiAqIFwibWVyZ2UgZm9sZGVyXCIgcGlja2VyIGFuZCB0aGVuIGZpcmluZyB0aGUgc2FtZSBjb21tYW5kIGFnYWluIHRvIHN0YWNrIHNldmVyYWwgY29uY3VycmVudCBtZXJnZXMuXG4gKlxuICogVGhlIHdyYXBwZXIgcmV1c2VzIHRoZSBtb2RhbCdzIG93biB0aXRsZSAoYHRpdGxlRWxgKSBhcyB0aGUgbWluaW1pemVkIGJhciBsYWJlbCwgc28gc2V0IHRoZSB0aXRsZVxuICogdGhlIHVzdWFsIHdheSAoYG1vZGFsLnNldFRpdGxlKC4uLilgKS4gUmVuZGVyIGFyYml0cmFyeSBjb250ZW50IGludG8ge0BsaW5rIE1vZGFsLmNvbnRlbnRFbH0sXG4gKiBpbmNsdWRpbmcgY2xpY2thYmxlIG5vdGUgbGlua3MgcHJvZHVjZWQgYnkgYHJlbmRlckludGVybmFsTGlua2AgZnJvbVxuICogYG9ic2lkaWFuLWRldi11dGlscy9vYnNpZGlhbi9tYXJrZG93bmA6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IG1vZGFsID0gbmV3IE15TW9kYWwoYXBwKTtcbiAqIG1vZGFsLnNldFRpdGxlKCdNZXJnaW5nIG5vdGVzJyk7XG4gKiBtb2RhbC5jb250ZW50RWwuYXBwZW5kQ2hpbGQoYXdhaXQgcmVuZGVySW50ZXJuYWxMaW5rKHsgYXBwLCBwYXRoT3JBYnN0cmFjdEZpbGU6IGZpbGUgfSkpO1xuICpcbiAqIGNvbnN0IG1pbmltaXphYmxlID0gbmV3IE1pbmltaXphYmxlTW9kYWwobW9kYWwpO1xuICogbWluaW1pemFibGUubW9kYWwub3BlbigpO1xuICogbWluaW1pemFibGUubWluaW1pemUoKTsgLy8gYSBmbG9hdGluZyBiYXIgb2ZmZXJzIFwicmVzdG9yZVwiOyB0aGUgYXBwIGlzIHBlZWstb25seSB1bnRpbCByZXN0b3JlZFxuICogYGBgXG4gKlxuICogVGhlIHdyYXBwZWQgbW9kYWwgY2FuIHN0aWxsIGJlIGNsb3NlZCBub3JtYWxseTsgdGhlIGZsb2F0aW5nIGJhciBpcyBjbGVhbmVkIHVwIGF1dG9tYXRpY2FsbHkgd2hlblxuICogdGhlIG1vZGFsIGNsb3NlcyAoZXZlbiBpZiBpdCBpcyBjbG9zZWQgd2hpbGUgbWluaW1pemVkKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgTW9kYWwsXG4gIHNldEljb24sXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBCZWVwZXIgfSBmcm9tICcuLi8uLi9iZWVwZXIudHMnO1xuaW1wb3J0IHsgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9hbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcblxuY29uc3QgTUlOSU1JWkVfSUNPTl9JRCA9ICdtaW51cyc7XG5jb25zdCBSRVNUT1JFX0lDT05fSUQgPSAnbWF4aW1pemUtMic7XG5jb25zdCBDQU5DRUxfSUNPTl9JRCA9ICd4JztcblxuLy8gTmF2aWdhdGlvbiBrZXlzIHBhc3MgdGhyb3VnaCB3aGlsZSBtaW5pbWl6ZWQgc28gdGhlIHVzZXIgY2FuIG1vdmUgdGhlIGN1cnNvciBhbmQgc2Nyb2xsIHRvIHJlYWQuXG4vLyBOb25lIG9mIHRoZW0gbXV0YXRlIHRoZSBkb2N1bWVudCBcdTIwMTQgdGV4dCBjaGFuZ2VzIGFyZSBjYXVnaHQgc2VwYXJhdGVseSBieSB0aGUgYGJlZm9yZWlucHV0YCBndWFyZC5cbi8vIFNoaWZ0K25hdmlnYXRpb24gaXMgYmxvY2tlZCwgdGhvdWdoLCBzaW5jZSBpdCBleHRlbmRzIHRoZSBzZWxlY3Rpb24gdGhhdCBpbnNwZWN0aW9uIGRvZXMgbm90IG5lZWQuXG5jb25zdCBOQVZJR0FUSU9OX0tFWVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnQXJyb3dEb3duJyxcbiAgJ0Fycm93TGVmdCcsXG4gICdBcnJvd1JpZ2h0JyxcbiAgJ0Fycm93VXAnLFxuICAnRW5kJyxcbiAgJ0hvbWUnLFxuICAnUGFnZURvd24nLFxuICAnUGFnZVVwJ1xuXSk7XG5cbi8vIEEgYmFyZSBtb2RpZmllciBwcmVzcyBkb2VzIG5vdGhpbmcgb24gaXRzIG93biwgc28gaXQgcGFzc2VzIHRocm91Z2ggdGhlIGxvY2suXG4vLyBUaGlzIGF2b2lkcyBhIHNwdXJpb3VzIGZsYXNoL2JlZXAgd2hpbGUgY29tcG9zaW5nIGEgc2hvcnRjdXQ7IHRoZSBzaG9ydGN1dCdzIGNvbW1hbmQga2V5IGlzIGJsb2NrZWQuXG5jb25zdCBNT0RJRklFUl9LRVlTID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ0FsdCcsXG4gICdDb250cm9sJyxcbiAgJ01ldGEnLFxuICAnU2hpZnQnXG5dKTtcblxuLyoqXG4gKiBBIHJlZ2lzdGVyZWQgZW50cnkgZm9yIGEgY3VycmVudGx5LW1pbmltaXplZCBtb2RhbC4gVGhlIHNoYXJlZCBwZWVrLW9ubHkgbG9jayB1c2VzIGl0IHRvIGtub3cgYVxuICogbW9kYWwgaXMgbWluaW1pemVkLCB0byBsZWF2ZSB0aGF0IG1vZGFsJ3Mgb3duIHJlLW9wZW5zIGFsb25lLCBhbmQgdG8gZmxhc2ggaXRzIGJhciBvbiBhIGJsb2NrZWRcbiAqIGF0dGVtcHQuXG4gKi9cbmludGVyZmFjZSBQZWVrTG9ja0VudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBmbG9hdGluZyBiYXIgZWxlbWVudC4gVXNlZCB0byBkZXRlY3QgYSBzdGFsZSBlbnRyeSAoaXRzIGJhciBoYXMgbGVmdCB0aGUgRE9NKSBzbyBpdCBjYW4gYmVcbiAgICogcHJ1bmVkIGFuZCBuZXZlciBrZWVwIHRoZSBhcHAgbG9ja2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFyRWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBGbGFzaGVzIHRoZSBmbG9hdGluZyBiYXIgdG8gc2lnbmFsIGEgYmxvY2tlZCBhdHRlbXB0LlxuICAgKi9cbiAgZmxhc2goKTogdm9pZDtcblxuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwgaW5zdGFuY2UsIHNvIGl0cyBvd24gYG9wZW4oKWAgaXMgbmV2ZXIgYmxvY2tlZCBieSB0aGUgbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGlubmVyTW9kYWw6IE1vZGFsO1xufVxuXG5jb25zdCBwZWVrTG9ja0VudHJpZXMgPSBuZXcgU2V0PFBlZWtMb2NrRW50cnk+KCk7XG5jb25zdCBiZWVwZXIgPSBuZXcgQmVlcGVyKCk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uc3RydWN0aW5nIGEge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1pbmltaXphYmxlTW9kYWxDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbWluaW1pemVkIGJhciBzaG93cyBhIENhbmNlbCBidXR0b24gdGhhdCBjbG9zZXMgdGhlIHdyYXBwZWQgbW9kYWwuIENsb3NpbmcgbGV0cyB0aGVcbiAgICogd3JhcHBlZCBtb2RhbCdzIG93biBgb25DbG9zZWAgZGVmaW5lIHdoYXQgXCJjYW5jZWxcIiBtZWFucyAoZS5nLiByZWxlYXNpbmcgYSBoZWxkIGxvY2spLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDYW5jZWxCdXR0b24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBwZWVrLW9ubHkgbG9jaydzIGBvcGVuYCBwYXRjaGVzIHdoaWxlIGF0IGxlYXN0IG9uZSBtb2RhbCBpcyBtaW5pbWl6ZWQuIEJlaW5nIGFcbiAqIHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnR9LCBib3RoIHBhdGNoZXMgYXJlIHRvcm4gZG93biBhdXRvbWF0aWNhbGx5IG9uIGB1bmxvYWRgLCBzbyB0aGV5IGV4aXN0XG4gKiBvbmx5IHdoaWxlIHRoZSBsb2NrIGlzIGFjdGl2ZS4gQSBtaW5pbWl6ZWQgbW9kYWwncyBvd24gcmUtb3BlbiBpcyBhbHdheXMgYWxsb3dlZCAoc2VlXG4gKiB7QGxpbmsgc2hvdWxkQmxvY2tPcGVufSk7IGV2ZXJ5IG90aGVyIG1vZGFsIG9wZW4gaXMgYmxvY2tlZCBhbmQgc2lnbmFscyBhIGZsYXNoICsgYmVlcC5cbiAqL1xuY2xhc3MgUGVla0xvY2tDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBhcHAgd2hvc2Ugc2V0dGluZ3MgbW9kYWwgaXMgZ3VhcmRlZCBhbmQgd2hvc2Ugd2luZG93cyBzdXBwcmVzcyBpbnB1dCB3aGlsZSBsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBgb3BlbmAgcGF0Y2hlcyBhbmQgdGhlIGlucHV0IHN1cHByZXNzb3JzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcblxuICAgIC8vIEJsb2NrIG9wZW5pbmcgYW55IE9USEVSIG1vZGFsIHdoaWxlIGEgbW9kYWwgaXMgbWluaW1pemVkICh0aGUgY29tbWFuZCBwYWxldHRlLCBhIHJlLWZpcmVkXG4gICAgLy8gQ29tbWFuZCwgYW5vdGhlciBwbHVnaW4gbW9kYWwsIFx1MjAyNikuXG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPE1vZGFsLCAnb3Blbic+KHtcbiAgICAgICRvYmplY3Q6IE1vZGFsLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdvcGVuJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsVGhpcyB9KTogdm9pZCA9PiB7XG4gICAgICAgIGJsb2NrT3JGYWxsYmFjayhvcmlnaW5hbFRoaXMsIGZhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE9ic2lkaWFuJ3MgU2V0dGluZ3MgaXMgYSAqcG9wb3V0KiBtb2RhbDogb24gZGVza3RvcCBpdHMgb3duIGBvcGVuKClgIGZpcnN0IGNyZWF0ZXMgYSBzZXBhcmF0ZSBPU1xuICAgIC8vIFdpbmRvdyAodmlhIGBzaG91bGRVc2VQb3BvdXQoKWAvYGdldFBvcG91dE9wdGlvbnMoKWApIGFuZCBvbmx5IFRIRU4gZGVsZWdhdGVzIHRvXG4gICAgLy8gYE1vZGFsLnByb3RvdHlwZS5vcGVuYCB0byByZW5kZXIgdGhlIGFjdGl2ZSB0YWIgaW50byBpdC4gR3VhcmRpbmcgb25seSBgTW9kYWwucHJvdG90eXBlLm9wZW5gXG4gICAgLy8gVGhlcmVmb3JlIGJsb2NrcyB0aGUgcmVuZGVyIGJ1dCBsZWF2ZXMgYW4gZW1wdHkgc2V0dGluZ3Mgd2luZG93IGJlaGluZCBcdTIwMTQgdGhlIHJlcG9ydGVkIGJhZCBVWC5cbiAgICAvLyBHdWFyZGluZyB0aGUgc2V0dGluZ3MgbW9kYWwncyBvd24gYG9wZW4oKWAgYmxvY2tzIGl0ICpiZWZvcmUqIHRoZSB3aW5kb3cgaXMgY3JlYXRlZC5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8QXBwWydzZXR0aW5nJ10sICdvcGVuJz4oe1xuICAgICAgJG9iamVjdDogdGhpcy5hcHAuc2V0dGluZyxcbiAgICAgIG1ldGhvZE5hbWU6ICdvcGVuJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsVGhpcyB9KTogdm9pZCA9PiB7XG4gICAgICAgIGJsb2NrT3JGYWxsYmFjayhvcmlnaW5hbFRoaXMsIGZhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFN1cHByZXNzIHRoZSBrZXlib2FyZCwgZWRpdG9yIG11dGF0aW9uLCBhbmQgdGhlIGNvbnRleHQgbWVudSBhY3Jvc3MgQUxMIHdpbmRvd3MgXHUyMDE0IHRoZSBtYWluIHdpbmRvd1xuICAgIC8vIEFuZCBldmVyeSBleGlzdGluZy9mdXR1cmUgcG9wb3V0IFx1MjAxNCBzbyB0aGUgbG9jayBob2xkcyB3aGVyZXZlciB0aGUgdXNlcidzIGZvY3VzIGlzLCBub3Qgb25seSBpblxuICAgIC8vIFRoZSB3aW5kb3cgdGhhdCBvd25zIHRoZSBtaW5pbWl6ZWQgbW9kYWwuIENhcHR1cmUtcGhhc2UgbGlzdGVuZXJzIHJ1biBiZWZvcmUgT2JzaWRpYW4ncyBvd25cbiAgICAvLyBEb2N1bWVudC9lbGVtZW50IGhhbmRsZXJzIChpbmNsdWRpbmcgQ29kZU1pcnJvcidzKSwgc28gYHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpYCBpbiB0aGVcbiAgICAvLyBTdXBwcmVzc29ycyBrZWVwcyBhIGJsb2NrZWQgZXZlbnQgZnJvbSBldmVyIHJlYWNoaW5nIHRoZW0uIGBrZXlkb3duYCBsZXRzIG5hdmlnYXRpb24ga2V5cyB0aHJvdWdoXG4gICAgLy8gKHNlZSBgaXNQZWVrQWxsb3dlZEtleWApIGJ1dCBibG9ja3MgY29tbWFuZCBob3RrZXlzOyBgYmVmb3JlaW5wdXRgIGJsb2NrcyBhbGwgZWRpdG9yIG11dGF0aW9uO1xuICAgIC8vIGBjb250ZXh0bWVudWAgYmxvY2tzIHRoZSByaWdodC1jbGljayBtZW51LlxuICAgIGNvbnN0IGFsbFdpbmRvd3NFdmVudENvbXBvbmVudCA9IHRoaXMuYWRkQ2hpbGQobmV3IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCh0aGlzLmFwcCkpO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NEb21FdmVudCh7XG4gICAgICBjYWxsYmFjazogc3VwcHJlc3NLZXlkb3duV2hpbGVQZWVrTG9ja2VkLFxuICAgICAgb3B0aW9uczogeyBjYXB0dXJlOiB0cnVlIH0sXG4gICAgICB0eXBlOiAna2V5ZG93bidcbiAgICB9KTtcbiAgICBhbGxXaW5kb3dzRXZlbnRDb21wb25lbnQucmVnaXN0ZXJBbGxXaW5kb3dzRG9tRXZlbnQoe1xuICAgICAgY2FsbGJhY2s6IHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLFxuICAgICAgb3B0aW9uczogeyBjYXB0dXJlOiB0cnVlIH0sXG4gICAgICB0eXBlOiAnYmVmb3JlaW5wdXQnXG4gICAgfSk7XG4gICAgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50LnJlZ2lzdGVyQWxsV2luZG93c0RvbUV2ZW50KHtcbiAgICAgIGNhbGxiYWNrOiBzdXBwcmVzc1doaWxlUGVla0xvY2tlZCxcbiAgICAgIG9wdGlvbnM6IHsgY2FwdHVyZTogdHJ1ZSB9LFxuICAgICAgdHlwZTogJ2NvbnRleHRtZW51J1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogV3JhcHMgYSB7QGxpbmsgTW9kYWx9IGluc3RhbmNlIHRvIG1ha2UgaXQgbWluaW1pemFibGUgdG8gYSBzbWFsbCBmbG9hdGluZyBiYXIgYW5kIHJlc3RvcmFibGUuIFdoaWxlXG4gKiBtaW5pbWl6ZWQgdGhlIGFwcCBpcyBwdXQgaW50byBhIHBlZWstb25seSBsb2NrIChrZXlib2FyZCwgY29udGV4dCBtZW51LCBhbmQgb3BlbmluZyBvdGhlciBtb2RhbHMgYXJlXG4gKiBibG9ja2VkKSBzbyB0aGUgbW9kYWwncyBibG9ja2luZyBjb250cmFjdCBpcyBwcmVzZXJ2ZWQuXG4gKlxuICogQHR5cGVQYXJhbSBUTW9kYWwgLSBUaGUgdHlwZSBvZiB0aGUgd3JhcHBlZCBtb2RhbC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1pbmltaXphYmxlTW9kYWw8VE1vZGFsIGV4dGVuZHMgTW9kYWw+IHtcbiAgLyoqXG4gICAqIFRoZSB3cmFwcGVkIG1vZGFsLiBPcGVuLCBjbG9zZSwgYW5kIHBvcHVsYXRlIGl0IGFzIHVzdWFsIChlLmcuIGBtaW5pbWl6YWJsZS5tb2RhbC5vcGVuKClgKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2RhbDogVE1vZGFsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtb2RhbCBpcyBjdXJyZW50bHkgbWluaW1pemVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1vZGFsIGlzIGN1cnJlbnRseSBtaW5pbWl6ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc01pbmltaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc01pbmltaXplZFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgdGhlIHdyYXBwZWQgbW9kYWwncyBgb25DbG9zZWAgdG8gcnVuIGNsZWFudXAuIFBlcnNpc3RzIGZvciB0aGUgd3JhcHBlcidzIHdob2xlIGxpZmUgKGFcbiAgICogbW9kYWwgY2FuIGJlIHJlb3BlbmVkLCBzbyB0aGUgcGF0Y2ggbXVzdCBzdXJ2aXZlIGVhY2ggY2xvc2UpLCBoZW5jZSBhIGRlZGljYXRlZCBjb21wb25lbnQgdGhhdCBpc1xuICAgKiBuZXZlciB1bmxvYWRlZCBcdTIwMTQgZGlzdGluY3QgZnJvbSBgcGVla0xvY2tDb21wb25lbnRgLCB3aG9zZSBwYXRjaGVzIGxpdmUgb25seSB3aGlsZSBtaW5pbWl6ZWQuXG4gICAqIEV4cG9zZWQgdG8gc3ViY2xhc3NlcyBzbyB0aGV5IGNhbiByZWdpc3RlciBhZGRpdGlvbmFsIGxpZmV0aW1lLXNjb3BlZCBwYXRjaGVzIG9uIHRoZSB3cmFwcGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsb3NlUGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG5cbiAgcHJpdmF0ZSBpc01pbmltaXplZFZhbHVlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWluaW1pemVCdXR0b25FbDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgbWluaW1pemVkQmFyRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVla0xvY2tDb21wb25lbnQ6IG51bGwgfCBQZWVrTG9ja0NvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgcGVla0xvY2tFbnRyeTogbnVsbCB8IFBlZWtMb2NrRW50cnkgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFNob3dDYW5jZWxCdXR0b246IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdyYXBzIHRoZSBnaXZlbiBtb2RhbCwgYWRkaW5nIGEgbWluaW1pemUgYnV0dG9uIGFuZCB3aXJpbmcgdXAgY2xlYW51cCBvbiBjbG9zZS5cbiAgICpcbiAgICogQHBhcmFtIG1vZGFsIC0gVGhlIG1vZGFsIGluc3RhbmNlIHRvIG1ha2UgbWluaW1pemFibGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBjb250cm9sbGluZyB0aGUgbWluaW1pemVkIGJhci4gU2VlIHtAbGluayBNaW5pbWl6YWJsZU1vZGFsQ29uc3RydWN0b3JPcHRpb25zfS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RhbDogVE1vZGFsLCBvcHRpb25zOiBNaW5pbWl6YWJsZU1vZGFsQ29uc3RydWN0b3JPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm1vZGFsID0gbW9kYWw7XG4gICAgdGhpcy5zaG91bGRTaG93Q2FuY2VsQnV0dG9uID0gb3B0aW9ucy5zaG91bGRTaG93Q2FuY2VsQnV0dG9uID8/IHRydWU7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhtb2RhbC5jb250YWluZXJFbCwgW0Nzc0NsYXNzLk1pbmltaXphYmxlTW9kYWxdKTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwgPSB0aGlzLmNyZWF0ZU1pbmltaXplQnV0dG9uKCk7XG4gICAgdGhpcy5jbG9zZVBhdGNoQ29tcG9uZW50LmxvYWQoKTtcbiAgICB0aGlzLnBhdGNoT25DbG9zZShtb2RhbCk7XG4gIH1cblxuICAvKipcbiAgICogTWluaW1pemVzIHRoZSBtb2RhbDogaGlkZXMgdGhlIG1vZGFsIGFuZCBpdHMgYmFja2Ryb3AsIHNob3dzIGEgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbixcbiAgICogYW5kIHB1dHMgdGhlIGFwcCBpbnRvIHRoZSBwZWVrLW9ubHkgbG9jay4gQSBuby1vcCBpZiB0aGUgbW9kYWwgaXMgYWxyZWFkeSBtaW5pbWl6ZWQuXG4gICAqL1xuICBwdWJsaWMgbWluaW1pemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSA9IHRydWU7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsLmhpZGUoKTtcbiAgICB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLmhpZGUoKTtcbiAgICAvLyBUaGUgbW9kYWwgc3RheXMgb3BlbiB3aGlsZSBtaW5pbWl6ZWQsIHNvIGl0cyBrZXltYXAgc2NvcGUgaXMgcG9wcGVkIHRvIHJlbGVhc2UgdGhlIGZvY3VzIHRyYXAuXG4gICAgLy8gUmVzdG9yaW5nIHJlLXB1c2hlcyBpdC4gQW4gYWN0aXZlIHRyYXAgd291bGQgc3RlYWwgZm9jdXMgYmFjayB0byB0aGUgaGlkZGVuIG1vZGFsLCBibG9ja2luZyB0aGVcbiAgICAvLyBNb3VzZS1kcml2ZW4gaW5zcGVjdGlvbiAoY2xpY2tpbmcgbm90ZXMsIHNjcm9sbGluZykgdGhhdCBtaW5pbWl6ZSBleGlzdHMgdG8gYWxsb3cuXG4gICAgLy8gS2V5Ym9hcmQgaW5wdXQgcmVtYWlucyBibG9ja2VkIGJ5IHRoZSBwZWVrLW9ubHkgbG9jaywgc28gcmVsZWFzaW5nIHRoZSB0cmFwIGtlZXBzIHRoZSBhcHAgaW5lcnQuXG4gICAgdGhpcy5tb2RhbC5hcHAua2V5bWFwLnBvcFNjb3BlKHRoaXMubW9kYWwuc2NvcGUpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSB0aGlzLmNyZWF0ZU1pbmltaXplZEJhcigpO1xuICAgIHRoaXMuZW5hYmxlUGVla0xvY2sodGhpcy5taW5pbWl6ZWRCYXJFbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgdGhlIG1vZGFsIGZyb20gdGhlIG1pbmltaXplZCBzdGF0ZSwgcmVtb3ZpbmcgdGhlIGZsb2F0aW5nIGJhciBhbmQgbGlmdGluZyB0aGUgcGVlay1vbmx5XG4gICAqIGxvY2suIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIG5vdCBtaW5pbWl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVzdG9yZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGlzYWJsZVBlZWtMb2NrKCk7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICAvLyBSZS1wdXNoIHRoZSBzY29wZSBwb3BwZWQgaW4gbWluaW1pemUoKSBzbyB0aGUgcmVzdG9yZWQgbW9kYWwgYmxvY2tzIHRoZSBhcHAgYWdhaW4gKGZvY3VzIHRyYXBcbiAgICAvLyArIEVzY2FwZSBjYXB0dXJlKS5cbiAgICB0aGlzLm1vZGFsLmFwcC5rZXltYXAucHVzaFNjb3BlKHRoaXMubW9kYWwuc2NvcGUpO1xuICAgIHRoaXMubW9kYWwuY29udGFpbmVyRWwuc2hvdygpO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5zaG93KCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pbmltaXplQnV0dG9uKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBidXR0b25FbCA9IHRoaXMubW9kYWwubW9kYWxFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBjbHM6IENzc0NsYXNzLk1pbmltaXplQnV0dG9uIH0pO1xuICAgIHNldEljb24oYnV0dG9uRWwsIE1JTklNSVpFX0lDT05fSUQpO1xuICAgIGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5taW5pbWl6ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBidXR0b25FbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWluaW1pemVkQmFyKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBiYXJFbCA9IHRoaXMubW9kYWwuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoYmFyRWwsIFtDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhcl0pO1xuICAgIGJhckVsLmNyZWF0ZVNwYW4oe1xuICAgICAgY2xzOiBDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhclRpdGxlLFxuICAgICAgdGV4dDogdGhpcy5tb2RhbC50aXRsZUVsLnRleHRDb250ZW50XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZUJ1dHRvbkVsID0gYmFyRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5SZXN0b3JlQnV0dG9uIH0pO1xuICAgIHNldEljb24ocmVzdG9yZUJ1dHRvbkVsLCBSRVNUT1JFX0lDT05fSUQpO1xuICAgIGlmICh0aGlzLnNob3VsZFNob3dDYW5jZWxCdXR0b24pIHtcbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbkVsID0gYmFyRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5DYW5jZWxCdXR0b24gfSk7XG4gICAgICBzZXRJY29uKGNhbmNlbEJ1dHRvbkVsLCBDQU5DRUxfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKGNhbmNlbEJ1dHRvbkVsLCAnQ2FuY2VsJyk7XG4gICAgICBjYW5jZWxCdXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgICAgLy8gVGhlIHdob2xlIGJhciByZXN0b3JlcyBvbiBjbGljazsgc3RvcCBwcm9wYWdhdGlvbiBzbyBDYW5jZWwgY2xvc2VzIHRoZSBtb2RhbCBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIFJlc3RvcmluZyBpdC4gQ2xvc2luZyBydW5zIHRoZSB3cmFwcGVkIG1vZGFsJ3Mgb25DbG9zZSAocGVlayBsb2NrIGxpZnRlZCwgYmFyIHJlbW92ZWQpLCBzb1xuICAgICAgICAvLyBUaGUgY29uc3VtZXIncyBvbkNsb3NlIGRlY2lkZXMgd2hhdCBcImNhbmNlbFwiIG1lYW5zIChlLmcuIHJlbGVhc2luZyBhIGhlbGQgbG9jaykuXG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5tb2RhbC5jbG9zZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRoZSB3aG9sZSBiYXIgcmVzdG9yZXMgb24gY2xpY2ssIG5vdCBqdXN0IHRoZSByZXN0b3JlIGJ1dHRvbiBcdTIwMTQgYSBsYXJnZXIsIGVhc2llciBjbGljayB0YXJnZXQuXG4gICAgLy8gYHJlc3RvcmUoKWAgZ3VhcmRzIGFnYWluc3QgYSBkb3VibGUgaW52b2NhdGlvbiwgc28gdGhlIHJlc3RvcmUgYnV0dG9uJ3Mgb3duIGNsaWNrIGJ1YmJsaW5nIHVwXG4gICAgLy8gSGVyZSBpcyBhIG5vLW9wLiBUaGUgcmVzdG9yZSBidXR0b24gc3RheXMgcHVyZWx5IGFzIGEgdmlzdWFsIGFmZm9yZGFuY2UgZm9yIHRoZSBjbGljayB0YXJnZXQuXG4gICAgYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgICAvLyBEcm9wIHRoZSBvbmUtc2hvdCBhdHRlbnRpb24gZmxhc2ggb25jZSBpdCBmaW5pc2hlcyBzbyB0aGUgYmFyIHJldHVybnMgdG8gaXRzIGdlbnRsZSBpZGxlIHB1bHNlLlxuICAgIC8vIFRoZSBpZGxlIHB1bHNlIGlzIGFuIGluZmluaXRlIGFuaW1hdGlvbiwgd2hpY2ggbmV2ZXIgZmlyZXMgYGFuaW1hdGlvbmVuZGAuXG4gICAgYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgYmFyRWwucmVtb3ZlQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiBiYXJFbDtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZVBlZWtMb2NrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wZWVrTG9ja0VudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGVla0xvY2tFbnRyaWVzLmRlbGV0ZSh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IG51bGw7XG4gICAgLy8gVGVhciB0aGUgYG9wZW5gIHBhdGNoZXMgZG93biB3aXRoIHRoZSBjb21wb25lbnQsIHNvIHRoZXkgZXhpc3Qgb25seSB3aGlsZSB0aGlzIG1vZGFsIGlzIG1pbmltaXplZC5cbiAgICB0aGlzLnBlZWtMb2NrQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICB0aGlzLnBlZWtMb2NrQ29tcG9uZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlUGVla0xvY2soYmFyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5wZWVrTG9ja0VudHJ5ID0ge1xuICAgICAgYmFyRWwsXG4gICAgICBmbGFzaDogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmZsYXNoQmFyKGJhckVsKTtcbiAgICAgIH0sXG4gICAgICBpbm5lck1vZGFsOiB0aGlzLm1vZGFsXG4gICAgfTtcbiAgICBwZWVrTG9ja0VudHJpZXMuYWRkKHRoaXMucGVla0xvY2tFbnRyeSk7XG4gICAgLy8gSW5zdGFsbCB0aGUgYG9wZW5gIHBhdGNoZXMgYW5kIGlucHV0IHN1cHByZXNzb3JzIGZvciBhcyBsb25nIGFzIHRoaXMgbW9kYWwgaXMgbWluaW1pemVkLiBUaGVcbiAgICAvLyBCbG9jayBMT0dJQyBpdHNlbGYga2V5cyBvZmYgdGhlIHNoYXJlZCBgcGVla0xvY2tFbnRyaWVzYCAoc2VlIGBzaG91bGRCbG9ja09wZW5gKSwgc28gd2l0aCBzZXZlcmFsXG4gICAgLy8gTW9kYWxzIG1pbmltaXplZCBldmVyeSBvbmUncyBwYXRjaCByZWFjaGVzIHRoZSBzYW1lIHZlcmRpY3Q7IHRoZSBsb2NrIGxpZnRzIG9ubHkgb25jZSB0aGUgbGFzdFxuICAgIC8vIE1vZGFsIHJlc3RvcmVzL2Nsb3Nlcy5cbiAgICB0aGlzLnBlZWtMb2NrQ29tcG9uZW50ID0gbmV3IFBlZWtMb2NrQ29tcG9uZW50KHRoaXMubW9kYWwuYXBwKTtcbiAgICB0aGlzLnBlZWtMb2NrQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hCYXIoYmFyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgYmFyRWwucmVtb3ZlQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICAgIC8vIEZvcmNlIGEgcmVmbG93IHNvIHJlLWFkZGluZyB0aGUgY2xhc3MgcmVzdGFydHMgdGhlIG9uZS1zaG90IGZsYXNoIG9uIHJhcGlkIHJlcGVhdGVkIGJsb2Nrcy5cbiAgICBiYXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBiYXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhckF0dGVudGlvbik7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZVBlZWtMb2NrKCk7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcGF0Y2hPbkNsb3NlKG1vZGFsOiBNb2RhbCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VQYXRjaENvbXBvbmVudC5yZWdpc3Rlck1ldGhvZFBhdGNoPE1vZGFsLCAnb25DbG9zZSc+KHtcbiAgICAgICRvYmplY3Q6IG1vZGFsLFxuICAgICAgbWV0aG9kTmFtZTogJ29uQ2xvc2UnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjayB9KTogdm9pZCA9PiB7XG4gICAgICAgIGZhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWluaW1pemVkQmFyKCk6IHZvaWQge1xuICAgIHRoaXMubWluaW1pemVkQmFyRWw/LnJlbW92ZSgpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2NrRXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpO1xufVxuXG5mdW5jdGlvbiBibG9ja09yRmFsbGJhY2sobW9kYWw6IE1vZGFsLCBmYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAoc2hvdWxkQmxvY2tPcGVuKG1vZGFsKSkge1xuICAgIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZmFsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gZmxhc2hNaW5pbWl6ZWRCYXJzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGVudHJ5LmZsYXNoKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNaW5pbWl6ZWRJbm5lck1vZGFsKG1vZGFsOiBNb2RhbCk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGlmIChlbnRyeS5pbm5lck1vZGFsID09PSBtb2RhbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1BlZWtBbGxvd2VkS2V5KCRldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAvLyBOYXZpZ2F0aW9uIG1vdmVzIHRoZSBjdXJzb3Ivc2Nyb2xscyAoYWxsb3dlZCksIGJ1dCBTaGlmdCtuYXZpZ2F0aW9uIGV4dGVuZHMgdGhlIHNlbGVjdGlvbiAobm90XG4gIC8vIE5lZWRlZCBmb3IgaW5zcGVjdGlvbiksIHNvIGl0IGlzIGJsb2NrZWQuIEJhcmUgbW9kaWZpZXIgcHJlc3NlcyBwYXNzIHRocm91Z2ggb24gdGhlaXIgb3duLlxuICBpZiAoTkFWSUdBVElPTl9LRVlTLmhhcygkZXZlbnQua2V5KSkge1xuICAgIHJldHVybiAhJGV2ZW50LnNoaWZ0S2V5O1xuICB9XG5cbiAgcmV0dXJuIE1PRElGSUVSX0tFWVMuaGFzKCRldmVudC5rZXkpO1xufVxuXG5mdW5jdGlvbiBpc1BlZWtMb2NrZWQoKTogYm9vbGVhbiB7XG4gIC8vIERyb3AgZW50cmllcyB3aG9zZSBiYXIgaGFzIGxlZnQgdGhlIERPTSB3aXRob3V0IGEgcmVzdG9yZSgpIG9yIGNsb3NlKCkuXG4gIC8vIEEgdGVzdCB0ZWFyZG93biB0aGF0IGVtcHRpZXMgdGhlIGJvZHkgaXMgdGhlIHR5cGljYWwgY2F1c2U7IHRoaXMga2VlcHMgYSBzdGFsZSBlbnRyeSBmcm9tIGxvY2tpbmcuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgcGVla0xvY2tFbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5iYXJFbC5pc0Nvbm5lY3RlZCkge1xuICAgICAgcGVla0xvY2tFbnRyaWVzLmRlbGV0ZShlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBlZWtMb2NrRW50cmllcy5zaXplID4gMDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQmxvY2tPcGVuKG1vZGFsOiBNb2RhbCk6IGJvb2xlYW4ge1xuICAvLyBBIG1vZGFsJ3Mgb3duIHJlLW9wZW4gaXMgbmV2ZXIgYmxvY2tlZCBcdTIwMTQgb3RoZXJ3aXNlIGEgbWluaW1pemVkIG1vZGFsIGNvdWxkIG5vdCByZXN0b3JlL3JlLW9wZW5cbiAgLy8gSXRzZWxmLiBFdmVyeSBPVEhFUiBtb2RhbCBvcGVuIGlzIGJsb2NrZWQgd2hpbGUgYW55IG1vZGFsIGlzIG1pbmltaXplZCAodGhlIHBlZWstb25seSBsb2NrKS5cbiAgcmV0dXJuIGlzUGVla0xvY2tlZCgpICYmICFpc01pbmltaXplZElubmVyTW9kYWwobW9kYWwpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpOiB2b2lkIHtcbiAgZmxhc2hNaW5pbWl6ZWRCYXJzKCk7XG4gIGJlZXBlci5iZWVwKCk7XG59XG5cbmZ1bmN0aW9uIHN1cHByZXNzS2V5ZG93bldoaWxlUGVla0xvY2tlZCgkZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFpc1BlZWtMb2NrZWQoKSB8fCBpc1BlZWtBbGxvd2VkS2V5KCRldmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBibG9ja0V2ZW50KCRldmVudCk7XG59XG5cbmZ1bmN0aW9uIHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFpc1BlZWtMb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJsb2NrRXZlbnQoJGV2ZW50KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOENBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsY0FBYztBQUN2QixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLDJCQUEyQjtBQUVwQyxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLGlCQUFpQjtBQUt2QixNQUFNLGtCQUFrQixvQkFBSSxJQUFZO0FBQUEsRUFDdEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQUlELE1BQU0sZ0JBQWdCLG9CQUFJLElBQVk7QUFBQSxFQUNwQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUF5QkQsTUFBTSxrQkFBa0Isb0JBQUksSUFBbUI7QUFDL0MsTUFBTSxTQUFTLElBQUksT0FBTztBQXFCMUIsTUFBTSwwQkFBMEIsc0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTTdD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
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIFx1MjAxNCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiAoYW5kLCBieSBkZWZhdWx0LCBhIENhbmNlbCBidXR0b24gdGhhdCBjbG9zZXMgdGhlIHdyYXBwZWRcbiAqIG1vZGFsIFx1MjAxNCBwYXNzIGB7IHNob3VsZFNob3dDYW5jZWxCdXR0b246IGZhbHNlIH1gIHRvIGhpZGUgaXQpLCBzbyB0aGUgdXNlciBjYW4gcGVlayBhdCB0aGVcbiAqIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvbiBpbnZvbHZlcyBcdTIwMTQgYnV0IHRoZSBtb2RhbCBpcyBOT1QgZGlzbWlzc2VkLCBzbyBpdHMgYmxvY2tpbmcgY29udHJhY3QgbXVzdCBiZSBwcmVzZXJ2ZWQuXG4gKlxuICogVG8ga2VlcCB0aGF0IGNvbnRyYWN0IHdoaWxlIG1pbmltaXplZCwgdGhlIHdyYXBwZXIgcHV0cyB0aGUgYXBwIGludG8gYSAqKnBlZWstb25seSBsb2NrKio6IHRoZSB1c2VyXG4gKiBtYXkgbW91c2UtY2xpY2sgYW5kIHNjcm9sbCB0byBpbnNwZWN0IGNvbnRlbnQsIGJ1dCBjYW5ub3Qgc3RhcnQgYW55dGhpbmcgbmV3LiBXaGlsZSBhbnkgbW9kYWwgaXNcbiAqIG1pbmltaXplZCB0aGUgd3JhcHBlcjpcbiAqIC0gYmxvY2tzIHRoZSBrZXlib2FyZCAodHlwaW5nLCBob3RrZXlzLCB0aGUgY29tbWFuZC1wYWxldHRlIHNob3J0Y3V0KSxcbiAqIC0gYmxvY2tzIHRoZSByaWdodC1jbGljayBjb250ZXh0IG1lbnUsIGFuZFxuICogLSBibG9ja3Mgb3BlbmluZyBhbnkgb3RoZXIgbW9kYWwgKGEgcmUtZmlyZWQgY29tbWFuZCwgdGhlIGNvbW1hbmQgcGFsZXR0ZSwgc2V0dGluZ3MsIFx1MjAyNikuXG4gKlxuICogQSBibG9ja2VkIGF0dGVtcHQgZmxhc2hlcyB0aGUgZmxvYXRpbmcgYmFyIGFuZCBiZWVwcyBzbyB0aGUgdXNlciBzZWVzIChhbmQgaGVhcnMpIHdoeSBub3RoaW5nXG4gKiBoYXBwZW5lZC4gUmVzdG9yaW5nIChvciB0aGUgbW9kYWwgY2xvc2luZykgbGlmdHMgdGhlIGxvY2suIFRoaXMgcHJldmVudHMsIGZvciBleGFtcGxlLCBtaW5pbWl6aW5nIGFcbiAqIFwibWVyZ2UgZm9sZGVyXCIgcGlja2VyIGFuZCB0aGVuIGZpcmluZyB0aGUgc2FtZSBjb21tYW5kIGFnYWluIHRvIHN0YWNrIHNldmVyYWwgY29uY3VycmVudCBtZXJnZXMuXG4gKlxuICogVGhlIHdyYXBwZXIgcmV1c2VzIHRoZSBtb2RhbCdzIG93biB0aXRsZSAoYHRpdGxlRWxgKSBhcyB0aGUgbWluaW1pemVkIGJhciBsYWJlbCwgc28gc2V0IHRoZSB0aXRsZVxuICogdGhlIHVzdWFsIHdheSAoYG1vZGFsLnNldFRpdGxlKC4uLilgKS4gUmVuZGVyIGFyYml0cmFyeSBjb250ZW50IGludG8ge0BsaW5rIE1vZGFsLmNvbnRlbnRFbH0sXG4gKiBpbmNsdWRpbmcgY2xpY2thYmxlIG5vdGUgbGlua3MgcHJvZHVjZWQgYnkgYHJlbmRlckludGVybmFsTGlua2AgZnJvbVxuICogYG9ic2lkaWFuLWRldi11dGlscy9vYnNpZGlhbi9tYXJrZG93bmA6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IG1vZGFsID0gbmV3IE15TW9kYWwoYXBwKTtcbiAqIG1vZGFsLnNldFRpdGxlKCdNZXJnaW5nIG5vdGVzJyk7XG4gKiBtb2RhbC5jb250ZW50RWwuYXBwZW5kQ2hpbGQoYXdhaXQgcmVuZGVySW50ZXJuYWxMaW5rKHsgYXBwLCBwYXRoT3JBYnN0cmFjdEZpbGU6IGZpbGUgfSkpO1xuICpcbiAqIGNvbnN0IG1pbmltaXphYmxlID0gbmV3IE1pbmltaXphYmxlTW9kYWwobW9kYWwpO1xuICogbWluaW1pemFibGUubW9kYWwub3BlbigpO1xuICogbWluaW1pemFibGUubWluaW1pemUoKTsgLy8gYSBmbG9hdGluZyBiYXIgb2ZmZXJzIFwicmVzdG9yZVwiOyB0aGUgYXBwIGlzIHBlZWstb25seSB1bnRpbCByZXN0b3JlZFxuICogYGBgXG4gKlxuICogVGhlIHdyYXBwZWQgbW9kYWwgY2FuIHN0aWxsIGJlIGNsb3NlZCBub3JtYWxseTsgdGhlIGZsb2F0aW5nIGJhciBpcyBjbGVhbmVkIHVwIGF1dG9tYXRpY2FsbHkgd2hlblxuICogdGhlIG1vZGFsIGNsb3NlcyAoZXZlbiBpZiBpdCBpcyBjbG9zZWQgd2hpbGUgbWluaW1pemVkKS5cbiAqXG4gKiBDbGlja2luZyB0aGUgZGltbWVkIGJhY2tncm91bmQgYmVoaW5kIHRoZSBtb2RhbCAqKm1pbmltaXplcyoqIGl0IHJhdGhlciB0aGFuIGNsb3NpbmcgaXQsIHNvIGEgc3RyYXlcbiAqIGNsaWNrIHBhc3QgdGhlIGRpYWxvZyBubyBsb25nZXIgY2FuY2VscyB0aGUgb3BlcmF0aW9uIHRoZSBtb2RhbCBpcyBydW5uaW5nIFx1MjAxNCBwYXNzXG4gKiBgeyBzaG91bGRNaW5pbWl6ZU9uQ2xpY2tPdXRzaWRlOiBmYWxzZSB9YCB0byBrZWVwIE9ic2lkaWFuJ3MgbmF0aXZlIGNsb3NlLW9uLWJhY2tncm91bmQtY2xpY2suXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIE1vZGFsLFxuICBzZXRJY29uLFxuICBzZXRUb29sdGlwXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQmVlcGVyIH0gZnJvbSAnLi4vLi4vYmVlcGVyLnRzJztcbmltcG9ydCB7IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5cbmNvbnN0IE1JTklNSVpFX0lDT05fSUQgPSAnbWludXMnO1xuY29uc3QgUkVTVE9SRV9JQ09OX0lEID0gJ21heGltaXplLTInO1xuY29uc3QgQ0FOQ0VMX0lDT05fSUQgPSAneCc7XG5cbi8vIE5hdmlnYXRpb24ga2V5cyBwYXNzIHRocm91Z2ggd2hpbGUgbWluaW1pemVkIHNvIHRoZSB1c2VyIGNhbiBtb3ZlIHRoZSBjdXJzb3IgYW5kIHNjcm9sbCB0byByZWFkLlxuLy8gTm9uZSBvZiB0aGVtIG11dGF0ZSB0aGUgZG9jdW1lbnQgXHUyMDE0IHRleHQgY2hhbmdlcyBhcmUgY2F1Z2h0IHNlcGFyYXRlbHkgYnkgdGhlIGBiZWZvcmVpbnB1dGAgZ3VhcmQuXG4vLyBTaGlmdCtuYXZpZ2F0aW9uIGlzIGJsb2NrZWQsIHRob3VnaCwgc2luY2UgaXQgZXh0ZW5kcyB0aGUgc2VsZWN0aW9uIHRoYXQgaW5zcGVjdGlvbiBkb2VzIG5vdCBuZWVkLlxuY29uc3QgTkFWSUdBVElPTl9LRVlTID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ0Fycm93RG93bicsXG4gICdBcnJvd0xlZnQnLFxuICAnQXJyb3dSaWdodCcsXG4gICdBcnJvd1VwJyxcbiAgJ0VuZCcsXG4gICdIb21lJyxcbiAgJ1BhZ2VEb3duJyxcbiAgJ1BhZ2VVcCdcbl0pO1xuXG4vLyBBIGJhcmUgbW9kaWZpZXIgcHJlc3MgZG9lcyBub3RoaW5nIG9uIGl0cyBvd24sIHNvIGl0IHBhc3NlcyB0aHJvdWdoIHRoZSBsb2NrLlxuLy8gVGhpcyBhdm9pZHMgYSBzcHVyaW91cyBmbGFzaC9iZWVwIHdoaWxlIGNvbXBvc2luZyBhIHNob3J0Y3V0OyB0aGUgc2hvcnRjdXQncyBjb21tYW5kIGtleSBpcyBibG9ja2VkLlxuY29uc3QgTU9ESUZJRVJfS0VZUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICdBbHQnLFxuICAnQ29udHJvbCcsXG4gICdNZXRhJyxcbiAgJ1NoaWZ0J1xuXSk7XG5cbi8qKlxuICogQSByZWdpc3RlcmVkIGVudHJ5IGZvciBhIGN1cnJlbnRseS1taW5pbWl6ZWQgbW9kYWwuIFRoZSBzaGFyZWQgcGVlay1vbmx5IGxvY2sgdXNlcyBpdCB0byBrbm93IGFcbiAqIG1vZGFsIGlzIG1pbmltaXplZCwgdG8gbGVhdmUgdGhhdCBtb2RhbCdzIG93biByZS1vcGVucyBhbG9uZSwgYW5kIHRvIGZsYXNoIGl0cyBiYXIgb24gYSBibG9ja2VkXG4gKiBhdHRlbXB0LlxuICovXG5pbnRlcmZhY2UgUGVla0xvY2tFbnRyeSB7XG4gIC8qKlxuICAgKiBUaGUgZmxvYXRpbmcgYmFyIGVsZW1lbnQuIFVzZWQgdG8gZGV0ZWN0IGEgc3RhbGUgZW50cnkgKGl0cyBiYXIgaGFzIGxlZnQgdGhlIERPTSkgc28gaXQgY2FuIGJlXG4gICAqIHBydW5lZCBhbmQgbmV2ZXIga2VlcCB0aGUgYXBwIGxvY2tlZC5cbiAgICovXG4gIHJlYWRvbmx5IGJhckVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogRmxhc2hlcyB0aGUgZmxvYXRpbmcgYmFyIHRvIHNpZ25hbCBhIGJsb2NrZWQgYXR0ZW1wdC5cbiAgICovXG4gIGZsYXNoKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB3cmFwcGVkIG1vZGFsIGluc3RhbmNlLCBzbyBpdHMgb3duIGBvcGVuKClgIGlzIG5ldmVyIGJsb2NrZWQgYnkgdGhlIGxvY2suXG4gICAqL1xuICByZWFkb25seSBpbm5lck1vZGFsOiBNb2RhbDtcbn1cblxuY29uc3QgcGVla0xvY2tFbnRyaWVzID0gbmV3IFNldDxQZWVrTG9ja0VudHJ5PigpO1xuY29uc3QgYmVlcGVyID0gbmV3IEJlZXBlcigpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBNaW5pbWl6YWJsZU1vZGFsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNaW5pbWl6YWJsZU1vZGFsQ29uc3RydWN0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgY2xpY2tpbmcgdGhlIGRpbW1lZCBiYWNrZ3JvdW5kIGJlaGluZCB0aGUgbW9kYWwgbWluaW1pemVzIGl0IGluc3RlYWQgb2YgY2xvc2luZyBpdC5cbiAgICogT2JzaWRpYW4ncyBuYXRpdmUgYmVoYXZpb3IgaXMgdG8gY2xvc2UsIHdoaWNoIGNhbmNlbHMgd2hhdGV2ZXIgb3BlcmF0aW9uIHRoZSBtb2RhbCBpcyBydW5uaW5nO1xuICAgKiBtaW5pbWl6aW5nIGtlZXBzIHRoYXQgb3BlcmF0aW9uIGFsaXZlIHNvIHRoZSB1c2VyIGNhbiBwZWVrIGF0IHRoZSBpbnZvbHZlZCBub3RlcyBhbmQgY29tZSBiYWNrLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZE1pbmltaXplT25DbGlja091dHNpZGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtaW5pbWl6ZWQgYmFyIHNob3dzIGEgQ2FuY2VsIGJ1dHRvbiB0aGF0IGNsb3NlcyB0aGUgd3JhcHBlZCBtb2RhbC4gQ2xvc2luZyBsZXRzIHRoZVxuICAgKiB3cmFwcGVkIG1vZGFsJ3Mgb3duIGBvbkNsb3NlYCBkZWZpbmUgd2hhdCBcImNhbmNlbFwiIG1lYW5zIChlLmcuIHJlbGVhc2luZyBhIGhlbGQgbG9jaykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0NhbmNlbEJ1dHRvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIHBlZWstb25seSBsb2NrJ3MgYG9wZW5gIHBhdGNoZXMgd2hpbGUgYXQgbGVhc3Qgb25lIG1vZGFsIGlzIG1pbmltaXplZC4gQmVpbmcgYVxuICoge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudH0sIGJvdGggcGF0Y2hlcyBhcmUgdG9ybiBkb3duIGF1dG9tYXRpY2FsbHkgb24gYHVubG9hZGAsIHNvIHRoZXkgZXhpc3RcbiAqIG9ubHkgd2hpbGUgdGhlIGxvY2sgaXMgYWN0aXZlLiBBIG1pbmltaXplZCBtb2RhbCdzIG93biByZS1vcGVuIGlzIGFsd2F5cyBhbGxvd2VkIChzZWVcbiAqIHtAbGluayBzaG91bGRCbG9ja09wZW59KTsgZXZlcnkgb3RoZXIgbW9kYWwgb3BlbiBpcyBibG9ja2VkIGFuZCBzaWduYWxzIGEgZmxhc2ggKyBiZWVwLlxuICovXG5jbGFzcyBQZWVrTG9ja0NvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIGFwcCB3aG9zZSBzZXR0aW5ncyBtb2RhbCBpcyBndWFyZGVkIGFuZCB3aG9zZSB3aW5kb3dzIHN1cHByZXNzIGlucHV0IHdoaWxlIGxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGBvcGVuYCBwYXRjaGVzIGFuZCB0aGUgaW5wdXQgc3VwcHJlc3NvcnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuXG4gICAgLy8gQmxvY2sgb3BlbmluZyBhbnkgT1RIRVIgbW9kYWwgd2hpbGUgYSBtb2RhbCBpcyBtaW5pbWl6ZWQgKHRoZSBjb21tYW5kIHBhbGV0dGUsIGEgcmUtZmlyZWRcbiAgICAvLyBDb21tYW5kLCBhbm90aGVyIHBsdWdpbiBtb2RhbCwgXHUyMDI2KS5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8TW9kYWwsICdvcGVuJz4oe1xuICAgICAgJG9iamVjdDogTW9kYWwucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ29wZW4nLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pOiB2b2lkID0+IHtcbiAgICAgICAgYmxvY2tPckZhbGxiYWNrKG9yaWdpbmFsVGhpcywgZmFsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gT2JzaWRpYW4ncyBTZXR0aW5ncyBpcyBhICpwb3BvdXQqIG1vZGFsOiBvbiBkZXNrdG9wIGl0cyBvd24gYG9wZW4oKWAgZmlyc3QgY3JlYXRlcyBhIHNlcGFyYXRlIE9TXG4gICAgLy8gV2luZG93ICh2aWEgYHNob3VsZFVzZVBvcG91dCgpYC9gZ2V0UG9wb3V0T3B0aW9ucygpYCkgYW5kIG9ubHkgVEhFTiBkZWxlZ2F0ZXMgdG9cbiAgICAvLyBgTW9kYWwucHJvdG90eXBlLm9wZW5gIHRvIHJlbmRlciB0aGUgYWN0aXZlIHRhYiBpbnRvIGl0LiBHdWFyZGluZyBvbmx5IGBNb2RhbC5wcm90b3R5cGUub3BlbmBcbiAgICAvLyBUaGVyZWZvcmUgYmxvY2tzIHRoZSByZW5kZXIgYnV0IGxlYXZlcyBhbiBlbXB0eSBzZXR0aW5ncyB3aW5kb3cgYmVoaW5kIFx1MjAxNCB0aGUgcmVwb3J0ZWQgYmFkIFVYLlxuICAgIC8vIEd1YXJkaW5nIHRoZSBzZXR0aW5ncyBtb2RhbCdzIG93biBgb3BlbigpYCBibG9ja3MgaXQgKmJlZm9yZSogdGhlIHdpbmRvdyBpcyBjcmVhdGVkLlxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxBcHBbJ3NldHRpbmcnXSwgJ29wZW4nPih7XG4gICAgICAkb2JqZWN0OiB0aGlzLmFwcC5zZXR0aW5nLFxuICAgICAgbWV0aG9kTmFtZTogJ29wZW4nLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pOiB2b2lkID0+IHtcbiAgICAgICAgYmxvY2tPckZhbGxiYWNrKG9yaWdpbmFsVGhpcywgZmFsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3VwcHJlc3MgdGhlIGtleWJvYXJkLCBlZGl0b3IgbXV0YXRpb24sIGFuZCB0aGUgY29udGV4dCBtZW51IGFjcm9zcyBBTEwgd2luZG93cyBcdTIwMTQgdGhlIG1haW4gd2luZG93XG4gICAgLy8gQW5kIGV2ZXJ5IGV4aXN0aW5nL2Z1dHVyZSBwb3BvdXQgXHUyMDE0IHNvIHRoZSBsb2NrIGhvbGRzIHdoZXJldmVyIHRoZSB1c2VyJ3MgZm9jdXMgaXMsIG5vdCBvbmx5IGluXG4gICAgLy8gVGhlIHdpbmRvdyB0aGF0IG93bnMgdGhlIG1pbmltaXplZCBtb2RhbC4gQ2FwdHVyZS1waGFzZSBsaXN0ZW5lcnMgcnVuIGJlZm9yZSBPYnNpZGlhbidzIG93blxuICAgIC8vIERvY3VtZW50L2VsZW1lbnQgaGFuZGxlcnMgKGluY2x1ZGluZyBDb2RlTWlycm9yJ3MpLCBzbyBgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClgIGluIHRoZVxuICAgIC8vIFN1cHByZXNzb3JzIGtlZXBzIGEgYmxvY2tlZCBldmVudCBmcm9tIGV2ZXIgcmVhY2hpbmcgdGhlbS4gYGtleWRvd25gIGxldHMgbmF2aWdhdGlvbiBrZXlzIHRocm91Z2hcbiAgICAvLyAoc2VlIGBpc1BlZWtBbGxvd2VkS2V5YCkgYnV0IGJsb2NrcyBjb21tYW5kIGhvdGtleXM7IGBiZWZvcmVpbnB1dGAgYmxvY2tzIGFsbCBlZGl0b3IgbXV0YXRpb247XG4gICAgLy8gYGNvbnRleHRtZW51YCBibG9ja3MgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuXG4gICAgY29uc3QgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChuZXcgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50KHRoaXMuYXBwKSk7XG4gICAgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50LnJlZ2lzdGVyQWxsV2luZG93c0RvbUV2ZW50KHtcbiAgICAgIGNhbGxiYWNrOiBzdXBwcmVzc0tleWRvd25XaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdrZXlkb3duJ1xuICAgIH0pO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NEb21FdmVudCh7XG4gICAgICBjYWxsYmFjazogc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdiZWZvcmVpbnB1dCdcbiAgICB9KTtcbiAgICBhbGxXaW5kb3dzRXZlbnRDb21wb25lbnQucmVnaXN0ZXJBbGxXaW5kb3dzRG9tRXZlbnQoe1xuICAgICAgY2FsbGJhY2s6IHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLFxuICAgICAgb3B0aW9uczogeyBjYXB0dXJlOiB0cnVlIH0sXG4gICAgICB0eXBlOiAnY29udGV4dG1lbnUnXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZS4gV2hpbGVcbiAqIG1pbmltaXplZCB0aGUgYXBwIGlzIHB1dCBpbnRvIGEgcGVlay1vbmx5IGxvY2sgKGtleWJvYXJkLCBjb250ZXh0IG1lbnUsIGFuZCBvcGVuaW5nIG90aGVyIG1vZGFscyBhcmVcbiAqIGJsb2NrZWQpIHNvIHRoZSBtb2RhbCdzIGJsb2NraW5nIGNvbnRyYWN0IGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNb2RhbCAtIFRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG1vZGFsLlxuICovXG5leHBvcnQgY2xhc3MgTWluaW1pemFibGVNb2RhbDxUTW9kYWwgZXh0ZW5kcyBNb2RhbD4ge1xuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwuIE9wZW4sIGNsb3NlLCBhbmQgcG9wdWxhdGUgaXQgYXMgdXN1YWwgKGUuZy4gYG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZGFsOiBUTW9kYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1vZGFsIGlzIGN1cnJlbnRseSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTWluaW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTWluaW1pemVkVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgd3JhcHBlZCBtb2RhbCdzIGBvbkNsb3NlYCB0byBydW4gY2xlYW51cC4gUGVyc2lzdHMgZm9yIHRoZSB3cmFwcGVyJ3Mgd2hvbGUgbGlmZSAoYVxuICAgKiBtb2RhbCBjYW4gYmUgcmVvcGVuZWQsIHNvIHRoZSBwYXRjaCBtdXN0IHN1cnZpdmUgZWFjaCBjbG9zZSksIGhlbmNlIGEgZGVkaWNhdGVkIGNvbXBvbmVudCB0aGF0IGlzXG4gICAqIG5ldmVyIHVubG9hZGVkIFx1MjAxNCBkaXN0aW5jdCBmcm9tIGBwZWVrTG9ja0NvbXBvbmVudGAsIHdob3NlIHBhdGNoZXMgbGl2ZSBvbmx5IHdoaWxlIG1pbmltaXplZC5cbiAgICogRXhwb3NlZCB0byBzdWJjbGFzc2VzIHNvIHRoZXkgY2FuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgbGlmZXRpbWUtc2NvcGVkIHBhdGNoZXMgb24gdGhlIHdyYXBwZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xvc2VQYXRjaENvbXBvbmVudCA9IG5ldyBNb25rZXlBcm91bmRDb21wb25lbnQoKTtcblxuICBwcml2YXRlIGlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtaW5pbWl6ZUJ1dHRvbkVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBtaW5pbWl6ZWRCYXJFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZWVrTG9ja0NvbXBvbmVudDogbnVsbCB8IFBlZWtMb2NrQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBwZWVrTG9ja0VudHJ5OiBudWxsIHwgUGVla0xvY2tFbnRyeSA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkTWluaW1pemVPbkNsaWNrT3V0c2lkZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRTaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXcmFwcyB0aGUgZ2l2ZW4gbW9kYWwsIGFkZGluZyBhIG1pbmltaXplIGJ1dHRvbiBhbmQgd2lyaW5nIHVwIGNsZWFudXAgb24gY2xvc2UuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RhbCAtIFRoZSBtb2RhbCBpbnN0YW5jZSB0byBtYWtlIG1pbmltaXphYmxlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIG1pbmltaXplZCBiYXIuIFNlZSB7QGxpbmsgTWluaW1pemFibGVNb2RhbENvbnN0cnVjdG9yT3B0aW9uc30uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IobW9kYWw6IFRNb2RhbCwgb3B0aW9uczogTWluaW1pemFibGVNb2RhbENvbnN0cnVjdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5tb2RhbCA9IG1vZGFsO1xuICAgIHRoaXMuc2hvdWxkTWluaW1pemVPbkNsaWNrT3V0c2lkZSA9IG9wdGlvbnMuc2hvdWxkTWluaW1pemVPbkNsaWNrT3V0c2lkZSA/PyB0cnVlO1xuICAgIHRoaXMuc2hvdWxkU2hvd0NhbmNlbEJ1dHRvbiA9IG9wdGlvbnMuc2hvdWxkU2hvd0NhbmNlbEJ1dHRvbiA/PyB0cnVlO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobW9kYWwuY29udGFpbmVyRWwsIFtDc3NDbGFzcy5NaW5pbWl6YWJsZU1vZGFsXSk7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZUJ1dHRvbigpO1xuICAgIGlmICh0aGlzLnNob3VsZE1pbmltaXplT25DbGlja091dHNpZGUpIHtcbiAgICAgIC8vIE9ic2lkaWFuIGRpc21pc3NlcyBhIG1vZGFsIGZyb20gYSBsaXN0ZW5lciBpdCByZWdpc3RlcnMgb24gYGJnRWxgIElOIFRIRSBgTW9kYWxgIENPTlNUUlVDVE9SIFx1MjAxNFxuICAgICAgLy8gT24gbWFjT1MgZGVza3RvcCB0aGF0IGxpc3RlbmVyIGNhbGxzIGBjbG9zZSgpYCBkaXJlY3RseSAobm8gb3ZlcnJpZGFibGUgbWV0aG9kLCBub1xuICAgICAgLy8gYGRlZmF1bHRQcmV2ZW50ZWRgIGd1YXJkKSwgc28gbmVpdGhlciBvdmVycmlkaW5nIGBvbkNsaWNrT3V0c2lkZWAgbm9yIGBwcmV2ZW50RGVmYXVsdCgpYCBhbG9uZSBjYW5cbiAgICAgIC8vIFN0b3AgaXQuIEF0IHRoZSB0YXJnZXQgcGhhc2UgdGhlIERPTSBpbnZva2VzIGxpc3RlbmVycyBpbiByZWdpc3RyYXRpb24gb3JkZXIgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAgIC8vIENhcHR1cmUgZmxhZywgYW5kIE9ic2lkaWFuIHJlZ2lzdGVyZWQgZmlyc3QsIHNvIHRoZSBvbmx5IHdheSB0byBydW4gZWFybGllciBpcyB0byBjYXB0dXJlIG9uIHRoZVxuICAgICAgLy8gUEFSRU5UIGVsZW1lbnQuIEhlbmNlOiBjYXB0dXJlLXBoYXNlIGBjbGlja2Agb24gYGNvbnRhaW5lckVsYC5cbiAgICAgIG1vZGFsLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUNvbnRhaW5lckNsaWNrKCRldmVudCk7XG4gICAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICAgIHRoaXMuY2xvc2VQYXRjaENvbXBvbmVudC5sb2FkKCk7XG4gICAgdGhpcy5wYXRjaE9uQ2xvc2UobW9kYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbmltaXplcyB0aGUgbW9kYWw6IGhpZGVzIHRoZSBtb2RhbCBhbmQgaXRzIGJhY2tkcm9wLCBzaG93cyBhIGZsb2F0aW5nIGJhciB3aXRoIGEgcmVzdG9yZSBidXR0b24sXG4gICAqIGFuZCBwdXRzIHRoZSBhcHAgaW50byB0aGUgcGVlay1vbmx5IGxvY2suIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIGFscmVhZHkgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5oaWRlKCk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5oaWRlKCk7XG4gICAgLy8gVGhlIG1vZGFsIHN0YXlzIG9wZW4gd2hpbGUgbWluaW1pemVkLCBzbyBpdHMga2V5bWFwIHNjb3BlIGlzIHBvcHBlZCB0byByZWxlYXNlIHRoZSBmb2N1cyB0cmFwLlxuICAgIC8vIFJlc3RvcmluZyByZS1wdXNoZXMgaXQuIEFuIGFjdGl2ZSB0cmFwIHdvdWxkIHN0ZWFsIGZvY3VzIGJhY2sgdG8gdGhlIGhpZGRlbiBtb2RhbCwgYmxvY2tpbmcgdGhlXG4gICAgLy8gTW91c2UtZHJpdmVuIGluc3BlY3Rpb24gKGNsaWNraW5nIG5vdGVzLCBzY3JvbGxpbmcpIHRoYXQgbWluaW1pemUgZXhpc3RzIHRvIGFsbG93LlxuICAgIC8vIEtleWJvYXJkIGlucHV0IHJlbWFpbnMgYmxvY2tlZCBieSB0aGUgcGVlay1vbmx5IGxvY2ssIHNvIHJlbGVhc2luZyB0aGUgdHJhcCBrZWVwcyB0aGUgYXBwIGluZXJ0LlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wb3BTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmVuYWJsZVBlZWtMb2NrKHRoaXMubWluaW1pemVkQmFyRWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIHRoZSBtb2RhbCBmcm9tIHRoZSBtaW5pbWl6ZWQgc3RhdGUsIHJlbW92aW5nIHRoZSBmbG9hdGluZyBiYXIgYW5kIGxpZnRpbmcgdGhlIHBlZWstb25seVxuICAgKiBsb2NrLiBBIG5vLW9wIGlmIHRoZSBtb2RhbCBpcyBub3QgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgLy8gUmUtcHVzaCB0aGUgc2NvcGUgcG9wcGVkIGluIG1pbmltaXplKCkgc28gdGhlIHJlc3RvcmVkIG1vZGFsIGJsb2NrcyB0aGUgYXBwIGFnYWluIChmb2N1cyB0cmFwXG4gICAgLy8gKyBFc2NhcGUgY2FwdHVyZSkuXG4gICAgdGhpcy5tb2RhbC5hcHAua2V5bWFwLnB1c2hTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLnNob3coKTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaW5pbWl6ZUJ1dHRvbigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYnV0dG9uRWwgPSB0aGlzLm1vZGFsLm1vZGFsRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5NaW5pbWl6ZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKGJ1dHRvbkVsLCBNSU5JTUlaRV9JQ09OX0lEKTtcbiAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMubWluaW1pemUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYnV0dG9uRWw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pbmltaXplZEJhcigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYmFyRWwgPSB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLm93bmVyRG9jdW1lbnQuYm9keS5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGJhckVsLCBbQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJdKTtcbiAgICBiYXJFbC5jcmVhdGVTcGFuKHtcbiAgICAgIGNsczogQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJUaXRsZSxcbiAgICAgIHRleHQ6IHRoaXMubW9kYWwudGl0bGVFbC50ZXh0Q29udGVudFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3RvcmVCdXR0b25FbCA9IGJhckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuUmVzdG9yZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKHJlc3RvcmVCdXR0b25FbCwgUkVTVE9SRV9JQ09OX0lEKTtcbiAgICBpZiAodGhpcy5zaG91bGRTaG93Q2FuY2VsQnV0dG9uKSB7XG4gICAgICBjb25zdCBjYW5jZWxCdXR0b25FbCA9IGJhckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuQ2FuY2VsQnV0dG9uIH0pO1xuICAgICAgc2V0SWNvbihjYW5jZWxCdXR0b25FbCwgQ0FOQ0VMX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcChjYW5jZWxCdXR0b25FbCwgJ0NhbmNlbCcpO1xuICAgICAgY2FuY2VsQnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIFRoZSB3aG9sZSBiYXIgcmVzdG9yZXMgb24gY2xpY2s7IHN0b3AgcHJvcGFnYXRpb24gc28gQ2FuY2VsIGNsb3NlcyB0aGUgbW9kYWwgaW5zdGVhZCBvZlxuICAgICAgICAvLyBSZXN0b3JpbmcgaXQuIENsb3NpbmcgcnVucyB0aGUgd3JhcHBlZCBtb2RhbCdzIG9uQ2xvc2UgKHBlZWsgbG9jayBsaWZ0ZWQsIGJhciByZW1vdmVkKSwgc29cbiAgICAgICAgLy8gVGhlIGNvbnN1bWVyJ3Mgb25DbG9zZSBkZWNpZGVzIHdoYXQgXCJjYW5jZWxcIiBtZWFucyAoZS5nLiByZWxlYXNpbmcgYSBoZWxkIGxvY2spLlxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMubW9kYWwuY2xvc2UoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUaGUgd2hvbGUgYmFyIHJlc3RvcmVzIG9uIGNsaWNrLCBub3QganVzdCB0aGUgcmVzdG9yZSBidXR0b24gXHUyMDE0IGEgbGFyZ2VyLCBlYXNpZXIgY2xpY2sgdGFyZ2V0LlxuICAgIC8vIGByZXN0b3JlKClgIGd1YXJkcyBhZ2FpbnN0IGEgZG91YmxlIGludm9jYXRpb24sIHNvIHRoZSByZXN0b3JlIGJ1dHRvbidzIG93biBjbGljayBidWJibGluZyB1cFxuICAgIC8vIEhlcmUgaXMgYSBuby1vcC4gVGhlIHJlc3RvcmUgYnV0dG9uIHN0YXlzIHB1cmVseSBhcyBhIHZpc3VhbCBhZmZvcmRhbmNlIGZvciB0aGUgY2xpY2sgdGFyZ2V0LlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSk7XG4gICAgLy8gRHJvcCB0aGUgb25lLXNob3QgYXR0ZW50aW9uIGZsYXNoIG9uY2UgaXQgZmluaXNoZXMgc28gdGhlIGJhciByZXR1cm5zIHRvIGl0cyBnZW50bGUgaWRsZSBwdWxzZS5cbiAgICAvLyBUaGUgaWRsZSBwdWxzZSBpcyBhbiBpbmZpbml0ZSBhbmltYXRpb24sIHdoaWNoIG5ldmVyIGZpcmVzIGBhbmltYXRpb25lbmRgLlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbmVuZCcsICgpID0+IHtcbiAgICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmFyRWw7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVQZWVrTG9jaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVla0xvY2tFbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBlZWtMb2NrRW50cmllcy5kZWxldGUodGhpcy5wZWVrTG9ja0VudHJ5KTtcbiAgICB0aGlzLnBlZWtMb2NrRW50cnkgPSBudWxsO1xuICAgIC8vIFRlYXIgdGhlIGBvcGVuYCBwYXRjaGVzIGRvd24gd2l0aCB0aGUgY29tcG9uZW50LCBzbyB0aGV5IGV4aXN0IG9ubHkgd2hpbGUgdGhpcyBtb2RhbCBpcyBtaW5pbWl6ZWQuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVBlZWtMb2NrKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IHtcbiAgICAgIGJhckVsLFxuICAgICAgZmxhc2g6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5mbGFzaEJhcihiYXJFbCk7XG4gICAgICB9LFxuICAgICAgaW5uZXJNb2RhbDogdGhpcy5tb2RhbFxuICAgIH07XG4gICAgcGVla0xvY2tFbnRyaWVzLmFkZCh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIC8vIEluc3RhbGwgdGhlIGBvcGVuYCBwYXRjaGVzIGFuZCBpbnB1dCBzdXBwcmVzc29ycyBmb3IgYXMgbG9uZyBhcyB0aGlzIG1vZGFsIGlzIG1pbmltaXplZC4gVGhlXG4gICAgLy8gQmxvY2sgTE9HSUMgaXRzZWxmIGtleXMgb2ZmIHRoZSBzaGFyZWQgYHBlZWtMb2NrRW50cmllc2AgKHNlZSBgc2hvdWxkQmxvY2tPcGVuYCksIHNvIHdpdGggc2V2ZXJhbFxuICAgIC8vIE1vZGFscyBtaW5pbWl6ZWQgZXZlcnkgb25lJ3MgcGF0Y2ggcmVhY2hlcyB0aGUgc2FtZSB2ZXJkaWN0OyB0aGUgbG9jayBsaWZ0cyBvbmx5IG9uY2UgdGhlIGxhc3RcbiAgICAvLyBNb2RhbCByZXN0b3Jlcy9jbG9zZXMuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG5ldyBQZWVrTG9ja0NvbXBvbmVudCh0aGlzLm1vZGFsLmFwcCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoQmFyKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyByZS1hZGRpbmcgdGhlIGNsYXNzIHJlc3RhcnRzIHRoZSBvbmUtc2hvdCBmbGFzaCBvbiByYXBpZCByZXBlYXRlZCBibG9ja3MuXG4gICAgYmFyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYmFyRWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgdGhpcy5pc01pbmltaXplZFZhbHVlID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lckNsaWNrKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIFdoaWxlIG1pbmltaXplZCB0aGUgY29udGFpbmVyIGlzIGhpZGRlbiwgc28gbm8gY2xpY2sgY2FuIHJlYWNoIGl0IFx1MjAxNCBidXQgYSBzeW50aGV0aWMgb25lIHN0aWxsIGNhbixcbiAgICAvLyBBbmQgbWluaW1pemluZyBhbiBhbHJlYWR5LW1pbmltaXplZCBtb2RhbCBpcyBtZWFuaW5nbGVzcy5cbiAgICBpZiAodGhpcy5pc01pbmltaXplZFZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBjbGljayB0aGF0IHBhc3NlZCB0aHJvdWdoIHRoZSBtb2RhbCBpdHNlbGYgaXMgb3JkaW5hcnkgaW50ZXJhY3Rpb24gd2l0aCBpdHMgY29udGVudC5cbiAgICAvLyBgY29tcG9zZWRQYXRoKClgIChyYXRoZXIgdGhhbiBgbW9kYWxFbC5jb250YWlucygkZXZlbnQudGFyZ2V0KWApIG5lZWRzIG5vIGNhc3QgYW5kIHN0YXlzIGNvcnJlY3RcbiAgICAvLyBBY3Jvc3Mgd2luZG93cywgd2hlcmUgYW4gYGluc3RhbmNlb2YgSFRNTEVsZW1lbnRgIGNoZWNrIGFnYWluc3QgYW5vdGhlciByZWFsbSdzIGVsZW1lbnQgd291bGQgbm90LlxuICAgIGlmICgkZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcy5tb2RhbC5tb2RhbEVsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdGV4dCBzZWxlY3Rpb24gZHJhZ2dlZCBmcm9tIGluc2lkZSB0aGUgbW9kYWwgb3V0IG9udG8gdGhlIGJhY2tncm91bmQgbWFrZXMgdGhlIHJlc3VsdGluZ1xuICAgIC8vIGBjbGlja2AgZmlyZSBvbiB0aGVpciBjb21tb24gYW5jZXN0b3IgXHUyMDE0IGBjb250YWluZXJFbGAuIE9ic2lkaWFuIGRvZXMgbm90IGRpc21pc3Mgb24gdGhhdCBnZXN0dXJlIChpdHNcbiAgICAvLyBPd24gbGlzdGVuZXIgc2l0cyBvbiBgYmdFbGAsIHdoaWNoIGlzIG5ldmVyIHRoZSB0YXJnZXQgaGVyZSksIHNvIG5laXRoZXIgZG9lcyB0aGlzLlxuICAgIGlmICgkZXZlbnQudGFyZ2V0ID09PSB0aGlzLm1vZGFsLmNvbnRhaW5lckVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2hhdCBpcyBsZWZ0IGlzIGEgY2xpY2sgb24gdGhlIGRpbW1lZCBiYWNrZ3JvdW5kIGl0c2VsZi4gYHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpYCBpcyB3aGF0XG4gICAgLy8gQWN0dWFsbHkga2VlcHMgaXQgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzIGBiZ0VsYCBsaXN0ZW5lciBvbiBCT1RIIHBsYXRmb3JtIGJyYW5jaGVzO1xuICAgIC8vIGBwcmV2ZW50RGVmYXVsdCgpYCBhZGRpdGlvbmFsbHkgc2F0aXNmaWVzIHRoZSBgZGVmYXVsdFByZXZlbnRlZGAgZ3VhcmQgaW4gYG9uQ2xpY2tPdXRzaWRlYC5cbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAkZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5taW5pbWl6ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXRjaE9uQ2xvc2UobW9kYWw6IE1vZGFsKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZVBhdGNoQ29tcG9uZW50LnJlZ2lzdGVyTWV0aG9kUGF0Y2g8TW9kYWwsICdvbkNsb3NlJz4oe1xuICAgICAgJG9iamVjdDogbW9kYWwsXG4gICAgICBtZXRob2ROYW1lOiAnb25DbG9zZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrIH0pOiB2b2lkID0+IHtcbiAgICAgICAgZmFsbGJhY2soKTtcbiAgICAgICAgdGhpcy5oYW5kbGVDbG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVNaW5pbWl6ZWRCYXIoKTogdm9pZCB7XG4gICAgdGhpcy5taW5pbWl6ZWRCYXJFbD8ucmVtb3ZlKCk7XG4gICAgdGhpcy5taW5pbWl6ZWRCYXJFbCA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmxvY2tFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAkZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk7XG59XG5cbmZ1bmN0aW9uIGJsb2NrT3JGYWxsYmFjayhtb2RhbDogTW9kYWwsIGZhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gIGlmIChzaG91bGRCbG9ja09wZW4obW9kYWwpKSB7XG4gICAgc2lnbmFsQmxvY2tlZEF0dGVtcHQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmYWxsYmFjaygpO1xufVxuXG5mdW5jdGlvbiBmbGFzaE1pbmltaXplZEJhcnMoKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgcGVla0xvY2tFbnRyaWVzKSB7XG4gICAgZW50cnkuZmxhc2goKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc01pbmltaXplZElubmVyTW9kYWwobW9kYWw6IE1vZGFsKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgcGVla0xvY2tFbnRyaWVzKSB7XG4gICAgaWYgKGVudHJ5LmlubmVyTW9kYWwgPT09IG1vZGFsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzUGVla0FsbG93ZWRLZXkoJGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gIC8vIE5hdmlnYXRpb24gbW92ZXMgdGhlIGN1cnNvci9zY3JvbGxzIChhbGxvd2VkKSwgYnV0IFNoaWZ0K25hdmlnYXRpb24gZXh0ZW5kcyB0aGUgc2VsZWN0aW9uIChub3RcbiAgLy8gTmVlZGVkIGZvciBpbnNwZWN0aW9uKSwgc28gaXQgaXMgYmxvY2tlZC4gQmFyZSBtb2RpZmllciBwcmVzc2VzIHBhc3MgdGhyb3VnaCBvbiB0aGVpciBvd24uXG4gIGlmIChOQVZJR0FUSU9OX0tFWVMuaGFzKCRldmVudC5rZXkpKSB7XG4gICAgcmV0dXJuICEkZXZlbnQuc2hpZnRLZXk7XG4gIH1cblxuICByZXR1cm4gTU9ESUZJRVJfS0VZUy5oYXMoJGV2ZW50LmtleSk7XG59XG5cbmZ1bmN0aW9uIGlzUGVla0xvY2tlZCgpOiBib29sZWFuIHtcbiAgLy8gRHJvcCBlbnRyaWVzIHdob3NlIGJhciBoYXMgbGVmdCB0aGUgRE9NIHdpdGhvdXQgYSByZXN0b3JlKCkgb3IgY2xvc2UoKS5cbiAgLy8gQSB0ZXN0IHRlYXJkb3duIHRoYXQgZW1wdGllcyB0aGUgYm9keSBpcyB0aGUgdHlwaWNhbCBjYXVzZTsgdGhpcyBrZWVwcyBhIHN0YWxlIGVudHJ5IGZyb20gbG9ja2luZy5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwZWVrTG9ja0VudHJpZXMpIHtcbiAgICBpZiAoIWVudHJ5LmJhckVsLmlzQ29ubmVjdGVkKSB7XG4gICAgICBwZWVrTG9ja0VudHJpZXMuZGVsZXRlKGVudHJ5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGVla0xvY2tFbnRyaWVzLnNpemUgPiAwO1xufVxuXG5mdW5jdGlvbiBzaG91bGRCbG9ja09wZW4obW9kYWw6IE1vZGFsKTogYm9vbGVhbiB7XG4gIC8vIEEgbW9kYWwncyBvd24gcmUtb3BlbiBpcyBuZXZlciBibG9ja2VkIFx1MjAxNCBvdGhlcndpc2UgYSBtaW5pbWl6ZWQgbW9kYWwgY291bGQgbm90IHJlc3RvcmUvcmUtb3BlblxuICAvLyBJdHNlbGYuIEV2ZXJ5IE9USEVSIG1vZGFsIG9wZW4gaXMgYmxvY2tlZCB3aGlsZSBhbnkgbW9kYWwgaXMgbWluaW1pemVkICh0aGUgcGVlay1vbmx5IGxvY2spLlxuICByZXR1cm4gaXNQZWVrTG9ja2VkKCkgJiYgIWlzTWluaW1pemVkSW5uZXJNb2RhbChtb2RhbCk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk6IHZvaWQge1xuICBmbGFzaE1pbmltaXplZEJhcnMoKTtcbiAgYmVlcGVyLmJlZXAoKTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NLZXlkb3duV2hpbGVQZWVrTG9ja2VkKCRldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICBpZiAoIWlzUGVla0xvY2tlZCgpIHx8IGlzUGVla0FsbG93ZWRLZXkoJGV2ZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJsb2NrRXZlbnQoJGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICBpZiAoIWlzUGVla0xvY2tlZCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYmxvY2tFdmVudCgkZXZlbnQpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrREE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsNkJBQTZCO0FBQ3RDLFNB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
|