obsidian-dev-utils 94.4.2 → 94.5.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 +4 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/script-utils/demo-vault-buttons.cjs +23 -5
- package/dist/lib/cjs/script-utils/demo-vault-buttons.d.cts +8 -4
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/script-utils/demo-vault-buttons.d.mts +8 -4
- package/dist/lib/esm/script-utils/demo-vault-buttons.mjs +23 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -125,7 +125,7 @@ __export(generated_during_build_exports, {
|
|
|
125
125
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
126
126
|
});
|
|
127
127
|
module.exports = __toCommonJS(generated_during_build_exports);
|
|
128
|
-
const LIBRARY_VERSION = "94.
|
|
128
|
+
const LIBRARY_VERSION = "94.5.0";
|
|
129
129
|
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:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus:invalid:not(.untouched),\n.obsidian-dev-utils textarea:active:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus:invalid:not(.untouched) {\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;;;ACKJ;EAPA;;AAuBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAvBJ;;AA6BA;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//%20An%20input%20the%20user%20has%20not%20interacted%20with%20yet%20carries%20%60.untouched%60%20(set%20by%20%60PromptModal%60),%20so%20a%20modal%20that%5Cn//%20opens%20invalid%20by%20design%20does%20not%20greet%20the%20user%20in%20red.%20Both%20blocks%20below%20must%20be%20gated:%20the%20input%20is%5Cn//%20focused%20on%20open,%20so%20the%20focus%20block%20alone%20would%20keep%20painting%20it.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid:not(.untouched)%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:not(.untouched)%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";
|
|
130
130
|
// Annotate the CommonJS export names for ESM import in node:
|
|
131
131
|
0 && (module.exports = {
|
|
@@ -159,11 +159,29 @@ function formatFailures(noteName, failures) {
|
|
|
159
159
|
return `${String(failures.length)} button(s) in ${noteName} did not run cleanly:
|
|
160
160
|
${details}`;
|
|
161
161
|
}
|
|
162
|
+
const NON_WALKTHROUGH_FOLDERS = /* @__PURE__ */ new Set(["Materials"]);
|
|
162
163
|
function listNotesWithButtons(demoVaultPath, excludedNotes) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
164
|
+
const notes = [];
|
|
165
|
+
function walk(folder, relativeFolder) {
|
|
166
|
+
for (const entry of (0, import_node_fs.readdirSync)(folder, { withFileTypes: true })) {
|
|
167
|
+
const relativePath = relativeFolder === "" ? entry.name : `${relativeFolder}/${entry.name}`;
|
|
168
|
+
if (entry.isDirectory()) {
|
|
169
|
+
if (!entry.name.startsWith(".") && !entry.name.startsWith("_") && !NON_WALKTHROUGH_FOLDERS.has(entry.name)) {
|
|
170
|
+
walk((0, import_node_path.join)(folder, entry.name), relativePath);
|
|
171
|
+
}
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (!entry.name.endsWith(".md") || excludedNotes.has(entry.name) || excludedNotes.has(relativePath)) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const buttonCount = ((0, import_node_fs.readFileSync)((0, import_node_path.join)(folder, entry.name), "utf-8").match(CODE_BUTTON_FENCE_REG_EXP) ?? []).length;
|
|
178
|
+
if (buttonCount > 0) {
|
|
179
|
+
notes.push({ buttonCount, name: relativePath });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
walk(demoVaultPath, "");
|
|
184
|
+
return notes.sort((a, b) => a.name.localeCompare(b.name, "en"));
|
|
167
185
|
}
|
|
168
186
|
function registerDemoVaultButtonSuite(options = {}) {
|
|
169
187
|
const rootFolder = options.rootFolder ?? (0, import_root.getRootFolder)() ?? import_node_process.default.cwd();
|
|
@@ -378,4 +396,4 @@ async function openNoteAndListButtonCaptions(note, settleTimeoutInMilliseconds)
|
|
|
378
396
|
listNotesWithButtons,
|
|
379
397
|
registerDemoVaultButtonSuite
|
|
380
398
|
});
|
|
381
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LWJ1dHRvbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHZpdGVzdCBzdWl0ZSB0aGF0IG9wZW5zIGV2ZXJ5IG5vdGUgb2YgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AsIGNsaWNrcyBlYWNoIGBjb2RlLWJ1dHRvbmBcbiAqIGluIGl0IGFnYWluc3QgYSByZWFsIE9ic2lkaWFuLCBhbmQgZmFpbHMgb24gYW55IGJ1dHRvbiB0aGF0IGVycm9ycyBvciBuZXZlciByZXBvcnRzIGEgcmVzdWx0LlxuICpcbiAqIEEgZGVtbyB2YXVsdCdzIGJ1dHRvbnMgYXJlIHRoZSBvbmUgcGFydCBvZiBpdCBubyBvdGhlciBnYXRlIGNhbiBjaGVjay4gYGxpbnQ6bWRgIHJlYWRzIHRoZSBtYXJrZG93bixcbiAqIHRoZSBjb3ZlcmFnZSBzdWl0ZSAoe0BsaW5rIC4vZGVtby12YXVsdC1jb3ZlcmFnZS50cyB8IGByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVgfSkgY2hlY2tzIHRoZVxuICogYXV0aG9yaW5nIGNvbnZlbnRpb25zLCBhbmQgbmVpdGhlciBleGVjdXRlcyBhbnl0aGluZyBcdTIwMTQgYSBidXR0b24gd2hvc2UgYHJlcXVpcmUoJy9kZW1vU2V0dXAudHMnKWAgcGF0aFxuICogaXMgd3JvbmcsIG9yIHRoYXQgY2FsbHMgYW4gQVBJIHRoYXQgaGFzIHNpbmNlIGNoYW5nZWQgc2hhcGUsIGZhaWxzIGF0IGNsaWNrIHRpbWUgYW5kIG5vd2hlcmUgZWxzZS5cbiAqXG4gKiBUaGUgY29tcGFuaW9uIGhhbGYgXHUyMDE0IHNlZWRpbmcgdGhlIHRlbXAgdmF1bHQgd2l0aCB0aGUgZGVtby12YXVsdCB0cmVlLCBpdHMgYC5vYnNpZGlhbmAgY29uZmlnLCBhbmQgdGhlXG4gKiBDb2RlU2NyaXB0IFRvb2xraXQgYmluYXJ5IHRoYXQgdHVybnMgYGBgYCBgYGBjb2RlLWJ1dHRvbiBgYGBgIGZlbmNlcyBpbnRvIGJ1dHRvbnMgXHUyMDE0IGlzXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgaW4gYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgOyBoYW5kIGl0cyByZXN1bHQgdG8gdGhlIHByb2plY3Qnc1xuICogYGdsb2JhbFNldHVwYCBhbmQgbmFtZSBDb2RlU2NyaXB0IFRvb2xraXQgaW4gYGVuYWJsZUNvbW11bml0eVBsdWdpbnNgLlxuICovXG5cbmltcG9ydCB7XG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuaW1wb3J0IHsgZ2V0VGVtcG9yYXJ5VmF1bHQgfSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJztcbmltcG9ydCB7XG4gIGJlZm9yZUFsbCxcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgaXRcbn0gZnJvbSAndml0ZXN0JztcblxuaW1wb3J0IHsgZ2V0Um9vdEZvbGRlciB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogQ29kZVNjcmlwdCBUb29sa2l0J3MgbWFuaWZlc3QgaWQuIEl0IGlzIHN0aWxsIHRoZSBwbHVnaW4ncyBvcmlnaW5hbCBgZml4LXJlcXVpcmUtbW9kdWxlc2AgaWQsIHdoaWNoXG4gKiBubyBsb25nZXIgbWF0Y2hlcyBpdHMgbmFtZSBcdTIwMTQgdGhlIGlkIGlzIHB1Ymxpc2hlZCwgc28gaXQgY2Fubm90IGJlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCA9ICdmaXgtcmVxdWlyZS1tb2R1bGVzJztcblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiBjbGlja2luZyBvbmUgYnV0dG9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEJ1dHRvblJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgYnV0dG9uJ3MgY2FwdGlvbiwgYXMgcmVuZGVyZWQuXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgbGluZSBDb2RlU2NyaXB0IFRvb2xraXQgcHJpbnRlZCB1bmRlciB0aGUgYnV0dG9uLCB0cnVuY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnV0dG9uIHJlcG9ydGVkIHN1Y2Nlc3MsIHJlcG9ydGVkIGFuIGVycm9yLCBvciBuZXZlciByZXBvcnRlZCBhdCBhbGwuXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6ICdlcnJvcicgfCAnb2snIHwgJ3RpbWVvdXQnIHwgJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE9uZSBkZW1vLXZhdWx0IG5vdGUgYW5kIGhvdyBtYW55IGJ1dHRvbnMgaXRzIHNvdXJjZSBkZWNsYXJlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb3RlIHtcbiAgLyoqXG4gICAqIEhvdyBtYW55IGBjb2RlLWJ1dHRvbmAgZmVuY2VzIHRoZSBub3RlJ3Mgc291cmNlIGRlY2xhcmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHtAbGluayByZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZywgaW4gbWlsbGlzZWNvbmRzLCB0byB3YWl0IGZvciBhIGNsaWNrZWQgYnV0dG9uIHRvIHJlcG9ydCBhIHJlc3VsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDE1MDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOb3RlIGZpbGUgbmFtZXMgKHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QpIHRvIHNraXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ1JFQURNRS5tZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3NpdG9yeSByb290IGhvbGRpbmcgYGRlbW8tdmF1bHQvYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHJlc29sdmVkIHJlcG8gcm9vdCwgZmFsbGluZyBiYWNrIHRvIGBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgZm9yIGEgbm90ZSdzIHByZXZpZXcgYW5kIGl0cyBidXR0b25zIHRvIG1vdW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjAwMDBgXG4gICAqL1xuICByZWFkb25seSBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHdhaXRpbmcgYnVkZ2V0cyBhIHNpbmdsZSBidXR0b24gY2xpY2sgaXMgYWxsb3dlZC5cbiAqL1xuaW50ZXJmYWNlIENsaWNrQnV0dG9uVGltZW91dHMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGNsaWNrZWQgYnV0dG9uIHRvIHJlcG9ydCBhIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgYnV0dG9uIGl0c2VsZiB0byBtb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUX0JVVFRPTl9SRVNVTFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxNV8wMDA7XG5jb25zdCBERUZBVUxUX1NFVFRMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDIwXzAwMDtcbmNvbnN0IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMTAwO1xuY29uc3QgT1VUUFVUX0VYQ0VSUFRfTEVOR1RIID0gNDAwO1xuXG4vLyBgUkVBRE1FLm1kYCBpcyB0aGUgcmVwby1mYWNpbmcgcGFnZSBHaXRIdWIgcmVuZGVycywgbm90IGEgd2Fsa3Rocm91Z2guIGAwMCBTdGFydC5tZGAgaXMgZGVsaWJlcmF0ZWx5XG4vLyBOT1QgZXhjbHVkZWQ6IHNpbmNlIFQ0NzggdGhlIGxhbmRpbmcgbm90ZXMgY2FycnkgYnV0dG9ucyBvZiB0aGVpciBvd24uXG5jb25zdCBERUZBVUxUX0VYQ0xVREVEX05PVEVTID0gWydSRUFETUUubWQnXTtcblxuY29uc3QgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKmBgYGNvZGUtYnV0dG9uL2dtO1xuXG4vLyBUaGUgcmVuZGVyZWQtYnV0dG9uIHNlbGVjdG9yIGlzIGA6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhYC4gSXQgaXMgd3JpdHRlblxuLy8gT3V0IGF0IGVhY2ggdXNlIHNpdGUgcmF0aGVyIHRoYW4gaGVsZCBpbiBhIGNvbnN0YW50IGhlcmU6IGV2ZXJ5IGNsb3N1cmUgYmVsb3cgaXMgc2VyaWFsaXplZCB3aXRoXG4vLyBgdG9TdHJpbmcoKWAgYW5kIGV2YWx1YXRlZCBpbnNpZGUgT2JzaWRpYW4sIHdoZXJlIG5vdGhpbmcgZnJvbSB0aGlzIG1vZHVsZSdzIHNjb3BlIGV4aXN0cy5cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGFzc2VydGlvbiBtZXNzYWdlIGZvciBhIG5vdGUncyBmYWlsaW5nIGJ1dHRvbnMuXG4gKlxuICogVGhlIGNhcHR1cmVkIG91dHB1dCBpcyBpbmNsdWRlZCBiZWNhdXNlIGEgYnV0dG9uJ3MgZmFpbHVyZSBpcyBhIHJ1bnRpbWUgb25lIFx1MjAxNCB0aGUgc3RhY2sgQ29kZVNjcmlwdFxuICogVG9vbGtpdCBwcmludHMgdW5kZXIgaXQgaXMgdGhlIG9ubHkgZGlhZ25vc2lzIHRoZXJlIGlzLlxuICpcbiAqIEBwYXJhbSBub3RlTmFtZSAtIFRoZSBub3RlIHRoZSBidXR0b25zIGJlbG9uZyB0by5cbiAqIEBwYXJhbSBmYWlsdXJlcyAtIFRoZSBmYWlsaW5nIGJ1dHRvbnMuXG4gKiBAcmV0dXJucyBUaGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZhaWx1cmVzKG5vdGVOYW1lOiBzdHJpbmcsIGZhaWx1cmVzOiByZWFkb25seSBEZW1vVmF1bHRCdXR0b25SZXN1bHRbXSk6IHN0cmluZyB7XG4gIGlmIChmYWlsdXJlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBkZXRhaWxzID0gZmFpbHVyZXNcbiAgICAubWFwKChmYWlsdXJlKSA9PiBgICAtIFwiJHtmYWlsdXJlLmNhcHRpb259XCIgWyR7ZmFpbHVyZS5zdGF0dXN9XTogJHtmYWlsdXJlLm91dHB1dC5yZXBsYWNlQWxsKC9cXHMrL2csICcgJykudHJpbSgpfWApXG4gICAgLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gYCR7U3RyaW5nKGZhaWx1cmVzLmxlbmd0aCl9IGJ1dHRvbihzKSBpbiAke25vdGVOYW1lfSBkaWQgbm90IHJ1biBjbGVhbmx5OlxcbiR7ZGV0YWlsc31gO1xufVxuXG4vKipcbiAqIExpc3RzIHRoZSBkZW1vIHZhdWx0J3MgdG9wLWxldmVsIG5vdGVzIHRoYXQgZGVjbGFyZSBhdCBsZWFzdCBvbmUgYGNvZGUtYnV0dG9uYC5cbiAqXG4gKiBPbmx5IHRoZSB2YXVsdCByb290IGlzIHdhbGtlZDogYE1hdGVyaWFscy9gIGhvbGRzIGZpeHR1cmVzIHRoZSB3YWxrdGhyb3VnaHMgYWN0IG9uLCBub3Qgd2Fsa3Rocm91Z2hzLlxuICpcbiAqIEBwYXJhbSBkZW1vVmF1bHRQYXRoIC0gVGhlIGRlbW8gdmF1bHQgcm9vdC5cbiAqIEBwYXJhbSBleGNsdWRlZE5vdGVzIC0gTm90ZSBmaWxlIG5hbWVzIHRvIHNraXAuXG4gKiBAcmV0dXJucyBUaGUgbm90ZXMsIHNvcnRlZCBieSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdE5vdGVzV2l0aEJ1dHRvbnMoZGVtb1ZhdWx0UGF0aDogc3RyaW5nLCBleGNsdWRlZE5vdGVzOiBSZWFkb25seVNldDxzdHJpbmc+KTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgcmV0dXJuIHJlYWRkaXJTeW5jKGRlbW9WYXVsdFBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSAmJiAhZXhjbHVkZWROb3Rlcy5oYXMoZW50cnkubmFtZSkpXG4gICAgLm1hcCgoZW50cnkpID0+IGVudHJ5Lm5hbWUpXG4gICAgLnNvcnQoKVxuICAgIC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBidXR0b25Db3VudDogKHJlYWRGaWxlU3luYyhqb2luKGRlbW9WYXVsdFBhdGgsIG5hbWUpLCAndXRmLTgnKS5tYXRjaChDT0RFX0JVVFRPTl9GRU5DRV9SRUdfRVhQKSA/PyBbXSkubGVuZ3RoLFxuICAgICAgbmFtZVxuICAgIH0pKVxuICAgIC5maWx0ZXIoKG5vdGUpID0+IG5vdGUuYnV0dG9uQ291bnQgPiAwKTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEV2ZXJ5IGFzc2VydGlvbiBiZWxvdyBydW5zIGFnYWluc3QgYSByZWFsIE9ic2lkaWFuIG92ZXIgQ0RQLCBkcml2ZW4gYnkgY2xvc3VyZXMgdGhpcyBwcm9jZXNzIHNlcmlhbGl6ZXMgYW5kIGFub3RoZXIgZXhlY3V0ZXMuIFRoZSB0ZXN0YWJsZSBwYXJ0cyBhcmUgbGlzdE5vdGVzV2l0aEJ1dHRvbnMgYW5kIGZvcm1hdEZhaWx1cmVzLCB3aGljaCBoYXZlIHRoZWlyIG93biB1bml0IHRlc3RzLiAqL1xuLyoqXG4gKiBSZWdpc3RlcnMgYSB2aXRlc3Qgc3VpdGUgdGhhdCBjbGlja3MgZXZlcnkgYGNvZGUtYnV0dG9uYCBpbiB0aGUgcmVwbydzIGRlbW8gdmF1bHQuXG4gKlxuICogT25lIGBpdGAgcGVyIG5vdGUsIGFuZCBvbmUgYGV2YWxJbk9ic2lkaWFuYCBwZXIgYnV0dG9uOiBhIHNpbmdsZSBjbG9zdXJlIHJ1bnMgYXMgb25lIENEUFxuICogYFJ1bnRpbWUuZXZhbHVhdGVgLCB3aGljaCB0aGUgaGFybmVzcyBjYXBzIGF0IDMwIHMsIHNvIGEgbm90ZSB3aXRoIGEgZG96ZW4gYnV0dG9ucyB3b3VsZCBvdGhlcndpc2VcbiAqIHRpbWUgb3V0IGFzIGEgd2hvbGUgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIHdoaWNoIGJ1dHRvbiBmYWlsZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFJlZ2lzdGVyRGVtb1ZhdWx0QnV0dG9uU3VpdGVPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVtb1ZhdWx0QnV0dG9uU3VpdGUob3B0aW9uczogUmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICBjb25zdCByb290Rm9sZGVyID0gb3B0aW9ucy5yb290Rm9sZGVyID8/IGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBkZW1vVmF1bHRQYXRoID0gam9pbihyb290Rm9sZGVyLCAnZGVtby12YXVsdCcpO1xuICBjb25zdCBleGNsdWRlZE5vdGVzID0gbmV3IFNldChvcHRpb25zLmV4Y2x1ZGVkTm90ZXMgPz8gREVGQVVMVF9FWENMVURFRF9OT1RFUyk7XG4gIGNvbnN0IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IG9wdGlvbnMuc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfU0VUVExFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICBjb25zdCBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBvcHRpb25zLmJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0JVVFRPTl9SRVNVTFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgY29uc3Qgbm90ZXMgPSBsaXN0Tm90ZXNXaXRoQnV0dG9ucyhkZW1vVmF1bHRQYXRoLCBleGNsdWRlZE5vdGVzKTtcblxuICBkZXNjcmliZSgnZGVtby12YXVsdCBidXR0b25zJywgKCkgPT4ge1xuICAgIGJlZm9yZUFsbChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpc0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkID0gYXdhaXQgY2hlY2tDb2RlU2NyaXB0VG9vbGtpdExvYWRlZChzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgLy8gV2l0aG91dCBpdCBldmVyeSBgY29kZS1idXR0b25gIGZlbmNlIHN0YXlzIGEgcGxhaW4gY29kZSBibG9jaywgc28gZXZlcnkgbm90ZSBiZWxvdyB3b3VsZCByZXBvcnRcbiAgICAgIC8vIFplcm8gYnV0dG9ucyBhbmQgcGFzcyB2YWN1b3VzbHkuIEZhaWwgaGVyZSBpbnN0ZWFkLCBvbmNlLCB3aXRoIHRoZSByZWFzb24uXG4gICAgICBleHBlY3QoaXNDb2RlU2NyaXB0VG9vbGtpdExvYWRlZCwgJ0NvZGVTY3JpcHQgVG9vbGtpdCBkaWQgbm90IGxvYWQsIHNvIG5vIGJ1dHRvbiBjb3VsZCByZW5kZXInKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gQSB2YXVsdCB3aG9zZSBub3RlcyBkZWNsYXJlIG5vIGJ1dHRvbnMgaXMgYSByZWFsIGZhaWx1cmUgb2YgRzk4J3MgaW50ZXJhY3RpdmUgaGFsZiwgbm90IGEgcmVhc29uXG4gICAgLy8gVG8gcmVnaXN0ZXIgbm90aGluZyBhbmQgcmVwb3J0IGdyZWVuLlxuICAgIGl0KCdoYXMgYXQgbGVhc3Qgb25lIG5vdGUgd2l0aCBhIGNvZGUgYnV0dG9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG5vdGVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBub3RlIG9mIG5vdGVzKSB7XG4gICAgICBpdChgcnVucyBldmVyeSBjb2RlIGJ1dHRvbiBpbiAke25vdGUubmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhcHRpb25zID0gYXdhaXQgb3Blbk5vdGVBbmRMaXN0QnV0dG9uQ2FwdGlvbnMobm90ZSwgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgLy8gUmVhZGluZyB2aWV3IG1vdW50cyBhIG5vdGUncyBsZWFkaW5nIHNlY3Rpb25zIG1vcmUgdGhhbiBvbmNlIHdoaWxlIGl0IHNldHRsZXMsIHNvIHRoZSBET00gY2FuXG4gICAgICAgIC8vIEhvbGQgc2V2ZXJhbCBlbGVtZW50cyBwZXIgZmVuY2UuIFRoZSBjYXB0aW9ucyBhcmUgZGVkdXBsaWNhdGVkLCBhbmQgdGhlIGFzc2VydGlvbiBpcyB0aGF0IGF0XG4gICAgICAgIC8vIExlYXN0IGFzIG1hbnkgRElTVElOQ1QgYnV0dG9ucyByZW5kZXJlZCBhcyB0aGUgc291cmNlIGRlY2xhcmVzIFx1MjAxNCBhIGZlbmNlIHRoYXQgc2lsZW50bHkgc3RheWVkXG4gICAgICAgIC8vIEEgcGxhaW4gY29kZSBibG9jayBpcyB0aGUgZmFpbHVyZSB0aGlzIGNhdGNoZXMuXG4gICAgICAgIGV4cGVjdChjYXB0aW9ucy5sZW5ndGgsIGAke25vdGUubmFtZX0gZGVjbGFyZXMgJHtTdHJpbmcobm90ZS5idXR0b25Db3VudCl9IGJ1dHRvbihzKSBidXQgb25seSAke1N0cmluZyhjYXB0aW9ucy5sZW5ndGgpfSByZW5kZXJlZGApXG4gICAgICAgICAgLnRvQmVHcmVhdGVyVGhhbk9yRXF1YWwobm90ZS5idXR0b25Db3VudCk7XG5cbiAgICAgICAgY29uc3QgZmFpbHVyZXM6IERlbW9WYXVsdEJ1dHRvblJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY2FwdGlvbiBvZiBjYXB0aW9ucykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWNrQnV0dG9uKG5vdGUubmFtZSwgY2FwdGlvbiwge1xuICAgICAgICAgICAgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09ICdvaycpIHtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QoZmFpbHVyZXMsIGZvcm1hdEZhaWx1cmVzKG5vdGUubmFtZSwgZmFpbHVyZXMpKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEcml2ZXMgYSByZWFsIE9ic2lkaWFuIG92ZXIgQ0RQOiB0aGUgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGhlcmUgYW5kIGV4ZWN1dGVkIGluIGFub3RoZXIgcHJvY2Vzcywgc28gaXQgY2Fubm90IGJlIGV4ZXJjaXNlZCBieSBhIHVuaXQgdGVzdC4gKi9cbi8qKlxuICogVHVybnMgcmVzdHJpY3RlZCBtb2RlIG9mZiBhbmQgZW5hYmxlcyBDb2RlU2NyaXB0IFRvb2xraXQsIHdob3NlIGJpbmFyeSB0aGUgZ2xvYmFsIHNldHVwIHNlZWRlZC5cbiAqXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gSG93IGxvbmcgdG8gd2FpdCBmb3IgaXQgdG8gbG9hZC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgQ29kZVNjcmlwdCBUb29sa2l0IGlzIGxvYWRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tDb2RlU2NyaXB0VG9vbGtpdExvYWRlZCh0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gZXZhbEluT2JzaWRpYW4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkLCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLCBsaWI6IHsgd2FpdFVudGlsIH0sIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dCB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBpZiAodHlwZW9mIGFwcC5wbHVnaW5zLmlzRW5hYmxlZCA9PT0gJ2Z1bmN0aW9uJyAmJiAhYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuc2V0RW5hYmxlKHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFhcHAucGx1Z2lucy5nZXRQbHVnaW4oY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZCkpIHtcbiAgICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luKGNvZGVTY3JpcHRUb29sa2l0UGx1Z2luSWQpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKHtcbiAgICAgICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIG1lc3NhZ2U6ICdDb2RlU2NyaXB0IFRvb2xraXQgbmV2ZXIgbG9hZGVkJyxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IGFwcC5wbHVnaW5zLmdldFBsdWdpbihjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkKSAhPT0gbnVsbCxcbiAgICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRpbWVvdXRcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZDogQ09ERV9TQ1JJUFRfVE9PTEtJVF9QTFVHSU5fSUQsXG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzOiBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEcml2ZXMgYSByZWFsIE9ic2lkaWFuIG92ZXIgQ0RQOiB0aGUgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGhlcmUgYW5kIGV4ZWN1dGVkIGluIGFub3RoZXIgcHJvY2Vzcywgc28gaXQgY2Fubm90IGJlIGV4ZXJjaXNlZCBieSBhIHVuaXQgdGVzdC4gKi9cbi8qKlxuICogQ2xpY2tzIG9uZSBidXR0b24gYW5kIHJlYWRzIHRoZSByZXN1bHQgbGluZSBDb2RlU2NyaXB0IFRvb2xraXQgd3JpdGVzIHVuZGVyIGl0LlxuICpcbiAqIEEgYnV0dG9uIHRoYXQgcmUtcmVuZGVycyBpdHMgb3duIG5vdGUgKGEgc2V0dGluZ3MgY2hhbmdlLCBhIHJlbG9hZCkgZGV0YWNoZXMgdGhlIGJsb2NrIGl0IGxpdmVzIGluLFxuICogc28gdGhlIGJsb2NrIGVsZW1lbnQgaXMgY2FwdHVyZWQgQkVGT1JFIHRoZSBjbGljayBhbmQgcmVhZCBhZnRlcndhcmRzIFx1MjAxNCBDb2RlU2NyaXB0IFRvb2xraXQgd3JpdGVzIHRoZVxuICogcmVzdWx0IGludG8gdGhhdCBzYW1lIGVsZW1lbnQgZXZlbiBvbmNlIGl0IGlzIGRldGFjaGVkLlxuICpcbiAqIEBwYXJhbSBub3RlUGF0aCAtIFRoZSBub3RlIGhvbGRpbmcgdGhlIGJ1dHRvbi5cbiAqIEBwYXJhbSBidXR0b25DYXB0aW9uIC0gVGhlIGJ1dHRvbidzIHJlbmRlcmVkIGNhcHRpb24sIHdoaWNoIGlzIGhvdyBpdCBpcyBhZGRyZXNzZWQuXG4gKiBAcGFyYW0gdGltZW91dHMgLSBUaGUgcmVuZGVyIGFuZCByZXN1bHQgYnVkZ2V0cy5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRGVtb1ZhdWx0QnV0dG9uUmVzdWx0fS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xpY2tCdXR0b24oXG4gIG5vdGVQYXRoOiBzdHJpbmcsXG4gIGJ1dHRvbkNhcHRpb246IHN0cmluZyxcbiAgdGltZW91dHM6IENsaWNrQnV0dG9uVGltZW91dHNcbik6IFByb21pc2U8RGVtb1ZhdWx0QnV0dG9uUmVzdWx0PiB7XG4gIHJldHVybiBldmFsSW5PYnNpZGlhbih7XG4gICAgYXN5bmMgY2FsbGJhY2soe1xuICAgICAgYXBwLFxuICAgICAgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgY2FwdGlvbixcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICBsaWI6IHsgd2FpdFVudGlsIH0sXG4gICAgICBub3RlUGF0aDogbm90ZVBhdGhUb09wZW4sXG4gICAgICBvYnNpZGlhbk1vZHVsZSxcbiAgICAgIG91dHB1dEV4Y2VycHRMZW5ndGgsXG4gICAgICBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KTogUHJvbWlzZTxEZW1vVmF1bHRCdXR0b25SZXN1bHQ+IHtcbiAgICAgIGZ1bmN0aW9uIHZpZXcoKTogSW5zdGFuY2VUeXBlPHR5cGVvZiBvYnNpZGlhbk1vZHVsZS5NYXJrZG93blZpZXc+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUob2JzaWRpYW5Nb2R1bGUuTWFya2Rvd25WaWV3KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHByZXZpZXdFbCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdmlldygpPy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignOnNjb3BlIC5tYXJrZG93bi1wcmV2aWV3LXZpZXcnKSA/PyBudWxsO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnV0dG9ucygpOiBIVE1MQnV0dG9uRWxlbWVudFtdIHtcbiAgICAgICAgcmV0dXJuIFsuLi52aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCc6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhJykgPz8gW11dO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmaW5kQnV0dG9uKCk6IEhUTUxCdXR0b25FbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGJ1dHRvbnMoKS5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50ZXh0Q29udGVudCA9PT0gY2FwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWRpbmcgdmlldyBtb3VudHMgbGF6aWx5IGFuZCB1bm1vdW50cyBzZWN0aW9ucyBmYXIgb2ZmLXNjcmVlbiwgc28gTk8gc2luZ2xlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgLy8gSG9sZHMgYSB3aG9sZSBub3RlJ3MgYnV0dG9ucy4gQWR2YW5jZSBhIHZpZXdwb3J0IGF0IGEgdGltZSBhbmQgd3JhcCBiYWNrIHRvIHRoZSB0b3AsIHJlbW91bnRpbmdcbiAgICAgIC8vIEV2ZXJ5IHNlY3Rpb24gaW4gdHVybiB1bnRpbCB0aGUgb25lIGJlaW5nIGxvb2tlZCBmb3IgYXBwZWFycy4gUGlubmluZyB0byB0aGUgQk9UVE9NIGluc3RlYWQgXHUyMDE0XG4gICAgICAvLyBXaGF0IHRoaXMgZGlkIHVudGlsIDk0LjQuMSBcdTIwMTQgb25seSBldmVyIG1vdW50cyB0aGUgbm90ZSdzIHRhaWwsIHNvIGEgYnV0dG9uIGFueXdoZXJlIGJ1dCBhdCB0aGVcbiAgICAgIC8vIEVuZCBvZiBpdHMgbm90ZSB3YXMgcmVwb3J0ZWQgYXMgbmV2ZXIgcmVuZGVyZWQgKGBzdGF0dXM6ICd0aW1lb3V0J2AsIGVtcHR5IG91dHB1dCkgaG93ZXZlclxuICAgICAgLy8gSGVhbHRoeSBpdCB3YXMuXG4gICAgICBjb25zdCBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRV9JTl9QSVhFTFMgPSA0O1xuICAgICAgY29uc3QgU0NST0xMX1NURVBfUkFUSU8gPSAwLjg7XG4gICAgICBmdW5jdGlvbiBhZHZhbmNlU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JvbGxlciA9IHByZXZpZXdFbCgpO1xuICAgICAgICBpZiAoIXNjcm9sbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQXRCb3R0b20gPSBzY3JvbGxlci5zY3JvbGxUb3AgKyBzY3JvbGxlci5jbGllbnRIZWlnaHQgPj0gc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0VfSU5fUElYRUxTO1xuICAgICAgICBzY3JvbGxlci5zY3JvbGxUb3AgPSBpc0F0Qm90dG9tID8gMCA6IHNjcm9sbGVyLnNjcm9sbFRvcCArIE1hdGguZmxvb3Ioc2Nyb2xsZXIuY2xpZW50SGVpZ2h0ICogU0NST0xMX1NURVBfUkFUSU8pO1xuICAgICAgfVxuXG4gICAgICAvLyBSZS1vcGVuIHRoZSBub3RlIGJlZm9yZSBldmVyeSBjbGljayBpbnN0ZWFkIG9mIGFzc3VtaW5nIHRoZSBwcmV2aW91cyBidXR0b24gbGVmdCB0aGUgd29ya3NwYWNlXG4gICAgICAvLyBXaGVyZSBpdCB3YXMgZm91bmQuIEV2ZXJ5IGhlbHBlciBhYm92ZSByZWFkcyB0aGUgQUNUSVZFIHZpZXcsIGFuZCBvcGVuaW5nIGEgbm90ZSBpcyBvbmUgb2YgdGhlXG4gICAgICAvLyBNb3N0IG9yZGluYXJ5IHRoaW5ncyBhIGRlbW8gYnV0dG9uIGRvZXMgXHUyMDE0IHNvIHRoZSBmaXJzdCBzdWNoIGJ1dHRvbiB3b3VsZCBvdGhlcndpc2Ugc2VuZCBlYWNoXG4gICAgICAvLyBMYXRlciBidXR0b24gaW4gaXRzIG5vdGUgdG8gYHN0YXR1czogJ3RpbWVvdXQnYCB3aXRoIGFuIGVtcHR5IG91dHB1dCwgd2hpY2ggaXMgdGhlIHNoYXBlIG9mIGFcbiAgICAgIC8vIEJ1dHRvbiB0aGF0IG5ldmVyIHJlbmRlcmVkIHJhdGhlciB0aGFuIG9uZSB0aGF0IHdhcyBsb29rZWQgZm9yIGluIHRoZSB3cm9uZyB2aWV3LlxuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobm90ZVBhdGhUb09wZW4ucmVwbGFjZSgvXFwubWQkLywgJycpLCAnJywgZmFsc2UpO1xuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoeyBzdGF0ZTogeyBmaWxlOiBub3RlUGF0aFRvT3BlbiwgbW9kZTogJ3ByZXZpZXcnIH0sIHR5cGU6ICdtYXJrZG93bicgfSk7XG5cbiAgICAgIC8vIEhlbGQgZnJvbSB0aGUgcHJlZGljYXRlIHJhdGhlciB0aGFuIHJlLXF1ZXJpZWQgYWZ0ZXIgaXQ6IHRoZSB3YWxrIGFib3ZlIGtlZXBzIG1vdmluZyB0aGVcbiAgICAgIC8vIFZpZXdwb3J0LCBzbyBhIGJ1dHRvbiBmb3VuZCBvbiBvbmUgcG9sbCBjYW4gYmUgdW5tb3VudGVkIGFnYWluIGJ5IHRoZSBuZXh0LlxuICAgICAgbGV0IGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgbWVzc2FnZTogYGNvZGUgYnV0dG9uIFwiJHtjYXB0aW9ufVwiIG5ldmVyIHJlbmRlcmVkYCxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGFkdmFuY2VTY3JvbGwoKTtcbiAgICAgICAgICAgIGJ1dHRvbiA9IGZpbmRCdXR0b24oKTtcbiAgICAgICAgICAgIHJldHVybiBidXR0b24gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7IGNhcHRpb24sIG91dHB1dDogJycsIHN0YXR1czogJ3RpbWVvdXQnIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghYnV0dG9uKSB7XG4gICAgICAgIHJldHVybiB7IGNhcHRpb24sIG91dHB1dDogJycsIHN0YXR1czogJ3RpbWVvdXQnIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsb2NrID0gYnV0dG9uLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24nKSA/PyBidXR0b24ucGFyZW50RWxlbWVudDtcbiAgICAgIGJ1dHRvbi5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgYnV0dG9uLmNsaWNrKCk7XG5cbiAgICAgIGxldCBzdGF0dXM6IERlbW9WYXVsdEJ1dHRvblJlc3VsdFsnc3RhdHVzJ107XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgbWVzc2FnZTogYGJ1dHRvbiBcIiR7Y2FwdGlvbn1cIiBuZXZlciByZXBvcnRlZCBhIHJlc3VsdGAsXG4gICAgICAgICAgcHJlZGljYXRlOiAoKTogYm9vbGVhbiA9PiAvRXhlY3V0ZWQgKD86c3VjY2Vzc2Z1bGx5fHdpdGggZXJyb3IpLy50ZXN0KGJsb2NrPy50ZXh0Q29udGVudCA/PyAnJyksXG4gICAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBibG9jaz8udGV4dENvbnRlbnQgPz8gJyc7XG4gICAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdFeGVjdXRlZCB3aXRoIGVycm9yJykpIHtcbiAgICAgICAgICBzdGF0dXMgPSAnZXJyb3InO1xuICAgICAgICB9IGVsc2UgaWYgKHRleHQuaW5jbHVkZXMoJ0V4ZWN1dGVkIHN1Y2Nlc3NmdWxseScpKSB7XG4gICAgICAgICAgc3RhdHVzID0gJ29rJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0dXMgPSAndW5rbm93bic7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzdGF0dXMgPSAndGltZW91dCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGNhcHRpb24sIG91dHB1dDogKGJsb2NrPy50ZXh0Q29udGVudCA/PyAnJykuc2xpY2UoMCwgb3V0cHV0RXhjZXJwdExlbmd0aCksIHN0YXR1cyB9O1xuICAgIH0sXG4gICAgaW5wdXQ6IHtcbiAgICAgIGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dHMuYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgY2FwdGlvbjogYnV0dG9uQ2FwdGlvbixcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHM6IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbm90ZVBhdGgsXG4gICAgICBvdXRwdXRFeGNlcnB0TGVuZ3RoOiBPVVRQVVRfRVhDRVJQVF9MRU5HVEgsXG4gICAgICBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHRpbWVvdXRzLnNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgYSBub3RlIGluIHJlYWRpbmcgdmlldyBhbmQgbGlzdHMgdGhlIGNhcHRpb25zIG9mIHRoZSBidXR0b25zIHRoYXQgbW91bnRlZCwgZGVkdXBsaWNhdGVkIGFuZCBpblxuICogZG9jdW1lbnQgb3JkZXIuXG4gKlxuICogVHdvIHF1aXJrcyBvZiByZWFkaW5nIHZpZXcgc2hhcGUgdGhpcy4gSXQgcmVuZGVycyBsYXppbHkgYW5kIHVubW91bnRzIHNlY3Rpb25zIGZhciBvZmYtc2NyZWVuLCBzbyBub1xuICogc2luZ2xlIHNjcm9sbCBwb3NpdGlvbiBob2xkcyBhIHdob2xlIG5vdGUncyBidXR0b25zIFx1MjAxNCB0aGUgcHJldmlldyBpcyB3YWxrZWQgdG9wIHRvIGJvdHRvbSBhbmQgYmFja1xuICogd2hpbGUgd2FpdGluZywgYW5kIHRoZSBjYXB0aW9ucyBzZWVuIGFsb25nIHRoZSB3YXkgYXJlIEFDQ1VNVUxBVEVEIHJhdGhlciB0aGFuIHJlYWQgb25jZSBhdCB0aGUgZW5kLlxuICogQW5kIHdoaWxlIGl0IHNldHRsZXMgaXQgY2FuIGhvbGQgU0VWRVJBTCBlbGVtZW50cyBwZXIgZmVuY2UgXHUyMDE0IHRoZSBzYW1lIGJ1dHRvbiB3YXMgb2JzZXJ2ZWQgcmVuZGVyZWRcbiAqIHR3aWNlIFx1MjAxNCBzbyB0aGUgY2FwdGlvbnMgYXJlIGRlZHVwbGljYXRlZDsgY2xpY2tpbmcgYnkgY2FwdGlvbiB0aGVuIGFkZHJlc3NlcyBlYWNoIGJ1dHRvbiBvbmNlIGhvd2V2ZXJcbiAqIG1hbnkgY29waWVzIG9mIGl0IHRoZSBET00gaXMgaG9sZGluZy5cbiAqXG4gKiBAcGFyYW0gbm90ZSAtIFRoZSBub3RlIHRvIG9wZW4uXG4gKiBAcGFyYW0gc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzIC0gSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGJ1dHRvbnMgdG8gbW91bnQuXG4gKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgYnV0dG9uIGNhcHRpb25zLlxuICovXG5hc3luYyBmdW5jdGlvbiBvcGVuTm90ZUFuZExpc3RCdXR0b25DYXB0aW9ucyhub3RlOiBEZW1vVmF1bHROb3RlLCBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIGV2YWxJbk9ic2lkaWFuKHtcbiAgICBhc3luYyBjYWxsYmFjayh7IGFwcCwgZXhwZWN0ZWRCdXR0b25Db3VudCwgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcywgbGliOiB7IHdhaXRVbnRpbCB9LCBub3RlUGF0aCwgb2JzaWRpYW5Nb2R1bGUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgZnVuY3Rpb24gdmlldygpOiBJbnN0YW5jZVR5cGU8dHlwZW9mIG9ic2lkaWFuTW9kdWxlLk1hcmtkb3duVmlldz4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShvYnNpZGlhbk1vZHVsZS5NYXJrZG93blZpZXcpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcHJldmlld0VsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB2aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgLm1hcmtkb3duLXByZXZpZXctdmlldycpID8/IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBBY2N1bXVsYXRlZCBhY3Jvc3MgdGhlIHdhbGsgYmVsb3csIG5ldmVyIHJlYWQgZnJvbSBvbmUgc25hcHNob3Q6IHdpdGggdGhlIHZpZXdwb3J0IG1vdmluZywgYW55XG4gICAgICAvLyBTaW5nbGUgcmVhZGluZyBob2xkcyBvbmx5IHRoZSBzZWN0aW9ucyBjdXJyZW50bHkgbW91bnRlZC5cbiAgICAgIGNvbnN0IHNlZW5DYXB0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZnVuY3Rpb24gY2FwdGlvbnMoKTogc3RyaW5nW10ge1xuICAgICAgICBmb3IgKGNvbnN0IGJ1dHRvbiBvZiB2aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCc6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhJykgPz8gW10pIHtcbiAgICAgICAgICBpZiAoYnV0dG9uLnRleHRDb250ZW50ICE9PSAnJykge1xuICAgICAgICAgICAgc2VlbkNhcHRpb25zLmFkZChidXR0b24udGV4dENvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLnNlZW5DYXB0aW9uc107XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbWUgd2FsayBhcyBgY2xpY2tCdXR0b25gLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogYSBub3RlIHdob3NlIGJ1dHRvbnMgYXJlIGluIHRoZSBNSURETEVcbiAgICAgIC8vIE5ldmVyIG1vdW50cyB0aGVtIGlmIHRoZSBwcmV2aWV3IGlzIHBpbm5lZCB0byB0aGUgYm90dG9tLlxuICAgICAgY29uc3QgU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0VfSU5fUElYRUxTID0gNDtcbiAgICAgIGNvbnN0IFNDUk9MTF9TVEVQX1JBVElPID0gMC44O1xuICAgICAgZnVuY3Rpb24gYWR2YW5jZVNjcm9sbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBwcmV2aWV3RWwoKTtcbiAgICAgICAgaWYgKCFzY3JvbGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0F0Qm90dG9tID0gc2Nyb2xsZXIuc2Nyb2xsVG9wICsgc2Nyb2xsZXIuY2xpZW50SGVpZ2h0ID49IHNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIFNDUk9MTF9CT1RUT01fVE9MRVJBTkNFX0lOX1BJWEVMUztcbiAgICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG9wID0gaXNBdEJvdHRvbSA/IDAgOiBzY3JvbGxlci5zY3JvbGxUb3AgKyBNYXRoLmZsb29yKHNjcm9sbGVyLmNsaWVudEhlaWdodCAqIFNDUk9MTF9TVEVQX1JBVElPKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobm90ZVBhdGgucmVwbGFjZSgvXFwubWQkLywgJycpLCAnJywgZmFsc2UpO1xuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoeyBzdGF0ZTogeyBmaWxlOiBub3RlUGF0aCwgbW9kZTogJ3ByZXZpZXcnIH0sIHR5cGU6ICdtYXJrZG93bicgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBtZXNzYWdlOiBgXCIke25vdGVQYXRofVwiIG5ldmVyIG1vdW50ZWQgYWxsICR7U3RyaW5nKGV4cGVjdGVkQnV0dG9uQ291bnQpfSBvZiBpdHMgYnV0dG9uc2AsXG4gICAgICAgICAgcHJlZGljYXRlOiAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICBhZHZhbmNlU2Nyb2xsKCk7XG4gICAgICAgICAgICByZXR1cm4gY2FwdGlvbnMoKS5sZW5ndGggPj0gZXhwZWN0ZWRCdXR0b25Db3VudDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgY2FwdGlvbnMgYXJlIHJldHVybmVkIGVpdGhlciB3YXk7IHRoZSBjYWxsZXIgYXNzZXJ0cyBvbiB0aGVtIGFuZCByZXBvcnRzIHRoZSBzaG9ydGZhbGwuXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYXB0aW9ucygpO1xuICAgIH0sXG4gICAgaW5wdXQ6IHtcbiAgICAgIGV4cGVjdGVkQnV0dG9uQ291bnQ6IG5vdGUuYnV0dG9uQ291bnQsXG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzOiBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG5vdGVQYXRoOiBub3RlLm5hbWUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpQkEscUJBR087QUFDUCx1QkFBcUI7QUFDckIsMEJBQW9CO0FBQ3BCLDBDQUErQjtBQUMvQix3Q0FBa0M7QUFDbEMsb0JBS087QUFFUCxrQkFBOEI7QUFNdkIsTUFBTSxnQ0FBZ0M7QUFxRjdDLE1BQU0sZ0RBQWdEO0FBQ3RELE1BQU0seUNBQXlDO0FBQy9DLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sd0JBQXdCO0FBSTlCLE1BQU0seUJBQXlCLENBQUMsV0FBVztBQUUzQyxNQUFNLDRCQUE0QjtBQWdCM0IsU0FBUyxlQUFlLFVBQWtCLFVBQW9EO0FBQ25HLE1BQUksU0FBUyxXQUFXLEdBQUc7QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFVBQVUsU0FDYixJQUFJLENBQUMsWUFBWSxRQUFRLFFBQVEsT0FBTyxNQUFNLFFBQVEsTUFBTSxNQUFNLFFBQVEsT0FBTyxXQUFXLFFBQVEsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQ2pILEtBQUssSUFBSTtBQUNaLFNBQU8s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
|
|
399
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LWJ1dHRvbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHZpdGVzdCBzdWl0ZSB0aGF0IG9wZW5zIGV2ZXJ5IG5vdGUgb2YgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AsIGNsaWNrcyBlYWNoIGBjb2RlLWJ1dHRvbmBcbiAqIGluIGl0IGFnYWluc3QgYSByZWFsIE9ic2lkaWFuLCBhbmQgZmFpbHMgb24gYW55IGJ1dHRvbiB0aGF0IGVycm9ycyBvciBuZXZlciByZXBvcnRzIGEgcmVzdWx0LlxuICpcbiAqIEEgZGVtbyB2YXVsdCdzIGJ1dHRvbnMgYXJlIHRoZSBvbmUgcGFydCBvZiBpdCBubyBvdGhlciBnYXRlIGNhbiBjaGVjay4gYGxpbnQ6bWRgIHJlYWRzIHRoZSBtYXJrZG93bixcbiAqIHRoZSBjb3ZlcmFnZSBzdWl0ZSAoe0BsaW5rIC4vZGVtby12YXVsdC1jb3ZlcmFnZS50cyB8IGByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVgfSkgY2hlY2tzIHRoZVxuICogYXV0aG9yaW5nIGNvbnZlbnRpb25zLCBhbmQgbmVpdGhlciBleGVjdXRlcyBhbnl0aGluZyBcdTIwMTQgYSBidXR0b24gd2hvc2UgYHJlcXVpcmUoJy9kZW1vU2V0dXAudHMnKWAgcGF0aFxuICogaXMgd3JvbmcsIG9yIHRoYXQgY2FsbHMgYW4gQVBJIHRoYXQgaGFzIHNpbmNlIGNoYW5nZWQgc2hhcGUsIGZhaWxzIGF0IGNsaWNrIHRpbWUgYW5kIG5vd2hlcmUgZWxzZS5cbiAqXG4gKiBUaGUgY29tcGFuaW9uIGhhbGYgXHUyMDE0IHNlZWRpbmcgdGhlIHRlbXAgdmF1bHQgd2l0aCB0aGUgZGVtby12YXVsdCB0cmVlLCBpdHMgYC5vYnNpZGlhbmAgY29uZmlnLCBhbmQgdGhlXG4gKiBDb2RlU2NyaXB0IFRvb2xraXQgYmluYXJ5IHRoYXQgdHVybnMgYGBgYCBgYGBjb2RlLWJ1dHRvbiBgYGBgIGZlbmNlcyBpbnRvIGJ1dHRvbnMgXHUyMDE0IGlzXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgaW4gYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgOyBoYW5kIGl0cyByZXN1bHQgdG8gdGhlIHByb2plY3Qnc1xuICogYGdsb2JhbFNldHVwYCBhbmQgbmFtZSBDb2RlU2NyaXB0IFRvb2xraXQgaW4gYGVuYWJsZUNvbW11bml0eVBsdWdpbnNgLlxuICovXG5cbmltcG9ydCB7XG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuaW1wb3J0IHsgZ2V0VGVtcG9yYXJ5VmF1bHQgfSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJztcbmltcG9ydCB7XG4gIGJlZm9yZUFsbCxcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgaXRcbn0gZnJvbSAndml0ZXN0JztcblxuaW1wb3J0IHsgZ2V0Um9vdEZvbGRlciB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogQ29kZVNjcmlwdCBUb29sa2l0J3MgbWFuaWZlc3QgaWQuIEl0IGlzIHN0aWxsIHRoZSBwbHVnaW4ncyBvcmlnaW5hbCBgZml4LXJlcXVpcmUtbW9kdWxlc2AgaWQsIHdoaWNoXG4gKiBubyBsb25nZXIgbWF0Y2hlcyBpdHMgbmFtZSBcdTIwMTQgdGhlIGlkIGlzIHB1Ymxpc2hlZCwgc28gaXQgY2Fubm90IGJlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCA9ICdmaXgtcmVxdWlyZS1tb2R1bGVzJztcblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiBjbGlja2luZyBvbmUgYnV0dG9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEJ1dHRvblJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgYnV0dG9uJ3MgY2FwdGlvbiwgYXMgcmVuZGVyZWQuXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgbGluZSBDb2RlU2NyaXB0IFRvb2xraXQgcHJpbnRlZCB1bmRlciB0aGUgYnV0dG9uLCB0cnVuY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnV0dG9uIHJlcG9ydGVkIHN1Y2Nlc3MsIHJlcG9ydGVkIGFuIGVycm9yLCBvciBuZXZlciByZXBvcnRlZCBhdCBhbGwuXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6ICdlcnJvcicgfCAnb2snIHwgJ3RpbWVvdXQnIHwgJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE9uZSBkZW1vLXZhdWx0IG5vdGUgYW5kIGhvdyBtYW55IGJ1dHRvbnMgaXRzIHNvdXJjZSBkZWNsYXJlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb3RlIHtcbiAgLyoqXG4gICAqIEhvdyBtYW55IGBjb2RlLWJ1dHRvbmAgZmVuY2VzIHRoZSBub3RlJ3Mgc291cmNlIGRlY2xhcmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHtAbGluayByZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZywgaW4gbWlsbGlzZWNvbmRzLCB0byB3YWl0IGZvciBhIGNsaWNrZWQgYnV0dG9uIHRvIHJlcG9ydCBhIHJlc3VsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDE1MDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOb3RlIGZpbGUgbmFtZXMgKHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QpIHRvIHNraXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ1JFQURNRS5tZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3NpdG9yeSByb290IGhvbGRpbmcgYGRlbW8tdmF1bHQvYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHJlc29sdmVkIHJlcG8gcm9vdCwgZmFsbGluZyBiYWNrIHRvIGBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgZm9yIGEgbm90ZSdzIHByZXZpZXcgYW5kIGl0cyBidXR0b25zIHRvIG1vdW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjAwMDBgXG4gICAqL1xuICByZWFkb25seSBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHdhaXRpbmcgYnVkZ2V0cyBhIHNpbmdsZSBidXR0b24gY2xpY2sgaXMgYWxsb3dlZC5cbiAqL1xuaW50ZXJmYWNlIENsaWNrQnV0dG9uVGltZW91dHMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGNsaWNrZWQgYnV0dG9uIHRvIHJlcG9ydCBhIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgYnV0dG9uIGl0c2VsZiB0byBtb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUX0JVVFRPTl9SRVNVTFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxNV8wMDA7XG5jb25zdCBERUZBVUxUX1NFVFRMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDIwXzAwMDtcbmNvbnN0IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMTAwO1xuY29uc3QgT1VUUFVUX0VYQ0VSUFRfTEVOR1RIID0gNDAwO1xuXG4vLyBgUkVBRE1FLm1kYCBpcyB0aGUgcmVwby1mYWNpbmcgcGFnZSBHaXRIdWIgcmVuZGVycywgbm90IGEgd2Fsa3Rocm91Z2guIGAwMCBTdGFydC5tZGAgaXMgZGVsaWJlcmF0ZWx5XG4vLyBOT1QgZXhjbHVkZWQ6IHNpbmNlIFQ0NzggdGhlIGxhbmRpbmcgbm90ZXMgY2FycnkgYnV0dG9ucyBvZiB0aGVpciBvd24uXG5jb25zdCBERUZBVUxUX0VYQ0xVREVEX05PVEVTID0gWydSRUFETUUubWQnXTtcblxuY29uc3QgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKmBgYGNvZGUtYnV0dG9uL2dtO1xuXG4vLyBUaGUgcmVuZGVyZWQtYnV0dG9uIHNlbGVjdG9yIGlzIGA6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhYC4gSXQgaXMgd3JpdHRlblxuLy8gT3V0IGF0IGVhY2ggdXNlIHNpdGUgcmF0aGVyIHRoYW4gaGVsZCBpbiBhIGNvbnN0YW50IGhlcmU6IGV2ZXJ5IGNsb3N1cmUgYmVsb3cgaXMgc2VyaWFsaXplZCB3aXRoXG4vLyBgdG9TdHJpbmcoKWAgYW5kIGV2YWx1YXRlZCBpbnNpZGUgT2JzaWRpYW4sIHdoZXJlIG5vdGhpbmcgZnJvbSB0aGlzIG1vZHVsZSdzIHNjb3BlIGV4aXN0cy5cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGFzc2VydGlvbiBtZXNzYWdlIGZvciBhIG5vdGUncyBmYWlsaW5nIGJ1dHRvbnMuXG4gKlxuICogVGhlIGNhcHR1cmVkIG91dHB1dCBpcyBpbmNsdWRlZCBiZWNhdXNlIGEgYnV0dG9uJ3MgZmFpbHVyZSBpcyBhIHJ1bnRpbWUgb25lIFx1MjAxNCB0aGUgc3RhY2sgQ29kZVNjcmlwdFxuICogVG9vbGtpdCBwcmludHMgdW5kZXIgaXQgaXMgdGhlIG9ubHkgZGlhZ25vc2lzIHRoZXJlIGlzLlxuICpcbiAqIEBwYXJhbSBub3RlTmFtZSAtIFRoZSBub3RlIHRoZSBidXR0b25zIGJlbG9uZyB0by5cbiAqIEBwYXJhbSBmYWlsdXJlcyAtIFRoZSBmYWlsaW5nIGJ1dHRvbnMuXG4gKiBAcmV0dXJucyBUaGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZhaWx1cmVzKG5vdGVOYW1lOiBzdHJpbmcsIGZhaWx1cmVzOiByZWFkb25seSBEZW1vVmF1bHRCdXR0b25SZXN1bHRbXSk6IHN0cmluZyB7XG4gIGlmIChmYWlsdXJlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBkZXRhaWxzID0gZmFpbHVyZXNcbiAgICAubWFwKChmYWlsdXJlKSA9PiBgICAtIFwiJHtmYWlsdXJlLmNhcHRpb259XCIgWyR7ZmFpbHVyZS5zdGF0dXN9XTogJHtmYWlsdXJlLm91dHB1dC5yZXBsYWNlQWxsKC9cXHMrL2csICcgJykudHJpbSgpfWApXG4gICAgLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gYCR7U3RyaW5nKGZhaWx1cmVzLmxlbmd0aCl9IGJ1dHRvbihzKSBpbiAke25vdGVOYW1lfSBkaWQgbm90IHJ1biBjbGVhbmx5OlxcbiR7ZGV0YWlsc31gO1xufVxuXG4vKipcbiAqIEZvbGRlcnMgdGhhdCBuZXZlciBob2xkIGEgd2Fsa3Rocm91Z2guIGBNYXRlcmlhbHMvYCBob2xkcyB0aGUgZml4dHVyZXMgdGhlIHdhbGt0aHJvdWdocyBhY3Qgb247XG4gKiBgX2Fzc2V0cy9gIGhvbGRzIHRoZSBkZW1vIHNjcmlwdHM7IGAub2JzaWRpYW4vYCBpcyB2YXVsdCBjb25maWcuIEEgZm9sZGVyIHN0YXJ0aW5nIHdpdGggYC5gIG9yIGBfYFxuICogaXMgc2tpcHBlZCBvbiB0aGUgc2FtZSByZWFzb25pbmcsIHdpdGhvdXQgaGF2aW5nIHRvIGJlIGxpc3RlZC5cbiAqL1xuY29uc3QgTk9OX1dBTEtUSFJPVUdIX0ZPTERFUlMgPSBuZXcgU2V0KFsnTWF0ZXJpYWxzJ10pO1xuXG4vKipcbiAqIExpc3RzIHRoZSBkZW1vIHZhdWx0J3Mgbm90ZXMgdGhhdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSBgY29kZS1idXR0b25gLCB3YWxraW5nIGdyb3VwIGZvbGRlcnMgdG9vLlxuICpcbiAqIEEgdmF1bHQgYmlnIGVub3VnaCB0byBuZWVkIGdyb3VwaW5nIHB1dHMgaXRzIHdhbGt0aHJvdWdocyBpbiBudW1iZXJlZCBmb2xkZXJzIFx1MjAxNCBhbmQgYSByb290LW9ubHkgd2Fsa1xuICogZmluZHMgTk9ORSBvZiB0aGVtLCB3aGljaCBpcyB3b3JzZSB0aGFuIGl0IHNvdW5kczogYSB2YXVsdCB3aG9zZSBub3RlcyBhcmUgYWxsIGdyb3VwZWQgcmVwb3J0cyB6ZXJvXG4gKiBub3RlcywgYW5kIG9uZSB0aGF0IGlzIHBhcnRseSBncm91cGVkIHNpbGVudGx5IGdhdGVzIG9ubHkgdGhlIHVuZ3JvdXBlZCBwYXJ0LiBGaXh0dXJlIGFuZCBhc3NldFxuICogZm9sZGVycyBhcmUgc3RpbGwgc2tpcHBlZCwgc28gd2hhdCBpcyB3YWxrZWQgaXMgd2Fsa3Rocm91Z2hzIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogQHBhcmFtIGRlbW9WYXVsdFBhdGggLSBUaGUgZGVtbyB2YXVsdCByb290LlxuICogQHBhcmFtIGV4Y2x1ZGVkTm90ZXMgLSBOb3RlIG5hbWVzIHRvIHNraXAsIG1hdGNoZWQgYWdhaW5zdCBib3RoIHRoZSBmaWxlIG5hbWUgYW5kIHRoZSBwYXRoIHJlbGF0aXZlXG4gKiB0byB0aGUgdmF1bHQgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBub3Rlcywgc29ydGVkIGJ5IHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Tm90ZXNXaXRoQnV0dG9ucyhkZW1vVmF1bHRQYXRoOiBzdHJpbmcsIGV4Y2x1ZGVkTm90ZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBEZW1vVmF1bHROb3RlW10ge1xuICBjb25zdCBub3RlczogRGVtb1ZhdWx0Tm90ZVtdID0gW107XG5cbiAgZnVuY3Rpb24gd2Fsayhmb2xkZXI6IHN0cmluZywgcmVsYXRpdmVGb2xkZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlRm9sZGVyID09PSAnJyA/IGVudHJ5Lm5hbWUgOiBgJHtyZWxhdGl2ZUZvbGRlcn0vJHtlbnRyeS5uYW1lfWA7XG5cbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmICghZW50cnkubmFtZS5zdGFydHNXaXRoKCcuJykgJiYgIWVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnXycpICYmICFOT05fV0FMS1RIUk9VR0hfRk9MREVSUy5oYXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgICB3YWxrKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSB8fCBleGNsdWRlZE5vdGVzLmhhcyhlbnRyeS5uYW1lKSB8fCBleGNsdWRlZE5vdGVzLmhhcyhyZWxhdGl2ZVBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25Db3VudCA9IChyZWFkRmlsZVN5bmMoam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpLCAndXRmLTgnKS5tYXRjaChDT0RFX0JVVFRPTl9GRU5DRV9SRUdfRVhQKSA/PyBbXSkubGVuZ3RoO1xuICAgICAgaWYgKGJ1dHRvbkNvdW50ID4gMCkge1xuICAgICAgICBub3Rlcy5wdXNoKHsgYnV0dG9uQ291bnQsIG5hbWU6IHJlbGF0aXZlUGF0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3YWxrKGRlbW9WYXVsdFBhdGgsICcnKTtcbiAgcmV0dXJuIG5vdGVzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSwgJ2VuJykpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXZlcnkgYXNzZXJ0aW9uIGJlbG93IHJ1bnMgYWdhaW5zdCBhIHJlYWwgT2JzaWRpYW4gb3ZlciBDRFAsIGRyaXZlbiBieSBjbG9zdXJlcyB0aGlzIHByb2Nlc3Mgc2VyaWFsaXplcyBhbmQgYW5vdGhlciBleGVjdXRlcy4gVGhlIHRlc3RhYmxlIHBhcnRzIGFyZSBsaXN0Tm90ZXNXaXRoQnV0dG9ucyBhbmQgZm9ybWF0RmFpbHVyZXMsIHdoaWNoIGhhdmUgdGhlaXIgb3duIHVuaXQgdGVzdHMuICovXG4vKipcbiAqIFJlZ2lzdGVycyBhIHZpdGVzdCBzdWl0ZSB0aGF0IGNsaWNrcyBldmVyeSBgY29kZS1idXR0b25gIGluIHRoZSByZXBvJ3MgZGVtbyB2YXVsdC5cbiAqXG4gKiBPbmUgYGl0YCBwZXIgbm90ZSwgYW5kIG9uZSBgZXZhbEluT2JzaWRpYW5gIHBlciBidXR0b246IGEgc2luZ2xlIGNsb3N1cmUgcnVucyBhcyBvbmUgQ0RQXG4gKiBgUnVudGltZS5ldmFsdWF0ZWAsIHdoaWNoIHRoZSBoYXJuZXNzIGNhcHMgYXQgMzAgcywgc28gYSBub3RlIHdpdGggYSBkb3plbiBidXR0b25zIHdvdWxkIG90aGVyd2lzZVxuICogdGltZSBvdXQgYXMgYSB3aG9sZSByYXRoZXIgdGhhbiByZXBvcnRpbmcgd2hpY2ggYnV0dG9uIGZhaWxlZC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgUmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZU9wdGlvbnN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZShvcHRpb25zOiBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHJvb3RGb2xkZXIgPSBvcHRpb25zLnJvb3RGb2xkZXIgPz8gZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IGRlbW9WYXVsdFBhdGggPSBqb2luKHJvb3RGb2xkZXIsICdkZW1vLXZhdWx0Jyk7XG4gIGNvbnN0IGV4Y2x1ZGVkTm90ZXMgPSBuZXcgU2V0KG9wdGlvbnMuZXhjbHVkZWROb3RlcyA/PyBERUZBVUxUX0VYQ0xVREVEX05PVEVTKTtcbiAgY29uc3Qgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzID0gb3B0aW9ucy5zZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9TRVRUTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gIGNvbnN0IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IG9wdGlvbnMuYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfQlVUVE9OX1JFU1VMVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICBjb25zdCBub3RlcyA9IGxpc3ROb3Rlc1dpdGhCdXR0b25zKGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTm90ZXMpO1xuXG4gIGRlc2NyaWJlKCdkZW1vLXZhdWx0IGJ1dHRvbnMnLCAoKSA9PiB7XG4gICAgYmVmb3JlQWxsKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGlzQ29kZVNjcmlwdFRvb2xraXRMb2FkZWQgPSBhd2FpdCBjaGVja0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkKHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgICAvLyBXaXRob3V0IGl0IGV2ZXJ5IGBjb2RlLWJ1dHRvbmAgZmVuY2Ugc3RheXMgYSBwbGFpbiBjb2RlIGJsb2NrLCBzbyBldmVyeSBub3RlIGJlbG93IHdvdWxkIHJlcG9ydFxuICAgICAgLy8gWmVybyBidXR0b25zIGFuZCBwYXNzIHZhY3VvdXNseS4gRmFpbCBoZXJlIGluc3RlYWQsIG9uY2UsIHdpdGggdGhlIHJlYXNvbi5cbiAgICAgIGV4cGVjdChpc0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkLCAnQ29kZVNjcmlwdCBUb29sa2l0IGRpZCBub3QgbG9hZCwgc28gbm8gYnV0dG9uIGNvdWxkIHJlbmRlcicpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBBIHZhdWx0IHdob3NlIG5vdGVzIGRlY2xhcmUgbm8gYnV0dG9ucyBpcyBhIHJlYWwgZmFpbHVyZSBvZiBHOTgncyBpbnRlcmFjdGl2ZSBoYWxmLCBub3QgYSByZWFzb25cbiAgICAvLyBUbyByZWdpc3RlciBub3RoaW5nIGFuZCByZXBvcnQgZ3JlZW4uXG4gICAgaXQoJ2hhcyBhdCBsZWFzdCBvbmUgbm90ZSB3aXRoIGEgY29kZSBidXR0b24nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qobm90ZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcbiAgICAgIGl0KGBydW5zIGV2ZXJ5IGNvZGUgYnV0dG9uIGluICR7bm90ZS5uYW1lfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY2FwdGlvbnMgPSBhd2FpdCBvcGVuTm90ZUFuZExpc3RCdXR0b25DYXB0aW9ucyhub3RlLCBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgICAvLyBSZWFkaW5nIHZpZXcgbW91bnRzIGEgbm90ZSdzIGxlYWRpbmcgc2VjdGlvbnMgbW9yZSB0aGFuIG9uY2Ugd2hpbGUgaXQgc2V0dGxlcywgc28gdGhlIERPTSBjYW5cbiAgICAgICAgLy8gSG9sZCBzZXZlcmFsIGVsZW1lbnRzIHBlciBmZW5jZS4gVGhlIGNhcHRpb25zIGFyZSBkZWR1cGxpY2F0ZWQsIGFuZCB0aGUgYXNzZXJ0aW9uIGlzIHRoYXQgYXRcbiAgICAgICAgLy8gTGVhc3QgYXMgbWFueSBESVNUSU5DVCBidXR0b25zIHJlbmRlcmVkIGFzIHRoZSBzb3VyY2UgZGVjbGFyZXMgXHUyMDE0IGEgZmVuY2UgdGhhdCBzaWxlbnRseSBzdGF5ZWRcbiAgICAgICAgLy8gQSBwbGFpbiBjb2RlIGJsb2NrIGlzIHRoZSBmYWlsdXJlIHRoaXMgY2F0Y2hlcy5cbiAgICAgICAgZXhwZWN0KGNhcHRpb25zLmxlbmd0aCwgYCR7bm90ZS5uYW1lfSBkZWNsYXJlcyAke1N0cmluZyhub3RlLmJ1dHRvbkNvdW50KX0gYnV0dG9uKHMpIGJ1dCBvbmx5ICR7U3RyaW5nKGNhcHRpb25zLmxlbmd0aCl9IHJlbmRlcmVkYClcbiAgICAgICAgICAudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbChub3RlLmJ1dHRvbkNvdW50KTtcblxuICAgICAgICBjb25zdCBmYWlsdXJlczogRGVtb1ZhdWx0QnV0dG9uUmVzdWx0W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjYXB0aW9uIG9mIGNhcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpY2tCdXR0b24obm90ZS5uYW1lLCBjYXB0aW9uLCB7XG4gICAgICAgICAgICBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgICBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gJ29rJykge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdChmYWlsdXJlcywgZm9ybWF0RmFpbHVyZXMobm90ZS5uYW1lLCBmYWlsdXJlcykpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERyaXZlcyBhIHJlYWwgT2JzaWRpYW4gb3ZlciBDRFA6IHRoZSBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgaGVyZSBhbmQgZXhlY3V0ZWQgaW4gYW5vdGhlciBwcm9jZXNzLCBzbyBpdCBjYW5ub3QgYmUgZXhlcmNpc2VkIGJ5IGEgdW5pdCB0ZXN0LiAqL1xuLyoqXG4gKiBUdXJucyByZXN0cmljdGVkIG1vZGUgb2ZmIGFuZCBlbmFibGVzIENvZGVTY3JpcHQgVG9vbGtpdCwgd2hvc2UgYmluYXJ5IHRoZSBnbG9iYWwgc2V0dXAgc2VlZGVkLlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBIb3cgbG9uZyB0byB3YWl0IGZvciBpdCB0byBsb2FkLlxuICogQHJldHVybnMgV2hldGhlciBDb2RlU2NyaXB0IFRvb2xraXQgaXMgbG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkKHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBldmFsSW5PYnNpZGlhbih7XG4gICAgYXN5bmMgY2FsbGJhY2soeyBhcHAsIGNvZGVTY3JpcHRUb29sa2l0UGx1Z2luSWQsIGludGVydmFsSW5NaWxsaXNlY29uZHMsIGxpYjogeyB3YWl0VW50aWwgfSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aW1lb3V0IH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGlmICh0eXBlb2YgYXBwLnBsdWdpbnMuaXNFbmFibGVkID09PSAnZnVuY3Rpb24nICYmICFhcHAucGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWFwcC5wbHVnaW5zLmdldFBsdWdpbihjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkKSkge1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW4oY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvZGVTY3JpcHQgVG9vbGtpdCBuZXZlciBsb2FkZWQnLFxuICAgICAgICAgIHByZWRpY2F0ZTogKCk6IGJvb2xlYW4gPT4gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKGNvZGVTY3JpcHRUb29sa2l0UGx1Z2luSWQpICE9PSBudWxsLFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGlucHV0OiB7XG4gICAgICBjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkOiBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCxcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHM6IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSxcbiAgICB2YXVsdFBhdGg6IGdldFRlbXBvcmFyeVZhdWx0KCkucGF0aFxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERyaXZlcyBhIHJlYWwgT2JzaWRpYW4gb3ZlciBDRFA6IHRoZSBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgaGVyZSBhbmQgZXhlY3V0ZWQgaW4gYW5vdGhlciBwcm9jZXNzLCBzbyBpdCBjYW5ub3QgYmUgZXhlcmNpc2VkIGJ5IGEgdW5pdCB0ZXN0LiAqL1xuLyoqXG4gKiBDbGlja3Mgb25lIGJ1dHRvbiBhbmQgcmVhZHMgdGhlIHJlc3VsdCBsaW5lIENvZGVTY3JpcHQgVG9vbGtpdCB3cml0ZXMgdW5kZXIgaXQuXG4gKlxuICogQSBidXR0b24gdGhhdCByZS1yZW5kZXJzIGl0cyBvd24gbm90ZSAoYSBzZXR0aW5ncyBjaGFuZ2UsIGEgcmVsb2FkKSBkZXRhY2hlcyB0aGUgYmxvY2sgaXQgbGl2ZXMgaW4sXG4gKiBzbyB0aGUgYmxvY2sgZWxlbWVudCBpcyBjYXB0dXJlZCBCRUZPUkUgdGhlIGNsaWNrIGFuZCByZWFkIGFmdGVyd2FyZHMgXHUyMDE0IENvZGVTY3JpcHQgVG9vbGtpdCB3cml0ZXMgdGhlXG4gKiByZXN1bHQgaW50byB0aGF0IHNhbWUgZWxlbWVudCBldmVuIG9uY2UgaXQgaXMgZGV0YWNoZWQuXG4gKlxuICogQHBhcmFtIG5vdGVQYXRoIC0gVGhlIG5vdGUgaG9sZGluZyB0aGUgYnV0dG9uLlxuICogQHBhcmFtIGJ1dHRvbkNhcHRpb24gLSBUaGUgYnV0dG9uJ3MgcmVuZGVyZWQgY2FwdGlvbiwgd2hpY2ggaXMgaG93IGl0IGlzIGFkZHJlc3NlZC5cbiAqIEBwYXJhbSB0aW1lb3V0cyAtIFRoZSByZW5kZXIgYW5kIHJlc3VsdCBidWRnZXRzLlxuICogQHJldHVybnMgVGhlIHtAbGluayBEZW1vVmF1bHRCdXR0b25SZXN1bHR9LlxuICovXG5hc3luYyBmdW5jdGlvbiBjbGlja0J1dHRvbihcbiAgbm90ZVBhdGg6IHN0cmluZyxcbiAgYnV0dG9uQ2FwdGlvbjogc3RyaW5nLFxuICB0aW1lb3V0czogQ2xpY2tCdXR0b25UaW1lb3V0c1xuKTogUHJvbWlzZTxEZW1vVmF1bHRCdXR0b25SZXN1bHQ+IHtcbiAgcmV0dXJuIGV2YWxJbk9ic2lkaWFuKHtcbiAgICBhc3luYyBjYWxsYmFjayh7XG4gICAgICBhcHAsXG4gICAgICBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBjYXB0aW9uLFxuICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgIGxpYjogeyB3YWl0VW50aWwgfSxcbiAgICAgIG5vdGVQYXRoOiBub3RlUGF0aFRvT3BlbixcbiAgICAgIG9ic2lkaWFuTW9kdWxlLFxuICAgICAgb3V0cHV0RXhjZXJwdExlbmd0aCxcbiAgICAgIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0pOiBQcm9taXNlPERlbW9WYXVsdEJ1dHRvblJlc3VsdD4ge1xuICAgICAgZnVuY3Rpb24gdmlldygpOiBJbnN0YW5jZVR5cGU8dHlwZW9mIG9ic2lkaWFuTW9kdWxlLk1hcmtkb3duVmlldz4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShvYnNpZGlhbk1vZHVsZS5NYXJrZG93blZpZXcpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcHJldmlld0VsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB2aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgLm1hcmtkb3duLXByZXZpZXctdmlldycpID8/IG51bGw7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidXR0b25zKCk6IEhUTUxCdXR0b25FbGVtZW50W10ge1xuICAgICAgICByZXR1cm4gWy4uLnZpZXcoKT8uY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJzpzY29wZSAuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24gYnV0dG9uLm1vZC1jdGEnKSA/PyBbXV07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZpbmRCdXR0b24oKTogSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gYnV0dG9ucygpLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnRleHRDb250ZW50ID09PSBjYXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZGluZyB2aWV3IG1vdW50cyBsYXppbHkgYW5kIHVubW91bnRzIHNlY3Rpb25zIGZhciBvZmYtc2NyZWVuLCBzbyBOTyBzaW5nbGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAvLyBIb2xkcyBhIHdob2xlIG5vdGUncyBidXR0b25zLiBBZHZhbmNlIGEgdmlld3BvcnQgYXQgYSB0aW1lIGFuZCB3cmFwIGJhY2sgdG8gdGhlIHRvcCwgcmVtb3VudGluZ1xuICAgICAgLy8gRXZlcnkgc2VjdGlvbiBpbiB0dXJuIHVudGlsIHRoZSBvbmUgYmVpbmcgbG9va2VkIGZvciBhcHBlYXJzLiBQaW5uaW5nIHRvIHRoZSBCT1RUT00gaW5zdGVhZCBcdTIwMTRcbiAgICAgIC8vIFdoYXQgdGhpcyBkaWQgdW50aWwgOTQuNC4xIFx1MjAxNCBvbmx5IGV2ZXIgbW91bnRzIHRoZSBub3RlJ3MgdGFpbCwgc28gYSBidXR0b24gYW55d2hlcmUgYnV0IGF0IHRoZVxuICAgICAgLy8gRW5kIG9mIGl0cyBub3RlIHdhcyByZXBvcnRlZCBhcyBuZXZlciByZW5kZXJlZCAoYHN0YXR1czogJ3RpbWVvdXQnYCwgZW1wdHkgb3V0cHV0KSBob3dldmVyXG4gICAgICAvLyBIZWFsdGh5IGl0IHdhcy5cbiAgICAgIGNvbnN0IFNDUk9MTF9CT1RUT01fVE9MRVJBTkNFX0lOX1BJWEVMUyA9IDQ7XG4gICAgICBjb25zdCBTQ1JPTExfU1RFUF9SQVRJTyA9IDAuODtcbiAgICAgIGZ1bmN0aW9uIGFkdmFuY2VTY3JvbGwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNjcm9sbGVyID0gcHJldmlld0VsKCk7XG4gICAgICAgIGlmICghc2Nyb2xsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNBdEJvdHRvbSA9IHNjcm9sbGVyLnNjcm9sbFRvcCArIHNjcm9sbGVyLmNsaWVudEhlaWdodCA+PSBzY3JvbGxlci5zY3JvbGxIZWlnaHQgLSBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRV9JTl9QSVhFTFM7XG4gICAgICAgIHNjcm9sbGVyLnNjcm9sbFRvcCA9IGlzQXRCb3R0b20gPyAwIDogc2Nyb2xsZXIuc2Nyb2xsVG9wICsgTWF0aC5mbG9vcihzY3JvbGxlci5jbGllbnRIZWlnaHQgKiBTQ1JPTExfU1RFUF9SQVRJTyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLW9wZW4gdGhlIG5vdGUgYmVmb3JlIGV2ZXJ5IGNsaWNrIGluc3RlYWQgb2YgYXNzdW1pbmcgdGhlIHByZXZpb3VzIGJ1dHRvbiBsZWZ0IHRoZSB3b3Jrc3BhY2VcbiAgICAgIC8vIFdoZXJlIGl0IHdhcyBmb3VuZC4gRXZlcnkgaGVscGVyIGFib3ZlIHJlYWRzIHRoZSBBQ1RJVkUgdmlldywgYW5kIG9wZW5pbmcgYSBub3RlIGlzIG9uZSBvZiB0aGVcbiAgICAgIC8vIE1vc3Qgb3JkaW5hcnkgdGhpbmdzIGEgZGVtbyBidXR0b24gZG9lcyBcdTIwMTQgc28gdGhlIGZpcnN0IHN1Y2ggYnV0dG9uIHdvdWxkIG90aGVyd2lzZSBzZW5kIGVhY2hcbiAgICAgIC8vIExhdGVyIGJ1dHRvbiBpbiBpdHMgbm90ZSB0byBgc3RhdHVzOiAndGltZW91dCdgIHdpdGggYW4gZW1wdHkgb3V0cHV0LCB3aGljaCBpcyB0aGUgc2hhcGUgb2YgYVxuICAgICAgLy8gQnV0dG9uIHRoYXQgbmV2ZXIgcmVuZGVyZWQgcmF0aGVyIHRoYW4gb25lIHRoYXQgd2FzIGxvb2tlZCBmb3IgaW4gdGhlIHdyb25nIHZpZXcuXG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChub3RlUGF0aFRvT3Blbi5yZXBsYWNlKC9cXC5tZCQvLCAnJyksICcnLCBmYWxzZSk7XG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLmdldExlYWYoZmFsc2UpLnNldFZpZXdTdGF0ZSh7IHN0YXRlOiB7IGZpbGU6IG5vdGVQYXRoVG9PcGVuLCBtb2RlOiAncHJldmlldycgfSwgdHlwZTogJ21hcmtkb3duJyB9KTtcblxuICAgICAgLy8gSGVsZCBmcm9tIHRoZSBwcmVkaWNhdGUgcmF0aGVyIHRoYW4gcmUtcXVlcmllZCBhZnRlciBpdDogdGhlIHdhbGsgYWJvdmUga2VlcHMgbW92aW5nIHRoZVxuICAgICAgLy8gVmlld3BvcnQsIHNvIGEgYnV0dG9uIGZvdW5kIG9uIG9uZSBwb2xsIGNhbiBiZSB1bm1vdW50ZWQgYWdhaW4gYnkgdGhlIG5leHQuXG4gICAgICBsZXQgYnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBtZXNzYWdlOiBgY29kZSBidXR0b24gXCIke2NhcHRpb259XCIgbmV2ZXIgcmVuZGVyZWRgLFxuICAgICAgICAgIHByZWRpY2F0ZTogKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgYWR2YW5jZVNjcm9sbCgpO1xuICAgICAgICAgICAgYnV0dG9uID0gZmluZEJ1dHRvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHsgY2FwdGlvbiwgb3V0cHV0OiAnJywgc3RhdHVzOiAndGltZW91dCcgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFidXR0b24pIHtcbiAgICAgICAgcmV0dXJuIHsgY2FwdGlvbiwgb3V0cHV0OiAnJywgc3RhdHVzOiAndGltZW91dCcgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvY2sgPSBidXR0b24uY2xvc2VzdDxIVE1MRWxlbWVudD4oJy5ibG9jay1sYW5ndWFnZS1jb2RlLWJ1dHRvbicpID8/IGJ1dHRvbi5wYXJlbnRFbGVtZW50O1xuICAgICAgYnV0dG9uLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICBidXR0b24uY2xpY2soKTtcblxuICAgICAgbGV0IHN0YXR1czogRGVtb1ZhdWx0QnV0dG9uUmVzdWx0WydzdGF0dXMnXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBtZXNzYWdlOiBgYnV0dG9uIFwiJHtjYXB0aW9ufVwiIG5ldmVyIHJlcG9ydGVkIGEgcmVzdWx0YCxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IC9FeGVjdXRlZCAoPzpzdWNjZXNzZnVsbHl8d2l0aCBlcnJvcikvLnRlc3QoYmxvY2s/LnRleHRDb250ZW50ID8/ICcnKSxcbiAgICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGJsb2NrPy50ZXh0Q29udGVudCA/PyAnJztcbiAgICAgICAgaWYgKHRleHQuaW5jbHVkZXMoJ0V4ZWN1dGVkIHdpdGggZXJyb3InKSkge1xuICAgICAgICAgIHN0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgIH0gZWxzZSBpZiAodGV4dC5pbmNsdWRlcygnRXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5JykpIHtcbiAgICAgICAgICBzdGF0dXMgPSAnb2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXR1cyA9ICd1bmtub3duJztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHN0YXR1cyA9ICd0aW1lb3V0JztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY2FwdGlvbiwgb3V0cHV0OiAoYmxvY2s/LnRleHRDb250ZW50ID8/ICcnKS5zbGljZSgwLCBvdXRwdXRFeGNlcnB0TGVuZ3RoKSwgc3RhdHVzIH07XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzOiB0aW1lb3V0cy5idXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBjYXB0aW9uOiBidXR0b25DYXB0aW9uLFxuICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kczogUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBub3RlUGF0aCxcbiAgICAgIG91dHB1dEV4Y2VycHRMZW5ndGg6IE9VVFBVVF9FWENFUlBUX0xFTkdUSCxcbiAgICAgIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dHMuc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSxcbiAgICB2YXVsdFBhdGg6IGdldFRlbXBvcmFyeVZhdWx0KCkucGF0aFxuICB9KTtcbn1cblxuLyoqXG4gKiBPcGVucyBhIG5vdGUgaW4gcmVhZGluZyB2aWV3IGFuZCBsaXN0cyB0aGUgY2FwdGlvbnMgb2YgdGhlIGJ1dHRvbnMgdGhhdCBtb3VudGVkLCBkZWR1cGxpY2F0ZWQgYW5kIGluXG4gKiBkb2N1bWVudCBvcmRlci5cbiAqXG4gKiBUd28gcXVpcmtzIG9mIHJlYWRpbmcgdmlldyBzaGFwZSB0aGlzLiBJdCByZW5kZXJzIGxhemlseSBhbmQgdW5tb3VudHMgc2VjdGlvbnMgZmFyIG9mZi1zY3JlZW4sIHNvIG5vXG4gKiBzaW5nbGUgc2Nyb2xsIHBvc2l0aW9uIGhvbGRzIGEgd2hvbGUgbm90ZSdzIGJ1dHRvbnMgXHUyMDE0IHRoZSBwcmV2aWV3IGlzIHdhbGtlZCB0b3AgdG8gYm90dG9tIGFuZCBiYWNrXG4gKiB3aGlsZSB3YWl0aW5nLCBhbmQgdGhlIGNhcHRpb25zIHNlZW4gYWxvbmcgdGhlIHdheSBhcmUgQUNDVU1VTEFURUQgcmF0aGVyIHRoYW4gcmVhZCBvbmNlIGF0IHRoZSBlbmQuXG4gKiBBbmQgd2hpbGUgaXQgc2V0dGxlcyBpdCBjYW4gaG9sZCBTRVZFUkFMIGVsZW1lbnRzIHBlciBmZW5jZSBcdTIwMTQgdGhlIHNhbWUgYnV0dG9uIHdhcyBvYnNlcnZlZCByZW5kZXJlZFxuICogdHdpY2UgXHUyMDE0IHNvIHRoZSBjYXB0aW9ucyBhcmUgZGVkdXBsaWNhdGVkOyBjbGlja2luZyBieSBjYXB0aW9uIHRoZW4gYWRkcmVzc2VzIGVhY2ggYnV0dG9uIG9uY2UgaG93ZXZlclxuICogbWFueSBjb3BpZXMgb2YgaXQgdGhlIERPTSBpcyBob2xkaW5nLlxuICpcbiAqIEBwYXJhbSBub3RlIC0gVGhlIG5vdGUgdG8gb3Blbi5cbiAqIEBwYXJhbSBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgLSBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgYnV0dG9ucyB0byBtb3VudC5cbiAqIEByZXR1cm5zIFRoZSBkaXN0aW5jdCBidXR0b24gY2FwdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Ob3RlQW5kTGlzdEJ1dHRvbkNhcHRpb25zKG5vdGU6IERlbW9WYXVsdE5vdGUsIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gZXZhbEluT2JzaWRpYW4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBleHBlY3RlZEJ1dHRvbkNvdW50LCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLCBsaWI6IHsgd2FpdFVudGlsIH0sIG5vdGVQYXRoLCBvYnNpZGlhbk1vZHVsZSwgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBmdW5jdGlvbiB2aWV3KCk6IEluc3RhbmNlVHlwZTx0eXBlb2Ygb2JzaWRpYW5Nb2R1bGUuTWFya2Rvd25WaWV3PiB8IG51bGwge1xuICAgICAgICByZXR1cm4gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKG9ic2lkaWFuTW9kdWxlLk1hcmtkb3duVmlldyk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBwcmV2aWV3RWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHZpZXcoKT8uY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJzpzY29wZSAubWFya2Rvd24tcHJldmlldy12aWV3JykgPz8gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIEFjY3VtdWxhdGVkIGFjcm9zcyB0aGUgd2FsayBiZWxvdywgbmV2ZXIgcmVhZCBmcm9tIG9uZSBzbmFwc2hvdDogd2l0aCB0aGUgdmlld3BvcnQgbW92aW5nLCBhbnlcbiAgICAgIC8vIFNpbmdsZSByZWFkaW5nIGhvbGRzIG9ubHkgdGhlIHNlY3Rpb25zIGN1cnJlbnRseSBtb3VudGVkLlxuICAgICAgY29uc3Qgc2VlbkNhcHRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmdW5jdGlvbiBjYXB0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGZvciAoY29uc3QgYnV0dG9uIG9mIHZpZXcoKT8uY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJzpzY29wZSAuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24gYnV0dG9uLm1vZC1jdGEnKSA/PyBbXSkge1xuICAgICAgICAgIGlmIChidXR0b24udGV4dENvbnRlbnQgIT09ICcnKSB7XG4gICAgICAgICAgICBzZWVuQ2FwdGlvbnMuYWRkKGJ1dHRvbi50ZXh0Q29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbLi4uc2VlbkNhcHRpb25zXTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FtZSB3YWxrIGFzIGBjbGlja0J1dHRvbmAsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiBhIG5vdGUgd2hvc2UgYnV0dG9ucyBhcmUgaW4gdGhlIE1JRERMRVxuICAgICAgLy8gTmV2ZXIgbW91bnRzIHRoZW0gaWYgdGhlIHByZXZpZXcgaXMgcGlubmVkIHRvIHRoZSBib3R0b20uXG4gICAgICBjb25zdCBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRV9JTl9QSVhFTFMgPSA0O1xuICAgICAgY29uc3QgU0NST0xMX1NURVBfUkFUSU8gPSAwLjg7XG4gICAgICBmdW5jdGlvbiBhZHZhbmNlU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JvbGxlciA9IHByZXZpZXdFbCgpO1xuICAgICAgICBpZiAoIXNjcm9sbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQXRCb3R0b20gPSBzY3JvbGxlci5zY3JvbGxUb3AgKyBzY3JvbGxlci5jbGllbnRIZWlnaHQgPj0gc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0VfSU5fUElYRUxTO1xuICAgICAgICBzY3JvbGxlci5zY3JvbGxUb3AgPSBpc0F0Qm90dG9tID8gMCA6IHNjcm9sbGVyLnNjcm9sbFRvcCArIE1hdGguZmxvb3Ioc2Nyb2xsZXIuY2xpZW50SGVpZ2h0ICogU0NST0xMX1NURVBfUkFUSU8pO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChub3RlUGF0aC5yZXBsYWNlKC9cXC5tZCQvLCAnJyksICcnLCBmYWxzZSk7XG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLmdldExlYWYoZmFsc2UpLnNldFZpZXdTdGF0ZSh7IHN0YXRlOiB7IGZpbGU6IG5vdGVQYXRoLCBtb2RlOiAncHJldmlldycgfSwgdHlwZTogJ21hcmtkb3duJyB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKHtcbiAgICAgICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7bm90ZVBhdGh9XCIgbmV2ZXIgbW91bnRlZCBhbGwgJHtTdHJpbmcoZXhwZWN0ZWRCdXR0b25Db3VudCl9IG9mIGl0cyBidXR0b25zYCxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGFkdmFuY2VTY3JvbGwoKTtcbiAgICAgICAgICAgIHJldHVybiBjYXB0aW9ucygpLmxlbmd0aCA+PSBleHBlY3RlZEJ1dHRvbkNvdW50O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBjYXB0aW9ucyBhcmUgcmV0dXJuZWQgZWl0aGVyIHdheTsgdGhlIGNhbGxlciBhc3NlcnRzIG9uIHRoZW0gYW5kIHJlcG9ydHMgdGhlIHNob3J0ZmFsbC5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNhcHRpb25zKCk7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgZXhwZWN0ZWRCdXR0b25Db3VudDogbm90ZS5idXR0b25Db3VudCxcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHM6IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbm90ZVBhdGg6IG5vdGUubmFtZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSxcbiAgICB2YXVsdFBhdGg6IGdldFRlbXBvcmFyeVZhdWx0KCkucGF0aFxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCQSxxQkFHTztBQUNQLHVCQUFxQjtBQUNyQiwwQkFBb0I7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
|
|
@@ -91,13 +91,17 @@ export interface RegisterDemoVaultButtonSuiteOptions {
|
|
|
91
91
|
*/
|
|
92
92
|
export declare function formatFailures(noteName: string, failures: readonly DemoVaultButtonResult[]): string;
|
|
93
93
|
/**
|
|
94
|
-
* Lists the demo vault's
|
|
94
|
+
* Lists the demo vault's notes that declare at least one `code-button`, walking group folders too.
|
|
95
95
|
*
|
|
96
|
-
*
|
|
96
|
+
* A vault big enough to need grouping puts its walkthroughs in numbered folders — and a root-only walk
|
|
97
|
+
* finds NONE of them, which is worse than it sounds: a vault whose notes are all grouped reports zero
|
|
98
|
+
* notes, and one that is partly grouped silently gates only the ungrouped part. Fixture and asset
|
|
99
|
+
* folders are still skipped, so what is walked is walkthroughs and nothing else.
|
|
97
100
|
*
|
|
98
101
|
* @param demoVaultPath - The demo vault root.
|
|
99
|
-
* @param excludedNotes - Note
|
|
100
|
-
*
|
|
102
|
+
* @param excludedNotes - Note names to skip, matched against both the file name and the path relative
|
|
103
|
+
* to the vault root.
|
|
104
|
+
* @returns The notes, sorted by path.
|
|
101
105
|
*/
|
|
102
106
|
export declare function listNotesWithButtons(demoVaultPath: string, excludedNotes: ReadonlySet<string>): DemoVaultNote[];
|
|
103
107
|
/**
|
|
@@ -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 = "94.
|
|
24
|
+
const LIBRARY_VERSION = "94.5.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:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus:invalid:not(.untouched),\n.obsidian-dev-utils textarea:active:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus:invalid:not(.untouched) {\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;;;ACKJ;EAPA;;AAuBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAvBJ;;AA6BA;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//%20An%20input%20the%20user%20has%20not%20interacted%20with%20yet%20carries%20%60.untouched%60%20(set%20by%20%60PromptModal%60),%20so%20a%20modal%20that%5Cn//%20opens%20invalid%20by%20design%20does%20not%20greet%20the%20user%20in%20red.%20Both%20blocks%20below%20must%20be%20gated:%20the%20input%20is%5Cn//%20focused%20on%20open,%20so%20the%20focus%20block%20alone%20would%20keep%20painting%20it.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid:not(.untouched)%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:not(.untouched)%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,
|
|
@@ -91,13 +91,17 @@ export interface RegisterDemoVaultButtonSuiteOptions {
|
|
|
91
91
|
*/
|
|
92
92
|
export declare function formatFailures(noteName: string, failures: readonly DemoVaultButtonResult[]): string;
|
|
93
93
|
/**
|
|
94
|
-
* Lists the demo vault's
|
|
94
|
+
* Lists the demo vault's notes that declare at least one `code-button`, walking group folders too.
|
|
95
95
|
*
|
|
96
|
-
*
|
|
96
|
+
* A vault big enough to need grouping puts its walkthroughs in numbered folders — and a root-only walk
|
|
97
|
+
* finds NONE of them, which is worse than it sounds: a vault whose notes are all grouped reports zero
|
|
98
|
+
* notes, and one that is partly grouped silently gates only the ungrouped part. Fixture and asset
|
|
99
|
+
* folders are still skipped, so what is walked is walkthroughs and nothing else.
|
|
97
100
|
*
|
|
98
101
|
* @param demoVaultPath - The demo vault root.
|
|
99
|
-
* @param excludedNotes - Note
|
|
100
|
-
*
|
|
102
|
+
* @param excludedNotes - Note names to skip, matched against both the file name and the path relative
|
|
103
|
+
* to the vault root.
|
|
104
|
+
* @returns The notes, sorted by path.
|
|
101
105
|
*/
|
|
102
106
|
export declare function listNotesWithButtons(demoVaultPath: string, excludedNotes: ReadonlySet<string>): DemoVaultNote[];
|
|
103
107
|
/**
|
|
@@ -51,11 +51,29 @@ function formatFailures(noteName, failures) {
|
|
|
51
51
|
return `${String(failures.length)} button(s) in ${noteName} did not run cleanly:
|
|
52
52
|
${details}`;
|
|
53
53
|
}
|
|
54
|
+
const NON_WALKTHROUGH_FOLDERS = /* @__PURE__ */ new Set(["Materials"]);
|
|
54
55
|
function listNotesWithButtons(demoVaultPath, excludedNotes) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
const notes = [];
|
|
57
|
+
function walk(folder, relativeFolder) {
|
|
58
|
+
for (const entry of readdirSync(folder, { withFileTypes: true })) {
|
|
59
|
+
const relativePath = relativeFolder === "" ? entry.name : `${relativeFolder}/${entry.name}`;
|
|
60
|
+
if (entry.isDirectory()) {
|
|
61
|
+
if (!entry.name.startsWith(".") && !entry.name.startsWith("_") && !NON_WALKTHROUGH_FOLDERS.has(entry.name)) {
|
|
62
|
+
walk(join(folder, entry.name), relativePath);
|
|
63
|
+
}
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (!entry.name.endsWith(".md") || excludedNotes.has(entry.name) || excludedNotes.has(relativePath)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const buttonCount = (readFileSync(join(folder, entry.name), "utf-8").match(CODE_BUTTON_FENCE_REG_EXP) ?? []).length;
|
|
70
|
+
if (buttonCount > 0) {
|
|
71
|
+
notes.push({ buttonCount, name: relativePath });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
walk(demoVaultPath, "");
|
|
76
|
+
return notes.sort((a, b) => a.name.localeCompare(b.name, "en"));
|
|
59
77
|
}
|
|
60
78
|
function registerDemoVaultButtonSuite(options = {}) {
|
|
61
79
|
const rootFolder = options.rootFolder ?? getRootFolder() ?? process.cwd();
|
|
@@ -269,4 +287,4 @@ export {
|
|
|
269
287
|
listNotesWithButtons,
|
|
270
288
|
registerDemoVaultButtonSuite
|
|
271
289
|
};
|
|
272
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LWJ1dHRvbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHZpdGVzdCBzdWl0ZSB0aGF0IG9wZW5zIGV2ZXJ5IG5vdGUgb2YgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AsIGNsaWNrcyBlYWNoIGBjb2RlLWJ1dHRvbmBcbiAqIGluIGl0IGFnYWluc3QgYSByZWFsIE9ic2lkaWFuLCBhbmQgZmFpbHMgb24gYW55IGJ1dHRvbiB0aGF0IGVycm9ycyBvciBuZXZlciByZXBvcnRzIGEgcmVzdWx0LlxuICpcbiAqIEEgZGVtbyB2YXVsdCdzIGJ1dHRvbnMgYXJlIHRoZSBvbmUgcGFydCBvZiBpdCBubyBvdGhlciBnYXRlIGNhbiBjaGVjay4gYGxpbnQ6bWRgIHJlYWRzIHRoZSBtYXJrZG93bixcbiAqIHRoZSBjb3ZlcmFnZSBzdWl0ZSAoe0BsaW5rIC4vZGVtby12YXVsdC1jb3ZlcmFnZS50cyB8IGByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVgfSkgY2hlY2tzIHRoZVxuICogYXV0aG9yaW5nIGNvbnZlbnRpb25zLCBhbmQgbmVpdGhlciBleGVjdXRlcyBhbnl0aGluZyBcdTIwMTQgYSBidXR0b24gd2hvc2UgYHJlcXVpcmUoJy9kZW1vU2V0dXAudHMnKWAgcGF0aFxuICogaXMgd3JvbmcsIG9yIHRoYXQgY2FsbHMgYW4gQVBJIHRoYXQgaGFzIHNpbmNlIGNoYW5nZWQgc2hhcGUsIGZhaWxzIGF0IGNsaWNrIHRpbWUgYW5kIG5vd2hlcmUgZWxzZS5cbiAqXG4gKiBUaGUgY29tcGFuaW9uIGhhbGYgXHUyMDE0IHNlZWRpbmcgdGhlIHRlbXAgdmF1bHQgd2l0aCB0aGUgZGVtby12YXVsdCB0cmVlLCBpdHMgYC5vYnNpZGlhbmAgY29uZmlnLCBhbmQgdGhlXG4gKiBDb2RlU2NyaXB0IFRvb2xraXQgYmluYXJ5IHRoYXQgdHVybnMgYGBgYCBgYGBjb2RlLWJ1dHRvbiBgYGBgIGZlbmNlcyBpbnRvIGJ1dHRvbnMgXHUyMDE0IGlzXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgaW4gYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgOyBoYW5kIGl0cyByZXN1bHQgdG8gdGhlIHByb2plY3Qnc1xuICogYGdsb2JhbFNldHVwYCBhbmQgbmFtZSBDb2RlU2NyaXB0IFRvb2xraXQgaW4gYGVuYWJsZUNvbW11bml0eVBsdWdpbnNgLlxuICovXG5cbmltcG9ydCB7XG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuaW1wb3J0IHsgZ2V0VGVtcG9yYXJ5VmF1bHQgfSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJztcbmltcG9ydCB7XG4gIGJlZm9yZUFsbCxcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgaXRcbn0gZnJvbSAndml0ZXN0JztcblxuaW1wb3J0IHsgZ2V0Um9vdEZvbGRlciB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogQ29kZVNjcmlwdCBUb29sa2l0J3MgbWFuaWZlc3QgaWQuIEl0IGlzIHN0aWxsIHRoZSBwbHVnaW4ncyBvcmlnaW5hbCBgZml4LXJlcXVpcmUtbW9kdWxlc2AgaWQsIHdoaWNoXG4gKiBubyBsb25nZXIgbWF0Y2hlcyBpdHMgbmFtZSBcdTIwMTQgdGhlIGlkIGlzIHB1Ymxpc2hlZCwgc28gaXQgY2Fubm90IGJlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCA9ICdmaXgtcmVxdWlyZS1tb2R1bGVzJztcblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiBjbGlja2luZyBvbmUgYnV0dG9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEJ1dHRvblJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgYnV0dG9uJ3MgY2FwdGlvbiwgYXMgcmVuZGVyZWQuXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgbGluZSBDb2RlU2NyaXB0IFRvb2xraXQgcHJpbnRlZCB1bmRlciB0aGUgYnV0dG9uLCB0cnVuY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnV0dG9uIHJlcG9ydGVkIHN1Y2Nlc3MsIHJlcG9ydGVkIGFuIGVycm9yLCBvciBuZXZlciByZXBvcnRlZCBhdCBhbGwuXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6ICdlcnJvcicgfCAnb2snIHwgJ3RpbWVvdXQnIHwgJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE9uZSBkZW1vLXZhdWx0IG5vdGUgYW5kIGhvdyBtYW55IGJ1dHRvbnMgaXRzIHNvdXJjZSBkZWNsYXJlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb3RlIHtcbiAgLyoqXG4gICAqIEhvdyBtYW55IGBjb2RlLWJ1dHRvbmAgZmVuY2VzIHRoZSBub3RlJ3Mgc291cmNlIGRlY2xhcmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHtAbGluayByZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZywgaW4gbWlsbGlzZWNvbmRzLCB0byB3YWl0IGZvciBhIGNsaWNrZWQgYnV0dG9uIHRvIHJlcG9ydCBhIHJlc3VsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDE1MDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOb3RlIGZpbGUgbmFtZXMgKHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QpIHRvIHNraXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ1JFQURNRS5tZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3NpdG9yeSByb290IGhvbGRpbmcgYGRlbW8tdmF1bHQvYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHJlc29sdmVkIHJlcG8gcm9vdCwgZmFsbGluZyBiYWNrIHRvIGBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgZm9yIGEgbm90ZSdzIHByZXZpZXcgYW5kIGl0cyBidXR0b25zIHRvIG1vdW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjAwMDBgXG4gICAqL1xuICByZWFkb25seSBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHdhaXRpbmcgYnVkZ2V0cyBhIHNpbmdsZSBidXR0b24gY2xpY2sgaXMgYWxsb3dlZC5cbiAqL1xuaW50ZXJmYWNlIENsaWNrQnV0dG9uVGltZW91dHMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGNsaWNrZWQgYnV0dG9uIHRvIHJlcG9ydCBhIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgYnV0dG9uIGl0c2VsZiB0byBtb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUX0JVVFRPTl9SRVNVTFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxNV8wMDA7XG5jb25zdCBERUZBVUxUX1NFVFRMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDIwXzAwMDtcbmNvbnN0IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMTAwO1xuY29uc3QgT1VUUFVUX0VYQ0VSUFRfTEVOR1RIID0gNDAwO1xuXG4vLyBgUkVBRE1FLm1kYCBpcyB0aGUgcmVwby1mYWNpbmcgcGFnZSBHaXRIdWIgcmVuZGVycywgbm90IGEgd2Fsa3Rocm91Z2guIGAwMCBTdGFydC5tZGAgaXMgZGVsaWJlcmF0ZWx5XG4vLyBOT1QgZXhjbHVkZWQ6IHNpbmNlIFQ0NzggdGhlIGxhbmRpbmcgbm90ZXMgY2FycnkgYnV0dG9ucyBvZiB0aGVpciBvd24uXG5jb25zdCBERUZBVUxUX0VYQ0xVREVEX05PVEVTID0gWydSRUFETUUubWQnXTtcblxuY29uc3QgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKmBgYGNvZGUtYnV0dG9uL2dtO1xuXG4vLyBUaGUgcmVuZGVyZWQtYnV0dG9uIHNlbGVjdG9yIGlzIGA6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhYC4gSXQgaXMgd3JpdHRlblxuLy8gT3V0IGF0IGVhY2ggdXNlIHNpdGUgcmF0aGVyIHRoYW4gaGVsZCBpbiBhIGNvbnN0YW50IGhlcmU6IGV2ZXJ5IGNsb3N1cmUgYmVsb3cgaXMgc2VyaWFsaXplZCB3aXRoXG4vLyBgdG9TdHJpbmcoKWAgYW5kIGV2YWx1YXRlZCBpbnNpZGUgT2JzaWRpYW4sIHdoZXJlIG5vdGhpbmcgZnJvbSB0aGlzIG1vZHVsZSdzIHNjb3BlIGV4aXN0cy5cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGFzc2VydGlvbiBtZXNzYWdlIGZvciBhIG5vdGUncyBmYWlsaW5nIGJ1dHRvbnMuXG4gKlxuICogVGhlIGNhcHR1cmVkIG91dHB1dCBpcyBpbmNsdWRlZCBiZWNhdXNlIGEgYnV0dG9uJ3MgZmFpbHVyZSBpcyBhIHJ1bnRpbWUgb25lIFx1MjAxNCB0aGUgc3RhY2sgQ29kZVNjcmlwdFxuICogVG9vbGtpdCBwcmludHMgdW5kZXIgaXQgaXMgdGhlIG9ubHkgZGlhZ25vc2lzIHRoZXJlIGlzLlxuICpcbiAqIEBwYXJhbSBub3RlTmFtZSAtIFRoZSBub3RlIHRoZSBidXR0b25zIGJlbG9uZyB0by5cbiAqIEBwYXJhbSBmYWlsdXJlcyAtIFRoZSBmYWlsaW5nIGJ1dHRvbnMuXG4gKiBAcmV0dXJucyBUaGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZhaWx1cmVzKG5vdGVOYW1lOiBzdHJpbmcsIGZhaWx1cmVzOiByZWFkb25seSBEZW1vVmF1bHRCdXR0b25SZXN1bHRbXSk6IHN0cmluZyB7XG4gIGlmIChmYWlsdXJlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBkZXRhaWxzID0gZmFpbHVyZXNcbiAgICAubWFwKChmYWlsdXJlKSA9PiBgICAtIFwiJHtmYWlsdXJlLmNhcHRpb259XCIgWyR7ZmFpbHVyZS5zdGF0dXN9XTogJHtmYWlsdXJlLm91dHB1dC5yZXBsYWNlQWxsKC9cXHMrL2csICcgJykudHJpbSgpfWApXG4gICAgLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gYCR7U3RyaW5nKGZhaWx1cmVzLmxlbmd0aCl9IGJ1dHRvbihzKSBpbiAke25vdGVOYW1lfSBkaWQgbm90IHJ1biBjbGVhbmx5OlxcbiR7ZGV0YWlsc31gO1xufVxuXG4vKipcbiAqIExpc3RzIHRoZSBkZW1vIHZhdWx0J3MgdG9wLWxldmVsIG5vdGVzIHRoYXQgZGVjbGFyZSBhdCBsZWFzdCBvbmUgYGNvZGUtYnV0dG9uYC5cbiAqXG4gKiBPbmx5IHRoZSB2YXVsdCByb290IGlzIHdhbGtlZDogYE1hdGVyaWFscy9gIGhvbGRzIGZpeHR1cmVzIHRoZSB3YWxrdGhyb3VnaHMgYWN0IG9uLCBub3Qgd2Fsa3Rocm91Z2hzLlxuICpcbiAqIEBwYXJhbSBkZW1vVmF1bHRQYXRoIC0gVGhlIGRlbW8gdmF1bHQgcm9vdC5cbiAqIEBwYXJhbSBleGNsdWRlZE5vdGVzIC0gTm90ZSBmaWxlIG5hbWVzIHRvIHNraXAuXG4gKiBAcmV0dXJucyBUaGUgbm90ZXMsIHNvcnRlZCBieSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdE5vdGVzV2l0aEJ1dHRvbnMoZGVtb1ZhdWx0UGF0aDogc3RyaW5nLCBleGNsdWRlZE5vdGVzOiBSZWFkb25seVNldDxzdHJpbmc+KTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgcmV0dXJuIHJlYWRkaXJTeW5jKGRlbW9WYXVsdFBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSAmJiAhZXhjbHVkZWROb3Rlcy5oYXMoZW50cnkubmFtZSkpXG4gICAgLm1hcCgoZW50cnkpID0+IGVudHJ5Lm5hbWUpXG4gICAgLnNvcnQoKVxuICAgIC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBidXR0b25Db3VudDogKHJlYWRGaWxlU3luYyhqb2luKGRlbW9WYXVsdFBhdGgsIG5hbWUpLCAndXRmLTgnKS5tYXRjaChDT0RFX0JVVFRPTl9GRU5DRV9SRUdfRVhQKSA/PyBbXSkubGVuZ3RoLFxuICAgICAgbmFtZVxuICAgIH0pKVxuICAgIC5maWx0ZXIoKG5vdGUpID0+IG5vdGUuYnV0dG9uQ291bnQgPiAwKTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEV2ZXJ5IGFzc2VydGlvbiBiZWxvdyBydW5zIGFnYWluc3QgYSByZWFsIE9ic2lkaWFuIG92ZXIgQ0RQLCBkcml2ZW4gYnkgY2xvc3VyZXMgdGhpcyBwcm9jZXNzIHNlcmlhbGl6ZXMgYW5kIGFub3RoZXIgZXhlY3V0ZXMuIFRoZSB0ZXN0YWJsZSBwYXJ0cyBhcmUgbGlzdE5vdGVzV2l0aEJ1dHRvbnMgYW5kIGZvcm1hdEZhaWx1cmVzLCB3aGljaCBoYXZlIHRoZWlyIG93biB1bml0IHRlc3RzLiAqL1xuLyoqXG4gKiBSZWdpc3RlcnMgYSB2aXRlc3Qgc3VpdGUgdGhhdCBjbGlja3MgZXZlcnkgYGNvZGUtYnV0dG9uYCBpbiB0aGUgcmVwbydzIGRlbW8gdmF1bHQuXG4gKlxuICogT25lIGBpdGAgcGVyIG5vdGUsIGFuZCBvbmUgYGV2YWxJbk9ic2lkaWFuYCBwZXIgYnV0dG9uOiBhIHNpbmdsZSBjbG9zdXJlIHJ1bnMgYXMgb25lIENEUFxuICogYFJ1bnRpbWUuZXZhbHVhdGVgLCB3aGljaCB0aGUgaGFybmVzcyBjYXBzIGF0IDMwIHMsIHNvIGEgbm90ZSB3aXRoIGEgZG96ZW4gYnV0dG9ucyB3b3VsZCBvdGhlcndpc2VcbiAqIHRpbWUgb3V0IGFzIGEgd2hvbGUgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIHdoaWNoIGJ1dHRvbiBmYWlsZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFJlZ2lzdGVyRGVtb1ZhdWx0QnV0dG9uU3VpdGVPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVtb1ZhdWx0QnV0dG9uU3VpdGUob3B0aW9uczogUmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICBjb25zdCByb290Rm9sZGVyID0gb3B0aW9ucy5yb290Rm9sZGVyID8/IGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBkZW1vVmF1bHRQYXRoID0gam9pbihyb290Rm9sZGVyLCAnZGVtby12YXVsdCcpO1xuICBjb25zdCBleGNsdWRlZE5vdGVzID0gbmV3IFNldChvcHRpb25zLmV4Y2x1ZGVkTm90ZXMgPz8gREVGQVVMVF9FWENMVURFRF9OT1RFUyk7XG4gIGNvbnN0IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IG9wdGlvbnMuc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfU0VUVExFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICBjb25zdCBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBvcHRpb25zLmJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0JVVFRPTl9SRVNVTFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgY29uc3Qgbm90ZXMgPSBsaXN0Tm90ZXNXaXRoQnV0dG9ucyhkZW1vVmF1bHRQYXRoLCBleGNsdWRlZE5vdGVzKTtcblxuICBkZXNjcmliZSgnZGVtby12YXVsdCBidXR0b25zJywgKCkgPT4ge1xuICAgIGJlZm9yZUFsbChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpc0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkID0gYXdhaXQgY2hlY2tDb2RlU2NyaXB0VG9vbGtpdExvYWRlZChzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgLy8gV2l0aG91dCBpdCBldmVyeSBgY29kZS1idXR0b25gIGZlbmNlIHN0YXlzIGEgcGxhaW4gY29kZSBibG9jaywgc28gZXZlcnkgbm90ZSBiZWxvdyB3b3VsZCByZXBvcnRcbiAgICAgIC8vIFplcm8gYnV0dG9ucyBhbmQgcGFzcyB2YWN1b3VzbHkuIEZhaWwgaGVyZSBpbnN0ZWFkLCBvbmNlLCB3aXRoIHRoZSByZWFzb24uXG4gICAgICBleHBlY3QoaXNDb2RlU2NyaXB0VG9vbGtpdExvYWRlZCwgJ0NvZGVTY3JpcHQgVG9vbGtpdCBkaWQgbm90IGxvYWQsIHNvIG5vIGJ1dHRvbiBjb3VsZCByZW5kZXInKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgLy8gQSB2YXVsdCB3aG9zZSBub3RlcyBkZWNsYXJlIG5vIGJ1dHRvbnMgaXMgYSByZWFsIGZhaWx1cmUgb2YgRzk4J3MgaW50ZXJhY3RpdmUgaGFsZiwgbm90IGEgcmVhc29uXG4gICAgLy8gVG8gcmVnaXN0ZXIgbm90aGluZyBhbmQgcmVwb3J0IGdyZWVuLlxuICAgIGl0KCdoYXMgYXQgbGVhc3Qgb25lIG5vdGUgd2l0aCBhIGNvZGUgYnV0dG9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG5vdGVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBub3RlIG9mIG5vdGVzKSB7XG4gICAgICBpdChgcnVucyBldmVyeSBjb2RlIGJ1dHRvbiBpbiAke25vdGUubmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhcHRpb25zID0gYXdhaXQgb3Blbk5vdGVBbmRMaXN0QnV0dG9uQ2FwdGlvbnMobm90ZSwgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgLy8gUmVhZGluZyB2aWV3IG1vdW50cyBhIG5vdGUncyBsZWFkaW5nIHNlY3Rpb25zIG1vcmUgdGhhbiBvbmNlIHdoaWxlIGl0IHNldHRsZXMsIHNvIHRoZSBET00gY2FuXG4gICAgICAgIC8vIEhvbGQgc2V2ZXJhbCBlbGVtZW50cyBwZXIgZmVuY2UuIFRoZSBjYXB0aW9ucyBhcmUgZGVkdXBsaWNhdGVkLCBhbmQgdGhlIGFzc2VydGlvbiBpcyB0aGF0IGF0XG4gICAgICAgIC8vIExlYXN0IGFzIG1hbnkgRElTVElOQ1QgYnV0dG9ucyByZW5kZXJlZCBhcyB0aGUgc291cmNlIGRlY2xhcmVzIFx1MjAxNCBhIGZlbmNlIHRoYXQgc2lsZW50bHkgc3RheWVkXG4gICAgICAgIC8vIEEgcGxhaW4gY29kZSBibG9jayBpcyB0aGUgZmFpbHVyZSB0aGlzIGNhdGNoZXMuXG4gICAgICAgIGV4cGVjdChjYXB0aW9ucy5sZW5ndGgsIGAke25vdGUubmFtZX0gZGVjbGFyZXMgJHtTdHJpbmcobm90ZS5idXR0b25Db3VudCl9IGJ1dHRvbihzKSBidXQgb25seSAke1N0cmluZyhjYXB0aW9ucy5sZW5ndGgpfSByZW5kZXJlZGApXG4gICAgICAgICAgLnRvQmVHcmVhdGVyVGhhbk9yRXF1YWwobm90ZS5idXR0b25Db3VudCk7XG5cbiAgICAgICAgY29uc3QgZmFpbHVyZXM6IERlbW9WYXVsdEJ1dHRvblJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY2FwdGlvbiBvZiBjYXB0aW9ucykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWNrQnV0dG9uKG5vdGUubmFtZSwgY2FwdGlvbiwge1xuICAgICAgICAgICAgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09ICdvaycpIHtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3QoZmFpbHVyZXMsIGZvcm1hdEZhaWx1cmVzKG5vdGUubmFtZSwgZmFpbHVyZXMpKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEcml2ZXMgYSByZWFsIE9ic2lkaWFuIG92ZXIgQ0RQOiB0aGUgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGhlcmUgYW5kIGV4ZWN1dGVkIGluIGFub3RoZXIgcHJvY2Vzcywgc28gaXQgY2Fubm90IGJlIGV4ZXJjaXNlZCBieSBhIHVuaXQgdGVzdC4gKi9cbi8qKlxuICogVHVybnMgcmVzdHJpY3RlZCBtb2RlIG9mZiBhbmQgZW5hYmxlcyBDb2RlU2NyaXB0IFRvb2xraXQsIHdob3NlIGJpbmFyeSB0aGUgZ2xvYmFsIHNldHVwIHNlZWRlZC5cbiAqXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gSG93IGxvbmcgdG8gd2FpdCBmb3IgaXQgdG8gbG9hZC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgQ29kZVNjcmlwdCBUb29sa2l0IGlzIGxvYWRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tDb2RlU2NyaXB0VG9vbGtpdExvYWRlZCh0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gZXZhbEluT2JzaWRpYW4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkLCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLCBsaWI6IHsgd2FpdFVudGlsIH0sIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dCB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBpZiAodHlwZW9mIGFwcC5wbHVnaW5zLmlzRW5hYmxlZCA9PT0gJ2Z1bmN0aW9uJyAmJiAhYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuc2V0RW5hYmxlKHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFhcHAucGx1Z2lucy5nZXRQbHVnaW4oY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZCkpIHtcbiAgICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luKGNvZGVTY3JpcHRUb29sa2l0UGx1Z2luSWQpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKHtcbiAgICAgICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIG1lc3NhZ2U6ICdDb2RlU2NyaXB0IFRvb2xraXQgbmV2ZXIgbG9hZGVkJyxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IGFwcC5wbHVnaW5zLmdldFBsdWdpbihjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkKSAhPT0gbnVsbCxcbiAgICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRpbWVvdXRcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZDogQ09ERV9TQ1JJUFRfVE9PTEtJVF9QTFVHSU5fSUQsXG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzOiBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEcml2ZXMgYSByZWFsIE9ic2lkaWFuIG92ZXIgQ0RQOiB0aGUgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGhlcmUgYW5kIGV4ZWN1dGVkIGluIGFub3RoZXIgcHJvY2Vzcywgc28gaXQgY2Fubm90IGJlIGV4ZXJjaXNlZCBieSBhIHVuaXQgdGVzdC4gKi9cbi8qKlxuICogQ2xpY2tzIG9uZSBidXR0b24gYW5kIHJlYWRzIHRoZSByZXN1bHQgbGluZSBDb2RlU2NyaXB0IFRvb2xraXQgd3JpdGVzIHVuZGVyIGl0LlxuICpcbiAqIEEgYnV0dG9uIHRoYXQgcmUtcmVuZGVycyBpdHMgb3duIG5vdGUgKGEgc2V0dGluZ3MgY2hhbmdlLCBhIHJlbG9hZCkgZGV0YWNoZXMgdGhlIGJsb2NrIGl0IGxpdmVzIGluLFxuICogc28gdGhlIGJsb2NrIGVsZW1lbnQgaXMgY2FwdHVyZWQgQkVGT1JFIHRoZSBjbGljayBhbmQgcmVhZCBhZnRlcndhcmRzIFx1MjAxNCBDb2RlU2NyaXB0IFRvb2xraXQgd3JpdGVzIHRoZVxuICogcmVzdWx0IGludG8gdGhhdCBzYW1lIGVsZW1lbnQgZXZlbiBvbmNlIGl0IGlzIGRldGFjaGVkLlxuICpcbiAqIEBwYXJhbSBub3RlUGF0aCAtIFRoZSBub3RlIGhvbGRpbmcgdGhlIGJ1dHRvbi5cbiAqIEBwYXJhbSBidXR0b25DYXB0aW9uIC0gVGhlIGJ1dHRvbidzIHJlbmRlcmVkIGNhcHRpb24sIHdoaWNoIGlzIGhvdyBpdCBpcyBhZGRyZXNzZWQuXG4gKiBAcGFyYW0gdGltZW91dHMgLSBUaGUgcmVuZGVyIGFuZCByZXN1bHQgYnVkZ2V0cy5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRGVtb1ZhdWx0QnV0dG9uUmVzdWx0fS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xpY2tCdXR0b24oXG4gIG5vdGVQYXRoOiBzdHJpbmcsXG4gIGJ1dHRvbkNhcHRpb246IHN0cmluZyxcbiAgdGltZW91dHM6IENsaWNrQnV0dG9uVGltZW91dHNcbik6IFByb21pc2U8RGVtb1ZhdWx0QnV0dG9uUmVzdWx0PiB7XG4gIHJldHVybiBldmFsSW5PYnNpZGlhbih7XG4gICAgYXN5bmMgY2FsbGJhY2soe1xuICAgICAgYXBwLFxuICAgICAgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgY2FwdGlvbixcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICBsaWI6IHsgd2FpdFVudGlsIH0sXG4gICAgICBub3RlUGF0aDogbm90ZVBhdGhUb09wZW4sXG4gICAgICBvYnNpZGlhbk1vZHVsZSxcbiAgICAgIG91dHB1dEV4Y2VycHRMZW5ndGgsXG4gICAgICBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KTogUHJvbWlzZTxEZW1vVmF1bHRCdXR0b25SZXN1bHQ+IHtcbiAgICAgIGZ1bmN0aW9uIHZpZXcoKTogSW5zdGFuY2VUeXBlPHR5cGVvZiBvYnNpZGlhbk1vZHVsZS5NYXJrZG93blZpZXc+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUob2JzaWRpYW5Nb2R1bGUuTWFya2Rvd25WaWV3KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHByZXZpZXdFbCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdmlldygpPy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignOnNjb3BlIC5tYXJrZG93bi1wcmV2aWV3LXZpZXcnKSA/PyBudWxsO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnV0dG9ucygpOiBIVE1MQnV0dG9uRWxlbWVudFtdIHtcbiAgICAgICAgcmV0dXJuIFsuLi52aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCc6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhJykgPz8gW11dO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmaW5kQnV0dG9uKCk6IEhUTUxCdXR0b25FbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGJ1dHRvbnMoKS5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50ZXh0Q29udGVudCA9PT0gY2FwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWRpbmcgdmlldyBtb3VudHMgbGF6aWx5IGFuZCB1bm1vdW50cyBzZWN0aW9ucyBmYXIgb2ZmLXNjcmVlbiwgc28gTk8gc2luZ2xlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgLy8gSG9sZHMgYSB3aG9sZSBub3RlJ3MgYnV0dG9ucy4gQWR2YW5jZSBhIHZpZXdwb3J0IGF0IGEgdGltZSBhbmQgd3JhcCBiYWNrIHRvIHRoZSB0b3AsIHJlbW91bnRpbmdcbiAgICAgIC8vIEV2ZXJ5IHNlY3Rpb24gaW4gdHVybiB1bnRpbCB0aGUgb25lIGJlaW5nIGxvb2tlZCBmb3IgYXBwZWFycy4gUGlubmluZyB0byB0aGUgQk9UVE9NIGluc3RlYWQgXHUyMDE0XG4gICAgICAvLyBXaGF0IHRoaXMgZGlkIHVudGlsIDk0LjQuMSBcdTIwMTQgb25seSBldmVyIG1vdW50cyB0aGUgbm90ZSdzIHRhaWwsIHNvIGEgYnV0dG9uIGFueXdoZXJlIGJ1dCBhdCB0aGVcbiAgICAgIC8vIEVuZCBvZiBpdHMgbm90ZSB3YXMgcmVwb3J0ZWQgYXMgbmV2ZXIgcmVuZGVyZWQgKGBzdGF0dXM6ICd0aW1lb3V0J2AsIGVtcHR5IG91dHB1dCkgaG93ZXZlclxuICAgICAgLy8gSGVhbHRoeSBpdCB3YXMuXG4gICAgICBjb25zdCBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRV9JTl9QSVhFTFMgPSA0O1xuICAgICAgY29uc3QgU0NST0xMX1NURVBfUkFUSU8gPSAwLjg7XG4gICAgICBmdW5jdGlvbiBhZHZhbmNlU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JvbGxlciA9IHByZXZpZXdFbCgpO1xuICAgICAgICBpZiAoIXNjcm9sbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQXRCb3R0b20gPSBzY3JvbGxlci5zY3JvbGxUb3AgKyBzY3JvbGxlci5jbGllbnRIZWlnaHQgPj0gc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0VfSU5fUElYRUxTO1xuICAgICAgICBzY3JvbGxlci5zY3JvbGxUb3AgPSBpc0F0Qm90dG9tID8gMCA6IHNjcm9sbGVyLnNjcm9sbFRvcCArIE1hdGguZmxvb3Ioc2Nyb2xsZXIuY2xpZW50SGVpZ2h0ICogU0NST0xMX1NURVBfUkFUSU8pO1xuICAgICAgfVxuXG4gICAgICAvLyBSZS1vcGVuIHRoZSBub3RlIGJlZm9yZSBldmVyeSBjbGljayBpbnN0ZWFkIG9mIGFzc3VtaW5nIHRoZSBwcmV2aW91cyBidXR0b24gbGVmdCB0aGUgd29ya3NwYWNlXG4gICAgICAvLyBXaGVyZSBpdCB3YXMgZm91bmQuIEV2ZXJ5IGhlbHBlciBhYm92ZSByZWFkcyB0aGUgQUNUSVZFIHZpZXcsIGFuZCBvcGVuaW5nIGEgbm90ZSBpcyBvbmUgb2YgdGhlXG4gICAgICAvLyBNb3N0IG9yZGluYXJ5IHRoaW5ncyBhIGRlbW8gYnV0dG9uIGRvZXMgXHUyMDE0IHNvIHRoZSBmaXJzdCBzdWNoIGJ1dHRvbiB3b3VsZCBvdGhlcndpc2Ugc2VuZCBlYWNoXG4gICAgICAvLyBMYXRlciBidXR0b24gaW4gaXRzIG5vdGUgdG8gYHN0YXR1czogJ3RpbWVvdXQnYCB3aXRoIGFuIGVtcHR5IG91dHB1dCwgd2hpY2ggaXMgdGhlIHNoYXBlIG9mIGFcbiAgICAgIC8vIEJ1dHRvbiB0aGF0IG5ldmVyIHJlbmRlcmVkIHJhdGhlciB0aGFuIG9uZSB0aGF0IHdhcyBsb29rZWQgZm9yIGluIHRoZSB3cm9uZyB2aWV3LlxuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobm90ZVBhdGhUb09wZW4ucmVwbGFjZSgvXFwubWQkLywgJycpLCAnJywgZmFsc2UpO1xuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoeyBzdGF0ZTogeyBmaWxlOiBub3RlUGF0aFRvT3BlbiwgbW9kZTogJ3ByZXZpZXcnIH0sIHR5cGU6ICdtYXJrZG93bicgfSk7XG5cbiAgICAgIC8vIEhlbGQgZnJvbSB0aGUgcHJlZGljYXRlIHJhdGhlciB0aGFuIHJlLXF1ZXJpZWQgYWZ0ZXIgaXQ6IHRoZSB3YWxrIGFib3ZlIGtlZXBzIG1vdmluZyB0aGVcbiAgICAgIC8vIFZpZXdwb3J0LCBzbyBhIGJ1dHRvbiBmb3VuZCBvbiBvbmUgcG9sbCBjYW4gYmUgdW5tb3VudGVkIGFnYWluIGJ5IHRoZSBuZXh0LlxuICAgICAgbGV0IGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgbWVzc2FnZTogYGNvZGUgYnV0dG9uIFwiJHtjYXB0aW9ufVwiIG5ldmVyIHJlbmRlcmVkYCxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGFkdmFuY2VTY3JvbGwoKTtcbiAgICAgICAgICAgIGJ1dHRvbiA9IGZpbmRCdXR0b24oKTtcbiAgICAgICAgICAgIHJldHVybiBidXR0b24gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7IGNhcHRpb24sIG91dHB1dDogJycsIHN0YXR1czogJ3RpbWVvdXQnIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghYnV0dG9uKSB7XG4gICAgICAgIHJldHVybiB7IGNhcHRpb24sIG91dHB1dDogJycsIHN0YXR1czogJ3RpbWVvdXQnIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsb2NrID0gYnV0dG9uLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24nKSA/PyBidXR0b24ucGFyZW50RWxlbWVudDtcbiAgICAgIGJ1dHRvbi5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgYnV0dG9uLmNsaWNrKCk7XG5cbiAgICAgIGxldCBzdGF0dXM6IERlbW9WYXVsdEJ1dHRvblJlc3VsdFsnc3RhdHVzJ107XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgbWVzc2FnZTogYGJ1dHRvbiBcIiR7Y2FwdGlvbn1cIiBuZXZlciByZXBvcnRlZCBhIHJlc3VsdGAsXG4gICAgICAgICAgcHJlZGljYXRlOiAoKTogYm9vbGVhbiA9PiAvRXhlY3V0ZWQgKD86c3VjY2Vzc2Z1bGx5fHdpdGggZXJyb3IpLy50ZXN0KGJsb2NrPy50ZXh0Q29udGVudCA/PyAnJyksXG4gICAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBibG9jaz8udGV4dENvbnRlbnQgPz8gJyc7XG4gICAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdFeGVjdXRlZCB3aXRoIGVycm9yJykpIHtcbiAgICAgICAgICBzdGF0dXMgPSAnZXJyb3InO1xuICAgICAgICB9IGVsc2UgaWYgKHRleHQuaW5jbHVkZXMoJ0V4ZWN1dGVkIHN1Y2Nlc3NmdWxseScpKSB7XG4gICAgICAgICAgc3RhdHVzID0gJ29rJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0dXMgPSAndW5rbm93bic7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzdGF0dXMgPSAndGltZW91dCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGNhcHRpb24sIG91dHB1dDogKGJsb2NrPy50ZXh0Q29udGVudCA/PyAnJykuc2xpY2UoMCwgb3V0cHV0RXhjZXJwdExlbmd0aCksIHN0YXR1cyB9O1xuICAgIH0sXG4gICAgaW5wdXQ6IHtcbiAgICAgIGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dHMuYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgY2FwdGlvbjogYnV0dG9uQ2FwdGlvbixcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHM6IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbm90ZVBhdGgsXG4gICAgICBvdXRwdXRFeGNlcnB0TGVuZ3RoOiBPVVRQVVRfRVhDRVJQVF9MRU5HVEgsXG4gICAgICBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHRpbWVvdXRzLnNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgYSBub3RlIGluIHJlYWRpbmcgdmlldyBhbmQgbGlzdHMgdGhlIGNhcHRpb25zIG9mIHRoZSBidXR0b25zIHRoYXQgbW91bnRlZCwgZGVkdXBsaWNhdGVkIGFuZCBpblxuICogZG9jdW1lbnQgb3JkZXIuXG4gKlxuICogVHdvIHF1aXJrcyBvZiByZWFkaW5nIHZpZXcgc2hhcGUgdGhpcy4gSXQgcmVuZGVycyBsYXppbHkgYW5kIHVubW91bnRzIHNlY3Rpb25zIGZhciBvZmYtc2NyZWVuLCBzbyBub1xuICogc2luZ2xlIHNjcm9sbCBwb3NpdGlvbiBob2xkcyBhIHdob2xlIG5vdGUncyBidXR0b25zIFx1MjAxNCB0aGUgcHJldmlldyBpcyB3YWxrZWQgdG9wIHRvIGJvdHRvbSBhbmQgYmFja1xuICogd2hpbGUgd2FpdGluZywgYW5kIHRoZSBjYXB0aW9ucyBzZWVuIGFsb25nIHRoZSB3YXkgYXJlIEFDQ1VNVUxBVEVEIHJhdGhlciB0aGFuIHJlYWQgb25jZSBhdCB0aGUgZW5kLlxuICogQW5kIHdoaWxlIGl0IHNldHRsZXMgaXQgY2FuIGhvbGQgU0VWRVJBTCBlbGVtZW50cyBwZXIgZmVuY2UgXHUyMDE0IHRoZSBzYW1lIGJ1dHRvbiB3YXMgb2JzZXJ2ZWQgcmVuZGVyZWRcbiAqIHR3aWNlIFx1MjAxNCBzbyB0aGUgY2FwdGlvbnMgYXJlIGRlZHVwbGljYXRlZDsgY2xpY2tpbmcgYnkgY2FwdGlvbiB0aGVuIGFkZHJlc3NlcyBlYWNoIGJ1dHRvbiBvbmNlIGhvd2V2ZXJcbiAqIG1hbnkgY29waWVzIG9mIGl0IHRoZSBET00gaXMgaG9sZGluZy5cbiAqXG4gKiBAcGFyYW0gbm90ZSAtIFRoZSBub3RlIHRvIG9wZW4uXG4gKiBAcGFyYW0gc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzIC0gSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGJ1dHRvbnMgdG8gbW91bnQuXG4gKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgYnV0dG9uIGNhcHRpb25zLlxuICovXG5hc3luYyBmdW5jdGlvbiBvcGVuTm90ZUFuZExpc3RCdXR0b25DYXB0aW9ucyhub3RlOiBEZW1vVmF1bHROb3RlLCBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIGV2YWxJbk9ic2lkaWFuKHtcbiAgICBhc3luYyBjYWxsYmFjayh7IGFwcCwgZXhwZWN0ZWRCdXR0b25Db3VudCwgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcywgbGliOiB7IHdhaXRVbnRpbCB9LCBub3RlUGF0aCwgb2JzaWRpYW5Nb2R1bGUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgZnVuY3Rpb24gdmlldygpOiBJbnN0YW5jZVR5cGU8dHlwZW9mIG9ic2lkaWFuTW9kdWxlLk1hcmtkb3duVmlldz4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShvYnNpZGlhbk1vZHVsZS5NYXJrZG93blZpZXcpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcHJldmlld0VsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB2aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgLm1hcmtkb3duLXByZXZpZXctdmlldycpID8/IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBBY2N1bXVsYXRlZCBhY3Jvc3MgdGhlIHdhbGsgYmVsb3csIG5ldmVyIHJlYWQgZnJvbSBvbmUgc25hcHNob3Q6IHdpdGggdGhlIHZpZXdwb3J0IG1vdmluZywgYW55XG4gICAgICAvLyBTaW5nbGUgcmVhZGluZyBob2xkcyBvbmx5IHRoZSBzZWN0aW9ucyBjdXJyZW50bHkgbW91bnRlZC5cbiAgICAgIGNvbnN0IHNlZW5DYXB0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZnVuY3Rpb24gY2FwdGlvbnMoKTogc3RyaW5nW10ge1xuICAgICAgICBmb3IgKGNvbnN0IGJ1dHRvbiBvZiB2aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCc6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhJykgPz8gW10pIHtcbiAgICAgICAgICBpZiAoYnV0dG9uLnRleHRDb250ZW50ICE9PSAnJykge1xuICAgICAgICAgICAgc2VlbkNhcHRpb25zLmFkZChidXR0b24udGV4dENvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLnNlZW5DYXB0aW9uc107XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbWUgd2FsayBhcyBgY2xpY2tCdXR0b25gLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogYSBub3RlIHdob3NlIGJ1dHRvbnMgYXJlIGluIHRoZSBNSURETEVcbiAgICAgIC8vIE5ldmVyIG1vdW50cyB0aGVtIGlmIHRoZSBwcmV2aWV3IGlzIHBpbm5lZCB0byB0aGUgYm90dG9tLlxuICAgICAgY29uc3QgU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0VfSU5fUElYRUxTID0gNDtcbiAgICAgIGNvbnN0IFNDUk9MTF9TVEVQX1JBVElPID0gMC44O1xuICAgICAgZnVuY3Rpb24gYWR2YW5jZVNjcm9sbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBwcmV2aWV3RWwoKTtcbiAgICAgICAgaWYgKCFzY3JvbGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0F0Qm90dG9tID0gc2Nyb2xsZXIuc2Nyb2xsVG9wICsgc2Nyb2xsZXIuY2xpZW50SGVpZ2h0ID49IHNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIFNDUk9MTF9CT1RUT01fVE9MRVJBTkNFX0lOX1BJWEVMUztcbiAgICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG9wID0gaXNBdEJvdHRvbSA/IDAgOiBzY3JvbGxlci5zY3JvbGxUb3AgKyBNYXRoLmZsb29yKHNjcm9sbGVyLmNsaWVudEhlaWdodCAqIFNDUk9MTF9TVEVQX1JBVElPKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobm90ZVBhdGgucmVwbGFjZSgvXFwubWQkLywgJycpLCAnJywgZmFsc2UpO1xuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoeyBzdGF0ZTogeyBmaWxlOiBub3RlUGF0aCwgbW9kZTogJ3ByZXZpZXcnIH0sIHR5cGU6ICdtYXJrZG93bicgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBtZXNzYWdlOiBgXCIke25vdGVQYXRofVwiIG5ldmVyIG1vdW50ZWQgYWxsICR7U3RyaW5nKGV4cGVjdGVkQnV0dG9uQ291bnQpfSBvZiBpdHMgYnV0dG9uc2AsXG4gICAgICAgICAgcHJlZGljYXRlOiAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICBhZHZhbmNlU2Nyb2xsKCk7XG4gICAgICAgICAgICByZXR1cm4gY2FwdGlvbnMoKS5sZW5ndGggPj0gZXhwZWN0ZWRCdXR0b25Db3VudDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgY2FwdGlvbnMgYXJlIHJldHVybmVkIGVpdGhlciB3YXk7IHRoZSBjYWxsZXIgYXNzZXJ0cyBvbiB0aGVtIGFuZCByZXBvcnRzIHRoZSBzaG9ydGZhbGwuXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYXB0aW9ucygpO1xuICAgIH0sXG4gICAgaW5wdXQ6IHtcbiAgICAgIGV4cGVjdGVkQnV0dG9uQ291bnQ6IG5vdGUuYnV0dG9uQ291bnQsXG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzOiBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG5vdGVQYXRoOiBub3RlLm5hbWUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFDcEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMscUJBQXFCO0FBTXZCLE1BQU0sZ0NBQWdDO0FBcUY3QyxNQUFNLGdEQUFnRDtBQUN0RCxNQUFNLHlDQUF5QztBQUMvQyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLHdCQUF3QjtBQUk5QixNQUFNLHlCQUF5QixDQUFDLFdBQVc7QUFFM0MsTUFBTSw0QkFBNEI7QUFnQjNCLFNBQVMsZUFBZSxVQUFrQixVQUFvRDtBQUNuRyxNQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxVQUFVLFNBQ2IsSUFBSSxDQUFDLFlBQVksUUFBUSxRQUFRLE9BQU8sTUFBTSxRQUFRLE1BQU0sTUFBTSxRQUFRLE9BQU8sV0FBVyxRQUFRLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUNqSCxLQUFLLElBQUk7QUFDWixTQUFPLEdBQUcsT0FBTyxTQUFTLE1BQU0sQ0FBQyxpQkFBaUIsUUFBUTtBQUFBLEVBQTBCLE9BQU87QUFDN0Y7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
|
|
290
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LWJ1dHRvbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHZpdGVzdCBzdWl0ZSB0aGF0IG9wZW5zIGV2ZXJ5IG5vdGUgb2YgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AsIGNsaWNrcyBlYWNoIGBjb2RlLWJ1dHRvbmBcbiAqIGluIGl0IGFnYWluc3QgYSByZWFsIE9ic2lkaWFuLCBhbmQgZmFpbHMgb24gYW55IGJ1dHRvbiB0aGF0IGVycm9ycyBvciBuZXZlciByZXBvcnRzIGEgcmVzdWx0LlxuICpcbiAqIEEgZGVtbyB2YXVsdCdzIGJ1dHRvbnMgYXJlIHRoZSBvbmUgcGFydCBvZiBpdCBubyBvdGhlciBnYXRlIGNhbiBjaGVjay4gYGxpbnQ6bWRgIHJlYWRzIHRoZSBtYXJrZG93bixcbiAqIHRoZSBjb3ZlcmFnZSBzdWl0ZSAoe0BsaW5rIC4vZGVtby12YXVsdC1jb3ZlcmFnZS50cyB8IGByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVgfSkgY2hlY2tzIHRoZVxuICogYXV0aG9yaW5nIGNvbnZlbnRpb25zLCBhbmQgbmVpdGhlciBleGVjdXRlcyBhbnl0aGluZyBcdTIwMTQgYSBidXR0b24gd2hvc2UgYHJlcXVpcmUoJy9kZW1vU2V0dXAudHMnKWAgcGF0aFxuICogaXMgd3JvbmcsIG9yIHRoYXQgY2FsbHMgYW4gQVBJIHRoYXQgaGFzIHNpbmNlIGNoYW5nZWQgc2hhcGUsIGZhaWxzIGF0IGNsaWNrIHRpbWUgYW5kIG5vd2hlcmUgZWxzZS5cbiAqXG4gKiBUaGUgY29tcGFuaW9uIGhhbGYgXHUyMDE0IHNlZWRpbmcgdGhlIHRlbXAgdmF1bHQgd2l0aCB0aGUgZGVtby12YXVsdCB0cmVlLCBpdHMgYC5vYnNpZGlhbmAgY29uZmlnLCBhbmQgdGhlXG4gKiBDb2RlU2NyaXB0IFRvb2xraXQgYmluYXJ5IHRoYXQgdHVybnMgYGBgYCBgYGBjb2RlLWJ1dHRvbiBgYGBgIGZlbmNlcyBpbnRvIGJ1dHRvbnMgXHUyMDE0IGlzXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgaW4gYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgOyBoYW5kIGl0cyByZXN1bHQgdG8gdGhlIHByb2plY3Qnc1xuICogYGdsb2JhbFNldHVwYCBhbmQgbmFtZSBDb2RlU2NyaXB0IFRvb2xraXQgaW4gYGVuYWJsZUNvbW11bml0eVBsdWdpbnNgLlxuICovXG5cbmltcG9ydCB7XG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuaW1wb3J0IHsgZ2V0VGVtcG9yYXJ5VmF1bHQgfSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJztcbmltcG9ydCB7XG4gIGJlZm9yZUFsbCxcbiAgZGVzY3JpYmUsXG4gIGV4cGVjdCxcbiAgaXRcbn0gZnJvbSAndml0ZXN0JztcblxuaW1wb3J0IHsgZ2V0Um9vdEZvbGRlciB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogQ29kZVNjcmlwdCBUb29sa2l0J3MgbWFuaWZlc3QgaWQuIEl0IGlzIHN0aWxsIHRoZSBwbHVnaW4ncyBvcmlnaW5hbCBgZml4LXJlcXVpcmUtbW9kdWxlc2AgaWQsIHdoaWNoXG4gKiBubyBsb25nZXIgbWF0Y2hlcyBpdHMgbmFtZSBcdTIwMTQgdGhlIGlkIGlzIHB1Ymxpc2hlZCwgc28gaXQgY2Fubm90IGJlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCA9ICdmaXgtcmVxdWlyZS1tb2R1bGVzJztcblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiBjbGlja2luZyBvbmUgYnV0dG9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEJ1dHRvblJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgYnV0dG9uJ3MgY2FwdGlvbiwgYXMgcmVuZGVyZWQuXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgbGluZSBDb2RlU2NyaXB0IFRvb2xraXQgcHJpbnRlZCB1bmRlciB0aGUgYnV0dG9uLCB0cnVuY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnV0dG9uIHJlcG9ydGVkIHN1Y2Nlc3MsIHJlcG9ydGVkIGFuIGVycm9yLCBvciBuZXZlciByZXBvcnRlZCBhdCBhbGwuXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6ICdlcnJvcicgfCAnb2snIHwgJ3RpbWVvdXQnIHwgJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE9uZSBkZW1vLXZhdWx0IG5vdGUgYW5kIGhvdyBtYW55IGJ1dHRvbnMgaXRzIHNvdXJjZSBkZWNsYXJlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb3RlIHtcbiAgLyoqXG4gICAqIEhvdyBtYW55IGBjb2RlLWJ1dHRvbmAgZmVuY2VzIHRoZSBub3RlJ3Mgc291cmNlIGRlY2xhcmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHtAbGluayByZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZywgaW4gbWlsbGlzZWNvbmRzLCB0byB3YWl0IGZvciBhIGNsaWNrZWQgYnV0dG9uIHRvIHJlcG9ydCBhIHJlc3VsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDE1MDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOb3RlIGZpbGUgbmFtZXMgKHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QpIHRvIHNraXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ1JFQURNRS5tZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3NpdG9yeSByb290IGhvbGRpbmcgYGRlbW8tdmF1bHQvYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHJlc29sdmVkIHJlcG8gcm9vdCwgZmFsbGluZyBiYWNrIHRvIGBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgZm9yIGEgbm90ZSdzIHByZXZpZXcgYW5kIGl0cyBidXR0b25zIHRvIG1vdW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjAwMDBgXG4gICAqL1xuICByZWFkb25seSBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIHdhaXRpbmcgYnVkZ2V0cyBhIHNpbmdsZSBidXR0b24gY2xpY2sgaXMgYWxsb3dlZC5cbiAqL1xuaW50ZXJmYWNlIENsaWNrQnV0dG9uVGltZW91dHMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGNsaWNrZWQgYnV0dG9uIHRvIHJlcG9ydCBhIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgYnV0dG9uIGl0c2VsZiB0byBtb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUX0JVVFRPTl9SRVNVTFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxNV8wMDA7XG5jb25zdCBERUZBVUxUX1NFVFRMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDIwXzAwMDtcbmNvbnN0IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMTAwO1xuY29uc3QgT1VUUFVUX0VYQ0VSUFRfTEVOR1RIID0gNDAwO1xuXG4vLyBgUkVBRE1FLm1kYCBpcyB0aGUgcmVwby1mYWNpbmcgcGFnZSBHaXRIdWIgcmVuZGVycywgbm90IGEgd2Fsa3Rocm91Z2guIGAwMCBTdGFydC5tZGAgaXMgZGVsaWJlcmF0ZWx5XG4vLyBOT1QgZXhjbHVkZWQ6IHNpbmNlIFQ0NzggdGhlIGxhbmRpbmcgbm90ZXMgY2FycnkgYnV0dG9ucyBvZiB0aGVpciBvd24uXG5jb25zdCBERUZBVUxUX0VYQ0xVREVEX05PVEVTID0gWydSRUFETUUubWQnXTtcblxuY29uc3QgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKmBgYGNvZGUtYnV0dG9uL2dtO1xuXG4vLyBUaGUgcmVuZGVyZWQtYnV0dG9uIHNlbGVjdG9yIGlzIGA6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhYC4gSXQgaXMgd3JpdHRlblxuLy8gT3V0IGF0IGVhY2ggdXNlIHNpdGUgcmF0aGVyIHRoYW4gaGVsZCBpbiBhIGNvbnN0YW50IGhlcmU6IGV2ZXJ5IGNsb3N1cmUgYmVsb3cgaXMgc2VyaWFsaXplZCB3aXRoXG4vLyBgdG9TdHJpbmcoKWAgYW5kIGV2YWx1YXRlZCBpbnNpZGUgT2JzaWRpYW4sIHdoZXJlIG5vdGhpbmcgZnJvbSB0aGlzIG1vZHVsZSdzIHNjb3BlIGV4aXN0cy5cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGFzc2VydGlvbiBtZXNzYWdlIGZvciBhIG5vdGUncyBmYWlsaW5nIGJ1dHRvbnMuXG4gKlxuICogVGhlIGNhcHR1cmVkIG91dHB1dCBpcyBpbmNsdWRlZCBiZWNhdXNlIGEgYnV0dG9uJ3MgZmFpbHVyZSBpcyBhIHJ1bnRpbWUgb25lIFx1MjAxNCB0aGUgc3RhY2sgQ29kZVNjcmlwdFxuICogVG9vbGtpdCBwcmludHMgdW5kZXIgaXQgaXMgdGhlIG9ubHkgZGlhZ25vc2lzIHRoZXJlIGlzLlxuICpcbiAqIEBwYXJhbSBub3RlTmFtZSAtIFRoZSBub3RlIHRoZSBidXR0b25zIGJlbG9uZyB0by5cbiAqIEBwYXJhbSBmYWlsdXJlcyAtIFRoZSBmYWlsaW5nIGJ1dHRvbnMuXG4gKiBAcmV0dXJucyBUaGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZhaWx1cmVzKG5vdGVOYW1lOiBzdHJpbmcsIGZhaWx1cmVzOiByZWFkb25seSBEZW1vVmF1bHRCdXR0b25SZXN1bHRbXSk6IHN0cmluZyB7XG4gIGlmIChmYWlsdXJlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBkZXRhaWxzID0gZmFpbHVyZXNcbiAgICAubWFwKChmYWlsdXJlKSA9PiBgICAtIFwiJHtmYWlsdXJlLmNhcHRpb259XCIgWyR7ZmFpbHVyZS5zdGF0dXN9XTogJHtmYWlsdXJlLm91dHB1dC5yZXBsYWNlQWxsKC9cXHMrL2csICcgJykudHJpbSgpfWApXG4gICAgLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gYCR7U3RyaW5nKGZhaWx1cmVzLmxlbmd0aCl9IGJ1dHRvbihzKSBpbiAke25vdGVOYW1lfSBkaWQgbm90IHJ1biBjbGVhbmx5OlxcbiR7ZGV0YWlsc31gO1xufVxuXG4vKipcbiAqIEZvbGRlcnMgdGhhdCBuZXZlciBob2xkIGEgd2Fsa3Rocm91Z2guIGBNYXRlcmlhbHMvYCBob2xkcyB0aGUgZml4dHVyZXMgdGhlIHdhbGt0aHJvdWdocyBhY3Qgb247XG4gKiBgX2Fzc2V0cy9gIGhvbGRzIHRoZSBkZW1vIHNjcmlwdHM7IGAub2JzaWRpYW4vYCBpcyB2YXVsdCBjb25maWcuIEEgZm9sZGVyIHN0YXJ0aW5nIHdpdGggYC5gIG9yIGBfYFxuICogaXMgc2tpcHBlZCBvbiB0aGUgc2FtZSByZWFzb25pbmcsIHdpdGhvdXQgaGF2aW5nIHRvIGJlIGxpc3RlZC5cbiAqL1xuY29uc3QgTk9OX1dBTEtUSFJPVUdIX0ZPTERFUlMgPSBuZXcgU2V0KFsnTWF0ZXJpYWxzJ10pO1xuXG4vKipcbiAqIExpc3RzIHRoZSBkZW1vIHZhdWx0J3Mgbm90ZXMgdGhhdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSBgY29kZS1idXR0b25gLCB3YWxraW5nIGdyb3VwIGZvbGRlcnMgdG9vLlxuICpcbiAqIEEgdmF1bHQgYmlnIGVub3VnaCB0byBuZWVkIGdyb3VwaW5nIHB1dHMgaXRzIHdhbGt0aHJvdWdocyBpbiBudW1iZXJlZCBmb2xkZXJzIFx1MjAxNCBhbmQgYSByb290LW9ubHkgd2Fsa1xuICogZmluZHMgTk9ORSBvZiB0aGVtLCB3aGljaCBpcyB3b3JzZSB0aGFuIGl0IHNvdW5kczogYSB2YXVsdCB3aG9zZSBub3RlcyBhcmUgYWxsIGdyb3VwZWQgcmVwb3J0cyB6ZXJvXG4gKiBub3RlcywgYW5kIG9uZSB0aGF0IGlzIHBhcnRseSBncm91cGVkIHNpbGVudGx5IGdhdGVzIG9ubHkgdGhlIHVuZ3JvdXBlZCBwYXJ0LiBGaXh0dXJlIGFuZCBhc3NldFxuICogZm9sZGVycyBhcmUgc3RpbGwgc2tpcHBlZCwgc28gd2hhdCBpcyB3YWxrZWQgaXMgd2Fsa3Rocm91Z2hzIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogQHBhcmFtIGRlbW9WYXVsdFBhdGggLSBUaGUgZGVtbyB2YXVsdCByb290LlxuICogQHBhcmFtIGV4Y2x1ZGVkTm90ZXMgLSBOb3RlIG5hbWVzIHRvIHNraXAsIG1hdGNoZWQgYWdhaW5zdCBib3RoIHRoZSBmaWxlIG5hbWUgYW5kIHRoZSBwYXRoIHJlbGF0aXZlXG4gKiB0byB0aGUgdmF1bHQgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBub3Rlcywgc29ydGVkIGJ5IHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Tm90ZXNXaXRoQnV0dG9ucyhkZW1vVmF1bHRQYXRoOiBzdHJpbmcsIGV4Y2x1ZGVkTm90ZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBEZW1vVmF1bHROb3RlW10ge1xuICBjb25zdCBub3RlczogRGVtb1ZhdWx0Tm90ZVtdID0gW107XG5cbiAgZnVuY3Rpb24gd2Fsayhmb2xkZXI6IHN0cmluZywgcmVsYXRpdmVGb2xkZXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlRm9sZGVyID09PSAnJyA/IGVudHJ5Lm5hbWUgOiBgJHtyZWxhdGl2ZUZvbGRlcn0vJHtlbnRyeS5uYW1lfWA7XG5cbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmICghZW50cnkubmFtZS5zdGFydHNXaXRoKCcuJykgJiYgIWVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnXycpICYmICFOT05fV0FMS1RIUk9VR0hfRk9MREVSUy5oYXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgICB3YWxrKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSB8fCBleGNsdWRlZE5vdGVzLmhhcyhlbnRyeS5uYW1lKSB8fCBleGNsdWRlZE5vdGVzLmhhcyhyZWxhdGl2ZVBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25Db3VudCA9IChyZWFkRmlsZVN5bmMoam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpLCAndXRmLTgnKS5tYXRjaChDT0RFX0JVVFRPTl9GRU5DRV9SRUdfRVhQKSA/PyBbXSkubGVuZ3RoO1xuICAgICAgaWYgKGJ1dHRvbkNvdW50ID4gMCkge1xuICAgICAgICBub3Rlcy5wdXNoKHsgYnV0dG9uQ291bnQsIG5hbWU6IHJlbGF0aXZlUGF0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3YWxrKGRlbW9WYXVsdFBhdGgsICcnKTtcbiAgcmV0dXJuIG5vdGVzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSwgJ2VuJykpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXZlcnkgYXNzZXJ0aW9uIGJlbG93IHJ1bnMgYWdhaW5zdCBhIHJlYWwgT2JzaWRpYW4gb3ZlciBDRFAsIGRyaXZlbiBieSBjbG9zdXJlcyB0aGlzIHByb2Nlc3Mgc2VyaWFsaXplcyBhbmQgYW5vdGhlciBleGVjdXRlcy4gVGhlIHRlc3RhYmxlIHBhcnRzIGFyZSBsaXN0Tm90ZXNXaXRoQnV0dG9ucyBhbmQgZm9ybWF0RmFpbHVyZXMsIHdoaWNoIGhhdmUgdGhlaXIgb3duIHVuaXQgdGVzdHMuICovXG4vKipcbiAqIFJlZ2lzdGVycyBhIHZpdGVzdCBzdWl0ZSB0aGF0IGNsaWNrcyBldmVyeSBgY29kZS1idXR0b25gIGluIHRoZSByZXBvJ3MgZGVtbyB2YXVsdC5cbiAqXG4gKiBPbmUgYGl0YCBwZXIgbm90ZSwgYW5kIG9uZSBgZXZhbEluT2JzaWRpYW5gIHBlciBidXR0b246IGEgc2luZ2xlIGNsb3N1cmUgcnVucyBhcyBvbmUgQ0RQXG4gKiBgUnVudGltZS5ldmFsdWF0ZWAsIHdoaWNoIHRoZSBoYXJuZXNzIGNhcHMgYXQgMzAgcywgc28gYSBub3RlIHdpdGggYSBkb3plbiBidXR0b25zIHdvdWxkIG90aGVyd2lzZVxuICogdGltZSBvdXQgYXMgYSB3aG9sZSByYXRoZXIgdGhhbiByZXBvcnRpbmcgd2hpY2ggYnV0dG9uIGZhaWxlZC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgUmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZU9wdGlvbnN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZShvcHRpb25zOiBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHJvb3RGb2xkZXIgPSBvcHRpb25zLnJvb3RGb2xkZXIgPz8gZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IGRlbW9WYXVsdFBhdGggPSBqb2luKHJvb3RGb2xkZXIsICdkZW1vLXZhdWx0Jyk7XG4gIGNvbnN0IGV4Y2x1ZGVkTm90ZXMgPSBuZXcgU2V0KG9wdGlvbnMuZXhjbHVkZWROb3RlcyA/PyBERUZBVUxUX0VYQ0xVREVEX05PVEVTKTtcbiAgY29uc3Qgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzID0gb3B0aW9ucy5zZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9TRVRUTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gIGNvbnN0IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IG9wdGlvbnMuYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfQlVUVE9OX1JFU1VMVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICBjb25zdCBub3RlcyA9IGxpc3ROb3Rlc1dpdGhCdXR0b25zKGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTm90ZXMpO1xuXG4gIGRlc2NyaWJlKCdkZW1vLXZhdWx0IGJ1dHRvbnMnLCAoKSA9PiB7XG4gICAgYmVmb3JlQWxsKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGlzQ29kZVNjcmlwdFRvb2xraXRMb2FkZWQgPSBhd2FpdCBjaGVja0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkKHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgICAvLyBXaXRob3V0IGl0IGV2ZXJ5IGBjb2RlLWJ1dHRvbmAgZmVuY2Ugc3RheXMgYSBwbGFpbiBjb2RlIGJsb2NrLCBzbyBldmVyeSBub3RlIGJlbG93IHdvdWxkIHJlcG9ydFxuICAgICAgLy8gWmVybyBidXR0b25zIGFuZCBwYXNzIHZhY3VvdXNseS4gRmFpbCBoZXJlIGluc3RlYWQsIG9uY2UsIHdpdGggdGhlIHJlYXNvbi5cbiAgICAgIGV4cGVjdChpc0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkLCAnQ29kZVNjcmlwdCBUb29sa2l0IGRpZCBub3QgbG9hZCwgc28gbm8gYnV0dG9uIGNvdWxkIHJlbmRlcicpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBBIHZhdWx0IHdob3NlIG5vdGVzIGRlY2xhcmUgbm8gYnV0dG9ucyBpcyBhIHJlYWwgZmFpbHVyZSBvZiBHOTgncyBpbnRlcmFjdGl2ZSBoYWxmLCBub3QgYSByZWFzb25cbiAgICAvLyBUbyByZWdpc3RlciBub3RoaW5nIGFuZCByZXBvcnQgZ3JlZW4uXG4gICAgaXQoJ2hhcyBhdCBsZWFzdCBvbmUgbm90ZSB3aXRoIGEgY29kZSBidXR0b24nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qobm90ZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcbiAgICAgIGl0KGBydW5zIGV2ZXJ5IGNvZGUgYnV0dG9uIGluICR7bm90ZS5uYW1lfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY2FwdGlvbnMgPSBhd2FpdCBvcGVuTm90ZUFuZExpc3RCdXR0b25DYXB0aW9ucyhub3RlLCBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgICAvLyBSZWFkaW5nIHZpZXcgbW91bnRzIGEgbm90ZSdzIGxlYWRpbmcgc2VjdGlvbnMgbW9yZSB0aGFuIG9uY2Ugd2hpbGUgaXQgc2V0dGxlcywgc28gdGhlIERPTSBjYW5cbiAgICAgICAgLy8gSG9sZCBzZXZlcmFsIGVsZW1lbnRzIHBlciBmZW5jZS4gVGhlIGNhcHRpb25zIGFyZSBkZWR1cGxpY2F0ZWQsIGFuZCB0aGUgYXNzZXJ0aW9uIGlzIHRoYXQgYXRcbiAgICAgICAgLy8gTGVhc3QgYXMgbWFueSBESVNUSU5DVCBidXR0b25zIHJlbmRlcmVkIGFzIHRoZSBzb3VyY2UgZGVjbGFyZXMgXHUyMDE0IGEgZmVuY2UgdGhhdCBzaWxlbnRseSBzdGF5ZWRcbiAgICAgICAgLy8gQSBwbGFpbiBjb2RlIGJsb2NrIGlzIHRoZSBmYWlsdXJlIHRoaXMgY2F0Y2hlcy5cbiAgICAgICAgZXhwZWN0KGNhcHRpb25zLmxlbmd0aCwgYCR7bm90ZS5uYW1lfSBkZWNsYXJlcyAke1N0cmluZyhub3RlLmJ1dHRvbkNvdW50KX0gYnV0dG9uKHMpIGJ1dCBvbmx5ICR7U3RyaW5nKGNhcHRpb25zLmxlbmd0aCl9IHJlbmRlcmVkYClcbiAgICAgICAgICAudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbChub3RlLmJ1dHRvbkNvdW50KTtcblxuICAgICAgICBjb25zdCBmYWlsdXJlczogRGVtb1ZhdWx0QnV0dG9uUmVzdWx0W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjYXB0aW9uIG9mIGNhcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpY2tCdXR0b24obm90ZS5uYW1lLCBjYXB0aW9uLCB7XG4gICAgICAgICAgICBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgICBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gJ29rJykge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdChmYWlsdXJlcywgZm9ybWF0RmFpbHVyZXMobm90ZS5uYW1lLCBmYWlsdXJlcykpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERyaXZlcyBhIHJlYWwgT2JzaWRpYW4gb3ZlciBDRFA6IHRoZSBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgaGVyZSBhbmQgZXhlY3V0ZWQgaW4gYW5vdGhlciBwcm9jZXNzLCBzbyBpdCBjYW5ub3QgYmUgZXhlcmNpc2VkIGJ5IGEgdW5pdCB0ZXN0LiAqL1xuLyoqXG4gKiBUdXJucyByZXN0cmljdGVkIG1vZGUgb2ZmIGFuZCBlbmFibGVzIENvZGVTY3JpcHQgVG9vbGtpdCwgd2hvc2UgYmluYXJ5IHRoZSBnbG9iYWwgc2V0dXAgc2VlZGVkLlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBIb3cgbG9uZyB0byB3YWl0IGZvciBpdCB0byBsb2FkLlxuICogQHJldHVybnMgV2hldGhlciBDb2RlU2NyaXB0IFRvb2xraXQgaXMgbG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkKHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBldmFsSW5PYnNpZGlhbih7XG4gICAgYXN5bmMgY2FsbGJhY2soeyBhcHAsIGNvZGVTY3JpcHRUb29sa2l0UGx1Z2luSWQsIGludGVydmFsSW5NaWxsaXNlY29uZHMsIGxpYjogeyB3YWl0VW50aWwgfSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aW1lb3V0IH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGlmICh0eXBlb2YgYXBwLnBsdWdpbnMuaXNFbmFibGVkID09PSAnZnVuY3Rpb24nICYmICFhcHAucGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWFwcC5wbHVnaW5zLmdldFBsdWdpbihjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkKSkge1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW4oY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvZGVTY3JpcHQgVG9vbGtpdCBuZXZlciBsb2FkZWQnLFxuICAgICAgICAgIHByZWRpY2F0ZTogKCk6IGJvb2xlYW4gPT4gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKGNvZGVTY3JpcHRUb29sa2l0UGx1Z2luSWQpICE9PSBudWxsLFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGlucHV0OiB7XG4gICAgICBjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkOiBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCxcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHM6IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSxcbiAgICB2YXVsdFBhdGg6IGdldFRlbXBvcmFyeVZhdWx0KCkucGF0aFxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERyaXZlcyBhIHJlYWwgT2JzaWRpYW4gb3ZlciBDRFA6IHRoZSBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgaGVyZSBhbmQgZXhlY3V0ZWQgaW4gYW5vdGhlciBwcm9jZXNzLCBzbyBpdCBjYW5ub3QgYmUgZXhlcmNpc2VkIGJ5IGEgdW5pdCB0ZXN0LiAqL1xuLyoqXG4gKiBDbGlja3Mgb25lIGJ1dHRvbiBhbmQgcmVhZHMgdGhlIHJlc3VsdCBsaW5lIENvZGVTY3JpcHQgVG9vbGtpdCB3cml0ZXMgdW5kZXIgaXQuXG4gKlxuICogQSBidXR0b24gdGhhdCByZS1yZW5kZXJzIGl0cyBvd24gbm90ZSAoYSBzZXR0aW5ncyBjaGFuZ2UsIGEgcmVsb2FkKSBkZXRhY2hlcyB0aGUgYmxvY2sgaXQgbGl2ZXMgaW4sXG4gKiBzbyB0aGUgYmxvY2sgZWxlbWVudCBpcyBjYXB0dXJlZCBCRUZPUkUgdGhlIGNsaWNrIGFuZCByZWFkIGFmdGVyd2FyZHMgXHUyMDE0IENvZGVTY3JpcHQgVG9vbGtpdCB3cml0ZXMgdGhlXG4gKiByZXN1bHQgaW50byB0aGF0IHNhbWUgZWxlbWVudCBldmVuIG9uY2UgaXQgaXMgZGV0YWNoZWQuXG4gKlxuICogQHBhcmFtIG5vdGVQYXRoIC0gVGhlIG5vdGUgaG9sZGluZyB0aGUgYnV0dG9uLlxuICogQHBhcmFtIGJ1dHRvbkNhcHRpb24gLSBUaGUgYnV0dG9uJ3MgcmVuZGVyZWQgY2FwdGlvbiwgd2hpY2ggaXMgaG93IGl0IGlzIGFkZHJlc3NlZC5cbiAqIEBwYXJhbSB0aW1lb3V0cyAtIFRoZSByZW5kZXIgYW5kIHJlc3VsdCBidWRnZXRzLlxuICogQHJldHVybnMgVGhlIHtAbGluayBEZW1vVmF1bHRCdXR0b25SZXN1bHR9LlxuICovXG5hc3luYyBmdW5jdGlvbiBjbGlja0J1dHRvbihcbiAgbm90ZVBhdGg6IHN0cmluZyxcbiAgYnV0dG9uQ2FwdGlvbjogc3RyaW5nLFxuICB0aW1lb3V0czogQ2xpY2tCdXR0b25UaW1lb3V0c1xuKTogUHJvbWlzZTxEZW1vVmF1bHRCdXR0b25SZXN1bHQ+IHtcbiAgcmV0dXJuIGV2YWxJbk9ic2lkaWFuKHtcbiAgICBhc3luYyBjYWxsYmFjayh7XG4gICAgICBhcHAsXG4gICAgICBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBjYXB0aW9uLFxuICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgIGxpYjogeyB3YWl0VW50aWwgfSxcbiAgICAgIG5vdGVQYXRoOiBub3RlUGF0aFRvT3BlbixcbiAgICAgIG9ic2lkaWFuTW9kdWxlLFxuICAgICAgb3V0cHV0RXhjZXJwdExlbmd0aCxcbiAgICAgIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0pOiBQcm9taXNlPERlbW9WYXVsdEJ1dHRvblJlc3VsdD4ge1xuICAgICAgZnVuY3Rpb24gdmlldygpOiBJbnN0YW5jZVR5cGU8dHlwZW9mIG9ic2lkaWFuTW9kdWxlLk1hcmtkb3duVmlldz4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShvYnNpZGlhbk1vZHVsZS5NYXJrZG93blZpZXcpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcHJldmlld0VsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB2aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgLm1hcmtkb3duLXByZXZpZXctdmlldycpID8/IG51bGw7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidXR0b25zKCk6IEhUTUxCdXR0b25FbGVtZW50W10ge1xuICAgICAgICByZXR1cm4gWy4uLnZpZXcoKT8uY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJzpzY29wZSAuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24gYnV0dG9uLm1vZC1jdGEnKSA/PyBbXV07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZpbmRCdXR0b24oKTogSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gYnV0dG9ucygpLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnRleHRDb250ZW50ID09PSBjYXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZGluZyB2aWV3IG1vdW50cyBsYXppbHkgYW5kIHVubW91bnRzIHNlY3Rpb25zIGZhciBvZmYtc2NyZWVuLCBzbyBOTyBzaW5nbGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAvLyBIb2xkcyBhIHdob2xlIG5vdGUncyBidXR0b25zLiBBZHZhbmNlIGEgdmlld3BvcnQgYXQgYSB0aW1lIGFuZCB3cmFwIGJhY2sgdG8gdGhlIHRvcCwgcmVtb3VudGluZ1xuICAgICAgLy8gRXZlcnkgc2VjdGlvbiBpbiB0dXJuIHVudGlsIHRoZSBvbmUgYmVpbmcgbG9va2VkIGZvciBhcHBlYXJzLiBQaW5uaW5nIHRvIHRoZSBCT1RUT00gaW5zdGVhZCBcdTIwMTRcbiAgICAgIC8vIFdoYXQgdGhpcyBkaWQgdW50aWwgOTQuNC4xIFx1MjAxNCBvbmx5IGV2ZXIgbW91bnRzIHRoZSBub3RlJ3MgdGFpbCwgc28gYSBidXR0b24gYW55d2hlcmUgYnV0IGF0IHRoZVxuICAgICAgLy8gRW5kIG9mIGl0cyBub3RlIHdhcyByZXBvcnRlZCBhcyBuZXZlciByZW5kZXJlZCAoYHN0YXR1czogJ3RpbWVvdXQnYCwgZW1wdHkgb3V0cHV0KSBob3dldmVyXG4gICAgICAvLyBIZWFsdGh5IGl0IHdhcy5cbiAgICAgIGNvbnN0IFNDUk9MTF9CT1RUT01fVE9MRVJBTkNFX0lOX1BJWEVMUyA9IDQ7XG4gICAgICBjb25zdCBTQ1JPTExfU1RFUF9SQVRJTyA9IDAuODtcbiAgICAgIGZ1bmN0aW9uIGFkdmFuY2VTY3JvbGwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNjcm9sbGVyID0gcHJldmlld0VsKCk7XG4gICAgICAgIGlmICghc2Nyb2xsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNBdEJvdHRvbSA9IHNjcm9sbGVyLnNjcm9sbFRvcCArIHNjcm9sbGVyLmNsaWVudEhlaWdodCA+PSBzY3JvbGxlci5zY3JvbGxIZWlnaHQgLSBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRV9JTl9QSVhFTFM7XG4gICAgICAgIHNjcm9sbGVyLnNjcm9sbFRvcCA9IGlzQXRCb3R0b20gPyAwIDogc2Nyb2xsZXIuc2Nyb2xsVG9wICsgTWF0aC5mbG9vcihzY3JvbGxlci5jbGllbnRIZWlnaHQgKiBTQ1JPTExfU1RFUF9SQVRJTyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLW9wZW4gdGhlIG5vdGUgYmVmb3JlIGV2ZXJ5IGNsaWNrIGluc3RlYWQgb2YgYXNzdW1pbmcgdGhlIHByZXZpb3VzIGJ1dHRvbiBsZWZ0IHRoZSB3b3Jrc3BhY2VcbiAgICAgIC8vIFdoZXJlIGl0IHdhcyBmb3VuZC4gRXZlcnkgaGVscGVyIGFib3ZlIHJlYWRzIHRoZSBBQ1RJVkUgdmlldywgYW5kIG9wZW5pbmcgYSBub3RlIGlzIG9uZSBvZiB0aGVcbiAgICAgIC8vIE1vc3Qgb3JkaW5hcnkgdGhpbmdzIGEgZGVtbyBidXR0b24gZG9lcyBcdTIwMTQgc28gdGhlIGZpcnN0IHN1Y2ggYnV0dG9uIHdvdWxkIG90aGVyd2lzZSBzZW5kIGVhY2hcbiAgICAgIC8vIExhdGVyIGJ1dHRvbiBpbiBpdHMgbm90ZSB0byBgc3RhdHVzOiAndGltZW91dCdgIHdpdGggYW4gZW1wdHkgb3V0cHV0LCB3aGljaCBpcyB0aGUgc2hhcGUgb2YgYVxuICAgICAgLy8gQnV0dG9uIHRoYXQgbmV2ZXIgcmVuZGVyZWQgcmF0aGVyIHRoYW4gb25lIHRoYXQgd2FzIGxvb2tlZCBmb3IgaW4gdGhlIHdyb25nIHZpZXcuXG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChub3RlUGF0aFRvT3Blbi5yZXBsYWNlKC9cXC5tZCQvLCAnJyksICcnLCBmYWxzZSk7XG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLmdldExlYWYoZmFsc2UpLnNldFZpZXdTdGF0ZSh7IHN0YXRlOiB7IGZpbGU6IG5vdGVQYXRoVG9PcGVuLCBtb2RlOiAncHJldmlldycgfSwgdHlwZTogJ21hcmtkb3duJyB9KTtcblxuICAgICAgLy8gSGVsZCBmcm9tIHRoZSBwcmVkaWNhdGUgcmF0aGVyIHRoYW4gcmUtcXVlcmllZCBhZnRlciBpdDogdGhlIHdhbGsgYWJvdmUga2VlcHMgbW92aW5nIHRoZVxuICAgICAgLy8gVmlld3BvcnQsIHNvIGEgYnV0dG9uIGZvdW5kIG9uIG9uZSBwb2xsIGNhbiBiZSB1bm1vdW50ZWQgYWdhaW4gYnkgdGhlIG5leHQuXG4gICAgICBsZXQgYnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBtZXNzYWdlOiBgY29kZSBidXR0b24gXCIke2NhcHRpb259XCIgbmV2ZXIgcmVuZGVyZWRgLFxuICAgICAgICAgIHByZWRpY2F0ZTogKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgYWR2YW5jZVNjcm9sbCgpO1xuICAgICAgICAgICAgYnV0dG9uID0gZmluZEJ1dHRvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHsgY2FwdGlvbiwgb3V0cHV0OiAnJywgc3RhdHVzOiAndGltZW91dCcgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFidXR0b24pIHtcbiAgICAgICAgcmV0dXJuIHsgY2FwdGlvbiwgb3V0cHV0OiAnJywgc3RhdHVzOiAndGltZW91dCcgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvY2sgPSBidXR0b24uY2xvc2VzdDxIVE1MRWxlbWVudD4oJy5ibG9jay1sYW5ndWFnZS1jb2RlLWJ1dHRvbicpID8/IGJ1dHRvbi5wYXJlbnRFbGVtZW50O1xuICAgICAgYnV0dG9uLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICBidXR0b24uY2xpY2soKTtcblxuICAgICAgbGV0IHN0YXR1czogRGVtb1ZhdWx0QnV0dG9uUmVzdWx0WydzdGF0dXMnXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBtZXNzYWdlOiBgYnV0dG9uIFwiJHtjYXB0aW9ufVwiIG5ldmVyIHJlcG9ydGVkIGEgcmVzdWx0YCxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IC9FeGVjdXRlZCAoPzpzdWNjZXNzZnVsbHl8d2l0aCBlcnJvcikvLnRlc3QoYmxvY2s/LnRleHRDb250ZW50ID8/ICcnKSxcbiAgICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGJsb2NrPy50ZXh0Q29udGVudCA/PyAnJztcbiAgICAgICAgaWYgKHRleHQuaW5jbHVkZXMoJ0V4ZWN1dGVkIHdpdGggZXJyb3InKSkge1xuICAgICAgICAgIHN0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgIH0gZWxzZSBpZiAodGV4dC5pbmNsdWRlcygnRXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5JykpIHtcbiAgICAgICAgICBzdGF0dXMgPSAnb2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXR1cyA9ICd1bmtub3duJztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHN0YXR1cyA9ICd0aW1lb3V0JztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY2FwdGlvbiwgb3V0cHV0OiAoYmxvY2s/LnRleHRDb250ZW50ID8/ICcnKS5zbGljZSgwLCBvdXRwdXRFeGNlcnB0TGVuZ3RoKSwgc3RhdHVzIH07XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzOiB0aW1lb3V0cy5idXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBjYXB0aW9uOiBidXR0b25DYXB0aW9uLFxuICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kczogUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBub3RlUGF0aCxcbiAgICAgIG91dHB1dEV4Y2VycHRMZW5ndGg6IE9VVFBVVF9FWENFUlBUX0xFTkdUSCxcbiAgICAgIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dHMuc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSxcbiAgICB2YXVsdFBhdGg6IGdldFRlbXBvcmFyeVZhdWx0KCkucGF0aFxuICB9KTtcbn1cblxuLyoqXG4gKiBPcGVucyBhIG5vdGUgaW4gcmVhZGluZyB2aWV3IGFuZCBsaXN0cyB0aGUgY2FwdGlvbnMgb2YgdGhlIGJ1dHRvbnMgdGhhdCBtb3VudGVkLCBkZWR1cGxpY2F0ZWQgYW5kIGluXG4gKiBkb2N1bWVudCBvcmRlci5cbiAqXG4gKiBUd28gcXVpcmtzIG9mIHJlYWRpbmcgdmlldyBzaGFwZSB0aGlzLiBJdCByZW5kZXJzIGxhemlseSBhbmQgdW5tb3VudHMgc2VjdGlvbnMgZmFyIG9mZi1zY3JlZW4sIHNvIG5vXG4gKiBzaW5nbGUgc2Nyb2xsIHBvc2l0aW9uIGhvbGRzIGEgd2hvbGUgbm90ZSdzIGJ1dHRvbnMgXHUyMDE0IHRoZSBwcmV2aWV3IGlzIHdhbGtlZCB0b3AgdG8gYm90dG9tIGFuZCBiYWNrXG4gKiB3aGlsZSB3YWl0aW5nLCBhbmQgdGhlIGNhcHRpb25zIHNlZW4gYWxvbmcgdGhlIHdheSBhcmUgQUNDVU1VTEFURUQgcmF0aGVyIHRoYW4gcmVhZCBvbmNlIGF0IHRoZSBlbmQuXG4gKiBBbmQgd2hpbGUgaXQgc2V0dGxlcyBpdCBjYW4gaG9sZCBTRVZFUkFMIGVsZW1lbnRzIHBlciBmZW5jZSBcdTIwMTQgdGhlIHNhbWUgYnV0dG9uIHdhcyBvYnNlcnZlZCByZW5kZXJlZFxuICogdHdpY2UgXHUyMDE0IHNvIHRoZSBjYXB0aW9ucyBhcmUgZGVkdXBsaWNhdGVkOyBjbGlja2luZyBieSBjYXB0aW9uIHRoZW4gYWRkcmVzc2VzIGVhY2ggYnV0dG9uIG9uY2UgaG93ZXZlclxuICogbWFueSBjb3BpZXMgb2YgaXQgdGhlIERPTSBpcyBob2xkaW5nLlxuICpcbiAqIEBwYXJhbSBub3RlIC0gVGhlIG5vdGUgdG8gb3Blbi5cbiAqIEBwYXJhbSBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgLSBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgYnV0dG9ucyB0byBtb3VudC5cbiAqIEByZXR1cm5zIFRoZSBkaXN0aW5jdCBidXR0b24gY2FwdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Ob3RlQW5kTGlzdEJ1dHRvbkNhcHRpb25zKG5vdGU6IERlbW9WYXVsdE5vdGUsIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gZXZhbEluT2JzaWRpYW4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBleHBlY3RlZEJ1dHRvbkNvdW50LCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLCBsaWI6IHsgd2FpdFVudGlsIH0sIG5vdGVQYXRoLCBvYnNpZGlhbk1vZHVsZSwgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBmdW5jdGlvbiB2aWV3KCk6IEluc3RhbmNlVHlwZTx0eXBlb2Ygb2JzaWRpYW5Nb2R1bGUuTWFya2Rvd25WaWV3PiB8IG51bGwge1xuICAgICAgICByZXR1cm4gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKG9ic2lkaWFuTW9kdWxlLk1hcmtkb3duVmlldyk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBwcmV2aWV3RWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHZpZXcoKT8uY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJzpzY29wZSAubWFya2Rvd24tcHJldmlldy12aWV3JykgPz8gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIEFjY3VtdWxhdGVkIGFjcm9zcyB0aGUgd2FsayBiZWxvdywgbmV2ZXIgcmVhZCBmcm9tIG9uZSBzbmFwc2hvdDogd2l0aCB0aGUgdmlld3BvcnQgbW92aW5nLCBhbnlcbiAgICAgIC8vIFNpbmdsZSByZWFkaW5nIGhvbGRzIG9ubHkgdGhlIHNlY3Rpb25zIGN1cnJlbnRseSBtb3VudGVkLlxuICAgICAgY29uc3Qgc2VlbkNhcHRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmdW5jdGlvbiBjYXB0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGZvciAoY29uc3QgYnV0dG9uIG9mIHZpZXcoKT8uY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJzpzY29wZSAuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24gYnV0dG9uLm1vZC1jdGEnKSA/PyBbXSkge1xuICAgICAgICAgIGlmIChidXR0b24udGV4dENvbnRlbnQgIT09ICcnKSB7XG4gICAgICAgICAgICBzZWVuQ2FwdGlvbnMuYWRkKGJ1dHRvbi50ZXh0Q29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbLi4uc2VlbkNhcHRpb25zXTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FtZSB3YWxrIGFzIGBjbGlja0J1dHRvbmAsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiBhIG5vdGUgd2hvc2UgYnV0dG9ucyBhcmUgaW4gdGhlIE1JRERMRVxuICAgICAgLy8gTmV2ZXIgbW91bnRzIHRoZW0gaWYgdGhlIHByZXZpZXcgaXMgcGlubmVkIHRvIHRoZSBib3R0b20uXG4gICAgICBjb25zdCBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRV9JTl9QSVhFTFMgPSA0O1xuICAgICAgY29uc3QgU0NST0xMX1NURVBfUkFUSU8gPSAwLjg7XG4gICAgICBmdW5jdGlvbiBhZHZhbmNlU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JvbGxlciA9IHByZXZpZXdFbCgpO1xuICAgICAgICBpZiAoIXNjcm9sbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQXRCb3R0b20gPSBzY3JvbGxlci5zY3JvbGxUb3AgKyBzY3JvbGxlci5jbGllbnRIZWlnaHQgPj0gc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0VfSU5fUElYRUxTO1xuICAgICAgICBzY3JvbGxlci5zY3JvbGxUb3AgPSBpc0F0Qm90dG9tID8gMCA6IHNjcm9sbGVyLnNjcm9sbFRvcCArIE1hdGguZmxvb3Ioc2Nyb2xsZXIuY2xpZW50SGVpZ2h0ICogU0NST0xMX1NURVBfUkFUSU8pO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChub3RlUGF0aC5yZXBsYWNlKC9cXC5tZCQvLCAnJyksICcnLCBmYWxzZSk7XG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLmdldExlYWYoZmFsc2UpLnNldFZpZXdTdGF0ZSh7IHN0YXRlOiB7IGZpbGU6IG5vdGVQYXRoLCBtb2RlOiAncHJldmlldycgfSwgdHlwZTogJ21hcmtkb3duJyB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKHtcbiAgICAgICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7bm90ZVBhdGh9XCIgbmV2ZXIgbW91bnRlZCBhbGwgJHtTdHJpbmcoZXhwZWN0ZWRCdXR0b25Db3VudCl9IG9mIGl0cyBidXR0b25zYCxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGFkdmFuY2VTY3JvbGwoKTtcbiAgICAgICAgICAgIHJldHVybiBjYXB0aW9ucygpLmxlbmd0aCA+PSBleHBlY3RlZEJ1dHRvbkNvdW50O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBjYXB0aW9ucyBhcmUgcmV0dXJuZWQgZWl0aGVyIHdheTsgdGhlIGNhbGxlciBhc3NlcnRzIG9uIHRoZW0gYW5kIHJlcG9ydHMgdGhlIHNob3J0ZmFsbC5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNhcHRpb25zKCk7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgZXhwZWN0ZWRCdXR0b25Db3VudDogbm90ZS5idXR0b25Db3VudCxcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHM6IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbm90ZVBhdGg6IG5vdGUubmFtZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSxcbiAgICB2YXVsdFBhdGg6IGdldFRlbXBvcmFyeVZhdWx0KCkucGF0aFxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sYUFBYTtBQUNwQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxxQkFBcUI7QUFNdkIsTUFB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
|