Walrus blob · mainnet
On-chain registration not yet visible.
The aggregator served this blob, but we couldn't locate a matching BlobRegistered event in our scan window. It may not be certified yet, or live further back than we paged.
Lifecycle data is unavailable until the blob registration is visible on-chain.
import { c as I, y as ne, r as u, j as t, L as oe, S as _, a as P, D as ie, z as ce, M as le, X as de, U as he } from "./index-BxJBMEbD.js";
import { P as ge, E as F } from "./PDFButton-Dph8vywy.js";
import { l as W } from "./pdfjs-CtDR3jN7.js";
import { A as pe } from "./arrow-left-BR4petKy.js";
import { S as me } from "./square-Cmt-LKF-.js";
import { S as ue } from "./search-UKg-Pqbr.js";
import { T as xe } from "./trash-2-BqpvVE1K.js";
import { C as fe } from "./chevron-left-xb-95XeW.js";
import { C as ye } from "./chevron-right-DZRT6Wr8.js";
/**
* @license lucide-react v0.469.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/
const be = I("Droplets", [["path", { d: "M7 16.3c2.2 0 4-1.83 4-4.05 0-1.16-.57-2.26-1.71-3.19S7.29 6.75 7 5.3c-.29 1.45-1.14 2.84-2.29 3.76S3 11.1 3 12.25c0 2.22 1.8 4.05 4 4.05z", key: "1ptgy4" }], ["path", { d: "M12.56 6.6A10.97 10.97 0 0 0 14 3.02c.5 2.5 2 4.9 4 6.5s3 3.5 3 5.5a6.98 6.98 0 0 1-11.91 4.97", key: "1sl1rz" }]]);
/**
* @license lucide-react v0.469.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/
const we = I("Grid3x3", [["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }], ["path", { d: "M3 9h18", key: "1pudct" }], ["path", { d: "M3 15h18", key: "5xshup" }], ["path", { d: "M9 3v18", key: "fh3hqa" }], ["path", { d: "M15 3v18", key: "14nvp0" }]]);
/**
* @license lucide-react v0.469.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/
const ke = I("Undo2", [["path", { d: "M9 14 4 9l5-5", key: "102s5s" }], ["path", { d: "M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11", key: "f3b9sd" }]]), D = 3;
function H() {
try {
return crypto.randomUUID();
} catch {
}
return "mr_" + Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
}
async function ve(n) {
return n.type === "application/pdf" || n.name.toLowerCase().endsWith(".pdf") ? je(n) : Ne(n);
}
async function je(n) {
const l = await W(), a = new Uint8Array(await n.arrayBuffer()), r = await l.getDocument({ data: a }).promise, c = [];
for (let i = 1; i <= r.numPages; i++) {
const o = await r.getPage(i), p = o.getViewport({ scale: D }), d = document.createElement("canvas");
d.width = Math.ceil(p.width), d.height = Math.ceil(p.height);
const y = d.getContext("2d");
await o.render({ canvasContext: y, viewport: p }).promise, c.push({ canvas: d, width: d.width, height: d.height });
}
return { kind: "pdf", pages: c, fileName: n.name, pdfDoc: r };
}
async function Ne(n) {
const l = URL.createObjectURL(n);
try {
const a = await new Promise((c, i) => {
const o = new Image();
o.onload = () => c(o), o.onerror = () => i(new Error("\u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F")), o.src = l;
}), r = document.createElement("canvas");
return r.width = a.naturalWidth, r.height = a.naturalHeight, r.getContext("2d").drawImage(a, 0, 0), { kind: "image", pages: [{ canvas: r, width: r.width, height: r.height }], fileName: n.name };
} finally {
URL.revokeObjectURL(l);
}
}
function Me(n, l, a) {
const r = Math.round(a.x), c = Math.round(a.y), i = Math.round(a.w), o = Math.round(a.h);
if (i <= 0 || o <= 0) return;
if (a.type === "black" || a.type === "white") {
n.fillStyle = a.type === "black" ? "#000000" : "#ffffff", n.fillRect(r, c, i, o);
return;
}
if (a.type === "mosaic") {
const d = Math.max(4, Math.floor(Math.min(i, o) / 8)), y = Math.max(1, Math.floor(i / d)), f = Math.max(1, Math.floor(o / d)), m = document.createElement("canvas");
m.width = y, m.height = f;
const b = m.getContext("2d");
b.imageSmoothingEnabled = false, b.drawImage(l, r, c, i, o, 0, 0, y, f), n.imageSmoothingEnabled = false, n.drawImage(m, 0, 0, y, f, r, c, i, o), n.imageSmoothingEnabled = true;
return;
}
const p = document.createElement("canvas");
p.width = i, p.height = o, p.getContext("2d").drawImage(l, r, c, i, o, 0, 0, i, o), n.save(), n.filter = `blur(${Math.max(4, Math.floor(Math.min(i, o) / 12))}px)`, n.beginPath(), n.rect(r, c, i, o), n.clip(), n.drawImage(p, 0, 0, i, o, r, c, i, o), n.restore();
}
function U(n, l) {
const a = document.createElement("canvas");
a.width = n.width, a.height = n.height;
const r = a.getContext("2d");
r.drawImage(n.canvas, 0, 0);
for (const c of l) Me(r, a, c);
return r.canvas;
}
async function Ce(n, l) {
if (n.kind !== "pdf" || !n.pdfDoc || !l.trim()) return [];
const a = await W(), r = n.pdfDoc, c = l.trim(), i = [];
for (let o = 1; o <= r.numPages; o++) {
const p = await r.getPage(o), d = p.getViewport({ scale: D }), y = await p.getTextContent();
for (const f of y.items) {
if (!f.str || !f.str.includes(c)) continue;
const m = a.Util.transform(d.transform, f.transform), b = Math.hypot(m[1], m[3]) || f.height * D, E = (f.width || 0) * d.scale, v = b * 0.15;
i.push({ id: H(), page: o - 1, x: m[4] - v, y: m[5] - b - v, w: E + v * 2, h: b + v * 2, type: "black" });
}
}
return i;
}
function Se(n) {
return new Promise((l, a) => {
n.toBlob(async (r) => {
if (!r) {
a(new Error("\u753B\u50CF\u5909\u63DB\u306B\u5931\u6557\u3057\u307E\u3057\u305F"));
return;
}
l(new Uint8Array(await r.arrayBuffer()));
}, "image/png");
});
}
async function Ee(n, l) {
const a = await ge.create();
for (let r = 0; r < n.length; r++) {
const c = U(n[r], l.filter((d) => d.page === r)), i = await Se(c), o = await a.embedPng(i);
a.addPage([c.width, c.height]).drawImage(o, { x: 0, y: 0, width: c.width, height: c.height });
}
return a.save();
}
function Le(n, l, a = "png") {
const r = U(n, l);
return new Promise((c, i) => {
r.toBlob((o) => o ? c(o) : i(new Error("\u753B\u50CF\u5909\u63DB\u306B\u5931\u6557\u3057\u307E\u3057\u305F")), a === "png" ? "image/png" : "image/jpeg", 0.95);
});
}
function Re(n) {
const l = [], a = n.some((o) => o.type === "mosaic" || o.type === "blur"), r = n.some((o) => o.type === "black" || o.type === "white");
l.push("\u51FA\u529B\u306F\u753B\u50CF\u5316\u3055\u308C\u3001\u5143\u306E\u30C6\u30AD\u30B9\u30C8\u30FB\u30E1\u30BF\u30C7\u30FC\u30BF\u306F\u542B\u307E\u308C\u307E\u305B\u3093\uFF08\u30B3\u30D4\u30DA\u30FB\u691C\u7D22\u306B\u3088\u308B\u5FA9\u5143\u306F\u4E0D\u53EF\u80FD\uFF09\u3002"), r && l.push("\u9ED2\u5857\u308A\u30FB\u767D\u5857\u308A\u306E\u9818\u57DF\u306F\u4E0B\u306E\u60C5\u5831\u304C\u5B8C\u5168\u306B\u7834\u68C4\u3055\u308C\u307E\u3059\uFF08\u5FA9\u5143\u4E0D\u53EF\uFF09\u3002"), a && l.push("\u30E2\u30B6\u30A4\u30AF\u30FB\u307C\u304B\u3057\u306F\u60C5\u5831\u3092\u4E0D\u53EF\u9006\u306B\u5909\u63DB\u3057\u307E\u3059\u304C\u3001\u6A5F\u5BC6\u306E\u300C\u6587\u5B57\u300D\u306B\u306F\u9ED2\u5857\u308A/\u767D\u5857\u308A\u3092\u63A8\u5968\u3057\u307E\u3059\u3002");
const c = n.length === 0 ? 1 : a && !r ? 2 : 3;
return { level: c, levelLabel: c === 3 ? "\u6700\u5F37\uFF08\u5B8C\u5168\u5FA9\u5143\u4E0D\u53EF\uFF09" : c === 2 ? "\u5F37\uFF08\u60C5\u5831\u5909\u63DB\uFF09" : "\u672A\u30DE\u30B9\u30AF", rasterized: true, hasObscureOnly: a && !r, notes: l };
}
const ze = [{ type: "black", label: "\u9ED2\u5857\u308A", icon: me }, { type: "white", label: "\u767D\u5857\u308A", icon: F }, { type: "mosaic", label: "\u30E2\u30B6\u30A4\u30AF", icon: we }, { type: "blur", label: "\u307C\u304B\u3057", icon: be }];
function $(n, l) {
const a = URL.createObjectURL(n), r = document.createElement("a");
r.href = a, r.download = l, document.body.appendChild(r), r.click(), r.remove(), setTimeout(() => URL.revokeObjectURL(a), 1e3);
}
function Ke() {
const { theme: n, toggleTheme: l } = ne(), [a, r] = u.useState(null), [c, i] = u.useState(false), [o, p] = u.useState(""), [d, y] = u.useState(0), [f, m] = u.useState([]), [b, E] = u.useState("black"), [v, q] = u.useState(false), [w, j] = u.useState(null), [L, G] = u.useState(""), [A, B] = u.useState(false), [O, T] = u.useState(false), R = u.useRef(null), N = u.useRef(null), M = (a == null ? void 0 : a.pages[d]) ?? null, C = f.filter((e) => e.page === d), V = u.useCallback(async (e) => {
p(""), i(true), r(null), m([]), y(0), j(null);
try {
const s = await ve(e);
r(s);
} catch (s) {
p(s instanceof Error ? s.message : "\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F");
} finally {
i(false);
}
}, []), S = u.useCallback((e) => {
const s = R.current;
if (!s || !M) return;
const h = U(M, C);
s.width = h.width, s.height = h.height;
const g = s.getContext("2d");
g.drawImage(h, 0, 0);
for (const x of C) g.strokeStyle = x.id === w ? "#ef4444" : "rgba(99,102,241,0.9)", g.lineWidth = x.id === w ? 4 : 2, g.strokeRect(x.x, x.y, x.w, x.h);
e && (g.strokeStyle = "#6366f1", g.setLineDash([8, 6]), g.lineWidth = 2, g.strokeRect(e.x, e.y, e.w, e.h), g.setLineDash([]));
}, [M, C, w]);
u.useEffect(() => {
S();
}, [S]);
const X = (e) => {
const s = R.current, h = s.getBoundingClientRect();
return { x: (e.clientX - h.left) * (s.width / h.width), y: (e.clientY - h.top) * (s.height / h.height) };
}, J = (e) => {
if (!M) return;
const { x: s, y: h } = X(e), g = [...C].reverse().find((x) => s >= x.x && s <= x.x + x.w && h >= x.y && h <= x.y + x.h);
if (g) {
j(g.id), N.current = null;
return;
}
j(null), N.current = { startX: s, startY: h, cur: { x: s, y: h }, moved: false }, e.target.setPointerCapture(e.pointerId);
}, Q = (e) => {
const s = N.current;
if (!s) return;
const { x: h, y: g } = X(e);
s.cur = { x: h, y: g }, (Math.abs(h - s.startX) > 3 || Math.abs(g - s.startY) > 3) && (s.moved = true), S({ x: Math.min(s.startX, h), y: Math.min(s.startY, g), w: Math.abs(h - s.startX), h: Math.abs(g - s.startY) });
}, Z = () => {
const e = N.current;
if (N.current = null, !e || !e.moved || !e.cur || !M) {
S();
return;
}
const s = Math.min(e.startX, e.cur.x), h = Math.min(e.startY, e.cur.y), g = Math.abs(e.cur.x - e.startX), x = Math.abs(e.cur.y - e.startY);
if (g < 5 || x < 5) {
S();
return;
}
const re = v && a ? a.pages.map((Y, z) => z) : [d];
m((Y) => [...Y, ...re.map((z) => ({ id: H(), page: z, x: s, y: h, w: g, h: x, type: b }))]);
};
u.useEffect(() => {
const e = (s) => {
(s.key === "Delete" || s.key === "Backspace") && w && (m((h) => h.filter((g) => g.id !== w)), j(null));
};
return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
}, [w]);
const ee = () => m((e) => e.slice(0, -1)), te = () => m((e) => e.filter((s) => s.page !== d)), ae = () => {
w && (m((e) => e.filter((s) => s.id !== w)), j(null));
}, K = async () => {
if (!(!a || !L.trim())) {
B(true);
try {
const e = await Ce(a, L);
e.length === 0 ? p("\u8A72\u5F53\u3059\u308B\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F") : (m((s) => [...s, ...e]), p(""));
} catch (e) {
p(e instanceof Error ? e.message : "\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u306B\u5931\u6557\u3057\u307E\u3057\u305F");
} finally {
B(false);
}
}
}, se = async () => {
if (a) {
T(true);
try {
const e = a.fileName.replace(/\.[^.]+$/, "");
if (a.kind === "pdf") {
const s = await Ee(a.pages, f);
$(new Blob([s], { type: "application/pdf" }), `${e}_masked.pdf`);
} else {
const s = await Le(a.pages[0], f, "png");
$(s, `${e}_masked.png`);
}
} catch (e) {
p(e instanceof Error ? e.message : "\u51FA\u529B\u306B\u5931\u6557\u3057\u307E\u3057\u305F");
} finally {
T(false);
}
}
}, k = Re(f);
return t.jsxs("div", { className: "h-screen flex flex-col bg-gray-100 dark:bg-[#0b0b0d] text-gray-900 dark:text-gray-100 overflow-hidden", children: [t.jsxs("header", { className: "shrink-0 h-14 flex items-center gap-3 px-4 border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-[#111] z-10", children: [t.jsx(oe, { to: "/", className: "p-2 -ml-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors", children: t.jsx(pe, { size: 18 }) }), t.jsx(_, { size: 20, className: "text-rose-500" }), t.jsx("h1", { className: "font-bold tracking-tight flex-1", children: "\u30DE\u30B9\u30AD\u30F3\u30B0\uFF08\u5B8C\u5168\u9ED2\u5857\u308A\uFF09" }), a && t.jsxs("button", { onClick: se, disabled: O, className: "flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-rose-500 text-white text-sm font-bold hover:bg-rose-600 transition-colors disabled:opacity-50", children: [O ? t.jsx(P, { size: 16, className: "animate-spin" }) : t.jsx(ie, { size: 16 }), " \u51FA\u529B"] }), t.jsx("button", { onClick: l, className: "p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors", children: n === "dark" ? t.jsx(ce, { size: 18 }) : t.jsx(le, { size: 18 }) })] }), o && t.jsxs("div", { className: "shrink-0 bg-red-50 dark:bg-red-950/30 text-red-600 dark:text-red-400 text-sm px-4 py-2 flex items-center gap-2", children: [t.jsx(de, { size: 14, className: "cursor-pointer", onClick: () => p("") }), " ", o] }), a ? t.jsxs("div", { className: "flex-1 flex overflow-hidden", children: [t.jsxs("aside", { className: "shrink-0 w-60 border-r border-gray-200 dark:border-gray-800 bg-white dark:bg-[#111] overflow-y-auto p-3 space-y-4", children: [t.jsxs("div", { children: [t.jsx("p", { className: "text-xs font-bold text-gray-400 uppercase tracking-wide mb-2", children: "\u30DE\u30B9\u30AF\u306E\u7A2E\u985E" }), t.jsx("div", { className: "grid grid-cols-2 gap-1.5", children: ze.map((e) => {
const s = e.icon;
return t.jsxs("button", { onClick: () => E(e.type), className: `flex items-center gap-1.5 px-2 py-2 rounded-lg text-sm transition-colors ${b === e.type ? "bg-rose-500 text-white" : "bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700"}`, children: [t.jsx(s, { size: 15 }), " ", e.label] }, e.type);
}) }), t.jsx("p", { className: "text-[11px] text-gray-400 mt-2", children: "\u30D7\u30EC\u30D3\u30E5\u30FC\u4E0A\u3092\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u7BC4\u56F2\u3092\u6307\u5B9A" })] }), t.jsxs("label", { className: "flex items-center gap-2 text-sm cursor-pointer", children: [t.jsx("input", { type: "checkbox", checked: v, onChange: (e) => q(e.target.checked), className: "accent-rose-500" }), "\u5168\u30DA\u30FC\u30B8\u306B\u540C\u3058\u4F4D\u7F6E\u3067\u9069\u7528"] }), a.kind === "pdf" && t.jsxs("div", { children: [t.jsx("p", { className: "text-xs font-bold text-gray-400 uppercase tracking-wide mb-2", children: "\u30AD\u30FC\u30EF\u30FC\u30C9\u81EA\u52D5\u58A8\u6D88\u3057" }), t.jsxs("div", { className: "flex gap-1.5", children: [t.jsx("input", { value: L, onChange: (e) => G(e.target.value), placeholder: "\u4F8B: \u5C71\u7530\u592A\u90CE", onKeyDown: (e) => {
e.key === "Enter" && K();
}, className: "flex-1 px-2 py-1.5 text-sm rounded-lg bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 outline-none focus:border-rose-400" }), t.jsx("button", { onClick: K, disabled: A, className: "p-2 rounded-lg bg-rose-50 dark:bg-rose-950/30 text-rose-500 hover:bg-rose-100 disabled:opacity-50", children: A ? t.jsx(P, { size: 15, className: "animate-spin" }) : t.jsx(ue, { size: 15 }) })] })] }), t.jsxs("div", { className: "space-y-1.5", children: [t.jsxs("button", { onClick: ee, disabled: !f.length, className: "w-full flex items-center gap-2 px-3 py-2 rounded-lg text-sm bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 disabled:opacity-40 transition-colors", children: [t.jsx(ke, { size: 15 }), " \u76F4\u524D\u3092\u53D6\u308A\u6D88\u3057"] }), w && t.jsxs("button", { onClick: ae, className: "w-full flex items-center gap-2 px-3 py-2 rounded-lg text-sm bg-red-50 dark:bg-red-950/30 text-red-600 hover:bg-red-100 transition-colors", children: [t.jsx(xe, { size: 15 }), " \u9078\u629E\u3092\u524A\u9664"] }), t.jsxs("button", { onClick: te, disabled: !C.length, className: "w-full flex items-center gap-2 px-3 py-2 rounded-lg text-sm text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-800 disabled:opacity-40 transition-colors", children: [t.jsx(F, { size: 15 }), " \u3053\u306E\u30DA\u30FC\u30B8\u3092\u30AF\u30EA\u30A2"] })] }), t.jsxs("div", { className: `rounded-xl p-3 ${k.level === 3 ? "bg-green-50 dark:bg-green-950/30" : k.level === 2 ? "bg-amber-50 dark:bg-amber-950/30" : "bg-gray-100 dark:bg-gray-800"}`, children: [t.jsxs("div", { className: "flex items-center gap-1.5 mb-1", children: [t.jsx(_, { size: 15, className: k.level === 3 ? "text-green-500" : k.level === 2 ? "text-amber-500" : "text-gray-400" }), t.jsxs("span", { className: "text-sm font-bold", children: ["\u5FA9\u5143\u4E0D\u53EF\u5EA6\uFF1A", "\u2605".repeat(k.level), "\u2606".repeat(3 - k.level)] })] }), t.jsx("p", { className: "text-xs text-gray-600 dark:text-gray-400 mb-1", children: k.levelLabel }), t.jsx("ul", { className: "text-[11px] text-gray-500 space-y-0.5 list-disc list-inside", children: k.notes.map((e, s) => t.jsx("li", { children: e }, s)) })] })] }), t.jsxs("main", { className: "flex-1 flex flex-col overflow-hidden", children: [a.pages.length > 1 && t.jsxs("div", { className: "shrink-0 flex items-center justify-center gap-3 py-2 border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-[#111]", children: [t.jsx("button", { onClick: () => y((e) => Math.max(0, e - 1)), disabled: d === 0, className: "p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800 disabled:opacity-30", children: t.jsx(fe, { size: 18 }) }), t.jsxs("span", { className: "text-sm tabular-nums", children: [d + 1, " / ", a.pages.length] }), t.jsx("button", { onClick: () => y((e) => Math.min(a.pages.length - 1, e + 1)), disabled: d === a.pages.length - 1, className: "p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800 disabled:opacity-30", children: t.jsx(ye, { size: 18 }) })] }), t.jsx("div", { className: "flex-1 overflow-auto p-4 flex items-start justify-center", children: t.jsx("canvas", { ref: R, onPointerDown: J, onPointerMove: Q, onPointerUp: Z, className: "max-w-full shadow-lg bg-white touch-none", style: { cursor: "crosshair", height: "auto" } }) })] })] }) : t.jsx("div", { className: "flex-1 flex items-center justify-center p-6", children: t.jsxs("label", { className: "w-full max-w-lg cursor-pointer", children: [t.jsx("div", { className: "border-2 border-dashed border-gray-300 dark:border-gray-700 rounded-2xl p-12 text-center hover:border-rose-400 transition-colors", children: c ? t.jsx(P, { size: 40, className: "mx-auto text-rose-400 animate-spin" }) : t.jsxs(t.Fragment, { children: [t.jsx(he, { size: 40, className: "mx-auto text-gray-400 mb-3" }), t.jsx("p", { className: "font-bold mb-1", children: "PDF \u307E\u305F\u306F\u753B\u50CF\u3092\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9" }), t.jsx("p", { className: "text-xs text-gray-500", children: "\u30D5\u30A1\u30A4\u30EB\u306F\u7AEF\u672B\u5185\u3060\u3051\u3067\u51E6\u7406\u3055\u308C\u3001\u5916\u90E8\u306B\u9001\u4FE1\u3055\u308C\u307E\u305B\u3093" })] }) }), t.jsx("input", { type: "file", accept: "application/pdf,image/*", className: "hidden", onChange: (e) => {
var _a;
const s = (_a = e.target.files) == null ? void 0 : _a[0];
s && V(s);
} })] }) })] });
}
export {
Ke as default
};