@blinkk/root-cms 1.0.0-rc.14 → 1.0.0-rc.16
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/dist/richtext.d.ts +73 -0
- package/dist/richtext.js +129 -0
- package/dist/ui/ui.js +22 -6
- package/package.json +7 -3
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as preact from 'preact';
|
|
2
|
+
import { FunctionalComponent } from 'preact';
|
|
3
|
+
|
|
4
|
+
interface RichTextBlock {
|
|
5
|
+
type: string;
|
|
6
|
+
data?: any;
|
|
7
|
+
}
|
|
8
|
+
interface RichTextData {
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
blocks: any[];
|
|
11
|
+
}
|
|
12
|
+
type RichTextBlockComponent = FunctionalComponent<any>;
|
|
13
|
+
interface RichTextContextProps {
|
|
14
|
+
components?: Record<string, RichTextBlockComponent>;
|
|
15
|
+
}
|
|
16
|
+
declare const RichTextContext: preact.Context<RichTextContextProps>;
|
|
17
|
+
declare function useRichTextContext(): RichTextContextProps;
|
|
18
|
+
interface RichTextProps {
|
|
19
|
+
data: RichTextData;
|
|
20
|
+
components?: Record<string, RichTextBlockComponent>;
|
|
21
|
+
}
|
|
22
|
+
/** Renders data from the "richtext" field. */
|
|
23
|
+
declare function RichText(props: RichTextProps): preact.JSX.Element;
|
|
24
|
+
declare namespace RichText {
|
|
25
|
+
var ParagraphBlock: (props: RichTextParagraphBlockProps) => preact.JSX.Element | null;
|
|
26
|
+
var HeadingBlock: (props: RichTextHeadingBlockProps) => preact.JSX.Element | null;
|
|
27
|
+
var ListBlock: (props: RichTextListBlockProps) => preact.JSX.Element | null;
|
|
28
|
+
var ImageBlock: (props: RichTextImageBlockProps) => preact.JSX.Element | null;
|
|
29
|
+
var HtmlBlock: (props: RichTextHtmlBlockProps) => preact.JSX.Element | null;
|
|
30
|
+
}
|
|
31
|
+
interface RichTextParagraphBlockProps {
|
|
32
|
+
type: 'paragraph';
|
|
33
|
+
data?: {
|
|
34
|
+
text?: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
interface RichTextHeadingBlockProps {
|
|
38
|
+
type: 'heading';
|
|
39
|
+
data?: {
|
|
40
|
+
level?: number;
|
|
41
|
+
text?: string;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
interface ListItem {
|
|
45
|
+
content?: string;
|
|
46
|
+
items?: ListItem[];
|
|
47
|
+
}
|
|
48
|
+
interface RichTextListBlockProps {
|
|
49
|
+
type: 'orderedList' | 'unorderedList';
|
|
50
|
+
data?: {
|
|
51
|
+
style?: 'ordered' | 'unordered';
|
|
52
|
+
items?: ListItem[];
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
interface RichTextImageBlockProps {
|
|
56
|
+
type: 'image';
|
|
57
|
+
data?: {
|
|
58
|
+
file?: {
|
|
59
|
+
url: string;
|
|
60
|
+
width: string | number;
|
|
61
|
+
height: string | number;
|
|
62
|
+
alt: string;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
interface RichTextHtmlBlockProps {
|
|
67
|
+
type: 'html';
|
|
68
|
+
data?: {
|
|
69
|
+
html?: string;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { RichText, type RichTextBlock, type RichTextBlockComponent, RichTextContext, type RichTextContextProps, type RichTextData, type RichTextHeadingBlockProps, type RichTextHtmlBlockProps, type RichTextImageBlockProps, type RichTextListBlockProps, type RichTextParagraphBlockProps, type RichTextProps, useRichTextContext };
|
package/dist/richtext.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// core/richtext.tsx
|
|
2
|
+
import { useTranslations } from "@blinkk/root";
|
|
3
|
+
import { createContext } from "preact";
|
|
4
|
+
import { useContext } from "preact/hooks";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
|
|
6
|
+
var RichTextContext = createContext({});
|
|
7
|
+
function useRichTextContext() {
|
|
8
|
+
return useContext(RichTextContext);
|
|
9
|
+
}
|
|
10
|
+
function RichText(props) {
|
|
11
|
+
var _a;
|
|
12
|
+
const richTextContext = useRichTextContext();
|
|
13
|
+
const components = {
|
|
14
|
+
heading: RichText.HeadingBlock,
|
|
15
|
+
html: RichText.HtmlBlock,
|
|
16
|
+
image: RichText.ImageBlock,
|
|
17
|
+
orderedList: RichText.ListBlock,
|
|
18
|
+
paragraph: RichText.ParagraphBlock,
|
|
19
|
+
unorderedList: RichText.ListBlock,
|
|
20
|
+
...richTextContext.components,
|
|
21
|
+
...props.components
|
|
22
|
+
};
|
|
23
|
+
const blocks = (((_a = props.data) == null ? void 0 : _a.blocks) || []).filter((block) => {
|
|
24
|
+
const blockType = block == null ? void 0 : block.type;
|
|
25
|
+
if (!blockType) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
if (!(blockType in components)) {
|
|
29
|
+
console.warn(`ignoring unknown richtext type: "${blockType}"`);
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
});
|
|
34
|
+
return /* @__PURE__ */ jsx(Fragment, { children: blocks.map((block) => {
|
|
35
|
+
const Block = components[block.type];
|
|
36
|
+
return /* @__PURE__ */ jsx(Block, { ...block });
|
|
37
|
+
}) });
|
|
38
|
+
}
|
|
39
|
+
RichText.ParagraphBlock = (props) => {
|
|
40
|
+
var _a;
|
|
41
|
+
if (!((_a = props.data) == null ? void 0 : _a.text)) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const t = useTranslations();
|
|
45
|
+
return /* @__PURE__ */ jsx("p", { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
|
|
46
|
+
};
|
|
47
|
+
RichText.HeadingBlock = (props) => {
|
|
48
|
+
var _a;
|
|
49
|
+
if (!((_a = props.data) == null ? void 0 : _a.text)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const t = useTranslations();
|
|
53
|
+
const level = props.data.level || 2;
|
|
54
|
+
const Component = `h${level}`;
|
|
55
|
+
return /* @__PURE__ */ jsx(Component, { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
|
|
56
|
+
};
|
|
57
|
+
RichText.ListBlock = (props) => {
|
|
58
|
+
var _a, _b, _c;
|
|
59
|
+
if (!((_b = (_a = props.data) == null ? void 0 : _a.items) == null ? void 0 : _b.length)) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
let style = (_c = props.data) == null ? void 0 : _c.style;
|
|
63
|
+
if (!style) {
|
|
64
|
+
style = props.type === "orderedList" ? "ordered" : "unordered";
|
|
65
|
+
}
|
|
66
|
+
const Component = style === "ordered" ? "ol" : "ul";
|
|
67
|
+
const items = props.data.items;
|
|
68
|
+
const t = useTranslations();
|
|
69
|
+
return /* @__PURE__ */ jsx(Component, { children: items.map((item) => {
|
|
70
|
+
var _a2;
|
|
71
|
+
if (item.content || ((_a2 = item.items) == null ? void 0 : _a2.length)) {
|
|
72
|
+
return /* @__PURE__ */ jsxs("li", { children: [
|
|
73
|
+
item.content && /* @__PURE__ */ jsx(
|
|
74
|
+
RichText.ParagraphBlock,
|
|
75
|
+
{
|
|
76
|
+
type: "paragraph",
|
|
77
|
+
data: { text: item.content }
|
|
78
|
+
}
|
|
79
|
+
),
|
|
80
|
+
item.items && item.items.length > 0 && /* @__PURE__ */ jsx(
|
|
81
|
+
RichText.ListBlock,
|
|
82
|
+
{
|
|
83
|
+
type: props.type,
|
|
84
|
+
data: { style, items: item.items }
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
] });
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}) });
|
|
91
|
+
};
|
|
92
|
+
RichText.ImageBlock = (props) => {
|
|
93
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
94
|
+
const imageUrl = (_b = (_a = props.data) == null ? void 0 : _a.file) == null ? void 0 : _b.url;
|
|
95
|
+
if (!imageUrl) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const width = toNumber((_d = (_c = props.data) == null ? void 0 : _c.file) == null ? void 0 : _d.width);
|
|
99
|
+
const height = toNumber((_f = (_e = props.data) == null ? void 0 : _e.file) == null ? void 0 : _f.height);
|
|
100
|
+
const alt = ((_h = (_g = props.data) == null ? void 0 : _g.file) == null ? void 0 : _h.alt) || "";
|
|
101
|
+
return /* @__PURE__ */ jsx("img", { src: imageUrl, width, height, alt });
|
|
102
|
+
};
|
|
103
|
+
RichText.HtmlBlock = (props) => {
|
|
104
|
+
var _a;
|
|
105
|
+
const html = ((_a = props.data) == null ? void 0 : _a.html) || "";
|
|
106
|
+
if (!html) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
return /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: html } });
|
|
110
|
+
};
|
|
111
|
+
function toNumber(input) {
|
|
112
|
+
if (input === void 0) {
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
if (typeof input === "number") {
|
|
116
|
+
return input;
|
|
117
|
+
}
|
|
118
|
+
const parsedNumber = parseFloat(input);
|
|
119
|
+
if (isNaN(parsedNumber)) {
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
return parsedNumber;
|
|
123
|
+
}
|
|
124
|
+
export {
|
|
125
|
+
RichText,
|
|
126
|
+
RichTextContext,
|
|
127
|
+
useRichTextContext
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9yaWNodGV4dC50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7dXNlVHJhbnNsYXRpb25zfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtGdW5jdGlvbmFsQ29tcG9uZW50LCBjcmVhdGVDb250ZXh0fSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHt1c2VDb250ZXh0fSBmcm9tICdwcmVhY3QvaG9va3MnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0QmxvY2sge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHREYXRhIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBibG9ja3M6IGFueVtdO1xufVxuXG5leHBvcnQgdHlwZSBSaWNoVGV4dEJsb2NrQ29tcG9uZW50ID0gRnVuY3Rpb25hbENvbXBvbmVudDxhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0Q29udGV4dFByb3BzIHtcbiAgY29tcG9uZW50cz86IFJlY29yZDxzdHJpbmcsIFJpY2hUZXh0QmxvY2tDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgY29uc3QgUmljaFRleHRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxSaWNoVGV4dENvbnRleHRQcm9wcz4oe30pO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmljaFRleHRDb250ZXh0KCk6IFJpY2hUZXh0Q29udGV4dFByb3BzIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoUmljaFRleHRDb250ZXh0KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFByb3BzIHtcbiAgZGF0YTogUmljaFRleHREYXRhO1xuICBjb21wb25lbnRzPzogUmVjb3JkPHN0cmluZywgUmljaFRleHRCbG9ja0NvbXBvbmVudD47XG59XG5cbi8qKiBSZW5kZXJzIGRhdGEgZnJvbSB0aGUgXCJyaWNodGV4dFwiIGZpZWxkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJpY2hUZXh0KHByb3BzOiBSaWNoVGV4dFByb3BzKSB7XG4gIGNvbnN0IHJpY2hUZXh0Q29udGV4dCA9IHVzZVJpY2hUZXh0Q29udGV4dCgpO1xuICBjb25zdCBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBSaWNoVGV4dEJsb2NrQ29tcG9uZW50PiA9IHtcbiAgICBoZWFkaW5nOiBSaWNoVGV4dC5IZWFkaW5nQmxvY2ssXG4gICAgaHRtbDogUmljaFRleHQuSHRtbEJsb2NrLFxuICAgIGltYWdlOiBSaWNoVGV4dC5JbWFnZUJsb2NrLFxuICAgIG9yZGVyZWRMaXN0OiBSaWNoVGV4dC5MaXN0QmxvY2ssXG4gICAgcGFyYWdyYXBoOiBSaWNoVGV4dC5QYXJhZ3JhcGhCbG9jayxcbiAgICB1bm9yZGVyZWRMaXN0OiBSaWNoVGV4dC5MaXN0QmxvY2ssXG4gICAgLi4ucmljaFRleHRDb250ZXh0LmNvbXBvbmVudHMsXG4gICAgLi4ucHJvcHMuY29tcG9uZW50cyxcbiAgfTtcbiAgY29uc3QgYmxvY2tzID0gKHByb3BzLmRhdGE/LmJsb2NrcyB8fCBbXSkuZmlsdGVyKChibG9jaykgPT4ge1xuICAgIGNvbnN0IGJsb2NrVHlwZSA9IGJsb2NrPy50eXBlO1xuICAgIGlmICghYmxvY2tUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghKGJsb2NrVHlwZSBpbiBjb21wb25lbnRzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBpZ25vcmluZyB1bmtub3duIHJpY2h0ZXh0IHR5cGU6IFwiJHtibG9ja1R5cGV9XCJgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7YmxvY2tzLm1hcCgoYmxvY2spID0+IHtcbiAgICAgICAgY29uc3QgQmxvY2sgPSBjb21wb25lbnRzW2Jsb2NrLnR5cGVdO1xuICAgICAgICByZXR1cm4gPEJsb2NrIHsuLi5ibG9ja30gLz47XG4gICAgICB9KX1cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFBhcmFncmFwaEJsb2NrUHJvcHMge1xuICB0eXBlOiAncGFyYWdyYXBoJztcbiAgZGF0YT86IHtcbiAgICB0ZXh0Pzogc3RyaW5nO1xuICB9O1xufVxuXG5SaWNoVGV4dC5QYXJhZ3JhcGhCbG9jayA9IChwcm9wczogUmljaFRleHRQYXJhZ3JhcGhCbG9ja1Byb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuZGF0YT8udGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHQgPSB1c2VUcmFuc2xhdGlvbnMoKTtcbiAgcmV0dXJuIDxwIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiB0KHByb3BzLmRhdGEudGV4dCl9fSAvPjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRIZWFkaW5nQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdoZWFkaW5nJztcbiAgZGF0YT86IHtcbiAgICBsZXZlbD86IG51bWJlcjtcbiAgICB0ZXh0Pzogc3RyaW5nO1xuICB9O1xufVxuXG50eXBlIEhlYWRpbmdDb21wb25lbnQgPSAnaDEnIHwgJ2gyJyB8ICdoMycgfCAnaDQnIHwgJ2g1JyB8ICdoNic7XG5cblJpY2hUZXh0LkhlYWRpbmdCbG9jayA9IChwcm9wczogUmljaFRleHRIZWFkaW5nQmxvY2tQcm9wcykgPT4ge1xuICBpZiAoIXByb3BzLmRhdGE/LnRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB0ID0gdXNlVHJhbnNsYXRpb25zKCk7XG4gIGNvbnN0IGxldmVsID0gcHJvcHMuZGF0YS5sZXZlbCB8fCAyO1xuICBjb25zdCBDb21wb25lbnQgPSBgaCR7bGV2ZWx9YCBhcyBIZWFkaW5nQ29tcG9uZW50O1xuICByZXR1cm4gPENvbXBvbmVudCBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogdChwcm9wcy5kYXRhLnRleHQpfX0gLz47XG59O1xuXG5pbnRlcmZhY2UgTGlzdEl0ZW0ge1xuICBjb250ZW50Pzogc3RyaW5nO1xuICBpdGVtcz86IExpc3RJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRMaXN0QmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdvcmRlcmVkTGlzdCcgfCAndW5vcmRlcmVkTGlzdCc7XG4gIGRhdGE/OiB7XG4gICAgc3R5bGU/OiAnb3JkZXJlZCcgfCAndW5vcmRlcmVkJztcbiAgICBpdGVtcz86IExpc3RJdGVtW107XG4gIH07XG59XG5cblJpY2hUZXh0Lkxpc3RCbG9jayA9IChwcm9wczogUmljaFRleHRMaXN0QmxvY2tQcm9wcykgPT4ge1xuICBpZiAoIXByb3BzLmRhdGE/Lml0ZW1zPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBzdHlsZSA9IHByb3BzLmRhdGE/LnN0eWxlO1xuICBpZiAoIXN0eWxlKSB7XG4gICAgc3R5bGUgPSBwcm9wcy50eXBlID09PSAnb3JkZXJlZExpc3QnID8gJ29yZGVyZWQnIDogJ3Vub3JkZXJlZCc7XG4gIH1cbiAgY29uc3QgQ29tcG9uZW50ID0gc3R5bGUgPT09ICdvcmRlcmVkJyA/ICdvbCcgOiAndWwnO1xuICBjb25zdCBpdGVtcyA9IHByb3BzLmRhdGEuaXRlbXM7XG4gIGNvbnN0IHQgPSB1c2VUcmFuc2xhdGlvbnMoKTtcbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50PlxuICAgICAge2l0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5jb250ZW50IHx8IGl0ZW0uaXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIHtpdGVtLmNvbnRlbnQgJiYgKFxuICAgICAgICAgICAgICAgIDxSaWNoVGV4dC5QYXJhZ3JhcGhCbG9ja1xuICAgICAgICAgICAgICAgICAgdHlwZT1cInBhcmFncmFwaFwiXG4gICAgICAgICAgICAgICAgICBkYXRhPXt7dGV4dDogaXRlbS5jb250ZW50fX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7aXRlbS5pdGVtcyAmJiBpdGVtLml0ZW1zLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxSaWNoVGV4dC5MaXN0QmxvY2tcbiAgICAgICAgICAgICAgICAgIHR5cGU9e3Byb3BzLnR5cGV9XG4gICAgICAgICAgICAgICAgICBkYXRhPXt7c3R5bGUsIGl0ZW1zOiBpdGVtLml0ZW1zfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSl9XG4gICAgPC9Db21wb25lbnQ+XG4gICk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0SW1hZ2VCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ2ltYWdlJztcbiAgZGF0YT86IHtcbiAgICBmaWxlPzoge1xuICAgICAgdXJsOiBzdHJpbmc7XG4gICAgICB3aWR0aDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaGVpZ2h0OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBhbHQ6IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG5SaWNoVGV4dC5JbWFnZUJsb2NrID0gKHByb3BzOiBSaWNoVGV4dEltYWdlQmxvY2tQcm9wcykgPT4ge1xuICBjb25zdCBpbWFnZVVybCA9IHByb3BzLmRhdGE/LmZpbGU/LnVybDtcbiAgaWYgKCFpbWFnZVVybCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHdpZHRoID0gdG9OdW1iZXIocHJvcHMuZGF0YT8uZmlsZT8ud2lkdGgpO1xuICBjb25zdCBoZWlnaHQgPSB0b051bWJlcihwcm9wcy5kYXRhPy5maWxlPy5oZWlnaHQpO1xuICBjb25zdCBhbHQgPSBwcm9wcy5kYXRhPy5maWxlPy5hbHQgfHwgJyc7XG4gIHJldHVybiA8aW1nIHNyYz17aW1hZ2VVcmx9IHdpZHRoPXt3aWR0aH0gaGVpZ2h0PXtoZWlnaHR9IGFsdD17YWx0fSAvPjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRIdG1sQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdodG1sJztcbiAgZGF0YT86IHtcbiAgICBodG1sPzogc3RyaW5nO1xuICB9O1xufVxuXG5SaWNoVGV4dC5IdG1sQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0SHRtbEJsb2NrUHJvcHMpID0+IHtcbiAgY29uc3QgaHRtbCA9IHByb3BzLmRhdGE/Lmh0bWwgfHwgJyc7XG4gIGlmICghaHRtbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiA8ZGl2IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBodG1sfX0gLz47XG59O1xuXG5mdW5jdGlvbiB0b051bWJlcihpbnB1dD86IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgY29uc3QgcGFyc2VkTnVtYmVyID0gcGFyc2VGbG9hdChpbnB1dCk7XG4gIGlmIChpc05hTihwYXJzZWROdW1iZXIpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZE51bWJlcjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFRLHVCQUFzQjtBQUM5QixTQUE2QixxQkFBb0I7QUFDakQsU0FBUSxrQkFBaUI7QUFzRHJCLG1CQUdXLEtBdUVILFlBMUVSO0FBcENHLElBQU0sa0JBQWtCLGNBQW9DLENBQUMsQ0FBQztBQUU5RCxTQUFTLHFCQUEyQztBQUN6RCxTQUFPLFdBQVcsZUFBZTtBQUNuQztBQVFPLFNBQVMsU0FBUyxPQUFzQjtBQWhDL0M7QUFpQ0UsUUFBTSxrQkFBa0IsbUJBQW1CO0FB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
|