@promptbook/components 0.112.0-93 → 0.112.0-95
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/esm/index.es.js +437 -497
- package/esm/index.es.js.map +1 -1
- package/esm/src/book-components/Chat/utils/renderMarkdown.test.d.ts +1 -0
- package/esm/src/version.d.ts +1 -1
- package/package.json +3 -1
- package/umd/index.umd.js +440 -500
- package/umd/index.umd.js.map +1 -1
- package/umd/src/book-components/Chat/utils/renderMarkdown.test.d.ts +1 -0
- package/umd/src/version.d.ts +1 -1
package/esm/index.es.js
CHANGED
|
@@ -10,8 +10,9 @@ import { randomBytes } from 'crypto';
|
|
|
10
10
|
import { createPortal } from 'react-dom';
|
|
11
11
|
import MonacoEditor, { useMonaco } from '@monaco-editor/react';
|
|
12
12
|
import { Registration } from 'destroyable';
|
|
13
|
-
import katex from 'katex';
|
|
14
13
|
import { createRoot } from 'react-dom/client';
|
|
14
|
+
import createDOMPurify from 'dompurify';
|
|
15
|
+
import katex from 'katex';
|
|
15
16
|
import { Converter } from 'showdown';
|
|
16
17
|
import { BehaviorSubject, Subject } from 'rxjs';
|
|
17
18
|
import { toCanvas } from 'html-to-image';
|
|
@@ -41,7 +42,7 @@ const BOOK_LANGUAGE_VERSION = '2.0.0';
|
|
|
41
42
|
* @generated
|
|
42
43
|
* @see https://github.com/webgptorg/promptbook
|
|
43
44
|
*/
|
|
44
|
-
const PROMPTBOOK_ENGINE_VERSION = '0.112.0-
|
|
45
|
+
const PROMPTBOOK_ENGINE_VERSION = '0.112.0-95';
|
|
45
46
|
/**
|
|
46
47
|
* TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
|
|
47
48
|
* Note: [💞] Ignore a discrepancy between file name and entity name
|
|
@@ -21552,19 +21553,341 @@ function parseCitationMarkersFromContent(content) {
|
|
|
21552
21553
|
return markers;
|
|
21553
21554
|
}
|
|
21554
21555
|
|
|
21555
|
-
var css_248z$b = ".MarkdownContent-module_MarkdownContent__2JuyX{--md-text-color:var(--chat-md-text-color,inherit);--md-muted-color:var(--chat-md-muted-color,currentColor);--md-link-color:var(--chat-md-link-color,#2563eb);--md-heading-color:var(--chat-heading-text-color,var(--md-text-color));--md-heading-font-family:var(\n --chat-md-heading-font-family,var(--font-poppins,\"Poppins\",system-ui,-apple-system,sans-serif)\n );--md-body-font-family:var(\n --chat-md-body-font-family,var(--font-poppins,\"Poppins\",system-ui,-apple-system,sans-serif)\n );--md-code-font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",monospace;--md-inline-code-bg:var(--chat-md-inline-code-bg,rgba(15,23,42,.08));--md-inline-code-border:var(--chat-md-inline-code-border,rgba(15,23,42,.12));--md-inline-code-color:var(--chat-md-inline-code-color,var(--md-text-color));--md-blockquote-bg:var(--chat-md-blockquote-bg,rgba(248,250,252,.92));--md-blockquote-border:var(--chat-md-blockquote-border,rgba(59,130,246,.35));--md-table-bg:var(--chat-md-table-bg,rgba(248,250,252,.92));--md-table-row-alt-bg:var(--chat-md-table-row-alt-bg,rgba(241,245,249,.9));--md-table-head-bg:var(--chat-md-table-head-bg,rgba(226,232,240,.95));--md-table-border:var(--chat-md-table-border,rgba(148,163,184,.36));--md-citation-bg:var(--chat-md-citation-bg,rgba(59,130,246,.14));--md-citation-color:var(--chat-md-citation-color,#1d4ed8);color:var(--md-text-color);font-family:var(--md-body-font-family);font-size:inherit;letter-spacing:.002em;line-height:1.65}.MarkdownContent-module_MarkdownContent__2JuyX>:first-child{margin-top:0!important}.MarkdownContent-module_MarkdownContent__2JuyX>:last-child{margin-bottom:0!important}.MarkdownContent-module_MarkdownContent__2JuyX :is(h1,h2,h3,h4,h5,h6){text-wrap:balance;color:var(--md-heading-color);font-family:var(--md-heading-font-family);font-weight:600;letter-spacing:.01em;line-height:1.24;margin:1.4em 0 .55em;position:relative}.MarkdownContent-module_MarkdownContent__2JuyX h1{font-size:1.52rem}.MarkdownContent-module_MarkdownContent__2JuyX h2{font-size:1.4rem}.MarkdownContent-module_MarkdownContent__2JuyX h3{font-size:1.26rem}.MarkdownContent-module_MarkdownContent__2JuyX h4{font-size:1.14rem}.MarkdownContent-module_MarkdownContent__2JuyX h5{font-size:1.04rem}.MarkdownContent-module_MarkdownContent__2JuyX h6{font-size:.98rem}.MarkdownContent-module_MarkdownContent__2JuyX p{text-wrap:pretty;margin:0 0 .9em}.MarkdownContent-module_MarkdownContent__2JuyX p:empty{display:none}.MarkdownContent-module_MarkdownContent__2JuyX :is(ul,ol){display:grid;gap:.35em;margin:.65em 0 1em;padding-inline-start:1.35rem}.MarkdownContent-module_MarkdownContent__2JuyX ul{list-style:disc}.MarkdownContent-module_MarkdownContent__2JuyX ol{list-style:decimal}.MarkdownContent-module_MarkdownContent__2JuyX li{line-height:1.58}.MarkdownContent-module_MarkdownContent__2JuyX li>:is(ul,ol){margin-bottom:0;margin-top:.45em}.MarkdownContent-module_MarkdownContent__2JuyX ul:has(>li>[data-chat-progress-marker]){list-style:none;padding-inline-start:0}.MarkdownContent-module_MarkdownContent__2JuyX ul:has(>li>[data-chat-progress-marker])>li{list-style:none}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker]{border-radius:999px;color:var(--md-link-color);display:inline-flex;height:1rem;margin-right:.58rem;transform-origin:center;vertical-align:text-bottom;width:1rem}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=pending]{animation:MarkdownContent-module_chatProgressMarkerSpin__TpoKr .85s linear infinite;border:2px solid color-mix(in srgb,currentColor 22%,transparent);border-top-color:currentcolor;box-sizing:border-box}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=completed]{align-items:center;background:color-mix(in srgb,currentColor 12%,transparent);border:2px solid;box-sizing:border-box;justify-content:center}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=completed]:before{border-bottom:2px solid;border-right:2px solid;box-sizing:border-box;content:\"\";display:block;height:.5rem;margin-top:-.06rem;transform:rotate(45deg);width:.26rem}@keyframes MarkdownContent-module_chatProgressMarkerSpin__TpoKr{to{transform:rotate(1turn)}}.MarkdownContent-module_MarkdownContent__2JuyX a{color:var(--md-link-color);text-decoration-color:currentColor;text-decoration-line:underline;text-decoration-thickness:1.4px;text-underline-offset:.16em;transition:opacity .2s ease,text-decoration-thickness .2s ease}.MarkdownContent-module_MarkdownContent__2JuyX a:focus-visible,.MarkdownContent-module_MarkdownContent__2JuyX a:hover{opacity:.92;text-decoration-thickness:2px}.MarkdownContent-module_MarkdownContent__2JuyX img{border-radius:14px;display:block;height:auto;margin:.95em 0;max-width:100%}.MarkdownContent-module_MarkdownContent__2JuyX blockquote,.MarkdownContent-module_MarkdownContent__2JuyX hr,.MarkdownContent-module_MarkdownContent__2JuyX pre,.MarkdownContent-module_MarkdownContent__2JuyX table{margin:.95em 0}.MarkdownContent-module_MarkdownContent__2JuyX pre{background:transparent;border:none;border-radius:12px;box-shadow:none;display:block;overflow:visible;padding:0}.MarkdownContent-module_MarkdownContent__2JuyX blockquote{background:var(--md-blockquote-bg);border:none;border-left:3px solid var(--md-blockquote-border);border-radius:12px;box-shadow:none;color:var(--md-muted-color);display:block;padding:.72em .96em}.MarkdownContent-module_MarkdownContent__2JuyX blockquote>:last-child{margin-bottom:0}.MarkdownContent-module_MarkdownContent__2JuyX code{background:var(--md-inline-code-bg);border:1px solid var(--md-inline-code-border);border-radius:8px;color:var(--md-inline-code-color);font-family:var(--md-code-font-family);font-size:.88em;line-height:1.45;margin:0;padding:.14em .42em;word-break:break-word}.MarkdownContent-module_MarkdownContent__2JuyX pre code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:normal}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg{background:#181c23;border:1px solid rgba(148,163,184,.35);border-radius:12px;box-shadow:0 6px 18px rgba(2,6,23,.28);color:#f8fafc;font-family:var(--md-code-font-family);font-size:14px;line-height:1.6;overflow-x:auto}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:normal}.MarkdownContent-module_MarkdownContent__2JuyX table{background:var(--md-table-bg);border:1px solid var(--md-table-border);border-collapse:separate;border-radius:12px;border-spacing:0;box-shadow:0 2px 8px rgba(15,23,42,.1);color:inherit;font-size:.93em;overflow:hidden;width:100%}.MarkdownContent-module_MarkdownContent__2JuyX td,.MarkdownContent-module_MarkdownContent__2JuyX th{background:none;border-bottom:1px solid var(--md-table-border);color:inherit;padding:.58em .72em;text-align:left;vertical-align:top}.MarkdownContent-module_MarkdownContent__2JuyX th{background:var(--md-table-head-bg);font-weight:600}.MarkdownContent-module_MarkdownContent__2JuyX tr:last-child td{border-bottom:none}.MarkdownContent-module_MarkdownContent__2JuyX tr:nth-child(2n) td{background:var(--md-table-row-alt-bg)}.MarkdownContent-module_MarkdownContent__2JuyX hr{border:none;border-top:1px solid var(--md-table-border);opacity:.8}.MarkdownContent-module_MarkdownContent__2JuyX details{background:color-mix(in srgb,var(--md-table-bg) 82%,hsla(0,0%,100%,.3) 18%);border:1px solid var(--md-table-border);border-radius:16px;box-shadow:0 8px 22px rgba(15,23,42,.08);margin:.95em 0;overflow:hidden;transition:border-color .18s ease,box-shadow .18s ease,transform .18s ease}.MarkdownContent-module_MarkdownContent__2JuyX details:focus-within,.MarkdownContent-module_MarkdownContent__2JuyX details:hover{border-color:color-mix(in srgb,var(--md-link-color) 24%,var(--md-table-border) 76%);box-shadow:0 12px 28px rgba(15,23,42,.12)}.MarkdownContent-module_MarkdownContent__2JuyX details>summary{align-items:center;background:linear-gradient(180deg,color-mix(in srgb,var(--md-table-head-bg) 88%,hsla(0,0%,100%,.85) 12%),color-mix(in srgb,var(--md-table-bg) 82%,hsla(0,0%,100%,.7) 18%));color:var(--md-link-color);cursor:pointer;display:flex;font-weight:600;gap:.72rem;list-style:none;padding:.9em 1.05em;transition:background .18s ease,color .18s ease;user-select:none}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:before{border-bottom:2px solid;border-right:2px solid;content:\"\";flex:0 0 auto;height:.62rem;margin-top:-.04rem;opacity:.82;transform:rotate(-45deg);transition:transform .18s ease,opacity .18s ease;width:.62rem}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:focus-visible,.MarkdownContent-module_MarkdownContent__2JuyX details>summary:hover{background:linear-gradient(180deg,color-mix(in srgb,var(--md-table-head-bg) 76%,hsla(0,0%,100%,.95) 24%),color-mix(in srgb,var(--md-table-bg) 74%,hsla(0,0%,100%,.82) 26%))}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:focus-visible{outline:2px solid color-mix(in srgb,var(--md-link-color) 52%,transparent);outline-offset:-2px}.MarkdownContent-module_MarkdownContent__2JuyX details>summary::-webkit-details-marker{display:none}.MarkdownContent-module_MarkdownContent__2JuyX details[open]>summary{border-bottom:1px solid color-mix(in srgb,var(--md-table-border) 88%,transparent)}.MarkdownContent-module_MarkdownContent__2JuyX details[open]>summary:before{opacity:1;transform:rotate(45deg)}.MarkdownContent-module_MarkdownContent__2JuyX details>:not(summary){margin-left:1.05em;margin-right:1.05em}.MarkdownContent-module_MarkdownContent__2JuyX details>summary+*{margin-top:.95em}.MarkdownContent-module_MarkdownContent__2JuyX details>:last-child{margin-bottom:1.05em}.MarkdownContent-module_MarkdownContent__2JuyX strong{font-weight:650}.MarkdownContent-module_MarkdownContent__2JuyX em{font-style:italic}.MarkdownContent-module_citationRef__fKqaT,.MarkdownContent-module_citation__11SMw{align-items:center;background:var(--md-citation-bg);border-radius:999px;color:var(--md-citation-color);display:inline-flex;font-size:.74em;font-weight:700;justify-content:center;line-height:1.45;margin:0 .1em;min-width:1.4em;padding:0 .35em;vertical-align:super}.MarkdownContent-module_MarkdownContent__2JuyX sup[data-citation-footnote]{color:currentColor;display:inline;font-size:.72em;font-weight:700;line-height:1;margin:0 .7em 0 .08em;vertical-align:super}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUNJLGlEQUFtRCxDQUNuRCx3REFBMEQsQ0FDMUQsaURBQW1ELENBQ25ELHNFQUF3RSxDQUN4RTs7S0FHQyxDQUNEOztLQUdDLENBQ0QsbUdBQTBHLENBQzFHLG9FQUEwRSxDQUMxRSw0RUFBa0YsQ0FDbEYsNEVBQThFLENBQzlFLHFFQUEyRSxDQUMzRSw0RUFBa0YsQ0FDbEYsMkRBQWlFLENBQ2pFLDBFQUFnRixDQUNoRixxRUFBMkUsQ0FDM0UsbUVBQXlFLENBQ3pFLGdFQUFzRSxDQUN0RSx5REFBMkQsQ0FFM0QsMEJBQTJCLENBQzNCLHNDQUF1QyxDQUN2QyxpQkFBa0IsQ0FFbEIscUJBQXVCLENBRHZCLGdCQUVKLENBRUEsNERBQ0ksc0JBQ0osQ0FFQSwyREFDSSx5QkFDSixDQUVBLHNFQVFJLGlCQUFrQixDQUxsQiw2QkFBOEIsQ0FDOUIseUNBQTBDLENBQzFDLGVBQWdCLENBRWhCLG9CQUFzQixDQUR0QixnQkFBaUIsQ0FKakIsb0JBQXNCLENBRHRCLGlCQVFKLENBRUEsa0RBQ0ksaUJBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGlCQUNKLENBRUEsa0RBQ0ksaUJBQ0osQ0FFQSxrREFDSSxpQkFDSixDQUVBLGtEQUNJLGdCQUNKLENBRUEsaURBRUksZ0JBQWlCLENBRGpCLGVBRUosQ0FFQSx1REFDSSxZQUNKLENBRUEsMERBR0ksWUFBYSxDQUNiLFNBQVcsQ0FIWCxrQkFBb0IsQ0FDcEIsNEJBR0osQ0FFQSxrREFDSSxlQUNKLENBRUEsa0RBQ0ksa0JBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLDZEQUVJLGVBQWdCLENBRGhCLGdCQUVKLENBRUEsdUZBQ0ksZUFBZ0IsQ0FDaEIsc0JBQ0osQ0FFQSwwRkFDSSxlQUNKLENBRUEsMkVBTUksbUJBQW9CLENBQ3BCLDBCQUEyQixDQU4zQixtQkFBb0IsQ0FFcEIsV0FBWSxDQUNaLG1C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QXFDLENBRHJDLHNCQUFvQyxDQUxwQyxVQUFXLENBR1gsYUFBYyxDQURkLGFBQWUsQ0FFZixrQkFBb0IsQ0FJcEIsV0FBYSxDQURiLHdCQUF5QixDQUV6QixnREFBb0QsQ0FScEQsWUFTSixDQUVBLGtKQUVJLDJLQUtKLENBRUEsNkVBQ0kseUVBQTRFLENBQzVFLG1CQUNKLENBRUEsdUZBQ0ksWUFDSixDQUVBLHFFQUNJLGlGQUNKLENBRUEsNEVBRUksU0FBVSxDQURWLHVCQUVKLENBRUEscUVBQ0ksa0JBQW1CLENBQ25CLG1CQUNKLENBRUEsaUVBQ0ksZ0JBQ0osQ0FFQSxtRUFDSSxvQkFDSixDQUVBLHNEQUNJLGVBQ0osQ0FFQSxrREFDSSxpQkFDSixDQWtCQSxtRkFFSSxrQkFBbUIsQ0FXbkIsZ0NBQWlDLENBTmpDLG1CQUFvQixDQUtwQiw4QkFBK0IsQ0FYL0IsbUJBQW9CLENBT3BCLGVBQWlCLENBQ2pCLGVBQWdCLENBTmhCLHNCQUF1QixDQU92QixnQkFBaUIsQ0FMakIsYUFBZSxDQURmLGVBQWdCLENBRWhCLGVBQWlCLENBS2pCLG9CQUdKLENBRUEsMkVBT0ksa0JBQW1CLENBTm5CLGNBQWUsQ0FFZixlQUFpQixDQUNqQixlQUFnQixDQUNoQixhQUFjLENBSGQscUJBQXdCLENBSXhCLG9CQUVKIiwiZmlsZSI6Ik1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLk1hcmtkb3duQ29udGVudCB7XG4gICAgLS1tZC10ZXh0LWNvbG9yOiB2YXIoLS1jaGF0LW1kLXRleHQtY29sb3IsIGluaGVyaXQpO1xuICAgIC0tbWQtbXV0ZWQtY29sb3I6IHZhcigtLWNoYXQtbWQtbXV0ZWQtY29sb3IsIGN1cnJlbnRDb2xvcik7XG4gICAgLS1tZC1saW5rLWNvbG9yOiB2YXIoLS1jaGF0LW1kLWxpbmstY29sb3IsICMyNTYzZWIpO1xuICAgIC0tbWQtaGVhZGluZy1jb2xvcjogdmFyKC0tY2hhdC1oZWFkaW5nLXRleHQtY29sb3IsIHZhcigtLW1kLXRleHQtY29sb3IpKTtcbiAgICAtLW1kLWhlYWRpbmctZm9udC1mYW1pbHk6IHZhcihcbiAgICAgICAgLS1jaGF0LW1kLWhlYWRpbmctZm9udC1mYW1pbHksXG4gICAgICAgIHZhcigtLWZvbnQtcG9wcGlucywgJ1BvcHBpbnMnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYpXG4gICAgKTtcbiAgICAtLW1kLWJvZHktZm9udC1mYW1pbHk6IHZhcihcbiAgICAgICAgLS1jaGF0LW1kLWJvZHktZm9udC1mYW1pbHksXG4gICAgICAgIHZhcigtLWZvbnQtcG9wcGlucywgJ1BvcHBpbnMnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYpXG4gICAgKTtcbiAgICAtLW1kLWNvZGUtZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1xuICAgIC0tbWQtaW5saW5lLWNvZGUtYmc6IHZhcigtLWNoYXQtbWQtaW5saW5lLWNvZGUtYmcsIHJnYmEoMTUsIDIzLCA0MiwgMC4wOCkpO1xuICAgIC0tbWQtaW5saW5lLWNvZGUtYm9yZGVyOiB2YXIoLS1jaGF0LW1kLWlubGluZS1jb2RlLWJvcmRlciwgcmdiYSgxNSwgMjMsIDQyLCAwLjEyKSk7XG4gICAgLS1tZC1pbmxpbmUtY29kZS1jb2xvcjogdmFyKC0tY2hhdC1tZC1pbmxpbmUtY29kZS1jb2xvciwgdmFyKC0tbWQtdGV4dC1jb2xvcikpO1xuICAgIC0tbWQtYmxvY2txdW90ZS1iZzogdmFyKC0tY2hhdC1tZC1ibG9ja3F1b3RlLWJnLCByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuOTIpKTtcbiAgICAtLW1kLWJsb2NrcXVvdGUtYm9yZGVyOiB2YXIoLS1jaGF0LW1kLWJsb2NrcXVvdGUtYm9yZGVyLCByZ2JhKDU5LCAxMzAsIDI0NiwgMC4zNSkpO1xuICAgIC0tbWQtdGFibGUtYmc6IHZhcigtLWNoYXQtbWQtdGFibGUtYmcsIHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45MikpO1xuICAgIC0tbWQtdGFibGUtcm93LWFsdC1iZzogdmFyKC0tY2hhdC1tZC10YWJsZS1yb3ctYWx0LWJnLCByZ2JhKDI0MSwgMjQ1LCAyNDksIDAuOSkpO1xuICAgIC0tbWQtdGFibGUtaGVhZC1iZzogdmFyKC0tY2hhdC1tZC10YWJsZS1oZWFkLWJnLCByZ2JhKDIyNiwgMjMyLCAyNDAsIDAuOTUpKTtcbiAgICAtLW1kLXRhYmxlLWJvcmRlcjogdmFyKC0tY2hhdC1tZC10YWJsZS1ib3JkZXIsIHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC4zNikpO1xuICAgIC0tbWQtY2l0YXRpb24tYmc6IHZhcigtLWNoYXQtbWQtY2l0YXRpb24tYmcsIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjE0KSk7XG4gICAgLS1tZC1jaXRhdGlvbi1jb2xvcjogdmFyKC0tY2hhdC1tZC1jaXRhdGlvbi1jb2xvciwgIzFkNGVkOCk7XG5cbiAgICBjb2xvcjogdmFyKC0tbWQtdGV4dC1jb2xvcik7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLW1kLWJvZHktZm9udC1mYW1pbHkpO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogMS42NTtcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMDJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCA+IDpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50O1xufVxuXG4uTWFya2Rvd25Db250ZW50ID4gOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDAgIWltcG9ydGFudDtcbn1cblxuLk1hcmtkb3duQ29udGVudCA6aXMoaDEsIGgyLCBoMywgaDQsIGg1LCBoNikge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW46IDEuNGVtIDAgMC41NWVtO1xuICAgIGNvbG9yOiB2YXIoLS1tZC1oZWFkaW5nLWNvbG9yKTtcbiAgICBmb250LWZhbWlseTogdmFyKC0tbWQtaGVhZGluZy1mb250LWZhbWlseSk7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICBsaW5lLWhlaWdodDogMS4yNDtcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtO1xuICAgIHRleHQtd3JhcDogYmFsYW5jZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMSB7XG4gICAgZm9udC1zaXplOiAxLjUycmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGgyIHtcbiAgICBmb250LXNpemU6IDEuNHJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMyB7XG4gICAgZm9udC1zaXplOiAxLjI2cmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGg0IHtcbiAgICBmb250LXNpemU6IDEuMTRyZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgaDUge1xuICAgIGZvbnQtc2l6ZTogMS4wNHJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoNiB7XG4gICAgZm9udC1zaXplOiAwLjk4cmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHAge1xuICAgIG1hcmdpbjogMCAwIDAuOWVtO1xuICAgIHRleHQtd3JhcDogcHJldHR5O1xufVxuXG4uTWFya2Rvd25Db250ZW50IHA6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgOmlzKHVsLCBvbCkge1xuICAgIG1hcmdpbjogMC42NWVtIDAgMWVtO1xuICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAxLjM1cmVtO1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ2FwOiAwLjM1ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdWwge1xuICAgIGxpc3Qtc3R5bGU6IGRpc2M7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgb2wge1xuICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgbGkge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjU4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGxpID4gOmlzKHVsLCBvbCkge1xuICAgIG1hcmdpbi10b3A6IDAuNDVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHVsOmhhcyg+IGxpID4gW2RhdGEtY2hhdC1wcm9ncmVzcy1tYXJrZXJdKSB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICBwYWRkaW5nLWlubGluZS1zdGFydDogMDtcbn1cblxuLk1hcmtkb3duQ29udGVudCB1bDpoYXMoPiBsaSA+IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyXSkgPiBsaSB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBbZGF0YS1jaGF0LXByb2dyZXNzLW1hcmtlcl0ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIHdpZHRoOiAxcmVtO1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuNThyZW07XG4gICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgW2RhdGEtY2hhdC1wcm9ncmVzcy1tYXJrZXI9J3BlbmRpbmcnXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXI6IDJweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDIyJSwgdHJhbnNwYXJlbnQpO1xuICAgIGJvcmRlci10b3AtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgICBhbmltYXRpb246IGNoYXRQcm9ncmVzc01hcmtlclNwaW4gMC44NXMgbGluZWFyIGluZmluaXRlO1xufVxuXG4uTWFya2Rvd25Db250ZW50IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyPSdjb21wbGV0ZWQnXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDEyJSwgdHJhbnNwYXJlbnQpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyPSdjb21wbGV0ZWQnXTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHdpZHRoOiAwLjI2cmVtO1xuICAgIGhlaWdodDogMC41cmVtO1xuICAgIG1hcmdpbi10b3A6IC0wLjA2cmVtO1xuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgY3VycmVudENvbG9yO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbn1cblxuQGtleWZyYW1lcyBjaGF0UHJvZ3Jlc3NNYXJrZXJTcGluIHtcbiAgICB0byB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgfVxufVxuXG4uTWFya2Rvd25Db250ZW50IGEge1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lO1xuICAgIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDEuNHB4O1xuICAgIHRleHQtdW5kZXJsaW5lLW9mZnNldDogMC4xNmVtO1xuICAgIHRleHQtZGVjb3JhdGlvbi1jb2xvcjogY3VycmVudENvbG9yO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLCB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIDAuMnMgZWFzZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBhOmhvdmVyLFxuLk1hcmtkb3duQ29udGVudCBhOmZvY3VzLXZpc2libGUge1xuICAgIG9wYWNpdHk6IDAuOTI7XG4gICAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogMnB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGltZyB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiAxNHB4O1xuICAgIG1hcmdpbjogMC45NWVtIDA7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcHJlLFxuLk1hcmtkb3duQ29udGVudCBibG9ja3F1b3RlLFxuLk1hcmtkb3duQ29udGVudCB0YWJsZSxcbi5NYXJrZG93bkNvbnRlbnQgaHIge1xuICAgIG1hcmdpbjogMC45NWVtIDA7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcHJlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgYmxvY2txdW90ZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tbWQtYmxvY2txdW90ZS1ib3JkZXIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC1ibG9ja3F1b3RlLWJnKTtcbiAgICBjb2xvcjogdmFyKC0tbWQtbXV0ZWQtY29sb3IpO1xuICAgIHBhZGRpbmc6IDAuNzJlbSAwLjk2ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgYmxvY2txdW90ZSA+IDpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGNvZGUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwLjE0ZW0gMC40MmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1kLWlubGluZS1jb2RlLWJvcmRlcik7XG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIGJhY2tncm91bmQ6IHZhcigtLW1kLWlubGluZS1jb2RlLWJnKTtcbiAgICBmb250LWZhbWlseTogdmFyKC0tbWQtY29kZS1mb250LWZhbWlseSk7XG4gICAgZm9udC1zaXplOiAwLjg4ZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgY29sb3I6IHZhcigtLW1kLWlubGluZS1jb2RlLWNvbG9yKTtcbiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHByZSBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICB3b3JkLWJyZWFrOiBub3JtYWw7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLk1hcmtkb3duQ29udGVudCAuY2hhdC1jb2RlLWJsb2NrIHtcbiAgICBiYWNrZ3JvdW5kOiAjMTgxYzIzO1xuICAgIGNvbG9yOiAjZjhmYWZjO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMS42O1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDgsIDE2MywgMTg0LCAwLjM1KTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgyLCA2LCAyMywgMC4yOCk7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLW1kLWNvZGUtZm9udC1mYW1pbHkpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IC5jaGF0LWNvZGUtYmxvY2sgY29kZSB7XG4gICAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgd29yZC1icmVhazogbm9ybWFsO1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdGFibGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWQtdGFibGUtYm9yZGVyKTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYmFja2dyb3VuZDogdmFyKC0tbWQtdGFibGUtYmcpO1xuICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDE1LCAyMywgNDIsIDAuMSk7XG4gICAgZm9udC1zaXplOiAwLjkzZW07XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdGgsXG4uTWFya2Rvd25Db250ZW50IHRkIHtcbiAgICBwYWRkaW5nOiAwLjU4ZW0gMC43MmVtO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHRoIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC10YWJsZS1oZWFkLWJnKTtcbiAgICBmb250LXdlaWdodDogNjAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHRyOmxhc3QtY2hpbGQgdGQge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdHI6bnRoLWNoaWxkKGV2ZW4pIHRkIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC10YWJsZS1yb3ctYWx0LWJnKTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBociB7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpO1xuICAgIG9wYWNpdHk6IDAuODtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzIHtcbiAgICBtYXJnaW46IDAuOTVlbSAwO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1kLXRhYmxlLWJvcmRlcik7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWQtdGFibGUtYmcpIDgyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpIDE4JSk7XG4gICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMThzIGVhc2UsIGJveC1zaGFkb3cgMC4xOHMgZWFzZSwgdHJhbnNmb3JtIDAuMThzIGVhc2U7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlsczpob3Zlcixcbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlsczpmb2N1cy13aXRoaW4ge1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1kLWxpbmstY29sb3IpIDI0JSwgdmFyKC0tbWQtdGFibGUtYm9yZGVyKSA3NiUpO1xuICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4xMik7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnkge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNzJyZW07XG4gICAgcGFkZGluZzogMC45ZW0gMS4wNWVtO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgICAgMTgwZGVnLFxuICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWQtdGFibGUtaGVhZC1iZykgODglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpIDEyJSksXG4gICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1iZykgODIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMTglKVxuICAgICk7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE4cyBlYXNlLCBjb2xvciAwLjE4cyBlYXNlO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiBzdW1tYXJ5OjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHdpZHRoOiAwLjYycmVtO1xuICAgIGhlaWdodDogMC42MnJlbTtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBtYXJnaW4tdG9wOiAtMC4wNHJlbTtcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuICAgIG9wYWNpdHk6IDAuODI7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMThzIGVhc2UsIG9wYWNpdHkgMC4xOHMgZWFzZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzID4gc3VtbWFyeTpob3Zlcixcbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnk6Zm9jdXMtdmlzaWJsZSB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgICAxODBkZWcsXG4gICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1oZWFkLWJnKSA3NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkgMjQlKSxcbiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1kLXRhYmxlLWJnKSA3NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44MikgMjYlKVxuICAgICk7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnk6Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC1saW5rLWNvbG9yKSA1MiUsIHRyYW5zcGFyZW50KTtcbiAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzID4gc3VtbWFyeTo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzW29wZW5dID4gc3VtbWFyeSB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHNbb3Blbl0gPiBzdW1tYXJ5OjpiZWZvcmUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiA6bm90KHN1bW1hcnkpIHtcbiAgICBtYXJnaW4tbGVmdDogMS4wNWVtO1xuICAgIG1hcmdpbi1yaWdodDogMS4wNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiBzdW1tYXJ5ICsgKiB7XG4gICAgbWFyZ2luLXRvcDogMC45NWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiA6bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMS4wNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHN0cm9uZyB7XG4gICAgZm9udC13ZWlnaHQ6IDY1MDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBlbSB7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4uY2l0YXRpb24ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgbWluLXdpZHRoOiAxLjRlbTtcbiAgICBtYXJnaW46IDAgMC4xZW07XG4gICAgcGFkZGluZzogMCAwLjM1ZW07XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgZm9udC1zaXplOiAwLjc0ZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMS40NTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gICAgY29sb3I6IHZhcigtLW1kLWNpdGF0aW9uLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC1jaXRhdGlvbi1iZyk7XG59XG5cbi5jaXRhdGlvblJlZiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBtaW4td2lkdGg6IDEuNGVtO1xuICAgIG1hcmdpbjogMCAwLjFlbTtcbiAgICBwYWRkaW5nOiAwIDAuMzVlbTtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBmb250LXNpemU6IDAuNzRlbTtcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjQ1O1xuICAgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjtcbiAgICBjb2xvcjogdmFyKC0tbWQtY2l0YXRpb24tY29sb3IpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLW1kLWNpdGF0aW9uLWJnKTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBzdXBbZGF0YS1jaXRhdGlvbi1mb290bm90ZV0ge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBtYXJnaW46IDAgMC43ZW0gMCAwLjA4ZW07XG4gICAgZm9udC1zaXplOiAwLjcyZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gICAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cbiJdfQ== */";
|
|
21556
|
-
|
|
21557
|
-
|
|
21558
|
-
|
|
21556
|
+
/**
|
|
21557
|
+
* Default class name used for rendered citation references outside of CSS modules.
|
|
21558
|
+
*/
|
|
21559
|
+
const DEFAULT_CITATION_REFERENCE_CLASS_NAME = 'citationRef';
|
|
21560
|
+
/**
|
|
21561
|
+
* Browser stylesheet id used when KaTeX output is rendered in a live chat component.
|
|
21562
|
+
*/
|
|
21563
|
+
const KATEX_STYLESHEET_ID = 'katex-css';
|
|
21564
|
+
/**
|
|
21565
|
+
* CDN stylesheet loaded lazily when markdown contains KaTeX markup in the browser.
|
|
21566
|
+
*/
|
|
21567
|
+
const KATEX_STYLESHEET_URL = 'https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css';
|
|
21568
|
+
/**
|
|
21569
|
+
* Explicit allowlist of HTML tags that may survive markdown rendering.
|
|
21570
|
+
*
|
|
21571
|
+
* @private utility of `renderMarkdown`
|
|
21572
|
+
*/
|
|
21573
|
+
const MARKDOWN_SANITIZER_ALLOWED_TAGS = [
|
|
21574
|
+
'a',
|
|
21575
|
+
'annotation',
|
|
21576
|
+
'b',
|
|
21577
|
+
'blockquote',
|
|
21578
|
+
'br',
|
|
21579
|
+
'code',
|
|
21580
|
+
'del',
|
|
21581
|
+
'details',
|
|
21582
|
+
'div',
|
|
21583
|
+
'em',
|
|
21584
|
+
'h1',
|
|
21585
|
+
'h2',
|
|
21586
|
+
'h3',
|
|
21587
|
+
'h4',
|
|
21588
|
+
'h5',
|
|
21589
|
+
'h6',
|
|
21590
|
+
'hr',
|
|
21591
|
+
'i',
|
|
21592
|
+
'img',
|
|
21593
|
+
'input',
|
|
21594
|
+
'li',
|
|
21595
|
+
'math',
|
|
21596
|
+
'menclose',
|
|
21597
|
+
'mfrac',
|
|
21598
|
+
'mi',
|
|
21599
|
+
'mn',
|
|
21600
|
+
'mo',
|
|
21601
|
+
'mover',
|
|
21602
|
+
'mpadded',
|
|
21603
|
+
'mphantom',
|
|
21604
|
+
'mroot',
|
|
21605
|
+
'mrow',
|
|
21606
|
+
'msqrt',
|
|
21607
|
+
'mspace',
|
|
21608
|
+
'msub',
|
|
21609
|
+
'msubsup',
|
|
21610
|
+
'msup',
|
|
21611
|
+
'mstyle',
|
|
21612
|
+
'mtable',
|
|
21613
|
+
'mtd',
|
|
21614
|
+
'mtext',
|
|
21615
|
+
'mtr',
|
|
21616
|
+
'munder',
|
|
21617
|
+
'munderover',
|
|
21618
|
+
'ol',
|
|
21619
|
+
'p',
|
|
21620
|
+
'pre',
|
|
21621
|
+
's',
|
|
21622
|
+
'semantics',
|
|
21623
|
+
'span',
|
|
21624
|
+
'strong',
|
|
21625
|
+
'sub',
|
|
21626
|
+
'summary',
|
|
21627
|
+
'sup',
|
|
21628
|
+
'table',
|
|
21629
|
+
'tbody',
|
|
21630
|
+
'td',
|
|
21631
|
+
'tfoot',
|
|
21632
|
+
'th',
|
|
21633
|
+
'thead',
|
|
21634
|
+
'tr',
|
|
21635
|
+
'u',
|
|
21636
|
+
'ul',
|
|
21637
|
+
];
|
|
21638
|
+
/**
|
|
21639
|
+
* Explicit allowlist of HTML attributes that may survive markdown rendering.
|
|
21640
|
+
*
|
|
21641
|
+
* @private utility of `renderMarkdown`
|
|
21642
|
+
*/
|
|
21643
|
+
const MARKDOWN_SANITIZER_ALLOWED_ATTRIBUTES = [
|
|
21644
|
+
'alt',
|
|
21645
|
+
'aria-hidden',
|
|
21646
|
+
'checked',
|
|
21647
|
+
'class',
|
|
21648
|
+
'colspan',
|
|
21649
|
+
'data-citation-footnote',
|
|
21650
|
+
'data-chat-progress-marker',
|
|
21651
|
+
'disabled',
|
|
21652
|
+
'encoding',
|
|
21653
|
+
'height',
|
|
21654
|
+
'href',
|
|
21655
|
+
'id',
|
|
21656
|
+
'open',
|
|
21657
|
+
'rel',
|
|
21658
|
+
'rowspan',
|
|
21659
|
+
'src',
|
|
21660
|
+
'start',
|
|
21661
|
+
'stretchy',
|
|
21662
|
+
'style',
|
|
21663
|
+
'target',
|
|
21664
|
+
'title',
|
|
21665
|
+
'type',
|
|
21666
|
+
'width',
|
|
21667
|
+
'xmlns',
|
|
21668
|
+
];
|
|
21669
|
+
/**
|
|
21670
|
+
* Attributes that may contain external URLs and therefore need protocol validation.
|
|
21671
|
+
*
|
|
21672
|
+
* @private utility of `renderMarkdown`
|
|
21673
|
+
*/
|
|
21674
|
+
const MARKDOWN_SANITIZER_URL_ATTRIBUTES = ['href', 'src'];
|
|
21675
|
+
/**
|
|
21676
|
+
* URL protocols that remain allowed after markdown sanitization.
|
|
21677
|
+
*
|
|
21678
|
+
* @private utility of `renderMarkdown`
|
|
21679
|
+
*/
|
|
21680
|
+
const MARKDOWN_SANITIZER_ALLOWED_PROTOCOLS = new Set(['http', 'https', 'mailto', 'tel']);
|
|
21681
|
+
/**
|
|
21682
|
+
* Internal `data-*` attributes that Promptbook injects into rendered markdown and must survive sanitization.
|
|
21683
|
+
*
|
|
21684
|
+
* @private utility of `renderMarkdown`
|
|
21685
|
+
*/
|
|
21686
|
+
const MARKDOWN_SANITIZER_ALLOWED_DATA_ATTRIBUTES = new Set(['data-citation-footnote', 'data-chat-progress-marker']);
|
|
21687
|
+
/**
|
|
21688
|
+
* Highest ASCII control character code that should be stripped from sanitized URLs.
|
|
21689
|
+
*
|
|
21690
|
+
* @private utility of `renderMarkdown`
|
|
21691
|
+
*/
|
|
21692
|
+
const MAX_ASCII_CONTROL_CHARACTER_CODE = 32;
|
|
21693
|
+
/**
|
|
21694
|
+
* ASCII delete character code that should be stripped from sanitized URLs.
|
|
21695
|
+
*
|
|
21696
|
+
* @private utility of `renderMarkdown`
|
|
21697
|
+
*/
|
|
21698
|
+
const ASCII_DELETE_CHARACTER_CODE = 127;
|
|
21699
|
+
/**
|
|
21700
|
+
* DOMPurify configuration used for markdown rendering and export sanitization.
|
|
21701
|
+
*
|
|
21702
|
+
* @private utility of `renderMarkdown`
|
|
21703
|
+
*/
|
|
21704
|
+
const MARKDOWN_SANITIZER_CONFIG = {
|
|
21705
|
+
ALLOWED_TAGS: [...MARKDOWN_SANITIZER_ALLOWED_TAGS],
|
|
21706
|
+
ALLOWED_ATTR: [...MARKDOWN_SANITIZER_ALLOWED_ATTRIBUTES],
|
|
21707
|
+
ALLOW_ARIA_ATTR: true,
|
|
21708
|
+
ALLOW_DATA_ATTR: false,
|
|
21709
|
+
USE_PROFILES: {
|
|
21710
|
+
html: true,
|
|
21711
|
+
mathMl: true,
|
|
21712
|
+
svg: false,
|
|
21713
|
+
},
|
|
21714
|
+
};
|
|
21715
|
+
/**
|
|
21716
|
+
* Shared browser-side DOMPurify instance.
|
|
21717
|
+
*
|
|
21718
|
+
* @private utility of `renderMarkdown`
|
|
21719
|
+
*/
|
|
21720
|
+
let browserMarkdownSanitizer = null;
|
|
21721
|
+
/**
|
|
21722
|
+
* Shared server-side DOMPurify instance.
|
|
21723
|
+
*
|
|
21724
|
+
* @private utility of `renderMarkdown`
|
|
21725
|
+
*/
|
|
21726
|
+
let serverMarkdownSanitizer = null;
|
|
21727
|
+
/**
|
|
21728
|
+
* Shared JSDOM window backing the server-side DOMPurify instance.
|
|
21729
|
+
*
|
|
21730
|
+
* @private utility of `renderMarkdown`
|
|
21731
|
+
*/
|
|
21732
|
+
let serverMarkdownSanitizerWindow = null;
|
|
21733
|
+
/**
|
|
21734
|
+
* Pattern matching CODE FENCE.
|
|
21735
|
+
*/
|
|
21736
|
+
const CODE_FENCE_REGEX = /(`{3,}|~{3,})(?:[^\n\r]*)\r?\n[\s\S]*?\r?\n\1[^\n\r]*/g;
|
|
21737
|
+
/**
|
|
21738
|
+
* Pattern matching INLINE CODE.
|
|
21739
|
+
*/
|
|
21740
|
+
const INLINE_CODE_REGEX = /(`+)([\s\S]*?)(\1)/g;
|
|
21741
|
+
/**
|
|
21742
|
+
* Prefix for CODE PLACEHOLDER.
|
|
21743
|
+
*/
|
|
21744
|
+
const CODE_PLACEHOLDER_PREFIX = '@@PROMPTBOOK_CODE_PLACEHOLDER__';
|
|
21745
|
+
/**
|
|
21746
|
+
* Pattern matching CODE PLACEHOLDER.
|
|
21747
|
+
*/
|
|
21748
|
+
const CODE_PLACEHOLDER_REGEX = new RegExp(`${CODE_PLACEHOLDER_PREFIX}(\\d+)__`, 'g');
|
|
21749
|
+
/**
|
|
21750
|
+
* Pattern matching DETAILS BLOCK.
|
|
21751
|
+
*/
|
|
21752
|
+
const DETAILS_BLOCK_REGEX = /<details[\s\S]*?<\/details\s*>/gi;
|
|
21753
|
+
/**
|
|
21754
|
+
* Prefix for DETAILS PLACEHOLDER.
|
|
21755
|
+
*/
|
|
21756
|
+
const DETAILS_PLACEHOLDER_PREFIX = '@@PROMPTBOOK_DETAILS_PLACEHOLDER__';
|
|
21757
|
+
/**
|
|
21758
|
+
* Pattern matching DETAILS PLACEHOLDER.
|
|
21759
|
+
*/
|
|
21760
|
+
const DETAILS_PLACEHOLDER_REGEX = new RegExp(`${DETAILS_PLACEHOLDER_PREFIX}(\\d+)__`, 'g');
|
|
21761
|
+
/**
|
|
21762
|
+
* Matches a Showdown-wrapped placeholder such as `<p>@@PROMPTBOOK_DETAILS_PLACEHOLDER__0__</p>`.
|
|
21763
|
+
*/
|
|
21764
|
+
const DETAILS_PLACEHOLDER_WRAPPED_REGEX = new RegExp(`<p>\\s*(${DETAILS_PLACEHOLDER_PREFIX}\\d+__)\\s*<\\/p>`, 'g');
|
|
21765
|
+
/**
|
|
21766
|
+
* Collection of math delimiter definitions.
|
|
21767
|
+
*/
|
|
21768
|
+
const MATH_DELIMITER_DEFINITIONS = [
|
|
21769
|
+
{ regex: /(^|[^\\])\$\$([\s\S]+?)\$\$/g, displayMode: true },
|
|
21770
|
+
{ regex: /(^|[^\\])\\\[([\s\S]+?)\\\]/g, displayMode: true },
|
|
21771
|
+
{ regex: /(^|[^\\])\\\(([\s\S]+?)\\\)/g, displayMode: false },
|
|
21772
|
+
{ regex: /(^|[^\\])\$([^$\n]+?)\$/g, displayMode: false },
|
|
21773
|
+
];
|
|
21774
|
+
/**
|
|
21775
|
+
* Removes whitespace and control characters that can obscure a URL protocol.
|
|
21776
|
+
*
|
|
21777
|
+
* @private utility of `renderMarkdown`
|
|
21778
|
+
*/
|
|
21779
|
+
function normalizeSanitizedUrlValue(value) {
|
|
21780
|
+
return Array.from(value.trim())
|
|
21781
|
+
.filter((character) => {
|
|
21782
|
+
const characterCode = character.charCodeAt(0);
|
|
21783
|
+
return (characterCode > MAX_ASCII_CONTROL_CHARACTER_CODE && characterCode !== ASCII_DELETE_CHARACTER_CODE);
|
|
21784
|
+
})
|
|
21785
|
+
.join('');
|
|
21786
|
+
}
|
|
21787
|
+
/**
|
|
21788
|
+
* Returns whether a sanitized URL attribute still uses an allowed protocol.
|
|
21789
|
+
*
|
|
21790
|
+
* @private utility of `renderMarkdown`
|
|
21791
|
+
*/
|
|
21792
|
+
function isAllowedSanitizedUrl(value) {
|
|
21793
|
+
const normalizedValue = normalizeSanitizedUrlValue(value);
|
|
21794
|
+
if (normalizedValue === '') {
|
|
21795
|
+
return true;
|
|
21796
|
+
}
|
|
21797
|
+
if (normalizedValue.startsWith('#') ||
|
|
21798
|
+
normalizedValue.startsWith('/') ||
|
|
21799
|
+
normalizedValue.startsWith('./') ||
|
|
21800
|
+
normalizedValue.startsWith('../') ||
|
|
21801
|
+
normalizedValue.startsWith('?') ||
|
|
21802
|
+
normalizedValue.startsWith('//')) {
|
|
21803
|
+
return true;
|
|
21804
|
+
}
|
|
21805
|
+
const schemeMatch = normalizedValue.match(/^([a-z][a-z0-9+.-]*):/i);
|
|
21806
|
+
if (!schemeMatch) {
|
|
21807
|
+
return true;
|
|
21808
|
+
}
|
|
21809
|
+
return MARKDOWN_SANITIZER_ALLOWED_PROTOCOLS.has(schemeMatch[1].toLowerCase());
|
|
21810
|
+
}
|
|
21811
|
+
/**
|
|
21812
|
+
* Applies the shared post-attribute sanitization rules to a DOMPurify instance.
|
|
21813
|
+
*
|
|
21814
|
+
* @private utility of `renderMarkdown`
|
|
21815
|
+
*/
|
|
21816
|
+
function registerMarkdownSanitizerHooks(markdownSanitizer) {
|
|
21817
|
+
markdownSanitizer.addHook('uponSanitizeAttribute', (_currentNode, hookEvent) => {
|
|
21818
|
+
if (MARKDOWN_SANITIZER_ALLOWED_DATA_ATTRIBUTES.has(hookEvent.attrName)) {
|
|
21819
|
+
hookEvent.forceKeepAttr = true;
|
|
21820
|
+
}
|
|
21821
|
+
});
|
|
21822
|
+
markdownSanitizer.addHook('afterSanitizeAttributes', (currentNode) => {
|
|
21823
|
+
if (!currentNode || currentNode.nodeType !== 1) {
|
|
21824
|
+
return;
|
|
21825
|
+
}
|
|
21826
|
+
const currentElement = currentNode;
|
|
21827
|
+
for (const attributeName of MARKDOWN_SANITIZER_URL_ATTRIBUTES) {
|
|
21828
|
+
const attributeValue = currentElement.getAttribute(attributeName);
|
|
21829
|
+
if (attributeValue && !isAllowedSanitizedUrl(attributeValue)) {
|
|
21830
|
+
currentElement.removeAttribute(attributeName);
|
|
21831
|
+
}
|
|
21832
|
+
}
|
|
21833
|
+
if (currentElement.tagName === 'A' && currentElement.getAttribute('target') === '_blank') {
|
|
21834
|
+
currentElement.setAttribute('rel', 'noopener noreferrer');
|
|
21835
|
+
}
|
|
21836
|
+
});
|
|
21837
|
+
}
|
|
21838
|
+
/**
|
|
21839
|
+
* Creates a DOMPurify instance configured for Promptbook markdown output.
|
|
21840
|
+
*
|
|
21841
|
+
* @private utility of `renderMarkdown`
|
|
21842
|
+
*/
|
|
21843
|
+
function createMarkdownSanitizer(sanitizerWindow) {
|
|
21844
|
+
const markdownSanitizer = createDOMPurify(sanitizerWindow);
|
|
21845
|
+
registerMarkdownSanitizerHooks(markdownSanitizer);
|
|
21846
|
+
return markdownSanitizer;
|
|
21847
|
+
}
|
|
21848
|
+
/**
|
|
21849
|
+
* Lazily creates the JSDOM window used by server-side markdown sanitization.
|
|
21850
|
+
*
|
|
21851
|
+
* @private utility of `renderMarkdown`
|
|
21852
|
+
*/
|
|
21853
|
+
function getServerMarkdownSanitizerWindow() {
|
|
21854
|
+
if (!serverMarkdownSanitizerWindow) {
|
|
21855
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
21856
|
+
const { JSDOM } = require('jsdom');
|
|
21857
|
+
serverMarkdownSanitizerWindow = new JSDOM('').window;
|
|
21858
|
+
}
|
|
21859
|
+
return serverMarkdownSanitizerWindow;
|
|
21860
|
+
}
|
|
21861
|
+
/**
|
|
21862
|
+
* Returns the shared DOMPurify instance appropriate for the current runtime.
|
|
21863
|
+
*
|
|
21864
|
+
* @private utility of `renderMarkdown`
|
|
21865
|
+
*/
|
|
21866
|
+
function getMarkdownSanitizer() {
|
|
21867
|
+
if (typeof window !== 'undefined') {
|
|
21868
|
+
browserMarkdownSanitizer !== null && browserMarkdownSanitizer !== void 0 ? browserMarkdownSanitizer : (browserMarkdownSanitizer = createMarkdownSanitizer(window));
|
|
21869
|
+
return browserMarkdownSanitizer;
|
|
21870
|
+
}
|
|
21871
|
+
serverMarkdownSanitizer !== null && serverMarkdownSanitizer !== void 0 ? serverMarkdownSanitizer : (serverMarkdownSanitizer = createMarkdownSanitizer(getServerMarkdownSanitizerWindow()));
|
|
21872
|
+
return serverMarkdownSanitizer;
|
|
21873
|
+
}
|
|
21874
|
+
/**
|
|
21875
|
+
* Sanitizes rendered markdown HTML with the shared Promptbook allowlist.
|
|
21876
|
+
*
|
|
21877
|
+
* @private utility of `renderMarkdown`
|
|
21878
|
+
*/
|
|
21879
|
+
function sanitizeRenderedMarkdownHtml(html) {
|
|
21880
|
+
return getMarkdownSanitizer().sanitize(html, MARKDOWN_SANITIZER_CONFIG);
|
|
21881
|
+
}
|
|
21559
21882
|
/**
|
|
21560
21883
|
* Normalizes markdown sublists so they render correctly under ordered list items.
|
|
21561
21884
|
*
|
|
21562
21885
|
* @param markdown - Markdown content to normalize.
|
|
21563
21886
|
* @returns Markdown with normalized sublist indentation.
|
|
21564
21887
|
*
|
|
21565
|
-
* @private utility of `
|
|
21888
|
+
* @private utility of `renderMarkdown`
|
|
21566
21889
|
*/
|
|
21567
|
-
function normalizeMarkdownSublists
|
|
21890
|
+
function normalizeMarkdownSublists(markdown) {
|
|
21568
21891
|
const lines = markdown.split(/\r?\n/);
|
|
21569
21892
|
let orderedIndent = null;
|
|
21570
21893
|
let shouldIndentUnordered = false;
|
|
@@ -21607,11 +21930,13 @@ function normalizeMarkdownSublists$1(markdown) {
|
|
|
21607
21930
|
return normalizedLines.join('\n');
|
|
21608
21931
|
}
|
|
21609
21932
|
/**
|
|
21610
|
-
* Creates a showdown converter configured for chat markdown rendering
|
|
21933
|
+
* Creates a showdown converter configured for chat markdown rendering.
|
|
21611
21934
|
*
|
|
21612
|
-
* @private utility of `
|
|
21935
|
+
* @private utility of `renderMarkdown`
|
|
21613
21936
|
*/
|
|
21614
|
-
function createChatMarkdownConverter
|
|
21937
|
+
function createChatMarkdownConverter(options) {
|
|
21938
|
+
var _a;
|
|
21939
|
+
const citationReferenceClassName = (_a = options === null || options === void 0 ? void 0 : options.citationReferenceClassName) !== null && _a !== void 0 ? _a : DEFAULT_CITATION_REFERENCE_CLASS_NAME;
|
|
21615
21940
|
return new Converter({
|
|
21616
21941
|
flavor: 'github',
|
|
21617
21942
|
tables: true,
|
|
@@ -21653,67 +21978,16 @@ function createChatMarkdownConverter$1() {
|
|
|
21653
21978
|
return match;
|
|
21654
21979
|
}
|
|
21655
21980
|
TODO_USE(citationMarker.source);
|
|
21656
|
-
|
|
21657
|
-
// We replace them with numbered superscript references
|
|
21658
|
-
return `<sup class="${styles$b.citationRef}">[${citationMarker.id}]</sup>`;
|
|
21981
|
+
return `<sup class="${citationReferenceClassName}">[${citationMarker.id}]</sup>`;
|
|
21659
21982
|
},
|
|
21660
21983
|
}),
|
|
21661
21984
|
],
|
|
21662
21985
|
});
|
|
21663
21986
|
}
|
|
21664
21987
|
/**
|
|
21665
|
-
* Pre-configured showdown converter for chat markdown
|
|
21666
|
-
*
|
|
21667
|
-
* @private utility of `MarkdownContent` component
|
|
21668
|
-
*/
|
|
21669
|
-
const chatMarkdownConverter = createChatMarkdownConverter$1();
|
|
21670
|
-
/**
|
|
21671
|
-
* Collection of math delimiter definitions.
|
|
21672
|
-
*/
|
|
21673
|
-
const mathDelimiterDefinitions = [
|
|
21674
|
-
{ regex: /(^|[^\\])\$\$([\s\S]+?)\$\$/g, displayMode: true },
|
|
21675
|
-
{ regex: /(^|[^\\])\\\[([\s\S]+?)\\\]/g, displayMode: true },
|
|
21676
|
-
{ regex: /(^|[^\\])\\\(([\s\S]+?)\\\)/g, displayMode: false },
|
|
21677
|
-
{ regex: /(^|[^\\])\$([^$\n]+?)\$/g, displayMode: false },
|
|
21678
|
-
];
|
|
21679
|
-
/**
|
|
21680
|
-
* Pattern matching CODE FENCE.
|
|
21681
|
-
*/
|
|
21682
|
-
const CODE_FENCE_REGEX$1 = /(`{3,}|~{3,})(?:[^\n\r]*)\r?\n[\s\S]*?\r?\n\1[^\n\r]*/g;
|
|
21683
|
-
/**
|
|
21684
|
-
* Pattern matching INLINE CODE.
|
|
21685
|
-
*/
|
|
21686
|
-
const INLINE_CODE_REGEX$1 = /(`+)([\s\S]*?)(\1)/g;
|
|
21687
|
-
/**
|
|
21688
|
-
* Prefix for CODE PLACEHOLDER.
|
|
21689
|
-
*/
|
|
21690
|
-
const CODE_PLACEHOLDER_PREFIX$1 = '@@PROMPTBOOK_CODE_PLACEHOLDER__';
|
|
21691
|
-
/**
|
|
21692
|
-
* Pattern matching CODE PLACEHOLDER.
|
|
21693
|
-
*/
|
|
21694
|
-
const CODE_PLACEHOLDER_REGEX$1 = new RegExp(`${CODE_PLACEHOLDER_PREFIX$1}(\\d+)__`, 'g');
|
|
21695
|
-
/**
|
|
21696
|
-
* Pattern matching DETAILS BLOCK.
|
|
21697
|
-
*/
|
|
21698
|
-
const DETAILS_BLOCK_REGEX$1 = /<details[\s\S]*?<\/details\s*>/gi;
|
|
21699
|
-
/**
|
|
21700
|
-
* Prefix for DETAILS PLACEHOLDER.
|
|
21701
|
-
*/
|
|
21702
|
-
const DETAILS_PLACEHOLDER_PREFIX$1 = '@@PROMPTBOOK_DETAILS_PLACEHOLDER__';
|
|
21703
|
-
/**
|
|
21704
|
-
* Pattern matching DETAILS PLACEHOLDER.
|
|
21705
|
-
*/
|
|
21706
|
-
const DETAILS_PLACEHOLDER_REGEX$1 = new RegExp(`${DETAILS_PLACEHOLDER_PREFIX$1}(\\d+)__`, 'g');
|
|
21707
|
-
/**
|
|
21708
|
-
* Matches a Showdown-wrapped placeholder such as `<p>@@PROMPTBOOK_DETAILS_PLACEHOLDER__0__</p>`
|
|
21709
|
-
*/
|
|
21710
|
-
const DETAILS_PLACEHOLDER_WRAPPED_REGEX$1 = new RegExp(`<p>\\s*(${DETAILS_PLACEHOLDER_PREFIX$1}\\d+__)\\s*<\\/p>`, 'g');
|
|
21711
|
-
/**
|
|
21712
|
-
* Selector used by the delegated summary click handler.
|
|
21713
|
-
*
|
|
21714
|
-
* @private utility of `MarkdownContent` component
|
|
21988
|
+
* Pre-configured showdown converter for chat markdown.
|
|
21715
21989
|
*/
|
|
21716
|
-
const
|
|
21990
|
+
const CHAT_MARKDOWN_CONVERTER = createChatMarkdownConverter();
|
|
21717
21991
|
/**
|
|
21718
21992
|
* Renders the body of one raw `<details>` block as markdown while keeping the
|
|
21719
21993
|
* outer `<details>` and optional `<summary>` markup untouched.
|
|
@@ -21721,9 +21995,9 @@ const DETAILS_SUMMARY_SELECTOR = 'summary';
|
|
|
21721
21995
|
* @param detailsBlock - Raw `<details>...</details>` HTML captured from markdown.
|
|
21722
21996
|
* @returns `<details>` HTML whose body has been converted from markdown to HTML.
|
|
21723
21997
|
*
|
|
21724
|
-
* @private utility of `
|
|
21998
|
+
* @private utility of `renderMarkdown`
|
|
21725
21999
|
*/
|
|
21726
|
-
function renderDetailsBlock
|
|
22000
|
+
function renderDetailsBlock(detailsBlock) {
|
|
21727
22001
|
var _a, _b;
|
|
21728
22002
|
const openTagMatch = detailsBlock.match(/^<details\b[^>]*>/i);
|
|
21729
22003
|
const closeTagMatch = detailsBlock.match(/<\/details\s*>$/i);
|
|
@@ -21736,7 +22010,7 @@ function renderDetailsBlock$1(detailsBlock) {
|
|
|
21736
22010
|
const summaryMatch = innerContent.match(/^(\s*<summary\b[^>]*>[\s\S]*?<\/summary\s*>)([\s\S]*)$/i);
|
|
21737
22011
|
const summaryHtml = (_a = summaryMatch === null || summaryMatch === void 0 ? void 0 : summaryMatch[1]) !== null && _a !== void 0 ? _a : '';
|
|
21738
22012
|
const bodyMarkdown = ((_b = summaryMatch === null || summaryMatch === void 0 ? void 0 : summaryMatch[2]) !== null && _b !== void 0 ? _b : innerContent);
|
|
21739
|
-
const renderedBody = renderMarkdown
|
|
22013
|
+
const renderedBody = renderMarkdown(bodyMarkdown);
|
|
21740
22014
|
return `${openTag}${summaryHtml}${renderedBody}${closeTag}`;
|
|
21741
22015
|
}
|
|
21742
22016
|
/**
|
|
@@ -21745,13 +22019,13 @@ function renderDetailsBlock$1(detailsBlock) {
|
|
|
21745
22019
|
* @param markdown - Markdown text to mask.
|
|
21746
22020
|
* @returns Masked markdown and a restore helper.
|
|
21747
22021
|
*
|
|
21748
|
-
* @private utility of `
|
|
22022
|
+
* @private utility of `renderMarkdown`
|
|
21749
22023
|
*/
|
|
21750
|
-
function maskMarkdownCodeSegments
|
|
22024
|
+
function maskMarkdownCodeSegments(markdown) {
|
|
21751
22025
|
const segments = [];
|
|
21752
22026
|
let masked = markdown;
|
|
21753
22027
|
const addPlaceholder = (segment) => {
|
|
21754
|
-
const placeholder = `${CODE_PLACEHOLDER_PREFIX
|
|
22028
|
+
const placeholder = `${CODE_PLACEHOLDER_PREFIX}${segments.length}__`;
|
|
21755
22029
|
segments.push(segment);
|
|
21756
22030
|
return placeholder;
|
|
21757
22031
|
};
|
|
@@ -21759,51 +22033,48 @@ function maskMarkdownCodeSegments$1(markdown) {
|
|
|
21759
22033
|
regex.lastIndex = 0;
|
|
21760
22034
|
masked = masked.replace(regex, (match) => addPlaceholder(match));
|
|
21761
22035
|
};
|
|
21762
|
-
maskWith(CODE_FENCE_REGEX
|
|
21763
|
-
maskWith(INLINE_CODE_REGEX
|
|
22036
|
+
maskWith(CODE_FENCE_REGEX);
|
|
22037
|
+
maskWith(INLINE_CODE_REGEX);
|
|
21764
22038
|
return {
|
|
21765
22039
|
masked: masked,
|
|
21766
22040
|
restore(value) {
|
|
21767
|
-
return value.replace(CODE_PLACEHOLDER_REGEX
|
|
22041
|
+
return value.replace(CODE_PLACEHOLDER_REGEX, (_match, index) => { var _a; return (_a = segments[Number(index)]) !== null && _a !== void 0 ? _a : ''; });
|
|
21768
22042
|
},
|
|
21769
22043
|
};
|
|
21770
22044
|
}
|
|
21771
22045
|
/**
|
|
21772
|
-
* Masks `<details
|
|
21773
|
-
* processes their content
|
|
21774
|
-
*
|
|
21775
|
-
* The original blocks are replaced with placeholders before Showdown runs, then restored
|
|
21776
|
-
* afterwards with their non-summary body converted through the normal markdown pipeline.
|
|
21777
|
-
* Any surrounding `<p>` wrapper that Showdown may have injected around a placeholder is
|
|
21778
|
-
* stripped so the `<details>` element remains a proper block-level element.
|
|
22046
|
+
* Masks `<details>...</details>` blocks in the markdown source so that Showdown never
|
|
22047
|
+
* processes their content.
|
|
21779
22048
|
*
|
|
21780
22049
|
* @param markdown - Markdown text that may contain raw HTML `<details>` blocks.
|
|
21781
22050
|
* @returns Masked markdown and a restore helper that returns `string_html`.
|
|
21782
22051
|
*
|
|
21783
|
-
* @private utility of `
|
|
22052
|
+
* @private utility of `renderMarkdown`
|
|
21784
22053
|
*/
|
|
21785
|
-
function maskDetailsBlocks
|
|
22054
|
+
function maskDetailsBlocks(markdown) {
|
|
21786
22055
|
const blocks = [];
|
|
21787
|
-
DETAILS_BLOCK_REGEX
|
|
21788
|
-
const masked = markdown.replace(DETAILS_BLOCK_REGEX
|
|
21789
|
-
const placeholder = `${DETAILS_PLACEHOLDER_PREFIX
|
|
21790
|
-
blocks.push(renderDetailsBlock
|
|
22056
|
+
DETAILS_BLOCK_REGEX.lastIndex = 0;
|
|
22057
|
+
const masked = markdown.replace(DETAILS_BLOCK_REGEX, (match) => {
|
|
22058
|
+
const placeholder = `${DETAILS_PLACEHOLDER_PREFIX}${blocks.length}__`;
|
|
22059
|
+
blocks.push(renderDetailsBlock(match));
|
|
21791
22060
|
return placeholder;
|
|
21792
22061
|
});
|
|
21793
22062
|
return {
|
|
21794
22063
|
masked,
|
|
21795
22064
|
restore(value) {
|
|
21796
22065
|
return value
|
|
21797
|
-
.replace(DETAILS_PLACEHOLDER_WRAPPED_REGEX
|
|
21798
|
-
.replace(DETAILS_PLACEHOLDER_REGEX
|
|
22066
|
+
.replace(DETAILS_PLACEHOLDER_WRAPPED_REGEX, '$1')
|
|
22067
|
+
.replace(DETAILS_PLACEHOLDER_REGEX, (_match, index) => { var _a; return (_a = blocks[Number(index)]) !== null && _a !== void 0 ? _a : ''; });
|
|
21799
22068
|
},
|
|
21800
22069
|
};
|
|
21801
22070
|
}
|
|
21802
22071
|
/**
|
|
21803
22072
|
* Replaces math delimiter.
|
|
22073
|
+
*
|
|
22074
|
+
* @private utility of `renderMarkdown`
|
|
21804
22075
|
*/
|
|
21805
|
-
function replaceMathDelimiter
|
|
21806
|
-
return
|
|
22076
|
+
function replaceMathDelimiter(markdown, delimiter) {
|
|
22077
|
+
return markdown.replace(delimiter.regex, (...args) => {
|
|
21807
22078
|
var _a, _b, _c;
|
|
21808
22079
|
const match = (_a = args[0]) !== null && _a !== void 0 ? _a : '';
|
|
21809
22080
|
const prefix = (_b = args[1]) !== null && _b !== void 0 ? _b : '';
|
|
@@ -21828,71 +22099,94 @@ function replaceMathDelimiter$1(md, delimiter) {
|
|
|
21828
22099
|
*
|
|
21829
22100
|
* Supported delimiters: `$$...$$`, `\[...\]`, `\(...\)`, and `$...$`.
|
|
21830
22101
|
*
|
|
21831
|
-
* @private utility of `
|
|
22102
|
+
* @private utility of `renderMarkdown`
|
|
21832
22103
|
*/
|
|
21833
|
-
function renderMathInMarkdown
|
|
21834
|
-
const { masked, restore } = maskMarkdownCodeSegments
|
|
22104
|
+
function renderMathInMarkdown(markdown) {
|
|
22105
|
+
const { masked, restore } = maskMarkdownCodeSegments(markdown);
|
|
21835
22106
|
let processed = masked;
|
|
21836
|
-
for (const delimiter of
|
|
21837
|
-
processed = replaceMathDelimiter
|
|
22107
|
+
for (const delimiter of MATH_DELIMITER_DEFINITIONS) {
|
|
22108
|
+
processed = replaceMathDelimiter(processed, delimiter);
|
|
21838
22109
|
}
|
|
21839
22110
|
processed = processed.replace(/\\$/g, '$');
|
|
21840
22111
|
return restore(processed);
|
|
21841
22112
|
}
|
|
21842
22113
|
/**
|
|
21843
|
-
*
|
|
21844
|
-
*
|
|
21845
|
-
* TODO: [🧠] Maybe export from `@promptbook/markdown-utils`
|
|
21846
|
-
*
|
|
21847
|
-
* @param markdown - The markdown content to convert
|
|
21848
|
-
* @returns HTML string ready for rendering
|
|
22114
|
+
* Escapes HTML-sensitive text before returning fallback markdown rendering.
|
|
21849
22115
|
*
|
|
21850
|
-
* @
|
|
22116
|
+
* @private utility of `renderMarkdown`
|
|
21851
22117
|
*/
|
|
21852
|
-
function
|
|
21853
|
-
|
|
21854
|
-
|
|
21855
|
-
|
|
21856
|
-
|
|
21857
|
-
|
|
21858
|
-
|
|
21859
|
-
|
|
21860
|
-
|
|
21861
|
-
|
|
21862
|
-
|
|
21863
|
-
|
|
21864
|
-
|
|
21865
|
-
|
|
21866
|
-
|
|
21867
|
-
|
|
21868
|
-
|
|
21869
|
-
|
|
21870
|
-
|
|
21871
|
-
|
|
21872
|
-
|
|
22118
|
+
function escapeHtml$2(value) {
|
|
22119
|
+
return value.replace(/[<>&"']/g, (char) => {
|
|
22120
|
+
const entities = {
|
|
22121
|
+
'<': '<',
|
|
22122
|
+
'>': '>',
|
|
22123
|
+
'&': '&',
|
|
22124
|
+
'"': '"',
|
|
22125
|
+
"'": ''',
|
|
22126
|
+
};
|
|
22127
|
+
return entities[char] || char;
|
|
22128
|
+
});
|
|
22129
|
+
}
|
|
22130
|
+
/**
|
|
22131
|
+
* Loads KaTeX CSS in browser environments that need to display math output.
|
|
22132
|
+
*
|
|
22133
|
+
* @private utility of `renderMarkdown`
|
|
22134
|
+
*/
|
|
22135
|
+
function registerKatexStylesheet(html) {
|
|
22136
|
+
if (typeof window === 'undefined') {
|
|
22137
|
+
return;
|
|
22138
|
+
}
|
|
22139
|
+
if (!html.match(/class="katex/)) {
|
|
22140
|
+
return;
|
|
22141
|
+
}
|
|
22142
|
+
if (window.document.getElementById(KATEX_STYLESHEET_ID)) {
|
|
22143
|
+
return;
|
|
22144
|
+
}
|
|
22145
|
+
const link = window.document.createElement('link');
|
|
22146
|
+
link.id = KATEX_STYLESHEET_ID;
|
|
22147
|
+
link.rel = 'stylesheet';
|
|
22148
|
+
link.href = KATEX_STYLESHEET_URL;
|
|
22149
|
+
window.document.head.appendChild(link);
|
|
22150
|
+
}
|
|
22151
|
+
/**
|
|
22152
|
+
* Convert markdown content to HTML.
|
|
22153
|
+
*
|
|
22154
|
+
* @param markdown - The markdown content to convert.
|
|
22155
|
+
* @returns HTML string ready for rendering.
|
|
22156
|
+
*
|
|
22157
|
+
* @private internal utility of chat components and exports
|
|
22158
|
+
*/
|
|
22159
|
+
function renderMarkdown(markdown, options) {
|
|
22160
|
+
if (!markdown || typeof markdown !== 'string') {
|
|
22161
|
+
return '';
|
|
22162
|
+
}
|
|
22163
|
+
const converter = options ? createChatMarkdownConverter(options) : CHAT_MARKDOWN_CONVERTER;
|
|
22164
|
+
try {
|
|
22165
|
+
const normalizedMarkdown = normalizeMarkdownSublists(markdown);
|
|
22166
|
+
const { masked: maskedMarkdown, restore: restoreDetails } = maskDetailsBlocks(normalizedMarkdown);
|
|
22167
|
+
const processedMarkdown = renderMathInMarkdown(maskedMarkdown);
|
|
22168
|
+
const html = converter.makeHtml(processedMarkdown);
|
|
22169
|
+
registerKatexStylesheet(html);
|
|
21873
22170
|
const restoredHtml = restoreDetails(html);
|
|
21874
|
-
const sanitizedHtml = restoredHtml
|
|
21875
|
-
.replace(/<\s*(script|style|iframe|object|embed)[^>]*>[\s\S]*?<\s*\/\s*\1\s*>/gi, '')
|
|
21876
|
-
.replace(/\s+on\w+="[^"]*"/gi, '')
|
|
21877
|
-
.replace(/\s+javascript:/gi, '')
|
|
21878
|
-
.replace(/\s+data:/gi, '')
|
|
21879
|
-
.replace(/\s+vbscript:/gi, '');
|
|
22171
|
+
const sanitizedHtml = sanitizeRenderedMarkdownHtml(restoredHtml);
|
|
21880
22172
|
return sanitizedHtml;
|
|
21881
22173
|
}
|
|
21882
22174
|
catch (error) {
|
|
21883
22175
|
console.error('Error rendering markdown:', error);
|
|
21884
|
-
return markdown
|
|
21885
|
-
const entities = {
|
|
21886
|
-
'<': '<',
|
|
21887
|
-
'>': '>',
|
|
21888
|
-
'&': '&',
|
|
21889
|
-
'"': '"',
|
|
21890
|
-
"'": ''',
|
|
21891
|
-
};
|
|
21892
|
-
return entities[char] || char;
|
|
21893
|
-
});
|
|
22176
|
+
return escapeHtml$2(markdown);
|
|
21894
22177
|
}
|
|
21895
22178
|
}
|
|
22179
|
+
|
|
22180
|
+
var css_248z$b = ".MarkdownContent-module_MarkdownContent__2JuyX{--md-text-color:var(--chat-md-text-color,inherit);--md-muted-color:var(--chat-md-muted-color,currentColor);--md-link-color:var(--chat-md-link-color,#2563eb);--md-heading-color:var(--chat-heading-text-color,var(--md-text-color));--md-heading-font-family:var(\n --chat-md-heading-font-family,var(--font-poppins,\"Poppins\",system-ui,-apple-system,sans-serif)\n );--md-body-font-family:var(\n --chat-md-body-font-family,var(--font-poppins,\"Poppins\",system-ui,-apple-system,sans-serif)\n );--md-code-font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",monospace;--md-inline-code-bg:var(--chat-md-inline-code-bg,rgba(15,23,42,.08));--md-inline-code-border:var(--chat-md-inline-code-border,rgba(15,23,42,.12));--md-inline-code-color:var(--chat-md-inline-code-color,var(--md-text-color));--md-blockquote-bg:var(--chat-md-blockquote-bg,rgba(248,250,252,.92));--md-blockquote-border:var(--chat-md-blockquote-border,rgba(59,130,246,.35));--md-table-bg:var(--chat-md-table-bg,rgba(248,250,252,.92));--md-table-row-alt-bg:var(--chat-md-table-row-alt-bg,rgba(241,245,249,.9));--md-table-head-bg:var(--chat-md-table-head-bg,rgba(226,232,240,.95));--md-table-border:var(--chat-md-table-border,rgba(148,163,184,.36));--md-citation-bg:var(--chat-md-citation-bg,rgba(59,130,246,.14));--md-citation-color:var(--chat-md-citation-color,#1d4ed8);color:var(--md-text-color);font-family:var(--md-body-font-family);font-size:inherit;letter-spacing:.002em;line-height:1.65}.MarkdownContent-module_MarkdownContent__2JuyX>:first-child{margin-top:0!important}.MarkdownContent-module_MarkdownContent__2JuyX>:last-child{margin-bottom:0!important}.MarkdownContent-module_MarkdownContent__2JuyX :is(h1,h2,h3,h4,h5,h6){text-wrap:balance;color:var(--md-heading-color);font-family:var(--md-heading-font-family);font-weight:600;letter-spacing:.01em;line-height:1.24;margin:1.4em 0 .55em;position:relative}.MarkdownContent-module_MarkdownContent__2JuyX h1{font-size:1.52rem}.MarkdownContent-module_MarkdownContent__2JuyX h2{font-size:1.4rem}.MarkdownContent-module_MarkdownContent__2JuyX h3{font-size:1.26rem}.MarkdownContent-module_MarkdownContent__2JuyX h4{font-size:1.14rem}.MarkdownContent-module_MarkdownContent__2JuyX h5{font-size:1.04rem}.MarkdownContent-module_MarkdownContent__2JuyX h6{font-size:.98rem}.MarkdownContent-module_MarkdownContent__2JuyX p{text-wrap:pretty;margin:0 0 .9em}.MarkdownContent-module_MarkdownContent__2JuyX p:empty{display:none}.MarkdownContent-module_MarkdownContent__2JuyX :is(ul,ol){display:grid;gap:.35em;margin:.65em 0 1em;padding-inline-start:1.35rem}.MarkdownContent-module_MarkdownContent__2JuyX ul{list-style:disc}.MarkdownContent-module_MarkdownContent__2JuyX ol{list-style:decimal}.MarkdownContent-module_MarkdownContent__2JuyX li{line-height:1.58}.MarkdownContent-module_MarkdownContent__2JuyX li>:is(ul,ol){margin-bottom:0;margin-top:.45em}.MarkdownContent-module_MarkdownContent__2JuyX ul:has(>li>[data-chat-progress-marker]){list-style:none;padding-inline-start:0}.MarkdownContent-module_MarkdownContent__2JuyX ul:has(>li>[data-chat-progress-marker])>li{list-style:none}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker]{border-radius:999px;color:var(--md-link-color);display:inline-flex;height:1rem;margin-right:.58rem;transform-origin:center;vertical-align:text-bottom;width:1rem}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=pending]{animation:MarkdownContent-module_chatProgressMarkerSpin__TpoKr .85s linear infinite;border:2px solid color-mix(in srgb,currentColor 22%,transparent);border-top-color:currentcolor;box-sizing:border-box}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=completed]{align-items:center;background:color-mix(in srgb,currentColor 12%,transparent);border:2px solid;box-sizing:border-box;justify-content:center}.MarkdownContent-module_MarkdownContent__2JuyX [data-chat-progress-marker=completed]:before{border-bottom:2px solid;border-right:2px solid;box-sizing:border-box;content:\"\";display:block;height:.5rem;margin-top:-.06rem;transform:rotate(45deg);width:.26rem}@keyframes MarkdownContent-module_chatProgressMarkerSpin__TpoKr{to{transform:rotate(1turn)}}.MarkdownContent-module_MarkdownContent__2JuyX a{color:var(--md-link-color);text-decoration-color:currentColor;text-decoration-line:underline;text-decoration-thickness:1.4px;text-underline-offset:.16em;transition:opacity .2s ease,text-decoration-thickness .2s ease}.MarkdownContent-module_MarkdownContent__2JuyX a:focus-visible,.MarkdownContent-module_MarkdownContent__2JuyX a:hover{opacity:.92;text-decoration-thickness:2px}.MarkdownContent-module_MarkdownContent__2JuyX img{border-radius:14px;display:block;height:auto;margin:.95em 0;max-width:100%}.MarkdownContent-module_MarkdownContent__2JuyX blockquote,.MarkdownContent-module_MarkdownContent__2JuyX hr,.MarkdownContent-module_MarkdownContent__2JuyX pre,.MarkdownContent-module_MarkdownContent__2JuyX table{margin:.95em 0}.MarkdownContent-module_MarkdownContent__2JuyX pre{background:transparent;border:none;border-radius:12px;box-shadow:none;display:block;overflow:visible;padding:0}.MarkdownContent-module_MarkdownContent__2JuyX blockquote{background:var(--md-blockquote-bg);border:none;border-left:3px solid var(--md-blockquote-border);border-radius:12px;box-shadow:none;color:var(--md-muted-color);display:block;padding:.72em .96em}.MarkdownContent-module_MarkdownContent__2JuyX blockquote>:last-child{margin-bottom:0}.MarkdownContent-module_MarkdownContent__2JuyX code{background:var(--md-inline-code-bg);border:1px solid var(--md-inline-code-border);border-radius:8px;color:var(--md-inline-code-color);font-family:var(--md-code-font-family);font-size:.88em;line-height:1.45;margin:0;padding:.14em .42em;word-break:break-word}.MarkdownContent-module_MarkdownContent__2JuyX pre code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:normal}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg{background:#181c23;border:1px solid rgba(148,163,184,.35);border-radius:12px;box-shadow:0 6px 18px rgba(2,6,23,.28);color:#f8fafc;font-family:var(--md-code-font-family);font-size:14px;line-height:1.6;overflow-x:auto}.MarkdownContent-module_MarkdownContent__2JuyX .MarkdownContent-module_chat-code-block__ZffFg code{background:none!important;border:none!important;box-shadow:none!important;color:inherit!important;display:block;font-family:inherit!important;font-size:inherit!important;overflow-x:auto;padding:0!important;white-space:pre;word-break:normal}.MarkdownContent-module_MarkdownContent__2JuyX table{background:var(--md-table-bg);border:1px solid var(--md-table-border);border-collapse:separate;border-radius:12px;border-spacing:0;box-shadow:0 2px 8px rgba(15,23,42,.1);color:inherit;font-size:.93em;overflow:hidden;width:100%}.MarkdownContent-module_MarkdownContent__2JuyX td,.MarkdownContent-module_MarkdownContent__2JuyX th{background:none;border-bottom:1px solid var(--md-table-border);color:inherit;padding:.58em .72em;text-align:left;vertical-align:top}.MarkdownContent-module_MarkdownContent__2JuyX th{background:var(--md-table-head-bg);font-weight:600}.MarkdownContent-module_MarkdownContent__2JuyX tr:last-child td{border-bottom:none}.MarkdownContent-module_MarkdownContent__2JuyX tr:nth-child(2n) td{background:var(--md-table-row-alt-bg)}.MarkdownContent-module_MarkdownContent__2JuyX hr{border:none;border-top:1px solid var(--md-table-border);opacity:.8}.MarkdownContent-module_MarkdownContent__2JuyX details{background:color-mix(in srgb,var(--md-table-bg) 82%,hsla(0,0%,100%,.3) 18%);border:1px solid var(--md-table-border);border-radius:16px;box-shadow:0 8px 22px rgba(15,23,42,.08);margin:.95em 0;overflow:hidden;transition:border-color .18s ease,box-shadow .18s ease,transform .18s ease}.MarkdownContent-module_MarkdownContent__2JuyX details:focus-within,.MarkdownContent-module_MarkdownContent__2JuyX details:hover{border-color:color-mix(in srgb,var(--md-link-color) 24%,var(--md-table-border) 76%);box-shadow:0 12px 28px rgba(15,23,42,.12)}.MarkdownContent-module_MarkdownContent__2JuyX details>summary{align-items:center;background:linear-gradient(180deg,color-mix(in srgb,var(--md-table-head-bg) 88%,hsla(0,0%,100%,.85) 12%),color-mix(in srgb,var(--md-table-bg) 82%,hsla(0,0%,100%,.7) 18%));color:var(--md-link-color);cursor:pointer;display:flex;font-weight:600;gap:.72rem;list-style:none;padding:.9em 1.05em;transition:background .18s ease,color .18s ease;user-select:none}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:before{border-bottom:2px solid;border-right:2px solid;content:\"\";flex:0 0 auto;height:.62rem;margin-top:-.04rem;opacity:.82;transform:rotate(-45deg);transition:transform .18s ease,opacity .18s ease;width:.62rem}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:focus-visible,.MarkdownContent-module_MarkdownContent__2JuyX details>summary:hover{background:linear-gradient(180deg,color-mix(in srgb,var(--md-table-head-bg) 76%,hsla(0,0%,100%,.95) 24%),color-mix(in srgb,var(--md-table-bg) 74%,hsla(0,0%,100%,.82) 26%))}.MarkdownContent-module_MarkdownContent__2JuyX details>summary:focus-visible{outline:2px solid color-mix(in srgb,var(--md-link-color) 52%,transparent);outline-offset:-2px}.MarkdownContent-module_MarkdownContent__2JuyX details>summary::-webkit-details-marker{display:none}.MarkdownContent-module_MarkdownContent__2JuyX details[open]>summary{border-bottom:1px solid color-mix(in srgb,var(--md-table-border) 88%,transparent)}.MarkdownContent-module_MarkdownContent__2JuyX details[open]>summary:before{opacity:1;transform:rotate(45deg)}.MarkdownContent-module_MarkdownContent__2JuyX details>:not(summary){margin-left:1.05em;margin-right:1.05em}.MarkdownContent-module_MarkdownContent__2JuyX details>summary+*{margin-top:.95em}.MarkdownContent-module_MarkdownContent__2JuyX details>:last-child{margin-bottom:1.05em}.MarkdownContent-module_MarkdownContent__2JuyX strong{font-weight:650}.MarkdownContent-module_MarkdownContent__2JuyX em{font-style:italic}.MarkdownContent-module_citationRef__fKqaT,.MarkdownContent-module_citation__11SMw{align-items:center;background:var(--md-citation-bg);border-radius:999px;color:var(--md-citation-color);display:inline-flex;font-size:.74em;font-weight:700;justify-content:center;line-height:1.45;margin:0 .1em;min-width:1.4em;padding:0 .35em;vertical-align:super}.MarkdownContent-module_MarkdownContent__2JuyX sup[data-citation-footnote]{color:currentColor;display:inline;font-size:.72em;font-weight:700;line-height:1;margin:0 .7em 0 .08em;vertical-align:super}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUNJLGlEQUFtRCxDQUNuRCx3REFBMEQsQ0FDMUQsaURBQW1ELENBQ25ELHNFQUF3RSxDQUN4RTs7S0FHQyxDQUNEOztLQUdDLENBQ0QsbUdBQTBHLENBQzFHLG9FQUEwRSxDQUMxRSw0RUFBa0YsQ0FDbEYsNEVBQThFLENBQzlFLHFFQUEyRSxDQUMzRSw0RUFBa0YsQ0FDbEYsMkRBQWlFLENBQ2pFLDBFQUFnRixDQUNoRixxRUFBMkUsQ0FDM0UsbUVBQXlFLENBQ3pFLGdFQUFzRSxDQUN0RSx5REFBMkQsQ0FFM0QsMEJBQTJCLENBQzNCLHNDQUF1QyxDQUN2QyxpQkFBa0IsQ0FFbEIscUJBQXVCLENBRHZCLGdCQUVKLENBRUEsNERBQ0ksc0JBQ0osQ0FFQSwyREFDSSx5QkFDSixDQUVBLHNFQVFJLGlCQUFrQixDQUxsQiw2QkFBOEIsQ0FDOUIseUNBQTBDLENBQzFDLGVBQWdCLENBRWhCLG9CQUFzQixDQUR0QixnQkFBaUIsQ0FKakIsb0JBQXNCLENBRHRCLGlCQVFKLENBRUEsa0RBQ0ksaUJBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLGtEQUNJLGlCQUNKLENBRUEsa0RBQ0ksaUJBQ0osQ0FFQSxrREFDSSxpQkFDSixDQUVBLGtEQUNJLGdCQUNKLENBRUEsaURBRUksZ0JBQWlCLENBRGpCLGVBRUosQ0FFQSx1REFDSSxZQUNKLENBRUEsMERBR0ksWUFBYSxDQUNiLFNBQVcsQ0FIWCxrQkFBb0IsQ0FDcEIsNEJBR0osQ0FFQSxrREFDSSxlQUNKLENBRUEsa0RBQ0ksa0JBQ0osQ0FFQSxrREFDSSxnQkFDSixDQUVBLDZEQUVJLGVBQWdCLENBRGhCLGdCQUVKLENBRUEsdUZBQ0ksZUFBZ0IsQ0FDaEIsc0JBQ0osQ0FFQSwwRkFDSSxlQUNKLENBRUEsMkVBTUksbUJBQW9CLENBQ3BCLDBCQUEyQixDQU4zQixtQkFBb0IsQ0FFcEIsV0FBWSxDQUNaLG1C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QXFDLENBRHJDLHNCQUFvQyxDQUxwQyxVQUFXLENBR1gsYUFBYyxDQURkLGFBQWUsQ0FFZixrQkFBb0IsQ0FJcEIsV0FBYSxDQURiLHdCQUF5QixDQUV6QixnREFBb0QsQ0FScEQsWUFTSixDQUVBLGtKQUVJLDJLQUtKLENBRUEsNkVBQ0kseUVBQTRFLENBQzVFLG1CQUNKLENBRUEsdUZBQ0ksWUFDSixDQUVBLHFFQUNJLGlGQUNKLENBRUEsNEVBRUksU0FBVSxDQURWLHVCQUVKLENBRUEscUVBQ0ksa0JBQW1CLENBQ25CLG1CQUNKLENBRUEsaUVBQ0ksZ0JBQ0osQ0FFQSxtRUFDSSxvQkFDSixDQUVBLHNEQUNJLGVBQ0osQ0FFQSxrREFDSSxpQkFDSixDQWtCQSxtRkFFSSxrQkFBbUIsQ0FXbkIsZ0NBQWlDLENBTmpDLG1CQUFvQixDQUtwQiw4QkFBK0IsQ0FYL0IsbUJBQW9CLENBT3BCLGVBQWlCLENBQ2pCLGVBQWdCLENBTmhCLHNCQUF1QixDQU92QixnQkFBaUIsQ0FMakIsYUFBZSxDQURmLGVBQWdCLENBRWhCLGVBQWlCLENBS2pCLG9CQUdKLENBRUEsMkVBT0ksa0JBQW1CLENBTm5CLGNBQWUsQ0FFZixlQUFpQixDQUNqQixlQUFnQixDQUNoQixhQUFjLENBSGQscUJBQXdCLENBSXhCLG9CQUVKIiwiZmlsZSI6Ik1hcmtkb3duQ29udGVudC5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLk1hcmtkb3duQ29udGVudCB7XG4gICAgLS1tZC10ZXh0LWNvbG9yOiB2YXIoLS1jaGF0LW1kLXRleHQtY29sb3IsIGluaGVyaXQpO1xuICAgIC0tbWQtbXV0ZWQtY29sb3I6IHZhcigtLWNoYXQtbWQtbXV0ZWQtY29sb3IsIGN1cnJlbnRDb2xvcik7XG4gICAgLS1tZC1saW5rLWNvbG9yOiB2YXIoLS1jaGF0LW1kLWxpbmstY29sb3IsICMyNTYzZWIpO1xuICAgIC0tbWQtaGVhZGluZy1jb2xvcjogdmFyKC0tY2hhdC1oZWFkaW5nLXRleHQtY29sb3IsIHZhcigtLW1kLXRleHQtY29sb3IpKTtcbiAgICAtLW1kLWhlYWRpbmctZm9udC1mYW1pbHk6IHZhcihcbiAgICAgICAgLS1jaGF0LW1kLWhlYWRpbmctZm9udC1mYW1pbHksXG4gICAgICAgIHZhcigtLWZvbnQtcG9wcGlucywgJ1BvcHBpbnMnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYpXG4gICAgKTtcbiAgICAtLW1kLWJvZHktZm9udC1mYW1pbHk6IHZhcihcbiAgICAgICAgLS1jaGF0LW1kLWJvZHktZm9udC1mYW1pbHksXG4gICAgICAgIHZhcigtLWZvbnQtcG9wcGlucywgJ1BvcHBpbnMnLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYpXG4gICAgKTtcbiAgICAtLW1kLWNvZGUtZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1xuICAgIC0tbWQtaW5saW5lLWNvZGUtYmc6IHZhcigtLWNoYXQtbWQtaW5saW5lLWNvZGUtYmcsIHJnYmEoMTUsIDIzLCA0MiwgMC4wOCkpO1xuICAgIC0tbWQtaW5saW5lLWNvZGUtYm9yZGVyOiB2YXIoLS1jaGF0LW1kLWlubGluZS1jb2RlLWJvcmRlciwgcmdiYSgxNSwgMjMsIDQyLCAwLjEyKSk7XG4gICAgLS1tZC1pbmxpbmUtY29kZS1jb2xvcjogdmFyKC0tY2hhdC1tZC1pbmxpbmUtY29kZS1jb2xvciwgdmFyKC0tbWQtdGV4dC1jb2xvcikpO1xuICAgIC0tbWQtYmxvY2txdW90ZS1iZzogdmFyKC0tY2hhdC1tZC1ibG9ja3F1b3RlLWJnLCByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuOTIpKTtcbiAgICAtLW1kLWJsb2NrcXVvdGUtYm9yZGVyOiB2YXIoLS1jaGF0LW1kLWJsb2NrcXVvdGUtYm9yZGVyLCByZ2JhKDU5LCAxMzAsIDI0NiwgMC4zNSkpO1xuICAgIC0tbWQtdGFibGUtYmc6IHZhcigtLWNoYXQtbWQtdGFibGUtYmcsIHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45MikpO1xuICAgIC0tbWQtdGFibGUtcm93LWFsdC1iZzogdmFyKC0tY2hhdC1tZC10YWJsZS1yb3ctYWx0LWJnLCByZ2JhKDI0MSwgMjQ1LCAyNDksIDAuOSkpO1xuICAgIC0tbWQtdGFibGUtaGVhZC1iZzogdmFyKC0tY2hhdC1tZC10YWJsZS1oZWFkLWJnLCByZ2JhKDIyNiwgMjMyLCAyNDAsIDAuOTUpKTtcbiAgICAtLW1kLXRhYmxlLWJvcmRlcjogdmFyKC0tY2hhdC1tZC10YWJsZS1ib3JkZXIsIHJnYmEoMTQ4LCAxNjMsIDE4NCwgMC4zNikpO1xuICAgIC0tbWQtY2l0YXRpb24tYmc6IHZhcigtLWNoYXQtbWQtY2l0YXRpb24tYmcsIHJnYmEoNTksIDEzMCwgMjQ2LCAwLjE0KSk7XG4gICAgLS1tZC1jaXRhdGlvbi1jb2xvcjogdmFyKC0tY2hhdC1tZC1jaXRhdGlvbi1jb2xvciwgIzFkNGVkOCk7XG5cbiAgICBjb2xvcjogdmFyKC0tbWQtdGV4dC1jb2xvcik7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLW1kLWJvZHktZm9udC1mYW1pbHkpO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogMS42NTtcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMDJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCA+IDpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50O1xufVxuXG4uTWFya2Rvd25Db250ZW50ID4gOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDAgIWltcG9ydGFudDtcbn1cblxuLk1hcmtkb3duQ29udGVudCA6aXMoaDEsIGgyLCBoMywgaDQsIGg1LCBoNikge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXJnaW46IDEuNGVtIDAgMC41NWVtO1xuICAgIGNvbG9yOiB2YXIoLS1tZC1oZWFkaW5nLWNvbG9yKTtcbiAgICBmb250LWZhbWlseTogdmFyKC0tbWQtaGVhZGluZy1mb250LWZhbWlseSk7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICBsaW5lLWhlaWdodDogMS4yNDtcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtO1xuICAgIHRleHQtd3JhcDogYmFsYW5jZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMSB7XG4gICAgZm9udC1zaXplOiAxLjUycmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGgyIHtcbiAgICBmb250LXNpemU6IDEuNHJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoMyB7XG4gICAgZm9udC1zaXplOiAxLjI2cmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGg0IHtcbiAgICBmb250LXNpemU6IDEuMTRyZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgaDUge1xuICAgIGZvbnQtc2l6ZTogMS4wNHJlbTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBoNiB7XG4gICAgZm9udC1zaXplOiAwLjk4cmVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHAge1xuICAgIG1hcmdpbjogMCAwIDAuOWVtO1xuICAgIHRleHQtd3JhcDogcHJldHR5O1xufVxuXG4uTWFya2Rvd25Db250ZW50IHA6ZW1wdHkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgOmlzKHVsLCBvbCkge1xuICAgIG1hcmdpbjogMC42NWVtIDAgMWVtO1xuICAgIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAxLjM1cmVtO1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ2FwOiAwLjM1ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdWwge1xuICAgIGxpc3Qtc3R5bGU6IGRpc2M7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgb2wge1xuICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgbGkge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjU4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGxpID4gOmlzKHVsLCBvbCkge1xuICAgIG1hcmdpbi10b3A6IDAuNDVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHVsOmhhcyg+IGxpID4gW2RhdGEtY2hhdC1wcm9ncmVzcy1tYXJrZXJdKSB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICBwYWRkaW5nLWlubGluZS1zdGFydDogMDtcbn1cblxuLk1hcmtkb3duQ29udGVudCB1bDpoYXMoPiBsaSA+IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyXSkgPiBsaSB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBbZGF0YS1jaGF0LXByb2dyZXNzLW1hcmtlcl0ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIHdpZHRoOiAxcmVtO1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuNThyZW07XG4gICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgW2RhdGEtY2hhdC1wcm9ncmVzcy1tYXJrZXI9J3BlbmRpbmcnXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXI6IDJweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDIyJSwgdHJhbnNwYXJlbnQpO1xuICAgIGJvcmRlci10b3AtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgICBhbmltYXRpb246IGNoYXRQcm9ncmVzc01hcmtlclNwaW4gMC44NXMgbGluZWFyIGluZmluaXRlO1xufVxuXG4uTWFya2Rvd25Db250ZW50IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyPSdjb21wbGV0ZWQnXSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDEyJSwgdHJhbnNwYXJlbnQpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IFtkYXRhLWNoYXQtcHJvZ3Jlc3MtbWFya2VyPSdjb21wbGV0ZWQnXTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAnJztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHdpZHRoOiAwLjI2cmVtO1xuICAgIGhlaWdodDogMC41cmVtO1xuICAgIG1hcmdpbi10b3A6IC0wLjA2cmVtO1xuICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgY3VycmVudENvbG9yO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbn1cblxuQGtleWZyYW1lcyBjaGF0UHJvZ3Jlc3NNYXJrZXJTcGluIHtcbiAgICB0byB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgfVxufVxuXG4uTWFya2Rvd25Db250ZW50IGEge1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lO1xuICAgIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDEuNHB4O1xuICAgIHRleHQtdW5kZXJsaW5lLW9mZnNldDogMC4xNmVtO1xuICAgIHRleHQtZGVjb3JhdGlvbi1jb2xvcjogY3VycmVudENvbG9yO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLCB0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIDAuMnMgZWFzZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBhOmhvdmVyLFxuLk1hcmtkb3duQ29udGVudCBhOmZvY3VzLXZpc2libGUge1xuICAgIG9wYWNpdHk6IDAuOTI7XG4gICAgdGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzczogMnB4O1xufVxuXG4uTWFya2Rvd25Db250ZW50IGltZyB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiAxNHB4O1xuICAgIG1hcmdpbjogMC45NWVtIDA7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcHJlLFxuLk1hcmtkb3duQ29udGVudCBibG9ja3F1b3RlLFxuLk1hcmtkb3duQ29udGVudCB0YWJsZSxcbi5NYXJrZG93bkNvbnRlbnQgaHIge1xuICAgIG1hcmdpbjogMC45NWVtIDA7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgcHJlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgYmxvY2txdW90ZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tbWQtYmxvY2txdW90ZS1ib3JkZXIpO1xuICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC1ibG9ja3F1b3RlLWJnKTtcbiAgICBjb2xvcjogdmFyKC0tbWQtbXV0ZWQtY29sb3IpO1xuICAgIHBhZGRpbmc6IDAuNzJlbSAwLjk2ZW07XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgYmxvY2txdW90ZSA+IDpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGNvZGUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwLjE0ZW0gMC40MmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1kLWlubGluZS1jb2RlLWJvcmRlcik7XG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIGJhY2tncm91bmQ6IHZhcigtLW1kLWlubGluZS1jb2RlLWJnKTtcbiAgICBmb250LWZhbWlseTogdmFyKC0tbWQtY29kZS1mb250LWZhbWlseSk7XG4gICAgZm9udC1zaXplOiAwLjg4ZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgY29sb3I6IHZhcigtLW1kLWlubGluZS1jb2RlLWNvbG9yKTtcbiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHByZSBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICB3b3JkLWJyZWFrOiBub3JtYWw7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuLk1hcmtkb3duQ29udGVudCAuY2hhdC1jb2RlLWJsb2NrIHtcbiAgICBiYWNrZ3JvdW5kOiAjMTgxYzIzO1xuICAgIGNvbG9yOiAjZjhmYWZjO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMS42O1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNDgsIDE2MywgMTg0LCAwLjM1KTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgyLCA2LCAyMywgMC4yOCk7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLW1kLWNvZGUtZm9udC1mYW1pbHkpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IC5jaGF0LWNvZGUtYmxvY2sgY29kZSB7XG4gICAgYmFja2dyb3VuZDogbm9uZSAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG4gICAgd29yZC1icmVhazogbm9ybWFsO1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdGFibGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWQtdGFibGUtYm9yZGVyKTtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYmFja2dyb3VuZDogdmFyKC0tbWQtdGFibGUtYmcpO1xuICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDE1LCAyMywgNDIsIDAuMSk7XG4gICAgZm9udC1zaXplOiAwLjkzZW07XG4gICAgY29sb3I6IGluaGVyaXQ7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdGgsXG4uTWFya2Rvd25Db250ZW50IHRkIHtcbiAgICBwYWRkaW5nOiAwLjU4ZW0gMC43MmVtO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpO1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHRoIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC10YWJsZS1oZWFkLWJnKTtcbiAgICBmb250LXdlaWdodDogNjAwO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHRyOmxhc3QtY2hpbGQgdGQge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgdHI6bnRoLWNoaWxkKGV2ZW4pIHRkIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC10YWJsZS1yb3ctYWx0LWJnKTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBociB7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpO1xuICAgIG9wYWNpdHk6IDAuODtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzIHtcbiAgICBtYXJnaW46IDAuOTVlbSAwO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1kLXRhYmxlLWJvcmRlcik7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWQtdGFibGUtYmcpIDgyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpIDE4JSk7XG4gICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMThzIGVhc2UsIGJveC1zaGFkb3cgMC4xOHMgZWFzZSwgdHJhbnNmb3JtIDAuMThzIGVhc2U7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlsczpob3Zlcixcbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlsczpmb2N1cy13aXRoaW4ge1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1kLWxpbmstY29sb3IpIDI0JSwgdmFyKC0tbWQtdGFibGUtYm9yZGVyKSA3NiUpO1xuICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4xMik7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnkge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNzJyZW07XG4gICAgcGFkZGluZzogMC45ZW0gMS4wNWVtO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIGNvbG9yOiB2YXIoLS1tZC1saW5rLWNvbG9yKTtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgICAgMTgwZGVnLFxuICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWQtdGFibGUtaGVhZC1iZykgODglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpIDEyJSksXG4gICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1iZykgODIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMTglKVxuICAgICk7XG4gICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE4cyBlYXNlLCBjb2xvciAwLjE4cyBlYXNlO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiBzdW1tYXJ5OjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHdpZHRoOiAwLjYycmVtO1xuICAgIGhlaWdodDogMC42MnJlbTtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBtYXJnaW4tdG9wOiAtMC4wNHJlbTtcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuICAgIG9wYWNpdHk6IDAuODI7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMThzIGVhc2UsIG9wYWNpdHkgMC4xOHMgZWFzZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzID4gc3VtbWFyeTpob3Zlcixcbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnk6Zm9jdXMtdmlzaWJsZSB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgICAxODBkZWcsXG4gICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1oZWFkLWJnKSA3NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkgMjQlKSxcbiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1kLXRhYmxlLWJnKSA3NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44MikgMjYlKVxuICAgICk7XG59XG5cbi5NYXJrZG93bkNvbnRlbnQgZGV0YWlscyA+IHN1bW1hcnk6Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC1saW5rLWNvbG9yKSA1MiUsIHRyYW5zcGFyZW50KTtcbiAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzID4gc3VtbWFyeTo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBkZXRhaWxzW29wZW5dID4gc3VtbWFyeSB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tZC10YWJsZS1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHNbb3Blbl0gPiBzdW1tYXJ5OjpiZWZvcmUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiA6bm90KHN1bW1hcnkpIHtcbiAgICBtYXJnaW4tbGVmdDogMS4wNWVtO1xuICAgIG1hcmdpbi1yaWdodDogMS4wNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiBzdW1tYXJ5ICsgKiB7XG4gICAgbWFyZ2luLXRvcDogMC45NWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IGRldGFpbHMgPiA6bGFzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMS4wNWVtO1xufVxuXG4uTWFya2Rvd25Db250ZW50IHN0cm9uZyB7XG4gICAgZm9udC13ZWlnaHQ6IDY1MDtcbn1cblxuLk1hcmtkb3duQ29udGVudCBlbSB7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4uY2l0YXRpb24ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgbWluLXdpZHRoOiAxLjRlbTtcbiAgICBtYXJnaW46IDAgMC4xZW07XG4gICAgcGFkZGluZzogMCAwLjM1ZW07XG4gICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgZm9udC1zaXplOiAwLjc0ZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMS40NTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gICAgY29sb3I6IHZhcigtLW1kLWNpdGF0aW9uLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tZC1jaXRhdGlvbi1iZyk7XG59XG5cbi5jaXRhdGlvblJlZiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBtaW4td2lkdGg6IDEuNGVtO1xuICAgIG1hcmdpbjogMCAwLjFlbTtcbiAgICBwYWRkaW5nOiAwIDAuMzVlbTtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBmb250LXNpemU6IDAuNzRlbTtcbiAgICBmb250LXdlaWdodDogNzAwO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjQ1O1xuICAgIHZlcnRpY2FsLWFsaWduOiBzdXBlcjtcbiAgICBjb2xvcjogdmFyKC0tbWQtY2l0YXRpb24tY29sb3IpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLW1kLWNpdGF0aW9uLWJnKTtcbn1cblxuLk1hcmtkb3duQ29udGVudCBzdXBbZGF0YS1jaXRhdGlvbi1mb290bm90ZV0ge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBtYXJnaW46IDAgMC43ZW0gMCAwLjA4ZW07XG4gICAgZm9udC1zaXplOiAwLjcyZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gICAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cbiJdfQ== */";
|
|
22181
|
+
var styles$b = {"MarkdownContent":"MarkdownContent-module_MarkdownContent__2JuyX","chatProgressMarkerSpin":"MarkdownContent-module_chatProgressMarkerSpin__TpoKr","chat-code-block":"MarkdownContent-module_chat-code-block__ZffFg","citation":"MarkdownContent-module_citation__11SMw","citationRef":"MarkdownContent-module_citationRef__fKqaT"};
|
|
22182
|
+
styleInject(css_248z$b);
|
|
22183
|
+
|
|
22184
|
+
/**
|
|
22185
|
+
* Selector used by the delegated summary click handler.
|
|
22186
|
+
*
|
|
22187
|
+
* @private utility of `MarkdownContent` component
|
|
22188
|
+
*/
|
|
22189
|
+
const DETAILS_SUMMARY_SELECTOR = 'summary';
|
|
21896
22190
|
/**
|
|
21897
22191
|
* Returns a stable key for a `<details>` element based on its `<summary>` text.
|
|
21898
22192
|
* Used to identify and restore open state across re-renders.
|
|
@@ -21949,7 +22243,9 @@ function resolveClickedDetailsElement(target, container) {
|
|
|
21949
22243
|
*/
|
|
21950
22244
|
const MarkdownContent = memo(function MarkdownContent(props) {
|
|
21951
22245
|
const { content, className, onCreateAgent } = props;
|
|
21952
|
-
const htmlContent = useMemo(() => renderMarkdown
|
|
22246
|
+
const htmlContent = useMemo(() => renderMarkdown(content, {
|
|
22247
|
+
citationReferenceClassName: styles$b.citationRef,
|
|
22248
|
+
}), [content]);
|
|
21953
22249
|
const containerRef = useRef(null);
|
|
21954
22250
|
const rootsRef = useRef([]);
|
|
21955
22251
|
/** Tracks which `<details>` elements (by summary key) are currently open */
|
|
@@ -26285,362 +26581,6 @@ function resolveCitationPreviewUrl(citation, participants) {
|
|
|
26285
26581
|
}
|
|
26286
26582
|
// TODO: [💞] Spread into multiple files
|
|
26287
26583
|
|
|
26288
|
-
/**
|
|
26289
|
-
* Default class name used for rendered citation references outside of CSS modules.
|
|
26290
|
-
*/
|
|
26291
|
-
const DEFAULT_CITATION_REFERENCE_CLASS_NAME = 'citationRef';
|
|
26292
|
-
/**
|
|
26293
|
-
* Browser stylesheet id used when KaTeX output is rendered in a live chat component.
|
|
26294
|
-
*/
|
|
26295
|
-
const KATEX_STYLESHEET_ID = 'katex-css';
|
|
26296
|
-
/**
|
|
26297
|
-
* CDN stylesheet loaded lazily when markdown contains KaTeX markup in the browser.
|
|
26298
|
-
*/
|
|
26299
|
-
const KATEX_STYLESHEET_URL = 'https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css';
|
|
26300
|
-
/**
|
|
26301
|
-
* Pattern matching CODE FENCE.
|
|
26302
|
-
*/
|
|
26303
|
-
const CODE_FENCE_REGEX = /(`{3,}|~{3,})(?:[^\n\r]*)\r?\n[\s\S]*?\r?\n\1[^\n\r]*/g;
|
|
26304
|
-
/**
|
|
26305
|
-
* Pattern matching INLINE CODE.
|
|
26306
|
-
*/
|
|
26307
|
-
const INLINE_CODE_REGEX = /(`+)([\s\S]*?)(\1)/g;
|
|
26308
|
-
/**
|
|
26309
|
-
* Prefix for CODE PLACEHOLDER.
|
|
26310
|
-
*/
|
|
26311
|
-
const CODE_PLACEHOLDER_PREFIX = '@@PROMPTBOOK_CODE_PLACEHOLDER__';
|
|
26312
|
-
/**
|
|
26313
|
-
* Pattern matching CODE PLACEHOLDER.
|
|
26314
|
-
*/
|
|
26315
|
-
const CODE_PLACEHOLDER_REGEX = new RegExp(`${CODE_PLACEHOLDER_PREFIX}(\\d+)__`, 'g');
|
|
26316
|
-
/**
|
|
26317
|
-
* Pattern matching DETAILS BLOCK.
|
|
26318
|
-
*/
|
|
26319
|
-
const DETAILS_BLOCK_REGEX = /<details[\s\S]*?<\/details\s*>/gi;
|
|
26320
|
-
/**
|
|
26321
|
-
* Prefix for DETAILS PLACEHOLDER.
|
|
26322
|
-
*/
|
|
26323
|
-
const DETAILS_PLACEHOLDER_PREFIX = '@@PROMPTBOOK_DETAILS_PLACEHOLDER__';
|
|
26324
|
-
/**
|
|
26325
|
-
* Pattern matching DETAILS PLACEHOLDER.
|
|
26326
|
-
*/
|
|
26327
|
-
const DETAILS_PLACEHOLDER_REGEX = new RegExp(`${DETAILS_PLACEHOLDER_PREFIX}(\\d+)__`, 'g');
|
|
26328
|
-
/**
|
|
26329
|
-
* Matches a Showdown-wrapped placeholder such as `<p>@@PROMPTBOOK_DETAILS_PLACEHOLDER__0__</p>`.
|
|
26330
|
-
*/
|
|
26331
|
-
const DETAILS_PLACEHOLDER_WRAPPED_REGEX = new RegExp(`<p>\\s*(${DETAILS_PLACEHOLDER_PREFIX}\\d+__)\\s*<\\/p>`, 'g');
|
|
26332
|
-
/**
|
|
26333
|
-
* Collection of math delimiter definitions.
|
|
26334
|
-
*/
|
|
26335
|
-
const MATH_DELIMITER_DEFINITIONS = [
|
|
26336
|
-
{ regex: /(^|[^\\])\$\$([\s\S]+?)\$\$/g, displayMode: true },
|
|
26337
|
-
{ regex: /(^|[^\\])\\\[([\s\S]+?)\\\]/g, displayMode: true },
|
|
26338
|
-
{ regex: /(^|[^\\])\\\(([\s\S]+?)\\\)/g, displayMode: false },
|
|
26339
|
-
{ regex: /(^|[^\\])\$([^$\n]+?)\$/g, displayMode: false },
|
|
26340
|
-
];
|
|
26341
|
-
/**
|
|
26342
|
-
* Normalizes markdown sublists so they render correctly under ordered list items.
|
|
26343
|
-
*
|
|
26344
|
-
* @param markdown - Markdown content to normalize.
|
|
26345
|
-
* @returns Markdown with normalized sublist indentation.
|
|
26346
|
-
*
|
|
26347
|
-
* @private utility of `renderMarkdown`
|
|
26348
|
-
*/
|
|
26349
|
-
function normalizeMarkdownSublists(markdown) {
|
|
26350
|
-
const lines = markdown.split(/\r?\n/);
|
|
26351
|
-
let orderedIndent = null;
|
|
26352
|
-
let shouldIndentUnordered = false;
|
|
26353
|
-
let activeFence = null;
|
|
26354
|
-
const normalizedLines = lines.map((line) => {
|
|
26355
|
-
const trimmedLine = line.trim();
|
|
26356
|
-
const fenceMatch = trimmedLine.match(/^(```|~~~)/);
|
|
26357
|
-
if (fenceMatch) {
|
|
26358
|
-
const fence = fenceMatch[1];
|
|
26359
|
-
activeFence = activeFence === fence ? null : fence;
|
|
26360
|
-
return line;
|
|
26361
|
-
}
|
|
26362
|
-
if (activeFence) {
|
|
26363
|
-
return line;
|
|
26364
|
-
}
|
|
26365
|
-
if (trimmedLine === '') {
|
|
26366
|
-
return line;
|
|
26367
|
-
}
|
|
26368
|
-
const orderedMatch = line.match(/^(\s*)(\d+)\.\s+/);
|
|
26369
|
-
if (orderedMatch) {
|
|
26370
|
-
orderedIndent = orderedMatch[1].length;
|
|
26371
|
-
shouldIndentUnordered = true;
|
|
26372
|
-
return line;
|
|
26373
|
-
}
|
|
26374
|
-
const unorderedMatch = line.match(/^(\s*)([-+*])\s+/);
|
|
26375
|
-
if (unorderedMatch) {
|
|
26376
|
-
if (shouldIndentUnordered && orderedIndent !== null) {
|
|
26377
|
-
const currentIndent = unorderedMatch[1].length;
|
|
26378
|
-
const targetIndent = orderedIndent + 4;
|
|
26379
|
-
if (currentIndent < targetIndent) {
|
|
26380
|
-
return `${' '.repeat(targetIndent)}${line.trimStart()}`;
|
|
26381
|
-
}
|
|
26382
|
-
}
|
|
26383
|
-
return line;
|
|
26384
|
-
}
|
|
26385
|
-
orderedIndent = null;
|
|
26386
|
-
shouldIndentUnordered = false;
|
|
26387
|
-
return line;
|
|
26388
|
-
});
|
|
26389
|
-
return normalizedLines.join('\n');
|
|
26390
|
-
}
|
|
26391
|
-
/**
|
|
26392
|
-
* Creates a showdown converter configured for chat markdown rendering.
|
|
26393
|
-
*
|
|
26394
|
-
* @private utility of `renderMarkdown`
|
|
26395
|
-
*/
|
|
26396
|
-
function createChatMarkdownConverter(options) {
|
|
26397
|
-
var _a;
|
|
26398
|
-
const citationReferenceClassName = (_a = options === null || options === void 0 ? void 0 : options.citationReferenceClassName) !== null && _a !== void 0 ? _a : DEFAULT_CITATION_REFERENCE_CLASS_NAME;
|
|
26399
|
-
return new Converter({
|
|
26400
|
-
flavor: 'github',
|
|
26401
|
-
tables: true,
|
|
26402
|
-
strikethrough: true,
|
|
26403
|
-
tasklists: true,
|
|
26404
|
-
ghCodeBlocks: true,
|
|
26405
|
-
ghMentions: false,
|
|
26406
|
-
ghMentionsLink: '',
|
|
26407
|
-
openLinksInNewWindow: true,
|
|
26408
|
-
backslashEscapesHTMLTags: true,
|
|
26409
|
-
emoji: true,
|
|
26410
|
-
underline: true,
|
|
26411
|
-
completeHTMLDocument: false,
|
|
26412
|
-
metadata: false,
|
|
26413
|
-
splitAdjacentBlockquotes: true,
|
|
26414
|
-
noHeaderId: true,
|
|
26415
|
-
headerLevelStart: 1,
|
|
26416
|
-
parseImgDimensions: true,
|
|
26417
|
-
simplifiedAutoLink: true,
|
|
26418
|
-
literalMidWordUnderscores: true,
|
|
26419
|
-
literalMidWordAsterisks: false,
|
|
26420
|
-
simpleLineBreaks: true,
|
|
26421
|
-
requireSpaceBeforeHeadingText: true,
|
|
26422
|
-
ghCompatibleHeaderId: true,
|
|
26423
|
-
prefixHeaderId: 'chat-header-',
|
|
26424
|
-
rawPrefixHeaderId: false,
|
|
26425
|
-
rawHeaderId: false,
|
|
26426
|
-
smoothLivePreview: true,
|
|
26427
|
-
smartIndentationFix: true,
|
|
26428
|
-
disableForced4SpacesIndentedSublists: false,
|
|
26429
|
-
encodeEmails: true,
|
|
26430
|
-
extensions: [
|
|
26431
|
-
() => ({
|
|
26432
|
-
type: 'lang',
|
|
26433
|
-
regex: createCitationMarkerRegex(),
|
|
26434
|
-
replace: (match) => {
|
|
26435
|
-
const citationMarker = parseCitationMarker(match);
|
|
26436
|
-
if (!citationMarker) {
|
|
26437
|
-
return match;
|
|
26438
|
-
}
|
|
26439
|
-
TODO_USE(citationMarker.source);
|
|
26440
|
-
return `<sup class="${citationReferenceClassName}">[${citationMarker.id}]</sup>`;
|
|
26441
|
-
},
|
|
26442
|
-
}),
|
|
26443
|
-
],
|
|
26444
|
-
});
|
|
26445
|
-
}
|
|
26446
|
-
/**
|
|
26447
|
-
* Pre-configured showdown converter for chat markdown.
|
|
26448
|
-
*/
|
|
26449
|
-
const CHAT_MARKDOWN_CONVERTER = createChatMarkdownConverter();
|
|
26450
|
-
/**
|
|
26451
|
-
* Renders the body of one raw `<details>` block as markdown while keeping the
|
|
26452
|
-
* outer `<details>` and optional `<summary>` markup untouched.
|
|
26453
|
-
*
|
|
26454
|
-
* @param detailsBlock - Raw `<details>...</details>` HTML captured from markdown.
|
|
26455
|
-
* @returns `<details>` HTML whose body has been converted from markdown to HTML.
|
|
26456
|
-
*
|
|
26457
|
-
* @private utility of `renderMarkdown`
|
|
26458
|
-
*/
|
|
26459
|
-
function renderDetailsBlock(detailsBlock) {
|
|
26460
|
-
var _a, _b;
|
|
26461
|
-
const openTagMatch = detailsBlock.match(/^<details\b[^>]*>/i);
|
|
26462
|
-
const closeTagMatch = detailsBlock.match(/<\/details\s*>$/i);
|
|
26463
|
-
if (!openTagMatch || !closeTagMatch) {
|
|
26464
|
-
return detailsBlock;
|
|
26465
|
-
}
|
|
26466
|
-
const openTag = openTagMatch[0];
|
|
26467
|
-
const closeTag = closeTagMatch[0];
|
|
26468
|
-
const innerContent = detailsBlock.slice(openTag.length, detailsBlock.length - closeTag.length);
|
|
26469
|
-
const summaryMatch = innerContent.match(/^(\s*<summary\b[^>]*>[\s\S]*?<\/summary\s*>)([\s\S]*)$/i);
|
|
26470
|
-
const summaryHtml = (_a = summaryMatch === null || summaryMatch === void 0 ? void 0 : summaryMatch[1]) !== null && _a !== void 0 ? _a : '';
|
|
26471
|
-
const bodyMarkdown = ((_b = summaryMatch === null || summaryMatch === void 0 ? void 0 : summaryMatch[2]) !== null && _b !== void 0 ? _b : innerContent);
|
|
26472
|
-
const renderedBody = renderMarkdown(bodyMarkdown);
|
|
26473
|
-
return `${openTag}${summaryHtml}${renderedBody}${closeTag}`;
|
|
26474
|
-
}
|
|
26475
|
-
/**
|
|
26476
|
-
* Masks inline and fenced code segments so math rendering never touches them.
|
|
26477
|
-
*
|
|
26478
|
-
* @param markdown - Markdown text to mask.
|
|
26479
|
-
* @returns Masked markdown and a restore helper.
|
|
26480
|
-
*
|
|
26481
|
-
* @private utility of `renderMarkdown`
|
|
26482
|
-
*/
|
|
26483
|
-
function maskMarkdownCodeSegments(markdown) {
|
|
26484
|
-
const segments = [];
|
|
26485
|
-
let masked = markdown;
|
|
26486
|
-
const addPlaceholder = (segment) => {
|
|
26487
|
-
const placeholder = `${CODE_PLACEHOLDER_PREFIX}${segments.length}__`;
|
|
26488
|
-
segments.push(segment);
|
|
26489
|
-
return placeholder;
|
|
26490
|
-
};
|
|
26491
|
-
const maskWith = (regex) => {
|
|
26492
|
-
regex.lastIndex = 0;
|
|
26493
|
-
masked = masked.replace(regex, (match) => addPlaceholder(match));
|
|
26494
|
-
};
|
|
26495
|
-
maskWith(CODE_FENCE_REGEX);
|
|
26496
|
-
maskWith(INLINE_CODE_REGEX);
|
|
26497
|
-
return {
|
|
26498
|
-
masked: masked,
|
|
26499
|
-
restore(value) {
|
|
26500
|
-
return value.replace(CODE_PLACEHOLDER_REGEX, (_match, index) => { var _a; return (_a = segments[Number(index)]) !== null && _a !== void 0 ? _a : ''; });
|
|
26501
|
-
},
|
|
26502
|
-
};
|
|
26503
|
-
}
|
|
26504
|
-
/**
|
|
26505
|
-
* Masks `<details>...</details>` blocks in the markdown source so that Showdown never
|
|
26506
|
-
* processes their content.
|
|
26507
|
-
*
|
|
26508
|
-
* @param markdown - Markdown text that may contain raw HTML `<details>` blocks.
|
|
26509
|
-
* @returns Masked markdown and a restore helper that returns `string_html`.
|
|
26510
|
-
*
|
|
26511
|
-
* @private utility of `renderMarkdown`
|
|
26512
|
-
*/
|
|
26513
|
-
function maskDetailsBlocks(markdown) {
|
|
26514
|
-
const blocks = [];
|
|
26515
|
-
DETAILS_BLOCK_REGEX.lastIndex = 0;
|
|
26516
|
-
const masked = markdown.replace(DETAILS_BLOCK_REGEX, (match) => {
|
|
26517
|
-
const placeholder = `${DETAILS_PLACEHOLDER_PREFIX}${blocks.length}__`;
|
|
26518
|
-
blocks.push(renderDetailsBlock(match));
|
|
26519
|
-
return placeholder;
|
|
26520
|
-
});
|
|
26521
|
-
return {
|
|
26522
|
-
masked,
|
|
26523
|
-
restore(value) {
|
|
26524
|
-
return value
|
|
26525
|
-
.replace(DETAILS_PLACEHOLDER_WRAPPED_REGEX, '$1')
|
|
26526
|
-
.replace(DETAILS_PLACEHOLDER_REGEX, (_match, index) => { var _a; return (_a = blocks[Number(index)]) !== null && _a !== void 0 ? _a : ''; });
|
|
26527
|
-
},
|
|
26528
|
-
};
|
|
26529
|
-
}
|
|
26530
|
-
/**
|
|
26531
|
-
* Replaces math delimiter.
|
|
26532
|
-
*
|
|
26533
|
-
* @private utility of `renderMarkdown`
|
|
26534
|
-
*/
|
|
26535
|
-
function replaceMathDelimiter(markdown, delimiter) {
|
|
26536
|
-
return markdown.replace(delimiter.regex, (...args) => {
|
|
26537
|
-
var _a, _b, _c;
|
|
26538
|
-
const match = (_a = args[0]) !== null && _a !== void 0 ? _a : '';
|
|
26539
|
-
const prefix = (_b = args[1]) !== null && _b !== void 0 ? _b : '';
|
|
26540
|
-
const math = (_c = args[2]) !== null && _c !== void 0 ? _c : '';
|
|
26541
|
-
if (!math) {
|
|
26542
|
-
return match;
|
|
26543
|
-
}
|
|
26544
|
-
try {
|
|
26545
|
-
const rendered = katex.renderToString(math, {
|
|
26546
|
-
displayMode: delimiter.displayMode,
|
|
26547
|
-
throwOnError: false,
|
|
26548
|
-
});
|
|
26549
|
-
return `${prefix}${rendered}`;
|
|
26550
|
-
}
|
|
26551
|
-
catch (_d) {
|
|
26552
|
-
return match;
|
|
26553
|
-
}
|
|
26554
|
-
});
|
|
26555
|
-
}
|
|
26556
|
-
/**
|
|
26557
|
-
* Renders math expressions in markdown using KaTeX for the supported delimiter pairs.
|
|
26558
|
-
*
|
|
26559
|
-
* Supported delimiters: `$$...$$`, `\[...\]`, `\(...\)`, and `$...$`.
|
|
26560
|
-
*
|
|
26561
|
-
* @private utility of `renderMarkdown`
|
|
26562
|
-
*/
|
|
26563
|
-
function renderMathInMarkdown(markdown) {
|
|
26564
|
-
const { masked, restore } = maskMarkdownCodeSegments(markdown);
|
|
26565
|
-
let processed = masked;
|
|
26566
|
-
for (const delimiter of MATH_DELIMITER_DEFINITIONS) {
|
|
26567
|
-
processed = replaceMathDelimiter(processed, delimiter);
|
|
26568
|
-
}
|
|
26569
|
-
processed = processed.replace(/\\$/g, '$');
|
|
26570
|
-
return restore(processed);
|
|
26571
|
-
}
|
|
26572
|
-
/**
|
|
26573
|
-
* Escapes HTML-sensitive text before returning fallback markdown rendering.
|
|
26574
|
-
*
|
|
26575
|
-
* @private utility of `renderMarkdown`
|
|
26576
|
-
*/
|
|
26577
|
-
function escapeHtml$2(value) {
|
|
26578
|
-
return value.replace(/[<>&"']/g, (char) => {
|
|
26579
|
-
const entities = {
|
|
26580
|
-
'<': '<',
|
|
26581
|
-
'>': '>',
|
|
26582
|
-
'&': '&',
|
|
26583
|
-
'"': '"',
|
|
26584
|
-
"'": ''',
|
|
26585
|
-
};
|
|
26586
|
-
return entities[char] || char;
|
|
26587
|
-
});
|
|
26588
|
-
}
|
|
26589
|
-
/**
|
|
26590
|
-
* Loads KaTeX CSS in browser environments that need to display math output.
|
|
26591
|
-
*
|
|
26592
|
-
* @private utility of `renderMarkdown`
|
|
26593
|
-
*/
|
|
26594
|
-
function registerKatexStylesheet(html) {
|
|
26595
|
-
if (typeof window === 'undefined') {
|
|
26596
|
-
return;
|
|
26597
|
-
}
|
|
26598
|
-
if (!html.match(/class="katex/)) {
|
|
26599
|
-
return;
|
|
26600
|
-
}
|
|
26601
|
-
if (window.document.getElementById(KATEX_STYLESHEET_ID)) {
|
|
26602
|
-
return;
|
|
26603
|
-
}
|
|
26604
|
-
const link = window.document.createElement('link');
|
|
26605
|
-
link.id = KATEX_STYLESHEET_ID;
|
|
26606
|
-
link.rel = 'stylesheet';
|
|
26607
|
-
link.href = KATEX_STYLESHEET_URL;
|
|
26608
|
-
window.document.head.appendChild(link);
|
|
26609
|
-
}
|
|
26610
|
-
/**
|
|
26611
|
-
* Convert markdown content to HTML.
|
|
26612
|
-
*
|
|
26613
|
-
* @param markdown - The markdown content to convert.
|
|
26614
|
-
* @returns HTML string ready for rendering.
|
|
26615
|
-
*
|
|
26616
|
-
* @private internal utility of chat components and exports
|
|
26617
|
-
*/
|
|
26618
|
-
function renderMarkdown(markdown, options) {
|
|
26619
|
-
if (!markdown || typeof markdown !== 'string') {
|
|
26620
|
-
return '';
|
|
26621
|
-
}
|
|
26622
|
-
const converter = options ? createChatMarkdownConverter(options) : CHAT_MARKDOWN_CONVERTER;
|
|
26623
|
-
try {
|
|
26624
|
-
const normalizedMarkdown = normalizeMarkdownSublists(markdown);
|
|
26625
|
-
const { masked: maskedMarkdown, restore: restoreDetails } = maskDetailsBlocks(normalizedMarkdown);
|
|
26626
|
-
const processedMarkdown = renderMathInMarkdown(maskedMarkdown);
|
|
26627
|
-
const html = converter.makeHtml(processedMarkdown);
|
|
26628
|
-
registerKatexStylesheet(html);
|
|
26629
|
-
const restoredHtml = restoreDetails(html);
|
|
26630
|
-
const sanitizedHtml = restoredHtml
|
|
26631
|
-
.replace(/<\s*(script|style|iframe|object|embed)[^>]*>[\s\S]*?<\s*\/\s*\1\s*>/gi, '')
|
|
26632
|
-
.replace(/\s+on\w+="[^"]*"/gi, '')
|
|
26633
|
-
.replace(/\s+javascript:/gi, '')
|
|
26634
|
-
.replace(/\s+data:/gi, '')
|
|
26635
|
-
.replace(/\s+vbscript:/gi, '');
|
|
26636
|
-
return sanitizedHtml;
|
|
26637
|
-
}
|
|
26638
|
-
catch (error) {
|
|
26639
|
-
console.error('Error rendering markdown:', error);
|
|
26640
|
-
return escapeHtml$2(markdown);
|
|
26641
|
-
}
|
|
26642
|
-
}
|
|
26643
|
-
|
|
26644
26584
|
/**
|
|
26645
26585
|
* Parses OpenAI Assistant-style citations from message content
|
|
26646
26586
|
* Matches both:
|