@blinkk/root-cms 1.0.0-rc.12 → 1.0.0-rc.14
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/{core/core.d.ts → core.d.ts} +1 -1
- package/dist/{core/project.d.ts → project.d.ts} +1 -1
- package/dist/ui/ui.js +3 -7
- package/package.json +3 -7
- package/dist/richtext/richtext.d.ts +0 -65
- package/dist/richtext.js +0 -119
- /package/dist/{core/client.d.ts → client.d.ts} +0 -0
- /package/dist/{core/functions.d.ts → functions.d.ts} +0 -0
- /package/dist/{core/plugin.d.ts → plugin.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blinkk/root-cms",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.14",
|
|
4
4
|
"author": "s@blinkk.com",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"engines": {
|
|
@@ -44,10 +44,6 @@
|
|
|
44
44
|
"./project": {
|
|
45
45
|
"types": "./dist/project.d.ts",
|
|
46
46
|
"import": "./dist/project.js"
|
|
47
|
-
},
|
|
48
|
-
"./richtext": {
|
|
49
|
-
"types": "./dist/richtext.d.ts",
|
|
50
|
-
"import": "./dist/richtext.js"
|
|
51
47
|
}
|
|
52
48
|
},
|
|
53
49
|
"dependencies": {
|
|
@@ -101,10 +97,10 @@
|
|
|
101
97
|
"typescript": "5.2.2",
|
|
102
98
|
"vite": "5.0.8",
|
|
103
99
|
"vitest": "^0.34.6",
|
|
104
|
-
"@blinkk/root": "1.0.0-rc.
|
|
100
|
+
"@blinkk/root": "1.0.0-rc.14"
|
|
105
101
|
},
|
|
106
102
|
"peerDependencies": {
|
|
107
|
-
"@blinkk/root": "1.0.0-rc.
|
|
103
|
+
"@blinkk/root": "1.0.0-rc.14",
|
|
108
104
|
"firebase-admin": ">=11",
|
|
109
105
|
"firebase-functions": ">=4",
|
|
110
106
|
"preact": ">=10",
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import * as preact from 'preact';
|
|
2
|
-
import { FunctionalComponent } from 'preact';
|
|
3
|
-
|
|
4
|
-
interface RichTextData {
|
|
5
|
-
[key: string]: any;
|
|
6
|
-
blocks: any[];
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
type RichTextBlockComponent = FunctionalComponent<any>;
|
|
10
|
-
interface RichTextProps {
|
|
11
|
-
data: RichTextData;
|
|
12
|
-
components?: Record<string, RichTextBlockComponent>;
|
|
13
|
-
}
|
|
14
|
-
/** Renders data from the "richtext" field. */
|
|
15
|
-
declare function RichText(props: RichTextProps): preact.JSX.Element;
|
|
16
|
-
declare namespace RichText {
|
|
17
|
-
var ParagraphBlock: (props: RichTextParagraphBlockProps) => preact.JSX.Element | null;
|
|
18
|
-
var HeadingBlock: (props: RichTextHeadingBlockProps) => preact.JSX.Element | null;
|
|
19
|
-
var ListBlock: (props: RichTextListBlockProps) => preact.JSX.Element | null;
|
|
20
|
-
var ImageBlock: (props: RichTextImageBlockProps) => preact.JSX.Element | null;
|
|
21
|
-
var HtmlBlock: (props: RichTextHtmlBlockProps) => preact.JSX.Element | null;
|
|
22
|
-
}
|
|
23
|
-
interface RichTextParagraphBlockProps {
|
|
24
|
-
type: 'paragraph';
|
|
25
|
-
data?: {
|
|
26
|
-
text?: string;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
interface RichTextHeadingBlockProps {
|
|
30
|
-
type: 'heading';
|
|
31
|
-
data?: {
|
|
32
|
-
level?: number;
|
|
33
|
-
text?: string;
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
interface ListItem {
|
|
37
|
-
content?: string;
|
|
38
|
-
items?: ListItem[];
|
|
39
|
-
}
|
|
40
|
-
interface RichTextListBlockProps {
|
|
41
|
-
type: 'orderedList' | 'unorderedList';
|
|
42
|
-
data?: {
|
|
43
|
-
style?: 'ordered' | 'unordered';
|
|
44
|
-
items?: ListItem[];
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
interface RichTextImageBlockProps {
|
|
48
|
-
type: 'image';
|
|
49
|
-
data?: {
|
|
50
|
-
file?: {
|
|
51
|
-
url: string;
|
|
52
|
-
width: string | number;
|
|
53
|
-
height: string | number;
|
|
54
|
-
alt: string;
|
|
55
|
-
};
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
interface RichTextHtmlBlockProps {
|
|
59
|
-
type: 'html';
|
|
60
|
-
data?: {
|
|
61
|
-
html?: string;
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export { RichText, type RichTextBlockComponent, type RichTextHeadingBlockProps, type RichTextHtmlBlockProps, type RichTextImageBlockProps, type RichTextListBlockProps, type RichTextParagraphBlockProps, type RichTextProps };
|
package/dist/richtext.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
// richtext/richtext.tsx
|
|
2
|
-
import { useTranslations } from "@blinkk/root";
|
|
3
|
-
import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
|
|
4
|
-
function RichText(props) {
|
|
5
|
-
var _a;
|
|
6
|
-
const components = {
|
|
7
|
-
heading: RichText.HeadingBlock,
|
|
8
|
-
html: RichText.HtmlBlock,
|
|
9
|
-
image: RichText.ImageBlock,
|
|
10
|
-
orderedList: RichText.ListBlock,
|
|
11
|
-
paragraph: RichText.ParagraphBlock,
|
|
12
|
-
unorderedList: RichText.ListBlock,
|
|
13
|
-
...props.components
|
|
14
|
-
};
|
|
15
|
-
const blocks = (((_a = props.data) == null ? void 0 : _a.blocks) || []).filter((block) => {
|
|
16
|
-
const blockType = block == null ? void 0 : block.type;
|
|
17
|
-
if (!blockType) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
if (!(blockType in components)) {
|
|
21
|
-
console.warn(`ignoring unknown richtext type: "${blockType}"`);
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
return true;
|
|
25
|
-
});
|
|
26
|
-
return /* @__PURE__ */ jsx(Fragment, { children: blocks.map((block) => {
|
|
27
|
-
const Block = components[block.type];
|
|
28
|
-
return /* @__PURE__ */ jsx(Block, { ...block });
|
|
29
|
-
}) });
|
|
30
|
-
}
|
|
31
|
-
RichText.ParagraphBlock = (props) => {
|
|
32
|
-
var _a;
|
|
33
|
-
if (!((_a = props.data) == null ? void 0 : _a.text)) {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
const t = useTranslations();
|
|
37
|
-
return /* @__PURE__ */ jsx("p", { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
|
|
38
|
-
};
|
|
39
|
-
RichText.HeadingBlock = (props) => {
|
|
40
|
-
var _a;
|
|
41
|
-
if (!((_a = props.data) == null ? void 0 : _a.text)) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
const t = useTranslations();
|
|
45
|
-
const level = props.data.level || 2;
|
|
46
|
-
const Component = `h${level}`;
|
|
47
|
-
return /* @__PURE__ */ jsx(Component, { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
|
|
48
|
-
};
|
|
49
|
-
RichText.ListBlock = (props) => {
|
|
50
|
-
var _a, _b, _c;
|
|
51
|
-
if (!((_b = (_a = props.data) == null ? void 0 : _a.items) == null ? void 0 : _b.length)) {
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
let style = (_c = props.data) == null ? void 0 : _c.style;
|
|
55
|
-
if (!style) {
|
|
56
|
-
style = props.type === "orderedList" ? "ordered" : "unordered";
|
|
57
|
-
}
|
|
58
|
-
const Component = style === "ordered" ? "ol" : "ul";
|
|
59
|
-
const items = props.data.items;
|
|
60
|
-
const t = useTranslations();
|
|
61
|
-
return /* @__PURE__ */ jsx(Component, { children: items.map((item) => {
|
|
62
|
-
var _a2;
|
|
63
|
-
if (item.content || ((_a2 = item.items) == null ? void 0 : _a2.length)) {
|
|
64
|
-
return /* @__PURE__ */ jsxs("li", { children: [
|
|
65
|
-
item.content && /* @__PURE__ */ jsx(
|
|
66
|
-
RichText.ParagraphBlock,
|
|
67
|
-
{
|
|
68
|
-
type: "paragraph",
|
|
69
|
-
data: { text: item.content }
|
|
70
|
-
}
|
|
71
|
-
),
|
|
72
|
-
item.items && item.items.length > 0 && /* @__PURE__ */ jsx(
|
|
73
|
-
RichText.ListBlock,
|
|
74
|
-
{
|
|
75
|
-
type: props.type,
|
|
76
|
-
data: { style, items: item.items }
|
|
77
|
-
}
|
|
78
|
-
)
|
|
79
|
-
] });
|
|
80
|
-
}
|
|
81
|
-
return null;
|
|
82
|
-
}) });
|
|
83
|
-
};
|
|
84
|
-
RichText.ImageBlock = (props) => {
|
|
85
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
86
|
-
const imageUrl = (_b = (_a = props.data) == null ? void 0 : _a.file) == null ? void 0 : _b.url;
|
|
87
|
-
if (!imageUrl) {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
const width = toNumber((_d = (_c = props.data) == null ? void 0 : _c.file) == null ? void 0 : _d.width);
|
|
91
|
-
const height = toNumber((_f = (_e = props.data) == null ? void 0 : _e.file) == null ? void 0 : _f.height);
|
|
92
|
-
const alt = ((_h = (_g = props.data) == null ? void 0 : _g.file) == null ? void 0 : _h.alt) || "";
|
|
93
|
-
return /* @__PURE__ */ jsx("img", { src: imageUrl, width, height, alt });
|
|
94
|
-
};
|
|
95
|
-
RichText.HtmlBlock = (props) => {
|
|
96
|
-
var _a;
|
|
97
|
-
const html = ((_a = props.data) == null ? void 0 : _a.html) || "";
|
|
98
|
-
if (!html) {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
return /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: html } });
|
|
102
|
-
};
|
|
103
|
-
function toNumber(input) {
|
|
104
|
-
if (input === void 0) {
|
|
105
|
-
return 0;
|
|
106
|
-
}
|
|
107
|
-
if (typeof input === "number") {
|
|
108
|
-
return input;
|
|
109
|
-
}
|
|
110
|
-
const parsedNumber = parseFloat(input);
|
|
111
|
-
if (isNaN(parsedNumber)) {
|
|
112
|
-
return 0;
|
|
113
|
-
}
|
|
114
|
-
return parsedNumber;
|
|
115
|
-
}
|
|
116
|
-
export {
|
|
117
|
-
RichText
|
|
118
|
-
};
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vcmljaHRleHQvcmljaHRleHQudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge3VzZVRyYW5zbGF0aW9uc30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7RnVuY3Rpb25hbENvbXBvbmVudH0gZnJvbSAncHJlYWN0JztcbmltcG9ydCB7UmljaFRleHREYXRhfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgUmljaFRleHRCbG9ja0NvbXBvbmVudCA9IEZ1bmN0aW9uYWxDb21wb25lbnQ8YW55PjtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFByb3BzIHtcbiAgZGF0YTogUmljaFRleHREYXRhO1xuICBjb21wb25lbnRzPzogUmVjb3JkPHN0cmluZywgUmljaFRleHRCbG9ja0NvbXBvbmVudD47XG59XG5cbi8qKiBSZW5kZXJzIGRhdGEgZnJvbSB0aGUgXCJyaWNodGV4dFwiIGZpZWxkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJpY2hUZXh0KHByb3BzOiBSaWNoVGV4dFByb3BzKSB7XG4gIGNvbnN0IGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIFJpY2hUZXh0QmxvY2tDb21wb25lbnQ+ID0ge1xuICAgIGhlYWRpbmc6IFJpY2hUZXh0LkhlYWRpbmdCbG9jayxcbiAgICBodG1sOiBSaWNoVGV4dC5IdG1sQmxvY2ssXG4gICAgaW1hZ2U6IFJpY2hUZXh0LkltYWdlQmxvY2ssXG4gICAgb3JkZXJlZExpc3Q6IFJpY2hUZXh0Lkxpc3RCbG9jayxcbiAgICBwYXJhZ3JhcGg6IFJpY2hUZXh0LlBhcmFncmFwaEJsb2NrLFxuICAgIHVub3JkZXJlZExpc3Q6IFJpY2hUZXh0Lkxpc3RCbG9jayxcbiAgICAuLi5wcm9wcy5jb21wb25lbnRzLFxuICB9O1xuICBjb25zdCBibG9ja3MgPSAocHJvcHMuZGF0YT8uYmxvY2tzIHx8IFtdKS5maWx0ZXIoKGJsb2NrKSA9PiB7XG4gICAgY29uc3QgYmxvY2tUeXBlID0gYmxvY2s/LnR5cGU7XG4gICAgaWYgKCFibG9ja1R5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCEoYmxvY2tUeXBlIGluIGNvbXBvbmVudHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYGlnbm9yaW5nIHVua25vd24gcmljaHRleHQgdHlwZTogXCIke2Jsb2NrVHlwZX1cImApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHtibG9ja3MubWFwKChibG9jaykgPT4ge1xuICAgICAgICBjb25zdCBCbG9jayA9IGNvbXBvbmVudHNbYmxvY2sudHlwZV07XG4gICAgICAgIHJldHVybiA8QmxvY2sgey4uLmJsb2NrfSAvPjtcbiAgICAgIH0pfVxuICAgIDwvPlxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0UGFyYWdyYXBoQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdwYXJhZ3JhcGgnO1xuICBkYXRhPzoge1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gIH07XG59XG5cblJpY2hUZXh0LlBhcmFncmFwaEJsb2NrID0gKHByb3BzOiBSaWNoVGV4dFBhcmFncmFwaEJsb2NrUHJvcHMpID0+IHtcbiAgaWYgKCFwcm9wcy5kYXRhPy50ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgdCA9IHVzZVRyYW5zbGF0aW9ucygpO1xuICByZXR1cm4gPHAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IHQocHJvcHMuZGF0YS50ZXh0KX19IC8+O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEhlYWRpbmdCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ2hlYWRpbmcnO1xuICBkYXRhPzoge1xuICAgIGxldmVsPzogbnVtYmVyO1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbnR5cGUgSGVhZGluZ0NvbXBvbmVudCA9ICdoMScgfCAnaDInIHwgJ2gzJyB8ICdoNCcgfCAnaDUnIHwgJ2g2JztcblxuUmljaFRleHQuSGVhZGluZ0Jsb2NrID0gKHByb3BzOiBSaWNoVGV4dEhlYWRpbmdCbG9ja1Byb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuZGF0YT8udGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHQgPSB1c2VUcmFuc2xhdGlvbnMoKTtcbiAgY29uc3QgbGV2ZWwgPSBwcm9wcy5kYXRhLmxldmVsIHx8IDI7XG4gIGNvbnN0IENvbXBvbmVudCA9IGBoJHtsZXZlbH1gIGFzIEhlYWRpbmdDb21wb25lbnQ7XG4gIHJldHVybiA8Q29tcG9uZW50IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiB0KHByb3BzLmRhdGEudGV4dCl9fSAvPjtcbn07XG5cbmludGVyZmFjZSBMaXN0SXRlbSB7XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG4gIGl0ZW1zPzogTGlzdEl0ZW1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dExpc3RCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ29yZGVyZWRMaXN0JyB8ICd1bm9yZGVyZWRMaXN0JztcbiAgZGF0YT86IHtcbiAgICBzdHlsZT86ICdvcmRlcmVkJyB8ICd1bm9yZGVyZWQnO1xuICAgIGl0ZW1zPzogTGlzdEl0ZW1bXTtcbiAgfTtcbn1cblxuUmljaFRleHQuTGlzdEJsb2NrID0gKHByb3BzOiBSaWNoVGV4dExpc3RCbG9ja1Byb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuZGF0YT8uaXRlbXM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IHN0eWxlID0gcHJvcHMuZGF0YT8uc3R5bGU7XG4gIGlmICghc3R5bGUpIHtcbiAgICBzdHlsZSA9IHByb3BzLnR5cGUgPT09ICdvcmRlcmVkTGlzdCcgPyAnb3JkZXJlZCcgOiAndW5vcmRlcmVkJztcbiAgfVxuICBjb25zdCBDb21wb25lbnQgPSBzdHlsZSA9PT0gJ29yZGVyZWQnID8gJ29sJyA6ICd1bCc7XG4gIGNvbnN0IGl0ZW1zID0gcHJvcHMuZGF0YS5pdGVtcztcbiAgY29uc3QgdCA9IHVzZVRyYW5zbGF0aW9ucygpO1xuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnQ+XG4gICAgICB7aXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmNvbnRlbnQgfHwgaXRlbS5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAge2l0ZW0uY29udGVudCAmJiAoXG4gICAgICAgICAgICAgICAgPFJpY2hUZXh0LlBhcmFncmFwaEJsb2NrXG4gICAgICAgICAgICAgICAgICB0eXBlPVwicGFyYWdyYXBoXCJcbiAgICAgICAgICAgICAgICAgIGRhdGE9e3t0ZXh0OiBpdGVtLmNvbnRlbnR9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIHtpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgPFJpY2hUZXh0Lkxpc3RCbG9ja1xuICAgICAgICAgICAgICAgICAgdHlwZT17cHJvcHMudHlwZX1cbiAgICAgICAgICAgICAgICAgIGRhdGE9e3tzdHlsZSwgaXRlbXM6IGl0ZW0uaXRlbXN9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KX1cbiAgICA8L0NvbXBvbmVudD5cbiAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRJbWFnZUJsb2NrUHJvcHMge1xuICB0eXBlOiAnaW1hZ2UnO1xuICBkYXRhPzoge1xuICAgIGZpbGU/OiB7XG4gICAgICB1cmw6IHN0cmluZztcbiAgICAgIHdpZHRoOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBoZWlnaHQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGFsdDogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cblJpY2hUZXh0LkltYWdlQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0SW1hZ2VCbG9ja1Byb3BzKSA9PiB7XG4gIGNvbnN0IGltYWdlVXJsID0gcHJvcHMuZGF0YT8uZmlsZT8udXJsO1xuICBpZiAoIWltYWdlVXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgd2lkdGggPSB0b051bWJlcihwcm9wcy5kYXRhPy5maWxlPy53aWR0aCk7XG4gIGNvbnN0IGhlaWdodCA9IHRvTnVtYmVyKHByb3BzLmRhdGE/LmZpbGU/LmhlaWdodCk7XG4gIGNvbnN0IGFsdCA9IHByb3BzLmRhdGE/LmZpbGU/LmFsdCB8fCAnJztcbiAgcmV0dXJuIDxpbWcgc3JjPXtpbWFnZVVybH0gd2lkdGg9e3dpZHRofSBoZWlnaHQ9e2hlaWdodH0gYWx0PXthbHR9IC8+O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEh0bWxCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ2h0bWwnO1xuICBkYXRhPzoge1xuICAgIGh0bWw/OiBzdHJpbmc7XG4gIH07XG59XG5cblJpY2hUZXh0Lkh0bWxCbG9jayA9IChwcm9wczogUmljaFRleHRIdG1sQmxvY2tQcm9wcykgPT4ge1xuICBjb25zdCBodG1sID0gcHJvcHMuZGF0YT8uaHRtbCB8fCAnJztcbiAgaWYgKCFodG1sKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIDxkaXYgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGh0bWx9fSAvPjtcbn07XG5cbmZ1bmN0aW9uIHRvTnVtYmVyKGlucHV0Pzogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICBjb25zdCBwYXJzZWROdW1iZXIgPSBwYXJzZUZsb2F0KGlucHV0KTtcbiAgaWYgKGlzTmFOKHBhcnNlZE51bWJlcikpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gcGFyc2VkTnVtYmVyO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVEsdUJBQXNCO0FBa0MxQixtQkFHVyxLQXVFSCxZQTFFUjtBQXRCRyxTQUFTLFNBQVMsT0FBc0I7QUFaL0M7QUFhRSxRQUFNLGFBQXFEO0FBQUEsSUFDekQsU0FBUyxTQUFTO0FBQUEsSUFDbEIsTUFBTSxTQUFTO0FBQUEsSUFDZixPQUFPLFNBQVM7QUFBQSxJQUNoQixhQUFhLFNBQVM7QUFBQSxJQUN0QixXQUFXLFNBQVM7QUFBQSxJQUNwQixlQUFlLFNBQVM7QUFBQSxJQUN4QixHQUFHLE1BQU07QUFBQSxFQUNYO0FBQ0EsUUFBTSxZQUFVLFdBQU0sU0FBTixtQkFBWSxXQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVTtBQUMxRCxVQUFNLFlBQVksK0JBQU87QUFDekIsUUFBSSxDQUFDLFdBQVc7QUFDZCxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksRUFBRSxhQUFhLGFBQWE7QUFDOUIsY0FBUSxLQUFLLG9DQUFvQyxTQUFTLEdBQUc7QUFDN0QsYUFBTztBQUFBLElBQ1Q7QUFDQSxXQUFPO0FBQUEsRUFDVCxDQUFDO0FBQ0QsU0FDRSxnQ0FDRyxpQkFBTyxJQUFJLENBQUMsVUFBVTtBQUNyQixVQUFNLFFBQVEsV0FBVyxNQUFNLElBQUk7QUFDbkMsV0FBTyxvQkFBQyxTQUFPLEdBQUcsT0FBTztBQUFBLEVBQzNCLENBQUMsR0FDSDtBQUVKO0FBU0EsU0FBUyxpQkFBaUIsQ0FBQyxVQUF1QztBQWxEbEU7QUFtREUsTUFBSSxHQUFDLFdBQU0sU0FBTixtQkFBWSxPQUFNO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxJQUFJLGdCQUFnQjtBQUMxQixTQUFPLG9CQUFDLE9BQUUseUJBQXlCLEVB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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|